AI 资讯
Four Alarm Slots, Three Failure Modes: Building a Nightly Drain That Survives Sleep, Races, and Timeouts
Every night my Mac quietly rewrites my long-term memory. Not metaphorically — a shell script drains that day's Claude Code conversation logs into an Obsidian vault, commits them to a private repo, and leaves a briefing on my desktop. It took three real outages to make it reliable. This is the script, the three failures, and the design that came out of them. Why This Setup Works Claude Code's "memory" disappears by default Claude Code sessions are independent of one another. The root cause of a bug you found during a long working session today, the reason you settled on a particular architecture after trial and error, the accumulated knowledge that "this direction already failed once" — none of it is available in the next conversation once you close the session. Even on a paid plan, even with the most capable model available, if context isn't carried over you have to explain everything from scratch every time. Many people have had the experience of thinking "I already looked this up before" or "I should have failed at this once already, and yet here I am heading down the same road again." In a phase where you're shipping personal projects in volume, this problem is fatal. Once three or four projects are running in parallel, tracking "where each project currently stands" by hand hits a wall fast. And Claude, unable to reference previous conversations, repeats the same deliberations. The solution is to build an environment, not a task My first attempt at this problem was "I'll write up a summary by hand every day." It didn't last. When work has momentum you don't feel like writing a summary, and when you're tired you can write even less. A system that depends on human willpower doesn't function during a high-volume solo-dev phase. The answer was to build an environment that automatically drains Claude's conversation logs into Obsidian every night. Once the environment is in place, willpower and motivation are irrelevant. The Mac just does it. The reason I chose Obsidia
AI 资讯
I Built a Python Bot That Plays Blackjack on Discord's OwO Bot 🃏
I Built a Python Bot That Plays Blackjack on Discord's OwO Bot 🃏 An automation experiment in game logic, human-like timing, and why the house still wins. ⚠️ Disclaimer first: This project is for educational purposes only . It's a coding experiment about automation, pacing, and basic blackjack strategy. I'm not promoting gambling, I'm not responsible for any losses, and self-bots can violate Discord's Terms of Service — know the rules before running anything like this. What is this thing? If you've spent time in Discord economy servers, you've probably met OwO Bot — one of the most popular Discord bots out there, with its own cash economy and gambling minigames, including Blackjack . I asked myself a fun engineering question: Can I write a Python client that plays full Blackjack sessions on its own — with human-like pacing, break cycles, and a sensible betting strategy? That experiment became GhoSty OwO BlackJack Farm — a Python-based Discord self-bot focused on OwO Bot's Blackjack, now at V2.1 . What it does 🔄 Full Blackjack automation — handles the game loop end-to-end. 💡 Smart betting — strategy-based decisions instead of random yolo bets. 😴 Smart Sleep — lifetime work/break cycles instead of 24/7 spamming. ⏱️ Dynamic gaps — randomized delays between every action. 🚨 Zero win guarantees — on purpose. More on that below. The stack (and why an old discord.py) Python 3.10+ discord.py==1.7.3 colorama Yes, 1.7.3 is ancient — deliberately. The self_bot=True pattern that this kind of client relies on was removed in newer discord.py versions, so legacy 1.7.3 is the line that still supports it. If you've never touched pre-2.0 discord.py, this project is a small time capsule of that API. The whole project is intentionally tiny: OwO-Blackjack-Farm/ ├── main.py # bot + game logic ├── config.json # your token & settings ├── requirements.txt └── README.md Setup is two steps: drop your token into config.json , then: pip install discord.py == 1.7.3 colorama python main.py Start it
AI 资讯
RPA vs BPA vs Intelligent Automation: A Practical Map for Ops Leaders
Most automation purchases in ops organizations go wrong at the category level, before a single vendor demo happens. A team buys RPA because "automation" was the ask, then discovers six months in that the actual problem needed process orchestration across systems, not a bot clicking through a legacy UI. Or they buy an intelligent automation platform for a workflow that was always going to be simple, straightforward API orchestration, and pay for a cognitive layer they never needed. The three categories solve genuinely different problems, and the confusion between them is expensive in a specific, avoidable way. RPA: automating the UI, not the process Robotic process automation does one thing, and it's narrower than most pitches suggest: it mimics a human interacting with a screen — clicking buttons, reading fields, typing values — usually through UI selectors or an application's accessibility tree, not through an API. That's the entire point of it: RPA exists for systems that don't expose an API at all, or where getting API access would take longer than building a bot that just uses the interface the way a person would. That mechanism is also its defining weakness. A bot built against specific UI coordinates or element selectors breaks the moment the underlying application changes — a button moves, a field gets relabeled, a vendor ships a UI update — and the failure is usually silent until someone notices the process stopped completing. This is the single most common complaint about production RPA deployments, and it's not a implementation mistake, it's structural: robotic process automation is fundamentally built on mimicking a visual interface, and visual interfaces change for reasons that have nothing to do with the automation depending on them. RPA is the right tool specifically for swivel-chair tasks — moving data between systems that don't talk to each other, with no API available on at least one side, at a volume that makes manual entry genuinely costly. It's t
AI 资讯
Building an AI Test Automation Factory: How We Reduced Automation Effort by 78% with Multi-Agent Systems & MCP
Traditional test automation frameworks often carry heavy maintenance costs, slow release cycles, and high knowledge dependency. By transitioning from standard script creation to a governed AI Test Automation Factory , engineering teams can shift their focus from writing boilerplate code to high-value validation and architectural optimization. Here is an architectural breakdown of how multi-agent AI systems, governed telemetry, and Model Context Protocol (MCP) transform enterprise quality engineering. The Problem: The 45-Hour Manual Bottleneck Building a end-to-end BDD automation suite manually requires significant time per user story—often taking up to 45 hours across five distinct steps: Context Generation & Requirements Review (~8 hrs) Manual Test Case Design (~9 hrs) Cucumber Feature File Creation (~8 hrs) Page Object Model Generation (~8 hrs) Step Definition Implementation (~10 hrs) This traditional workflow creates coverage gaps, inconsistent code quality, and defect leakage. The Solution: Multi-Agent AI Automation Pipeline Instead of relying on single prompts, an AI Test Automation Factory routes requirement artifacts (BRDs / User Stories) through specialized agents: [BRD / User Story] │ ▼ [Context Agent] ──► [Test Case Agent] ──► [Feature File Agent] │ [Automation Suite] ◄── [Step Definition Agent] ◄── [Page Object Agent] Context Agent: Parses acceptance criteria and enterprise domain knowledge. Test Case Agent: Auto-generates exhaustive test scenario matrices. Feature File Agent: Drafts standardized BDD Cucumber feature files. Page Object & Step Def Agents: Constructs clean design patterns (POM) and matching step implementations. Measurable ROI: Before vs. After AI By replacing manual generation with agentic workflows, the effort to automate a scenario drops from 45 hours to 9.5 hours: Phase Manual Effort AI-Driven Effort Time Saved Context Generation 8 hrs 2 hrs 75% Test Design 9 hrs 2 hrs 78% Feature File Creation 8 hrs 0.5 hrs 94% Page Object Creation 8 h
AI 资讯
JSONL ledgers in git as the state layer for an autonomous agent: patterns that survive crashes and retries
Our autonomous agent has been running a small publishing business for three months: it posts, replies, follows, publishes articles, and tracks every decision it makes. The state layer behind all of that is not Postgres, not SQLite, not Redis. It is a directory of JSONL files committed to git. This choice gets us laughed at occasionally, so this post is the honest case for it — the patterns that make append-only text files survive crashes, retries, concurrent writers, and an LLM's enthusiasm for re-running things it already ran. Why files-in-git at all Three properties turned out to matter more than query power: Every state change is a diff. When the agent follows someone, replies to a thread, or publishes an article, the evidence lands in git log with a timestamp and an author. Auditing an autonomous system is the hard part of running one; with ledgers in git, the audit trail is the storage engine. Scheduled jobs and interactive sessions share state with no server. Our GitHub Actions jobs check out the repo, read the ledgers, act, commit. The interactive session pulls before deciding anything. The merge boundary is git's problem, which is a well-understood problem. The LLM can read its own state natively. An agent that can grep its full decision history is meaningfully smarter than one that needs a query layer written for it. Pattern 1: append-only, with one exception Almost every ledger is append-only: one JSON object per line, new facts go at the end. Append-only means a crashed write corrupts at most the final line, and recovery is "drop the broken tail," not "restore from backup." The exception: consumption ledgers (a stock of pre-written posts, a queue of follow candidates) need a consumedAt stamp on existing rows. For those we load-modify-rewrite the whole file — acceptable because the files are small — with one hard rule: a consumed mark is never overwritten. The update function refuses to touch a row whose consumedAt is already set. Retry-safety comes from t
AI 资讯
How to launch an AI automation agency offering voice AI agents for local businesses
You'll build a repeatable service that lets plumbers, dentists, and other service-business owners answer calls with a natural-sounding, AI-driven voice that schedules appointments, qualifies leads, and captures payments. The result is a hands-free phone front-desk that you can sell as a monthly subscription and use to acquire new clients for your agency. What you'll get: a working n8n workflow that wires Anthropic's Claude, ElevenLabs text-to-speech, and Twilio Programmable Voice together, plus a go-to client-acquisition script that turns the service into a scalable AI automation agency. What you need Tool Plan / Price* Role n8n (self-hosted Docker) Free (self-hosted) - see Docker Hub for latest image Orchestrates API calls, stores conversation state Twilio Programmable Voice Pay-as-you-go - check Twilio pricing page Provides inbound phone numbers and SIP bridge Anthropic Claude API Usage-based - check Anthropic pricing page Generates conversational replies ElevenLabs TTS API Usage-based - check ElevenLabs pricing page Turns Claude's text into a lifelike voice Cloudflare DNS + SSL Free tier available - verify limits Publishes a secure webhook for Twilio Git (optional) Free Version-controls workflow JSON *We avoid stating exact free-tier caps; always verify the current provider pricing. Estimated time-to-build: 12-16 hours total (including testing and client-onboarding script). Defining the core pieces Voice AI is the combination of speech-to-text, natural-language generation, and text-to-speech that lets a computer hold a phone conversation. In this guide we skip the speech-to-text step by letting Twilio forward the caller's audio to our n8n webhook; the rest happens via APIs. Key insight: The biggest revenue lever for an AI automation agency is the repeatable client-acquisition funnel, not the underlying technology. Building voice ai agents for local businesses Below is a step-by-step walkthrough. Every step mentions the exact UI field, API endpoint, or n8n node na
AI 资讯
The best free AI models 2026 for an automation-first business
The best free AI models 2026 are the ones that give you production-grade quality without a bill at the end of the month. In practice that means using Groq's ultra-low-latency mix, Google Gemini's 1 M-token free quota, Meta's LLaMA 2 (self-hosted), DeepSeek's open-source v2.5, and Mistral-7B-Base on a free cloud tier. Hook them up to an automation platform like n8n and you can run a full SaaS pipeline - lead scoring, email drafting, image captioning, or ticket routing - without paying for inference. Below you'll find the exact stack, a step-by-step build, the gotchas that usually bite newcomers, and a short FAQ so you can get the best free AI models 2026 live in under two hours. What you need Tool / Model Plan / Price (as of 2026) Role in the pipeline Groq (Mixtral-8x7B-instruct) Free tier: 200 k tokens / month, no credit-card required (see Groq pricing) Low-latency text generation for chat & summarisation Google Gemini 1.5 Flash Free tier: 1 M input tokens / month, 0.5 M output tokens / month (check Google Cloud AI) Multi-modal (text + image) support, best for classification and translation Meta LLaMA 2 13B Self-hosted Docker (CPU) - $0, or hosted on Runpod free credits (up to $5) Deep-knowledge base Q&A, fine-tuning on proprietary data DeepSeek-V2.5 Free tier on DeepSeek API: 150 k tokens / month (no card) Creative writing, code suggestions Mistral-7B-Base Free tier on Mistral Cloud: 100 k tokens / month (requires OAuth) Structured data extraction, function calling n8n (automation) Community Edition (self-hosted Docker) - free Orchestrates API calls, branching, retries Docker Desktop Free for personal use Container runtime for LLaMA 2 Node.js 18+ Free (runtime) Needed for custom JS functions inside n8n Estimated build time: 90 minutes for a fresh machine (install Docker, pull LLaMA, configure n8n) plus 30 minutes of testing. Total ~2 hours. Building a production-grade automation pipeline with the best free AI models 2026 Below is a concrete example: an inbound-lead
AI 资讯
ai agents vs automations: When to build an autonomous agent and when a simple workflow suffices
What's the difference? An AI agent is a loop-driven system that can decide which tool to call next, keep state across interactions, and adapt its behaviour. An automation is a fixed sequence of steps that runs the same way every time. In this guide you'll build both a plain n8n workflow that sends a prompt to OpenAI and stores the answer, and a full RAG-enabled AI agent that decides when to fetch documents, when to query the LLM, and when to respond. By the end you'll see why most teams over-engineer, and you'll have a production-ready example you can ship tomorrow. Key insight: If your use-case requires conditional tool use, memory, or dynamic goal-setting, you need an AI agent; otherwise a straight automation is cheaper, faster, and easier to maintain. What you need Tool Plan / Price Role n8n (open-source workflow engine) Community edition (self-hosted, free) - see https://n8n.io/pricing for hosted options Orchestrates both automation and agent pipelines OpenAI API (ChatGPT/GPT-4) Pay-as-you-go - see https://openai.com/api/pricing Generates natural-language responses Pinecone (vector store) Free tier or paid plan - see https://www.pinecone.io/pricing Holds document embeddings for RAG Docker (container runtime) Free Runs n8n locally or in CI Git (version control) Free Stores workflow definitions Estimated build time: ~4 hours for a complete agent (including embedding documents) and ~1 hour for the plain automation. Step-by-step build 1. Set up n8n locally # Pull the official n8n Docker image and start it on port 5678 docker run -d --name n8n \ -p 5678:5678 \ -e N8N_BASIC_AUTH_ACTIVE = true \ -e N8N_BASIC_AUTH_USER = admin \ -e N8N_BASIC_AUTH_PASSWORD = secret \ n8nio/n8n What this does: launches a self-hosted n8n instance with basic auth. After a few seconds open http://localhost:5678 and log in with the credentials above. 2. Create the plain automation workflow In the n8n UI, click New Workflow . Add a Webhook node (trigger URL: /automation ). This receives a JSON
AI 资讯
Waymo’s Gemini in Ojai Remains a Limited Beta as Rider Access Expands
Waymo’s Gemini integration in Ojai is being introduced through a limited beta rollout , not as a feature available to every rider. The company’s official updates describe early access for a restricted group of riders, followed by gradual expansion, while Gemini in the Ojai cabin continues to receive interface and product enhancements. Waymo first outlined the rollout in May 2026, saying it would welcome initial riders in select cities, including San Francisco, Phoenix and Los Angeles. Those riders would receive free rides as Waymo collected feedback, with access expected to expand over time. Waymo’s May 2026 Ojai rollout announcement is the primary account of that initial plan. The company’s July 2026 update characterized Gemini in Waymo as a beta feature in the Ojai cabin. It also referred to a redesigned user interface and ongoing enhancements. Taken together, the two announcements establish a phased deployment: early rider feedback first, followed by continued iteration and broader access over time. What Waymo has announced about Gemini in Ojai The official information supports a narrower view of availability than a universal launch. In May, Waymo described a limited group of early riders in three named cities. By July, the company was still describing Gemini in the Ojai cabin as a beta. Rollout stage Waymo’s description What it indicates May 2026 First riders in San Francisco, Phoenix and Los Angeles, with free rides for a limited group while Waymo collected feedback. Initial access was restricted and feedback-led. July 2026 Gemini in Waymo was described as a beta feature in the Ojai cabin, with a redesigned UI and ongoing enhancements. The in-cabin experience remained in active development. Waymo did not provide a universal-access date in the supplied material. Its stated approach is gradual expansion, which means availability should be assessed by the company’s current rider communications rather than by assuming that a beta feature has reached all users. Why
AI 资讯
OpenAI Rolls Out Flexible Codex Pricing for Business and Enterprise Teams
OpenAI has formally rolled out a more flexible way for organizations to buy and use Codex. Eligible ChatGPT Business and Enterprise workspaces can add Codex-only seats on a pay-as-you-go basis, with usage billed through API-style token consumption rather than a fixed fee for each of those seats. The change matters because it separates AI coding access from a conventional per-user subscription model. A team can provision Codex-only members for development work while managing consumption through credits, rather than treating every user as a full ChatGPT seat. OpenAI also reduced the annual ChatGPT Business seat price from $25 to $20 and introduced promotional credits intended to lower the cost of onboarding new Codex users. OpenAI details the model in its official flexible Codex pricing announcement for teams . The initial announcement was made on April 2, 2026. A June 24, 2026 update clarified that existing pay-as-you-go seats remain in place, while the availability of new Business pay-as-you-go seats may change. How OpenAI's Codex team pricing works The central change is the availability of Codex-only seats within Business and Enterprise workspaces. These seats have no fixed seat fee . Instead, their Codex consumption is charged using API-style token rates. OpenAI's approach gives organizations a way to make Codex available to users whose primary need is AI-assisted coding, without requiring the same seat model used for standard ChatGPT access. This is not a claim that coding costs are universally lower. A pay-as-you-go model makes expenditure more directly dependent on usage, so the financial effect will vary by team and workload. The documented advantage is billing flexibility: organizations can align Codex costs with token consumption and use credits across supported workspace features where their plan allows it. Item ChatGPT Business seat Codex-only seat Pricing approach $20 per seat annually, reduced from $25 Pay as you go through API-style token consumption Fi
AI 资讯
Cloudflare Cuts Astro Github Issues by 85% with AI Agents
Cloudflare, Astro, AI agents, GitHub Actions, issue triage, agentic AI, software architecture, open source, developer tools, AI automation, automated testing, human in the loop, agent workflows, GitHub, software engineering, AI software development, bug triage, continuous integration, developer productivity, autonomous agents, AI coding, Cloudflare Workers, Flue, triagebot By Leela Kumili
AI 资讯
n8n One-Line Setup Brings Its Self-Hosted AI Assistant Closer to Production Workflows
n8n has documented a one-command route for deploying a self-hosted instance with its AI Assistant support services included. The setup lowers the initial barrier to running n8n in a Docker-based environment, while keeping a crucial distinction clear: the AI Assistant is not active by default and requires a model provider API key before it can be enabled. The development matters for teams evaluating AI-assisted workflow automation without relying solely on a hosted deployment. n8n's installer provides a standardized starting point and a matching upgrade command, but it does not remove the operational work of selecting model providers, configuring execution infrastructure, and applying the controls an organization needs around credentials and automation. What n8n's one-line installer actually does The official n8n one-line setup documentation specifies the installation command as curl -fsSL https://get.n8n.io | sh . It creates a new n8n directory, writes a docker-compose.yml file and a .env file, then starts n8n. That behavior is an important correction to a simplified view of the installer. The command makes first deployment more direct, but it does not eliminate Compose or environment configuration. Instead, it generates those files as part of the deployment. This gives administrators a ready-made local configuration foundation that can be inspected and adapted after installation. The same script supports an upgrade path through the --upgrade option. For organizations already operating n8n, that means the documented deployment approach covers both an initial setup and subsequent upgrades, rather than treating self-hosting as a one-time installation task. Area Initial one-line installation AI Assistant activation Starting action Run the documented curl installer Add a model provider API key and restart n8n Generated or deployed components A new n8n directory, docker-compose.yml , and .env AI Assistant support services run alongside n8n Default AI status AI Assistant
AI 资讯
211 kristallisierte Regeln
Wie mein Agent aus 211 Fehlern ein besseres System geworden ist als ich es je programmieren könnte Heute Morgen hat mein Agent etwas getan, das er vor drei Monaten nicht konnte. Er hat einen eingehenden Webhook-Payload selbstständig klassifiziert, die richtige Skill-Route gewählt und dabei einen Edge Case abgefangen, den ich nie explizit beschrieben hatte. Ich habe das erst bemerkt, als ich die Logs durchgesehen habe. Der Agent hatte eine Regel angewendet, die ich nie geschrieben habe. Entstanden aus einem Fehler vom 14. März, bei dem er den falschen Dispatcher aufgerufen hat. Damals habe ich ihn korrigiert. Heute hat er die Korrektur automatisch angewendet, ohne dass ich auch nur daran gedacht hätte. Das ist der Crystallization-Loop. Und er verändert grundlegend, wie ich über KI-Systeme denke. Was der Crystallization-Loop eigentlich ist Die meisten KI-Workflows funktionieren so: Man gibt dem Modell einen Prompt, bekommt eine Ausgabe, korrigiert manuell, wiederholt. Jede Session beginnt von vorne. Das Modell lernt nichts. Du lernst vielleicht etwas, aber das nächste Mal ist die Chance hoch, dass der gleiche Fehler wieder passiert. Der Crystallization-Loop bricht diesen Kreislauf auf. Jede Korrektur, jedes Feedback, jeder Fehler wird automatisch in eine persistente Regel umgewandelt. Diese Regel landet in einer strukturierten Wissensbasis, die der Agent bei jeder neuen Session lädt. Das Prinzip ist einfach. Die Konsequenz ist dramatisch. Nach drei Monaten habe ich: 211 kristallisierte Regeln in strukturierten Markdown-Dateien 73 Learnings aus echten Fehlern und Korrekturen 61 Skills, die automatisch aus wiederkehrenden Aufgaben entstanden sind 308 Memory-Dateien, die den Kontext meines Projekts dauerhaft speichern Kein einziges dieser Dokumente habe ich manuell geschrieben. Sie sind alle aus echten Interaktionen entstanden. Die technische Implementierung Das System besteht aus drei Komponenten, die zusammenspielen. 1. Der Feedback-Collector Jedes Mal, wenn ich den Ag
AI 资讯
176 Regeln, die kein Mensch geschrieben hat
Um 02:47 Uhr stoppte mein System ein Deployment. Kein Mensch war wach. Es war ein Dienstagmorgen, als mein Guard-System anschlug. Nicht wegen eines fehlgeschlagenen Tests. Nicht wegen eines Syntaxfehlers. Ein Agent hatte versucht, einen Commit zu pushen, der einen AWS-API-Schlüssel enthielt. Der Schlüssel steckte in einer Konfigurationsdatei, die eigentlich nie ins Repository sollte. Der Deployment-Prozess wurde blockiert. Um 02:47 Uhr. Kein Mensch hätte das um diese Zeit gesehen. Der Schlüssel wäre live gegangen. Das war kein Einzelfall. Es war der 47. Vorfall in 14 Monaten, den mein System automatisch abgefangen hatte, bevor er Schaden anrichten konnte. Und er hat mir klarer als je zuvor gezeigt, warum das Regelwerk wichtiger ist als das Modell selbst. Was ein Guard-System wirklich ist Die meisten, die über KI-Sicherheit sprechen, meinen Alignment, Halluzinationen oder Trainingsdaten. Das sind echte Probleme, aber sie liegen auf einer anderen Ebene. Ich rede von etwas Handwerklichem: einem System, das verhindert, dass ein KI-Agent im laufenden Betrieb Fehler macht, die Menschen Geld oder Daten kosten. Mein System läuft auf einem Prinzip, das ich GRIP nenne: Guards, Rules, Isolation, Protocol. Jeder Agent, der in meinem Stack läuft, durchläuft vor jeder kritischen Aktion eine Prüfkette. Nicht als Empfehlung. Als harter Block. Das bedeutet konkret: Der Agent darf nicht weiter, bis das Problem behoben ist. Kein Fallback, kein "try anyway", kein Override ohne explizite Freigabe. # Beispiel: Pre-Commit Guard gegen Secrets #!/bin/bash STAGED_FILES = $( git diff --cached --name-only ) for FILE in $STAGED_FILES ; do if grep -rE "(AKIA[0-9A-Z]{16}|sk-[a-zA-Z0-9]{32,}|ghp_[a-zA-Z0-9]{36})" " $FILE " 2>/dev/null ; then echo "GUARD BLOCK: Potential secret detected in $FILE " echo "Deployment halted. Remove secret before proceeding." exit 1 fi done Das ist kein ausgeklügeltes KI-Modell. Das ist ein Shell-Skript, das seit Monaten zuverlässig seinen Job macht. 176 Regeln und wie
AI 资讯
Why Hitting Your Coverage Target Is Making Your Tests Worse
I had 87% coverage, and we still broke the billing flow on launch day. Not because of a gap in the percentage. Because 87% was covering the wrong things. The tests were written to pass a gate, not to catch a failure. That is a more common story than most teams admit. And the reason it keeps happening is not that engineers are careless. It is that the incentive structure you created made it the rational outcome. The series checkpoint The first three articles in this series built the investment case for testing and then dismantled the received wisdom about how to execute it. We've made the economic argument for automation. We've restructured when quality checks happen across the SDLC. We've replaced the pyramid model with something shaped by risk rather than by code hierarchy. Now, when someone asks: how do you know if it is working? The answer most teams give is their coverage percentage. This article is about why that answer is structurally broken, and why fixing it is a management decision before it is a tooling decision. What coverage percentage actually measures Coverage percentage tracks which lines of your code were executed during a test run. If a line ran, it counts as covered. That is the complete definition. It does not measure whether the test asserted anything meaningful about that line. It does not measure whether both branches of a conditional were exercised. It does not measure whether the specific inputs that cause failures were ever tried. A test that calls a payment function and checks assert response is not None covers the same lines as a test that validates the transaction ID, amount, currency, error code, and retry behaviour. The coverage tool treats them identically. The research on this is unambiguous. A 2017 study by Kochhar et al. examined the correlation between code coverage and actual bug rates across 100 large open-source Java projects. The finding: the coverage of existing test suites has an insignificant correlation with the number of b
AI 资讯
Your GitHub Actions cron fires less often than you declared: what we measured and how to design for it
We run an automated publishing pipeline entirely on GitHub Actions cron schedules — no server, no queue, just workflows that wake up, do one thing, and commit the result. It mostly works. But there is one behaviour of scheduled workflows that the docs mention in a single quiet sentence and that will silently halve your job frequency if you design around the cron expression instead of around reality: Scheduled workflows do not fire as often as you declare. What we measured We had a feedback-watcher workflow declared at four runs per hour: on : schedule : - cron : ' 7,22,37,52 * * * *' Measured over days, it actually fired one to two times per hour — not four, and not at the declared minutes. Roughly hourly on most days, at inconsistent offsets from the declared slots. We later redeclared it at two runs per hour ( 7,37 * * * * ) — measured result: still one to two runs per hour. The declared frequency changed by 2x; the delivered frequency barely moved. This is not an outage and not a misconfiguration. GitHub's own documentation says the schedule event can be delayed during periods of high load , and that high load times include the start of every hour — which is precisely where naive cron expressions cluster — and adds: "If the load is sufficiently high enough, some queued jobs may be dropped." What the docs understate is the magnitude: in our observation, on a private repo, "delayed" in practice meant "throttled to a fraction of the declared rate, indefinitely." What this breaks The failure mode is subtle because nothing goes red. Every run that happens succeeds. The runs that don't happen leave no trace — no log, no failure email, nothing. You only notice if something downstream depends on the frequency: We had promised a "reply within 15 minutes" SLA on incoming feedback, initially backed by the 4x/hour schedule. The schedule couldn't hold it, so for a while we ran a local 15-minute scheduler as the primary path and kept the workflow as fallback. When we later rel
AI 资讯
iCloud Silently Evicted 69 Article Files and Killed 4 Days of Publishing: EDEADLK and a read_text_resilient Design
Every one of my publishing lanes went dark for four days, and every script involved exited with status 0. Nothing had crashed. The files themselves had quietly stopped existing on disk — macOS had uploaded them to iCloud and deleted the local copies to "optimize storage." Why This Matters What it means for automation to depend on its environment When you run 160+ launchd jobs around the clock, the execution environment itself becomes a failure source before your script logic does. Ports get exhausted, processes orphan and pile up, memory never frees — I wrote about that class of resource leak last time. This is a completely different kind of total failure that happened the very next day. The files had become fatal to read . Not a bug in my code. Not a filesystem bug. An unintended side effect of a mechanism macOS runs under the name "optimization." What optimize-storage actually does macOS's "Optimize Storage" (System Settings → General → Storage → Optimize Storage), on a machine with iCloud Drive enabled, uploads files under Desktop and Documents to iCloud and deletes the local copies when free disk space gets tight . In Finder they still look like normal icons, but there is no local data — they are in a "dataless" state. Click one and it downloads automatically. For a human user, that's an acceptable tradeoff. The problem is automation scripts. python3 's open() , pathlib.Path.read_text() , cat , jq , cp — all of them die instantly on a dataless file with Errno 11: EDEADLK: Resource deadlock avoided . The name "Resource deadlock" makes you suspect a deadlock, but this is a POSIX errno code that macOS repurposes to mean "waiting for a file download." No lock is contended. No thread is stuck. The mere fact that "the data isn't local" surfaces to the process as a fatal error code. You can also get EAGAIN (resource temporarily unavailable). That one shows up as a race right after a download starts. The actual damage: four days of zero posts On August 6, 2026, note's a
AI 资讯
Google Gemini 3.7 Flash Goes GA Across AI Mode, APIs, and Enterprise Surfaces
Google has launched Gemini 3.7 Flash as a generally available model, extending it across the Gemini API, Google AI Studio, Vertex AI, Gemini Enterprise, the Gemini app, and AI Mode in Search. The August 13, 2026 release positions the model as the successor to earlier 3.5 and 3.6 Flash generations, with Google emphasizing stronger instruction following, improved understanding of user intent, and faster responses for coding, agentic workflows, and multi-step tasks. For enterprise developers, the significance is less about a single destination than a more consistent model layer across Google's consumer and business AI surfaces. Teams can evaluate the same model family for application development, managed enterprise use, and search-facing user journeys, while Google AI Pro and Ultra subscribers gain access through Gemini Spark as its rollout progresses. Google's official Gemini 3.7 Flash model documentation lists the GA model's specifications and launch pricing. It supports a 1 million-token context window , outputs of up to 64,000 tokens , and adjustable thinking levels. Those characteristics make the release relevant to workloads that need to process substantial source material, generate longer responses, or balance response speed against reasoning depth. What the Gemini 3.7 Flash rollout changes The core change is broad availability. Gemini 3.7 Flash is not limited to a standalone developer preview or one consumer product. Google is making it available through the Gemini API and related development environments, while also incorporating it into AI Mode in Search and the Gemini app. For AI Mode, Google says Gemini 3.7 Flash is replacing earlier Flash variants for many users in supported markets. The model's focus on following instructions and interpreting intent matters in a Search setting, where users often ask compound questions, refine requests, or expect a response to account for constraints stated in natural language. On the developer side, access spans Google AI
AI 资讯
OpenAI Computer History Remains Unavailable in the EEA, UK and Switzerland
OpenAI's Computer History feature is not currently available in the European Economic Area, the United Kingdom, or Switzerland, according to the company's Enterprise and Edu documentation. That documented regional status contradicts claims that the macOS ChatGPT capability has expanded to Pro, Business, and Enterprise users across those markets. Computer History is described as an optional feature in the ChatGPT macOS app for Enterprise members. It is intended to bring context from selected apps and websites into ChatGPT and Codex. For organizations evaluating desktop AI deployments, the distinction matters: feature access depends not only on the app and plan, but also on the user's region. OpenAI's documented regional position The relevant OpenAI Enterprise and Edu release notes explicitly state that Computer History is not currently available in the EEA, UK, or Switzerland. The August 10, 2026 help documentation repeats that regional limitation. This means companies in those locations should not plan around Computer History as an available ChatGPT desktop capability on the basis of a broader regional rollout claim. The supplied OpenAI documentation does not announce a launch date, rollout timetable, or confirmed expansion for those markets. What the release notes establish OpenAI's published material supports several clear conclusions: Computer History is an optional macOS ChatGPT feature described for Enterprise members. It can bring context from selected apps and websites into ChatGPT and Codex . The EEA, UK, and Switzerland remain excluded from current availability. The cited documentation does not support availability for Pro or Business users in those excluded regions. Availability point Claimed position OpenAI documentation EEA, UK, and Switzerland Available Not currently available User plans named Pro, Business, and Enterprise Release notes describe the optional feature for Enterprise members Desktop context Mac desktop app macOS ChatGPT app, with context f
AI 资讯
How to pull every open job from Greenhouse, Lever, Ashby and SmartRecruiters with public APIs (and monitor changes)
Job postings are one of the most underrated public data sources on the internet. Recruiters use them to spot placement opportunities, B2B teams read them as buying signals (a new Head of Data means data-tooling budget), and job seekers want to apply on day one — not when a posting finally reaches the aggregators. The usual instinct is to scrape career pages. Don't. Most tech companies host their careers page on one of a handful of Applicant Tracking Systems (ATS), and the four biggest ones — Greenhouse, Lever, Ashby and SmartRecruiters — all expose public, documented JSON APIs . No auth. No proxies. No brittle HTML selectors. The career page itself loads the same JSON you're about to fetch. In this tutorial we'll build a single-file Python tool that: fetches every open job for a company from any of the four ATS, auto-detects which ATS a company uses, normalizes everything into one clean schema, monitors changes — run it on a schedule and get only new / removed / changed postings. The four endpoints ATS Endpoint Greenhouse GET https://boards-api.greenhouse.io/v1/boards/{slug}/jobs?content=true Lever GET https://api.lever.co/v0/postings/{slug}?mode=json Ashby GET https://api.ashbyhq.com/posting-api/job-board/{slug} SmartRecruiters GET https://api.smartrecruiters.com/v1/companies/{slug}/postings (paginated) The {slug} is the company identifier you see in career-page URLs: boards.greenhouse.io/stripe → stripe , jobs.lever.co/spotify → spotify , jobs.ashbyhq.com/linear → linear , careers.smartrecruiters.com/Visa → Visa . Try one right now — no API key needed: curl -s "https://api.ashbyhq.com/posting-api/job-board/linear" | head -c 400 Step 1 — fetchers, one per ATS Each API returns a different shape, so we normalize as we fetch. Here are all four (Python 3, only requests ): import requests UA = { " User-Agent " : " ats-jobs-tutorial/1.0 " } def get_json ( url , params = None ): r = requests . get ( url , params = params , headers = UA , timeout = 30 ) r . raise_for_statu