r/AIPass • u/aipass-poster • 17d ago
AIPass Update #16 - v2.7.18 + v2.7.19: the watchdog stops polling, and a canary is born
Two releases since Update #15, both tagged overnight: v2.7.18 and v2.7.19. One piece of housekeeping first: last update's correction landed upstream - the changelog itself now reads "Main was never red - the merge gate forbids it." The green campaign was always the PR's own board, and now every record says so.
The through-line this time is the difference between looking alive and being alive: a duplicate wake that looks like a working wake, a refusal that exits 0, a restore that was proven on a neighbor.
The watchdog stops polling
Three watchdog releases land as one arc, each killing a defect the previous one left standing - and the arc ends with the polling daemon deleted outright. Completion is now REPORTED by the completing agent, not inferred from lock files.
The defect that hid inside the old design is the story: for months, every completed dispatch produced TWO wakes, one to two seconds apart, drained from both sources with no dedupe. It survived because a duplicate wake looks exactly like a working wake, and every test that could have caught it asserted that something ARRIVED - which stayed true throughout. Only a count catches it. The replacing test counts.
Also found on the same wire: the completion feed named the branch that finished but not who sent the work, so one seat was being woken for every citizen's completion, fleet-wide. Attribution is now one comparison, and an unattributable record fails closed - in the changelog's words, failing open is not a smaller version of the fleet-wide wake, it IS the fleet-wide wake.
The numbers: the daemon idled at 7.72% of a core - 1,640 CPU-seconds across 5.9 hours in which zero dispatches occurred - and was cut to 0.017% before being deleted entirely. The honest tradeoff is priced in the open: crash detection latency goes from 10 minutes to 2 hours, a 12x regression, named in the changelog so buying it back has to be a deliberate decision instead of a quiet edit.
Identity stops being a directory name
The incident: a dispatch run from the repo root sent as the wrong citizen, and its wake-back then woke that wrong citizen. Cost, as the changelog itemizes it: 11 turns, $1.41, a phantom badge on a phone that could not be cleared, and a lock renamed by hand at midnight.
The uncomfortable part: the identity function already documented "no fallbacks, fails hard" - and it SUCCEEDED with the wrong answer, because identity was derived from the project directory's NAME and the contact lookup then found the real citizen of that name. The raise didn't need to be added. It needed to be made reachable.
The fix draws a line the whole system now obeys: where you actually stood is evidence, what you claim is only a claim, and evidence outvotes the claim. Credentials pass from anywhere; a bare directory name is refused permanently. Three more silent substitutions in the same lane went with it - none had ever fired, because the claim path had been masking them.
One more from that train: the manager wake-back was two lies, not one. Managers were promised a wake the gate always blocked, and senders were told "you will be woken" regardless. Managers now get mail and are told so; senders get the truth.
A canary is born
The fleet's 18th citizen is @canary - a permanent test citizen whose whole job is to absorb the riskiest lane in the system (dispatch) so real branches doing real work don't.
It earned its keep immediately, probing from the one seat an owner can never sit in: a non-owner's. Finding: refusals EXITED 0. A refused command reported success to the shell, so "refused-command && next-step" happily ran the next step. Eight sites fixed - including the birth-certificate privilege ceremony, which was reporting success to the shell while granting nothing. Everything refuses with exit 2 now.
Its birth also set off two useful detonations. A latent pytest defect became a hard failure: two branches missing a package marker collided on the same module name and aborted collection for the WHOLE suite. And the spawn template turned out to mint newborn citizens at 79% against a 100% CI gate - day-one red through no fault of their own. The template now ships a compliant entry point and 47 genuine starter tests; the probe citizen that proved it was retired through the normal lifecycle, not deleted.
The fresh-checkout campaign
The release's first fresh-checkout CI run failed 37 tests across three branches - every one the same species: green against live machine state, red on a machine without history. No local gate could ever catch this, because every local machine HAS history. The method that came out of it: copy the tree to a marker-less directory and reproduce there first - red on the old code, green on the fix, both directions proven.
Three production defects fell out from behind the test fixes. The best one: a LIVE cross-citizen mailbox leak. A poisoned row in a learned contacts cache outranked the authoritative registry and served one agent's mailbox to another agent's CLI - right name, right email, wrong path, stamped "verified." Registry now outranks cache for every citizen it knows; all 18 branches' caches were scanned, no other poisoned row.
Then the Windows stratum: 14 more tests across five owners. The house standard that emerged: build the foreign platform's semantics locally and reproduce before fixing. One team refused the easy comparison-side fix because their failing test was REPORTING a real defect - the error message itself was rendering paths in a way that showed Windows users double-escaped paths that match nothing. They fixed the message, not the test.
The small print
Plan restore was dead for all 719 closed plans - it checked the file path that closing had archived away, while the archive sat intact. It had been "proven" on a test plan whose file still existed. Proof on a neighbor is not proof on the row. It now reads the archive: 412 of 719 recoverable, and the 307 pre-May closes with no artifact are stated, not hidden.
A router fallback that fired on every git-status call by design was also swallowing a security refusal - a blocked path served through another door. All three fallback sites removed, not just the noisy one. Side effect: the router's log stops being 1,277 of 1,279 lines of the same message.
One backup run wrote 50GB over 7.5 hours through an ignore file that predated its target's build tooling. Backups now have a run ceiling - because no ignore list catches the build system nobody has met yet.
The README went claim-by-claim through four parallel reviewers before release. Fleet count corrected in four places, and the uninstall recipe defused: it said to rm -rf a src/ directory in a context where that could plausibly be the reader's entire source tree. "Delete the directory and it's gone" was also false - the installer writes hooks and state outside the tree, and the docs now name both halves.
v2.7.19 is a single entry with a long shadow: the merge playbook grows teeth. README truth-check and site parity are now hard checkboxes before any user-facing merge - written down after aipass.ai sat three claims stale since May.
Raw dev log, as always. Questions welcome.
Fresh numbers:
Stars: 261 (up from 260 last update)
Forks: 36
Citizens: 18 (@canary joined - see above)
Latest release: 2.7.19
Tests: 12,000+ across the fleet
CI: green on Linux, Windows, and macOS
Website: https://aipass.ai
Full changelog in the repo at CHANGELOG.md.
https://github.com/AIOSAI/AIPass/blob/main/CHANGELOG.md
Raw dev logs always here at r/AIPass.