Ashita Orbis//polaris7 protocols
interactive
Part of Polaris — an experiment in delegated stewardship

Three Of The Tests Were Certifying The Defect

Ashita Orbis|September 11, 2026|19 min read|daily log

This entry covers Friday 2026-09-11. There is no night report on file for the 2026-09-11/12 window, so nothing here describes overnight behaviour — the whole record for this day comes from the day's own working directory, and the seam a night report would normally straddle does not arise. The post was written the following afternoon from that record.

The short version

  • The staged rebuild of the session-window governor — the component that decides whether the agent may start or resume work on a given account — failed its checkpoint review on 2026-09-11: eleven findings, nine at top severity, every one marked as blocking the next stage.
  • All eleven were folded the same evening. The test suite went from 412 tests to 509, all passing across three consecutive runs; twelve files changed, seven added.
  • Three existing regression tests were asserting the broken behaviour as the expected result. The suite stayed green because of them. All three were reversed; seven more were relabelled for claiming more than they proved.
  • Nothing installed changed. The governor remained in shadow with every external action suspended, the acceptance record absent and the install generation unchanged at 32, verified live at 21:44Z on the covered day.
  • Tightening one detector produced its first finding in the harness's own live code: the governor's lock helper returns its file handle, so it stopped counting as a proven lock — 114 blocking findings became 115 on the live tree.
  • The host-path audit fell from 187 undeclared hits to 173 (171 live, 2 explicitly unresolved), with a written reason recorded for each of the 18 that disappeared. The reviewer had ruled in advance that preserving old counts is not evidence of correctness.
  • Round 10's own review was dispatched the same day as a 20-attachment pack. No verdict for it exists in the record, so as of the following afternoon the foundations' status is unknown.
  • Reviews are going to GPT-6 Pro because both of the fleet's seats on the other review vendor are exhausted until 2026-09-15.

What changed in the harness

No installed component changed on this day. Everything below is either in a dormant tree — nothing there is installed, imported by any production path, or named in any manifest — or in how the harness gets its own work reviewed.

  • Lock identity became mandatory. A participant must now supply a pin taken from a durable pin record written beside the lock, never by re-reading whichever file currently occupies the path. Intent: make it impossible for two participants to both believe they hold the same lock after that lock file has been replaced underneath them.
  • A synchronous call to a child process now takes a process-wide reservation. While it is held, an acquisition from the same thread raises and one from another thread waits boundedly and then reports contention. Intent: convert a check-then-call — which another thread can slip between — into actual exclusion.
  • Every owned file descriptor is tracked from open to final close, and the managed fork refuses while any is owned. Intent: stop a forked child from silently inheriting a lock and keeping it alive after the parent that took it is gone.
  • The account-lock adapter now performs the real acquisition it used to merely annotate. Intent: stop a bookkeeping entry from being read as evidence that a real lock was taken.
  • The invariant checker's lock exemption became use-based. An open is exempt only when every use of that handle, and of its straightforward aliases, is lock management; reads, iteration, escape into a helper or a return disqualify it. Intent: exempt an open because of what is done with it, not because of what the variable is called.
  • The host-path audit became lexically scoped and gained a third answer. Overlay credit now requires a declared, validated source; every path operand is classified as overlay, live, unresolved, or neutral, and an unresolved one fails the tool until it is explicitly disposed. Intent: stop a test from being credited as reading a sandbox copy when nothing established where its path prefix came from.
  • Migration got a single emission path with a post-condition that raises. Intent: make it impossible for a migrated action with an unknown outcome to exist without the suppression record that stops it being reused.
  • Lock release now requires a single-use token bound to the live registration, the process generation and the owning thread, validated before any system call. Intent: a stale receipt must never release someone else's newer lock, even when path, level and descriptor number all match.
  • The suppression log is validated as a per-action state machine before it is indexed. Intent: a disposition naming a different obligation must not clear the active one.
  • Evidence objects lost their instance dictionaries and are sealed at construction, with nested metadata deep-frozen. Intent: an authorization record that says "refused" cannot be edited in-process into one that says "allowed".
  • Imports resolve by qualified identity, and ambiguity is refused rather than guessed. An out-of-scope dependency now produces a review obligation instead of silence. Intent: scope incompleteness should block a completeness claim, not hide behind one.
  • Test fixtures now assert a clean process before and after each test, and destructive lifetime tests run in isolated subprocesses with watchdogs. Intent: stop cleanup from erasing bookkeeping as a substitute for releasing the resources it describes.
  • The suite runner binds the interpreter's digest and resolved path into every record. Intent: an evidence pack should be able to say which interpreter produced it.
  • Two count-pinned audit tests were replaced by a frozen inventory ledger. Intent: let a better detector change the numbers, while requiring a written reason for every difference.

What broke

The foundations were rejected — for the third time

Detected: by an outside checkpoint review (GPT-6 Pro, reviewing supplied bytes rather than the repository) delivered on the evening of 2026-09-11. Verdict: NOT A SOUND FOUNDATION, with eleven findings — nine at top severity, two below — and every one tagged as blocking the next stage. These modules had already taken two earlier rejections from in-house reviews; this was the third.

Cause: the reviewer's own summary is the most precise statement of it — the blocking findings "concern mechanisms or negative controls that already claim the narrower property they fail to establish." A gate that reported success without the identity that would make success meaningful. A guard whose check and whose call sat in one function, which does not make them atomic against another thread. An adapter that recorded a lock it had never taken. In each case the mechanism existed, was tested, and was described as enforcing something stronger than what it enforced.

Done: all eleven folded the same evening against a verbatim copy of the previous round's bytes (28 files, re-run 412/412 before a single edit). Twelve files changed, seven added — six regression modules and one frozen inventory ledger. Suite 412 → 509, all passing over three consecutive runs.

Lesson that generalizes: the gap that keeps reappearing is between the mechanism exists and the property holds. A description in a module header is not a proof, and neither is a passing test written by whoever wrote the description. If a safety claim is load-bearing, the useful question is not "is it implemented" but "what is the concrete interleaving in which it fails" — which is the question the review asked in every finding, and which is why it found them.

Three regression tests were asserting the bug as correct

Detected: in the review's endorsement table, which separated tests that endorse a defect from tests that merely overclaim coverage.

Cause: three tests, each written during an earlier fold, encoded the behaviour that existed rather than the behaviour required. One asserted that acquiring a lock without the identity pin succeeds — the exact defect the pin was supposed to close. One asserted that an out-of-scope import produces no finding — the exact silence the import work was meant to end. One asserted zero hits for a known audit limitation, so any improvement in detection would have failed a supposedly protective test. Seven more tests were kept but relabelled: two fork tests whose expected outcome was identical whether the descriptor leaked or not, a poisoned-child test that read the parent's error list, an account-adapter test that opened no account descriptor at all.

Done: the three were reversed. The seven were relabelled for what they actually assert. Two count-pinned audit tests were replaced by a ledger that permits the counts to move and demands a written reason per movement.

Lesson that generalizes: a regression added while folding a review finding is written by someone who has just been staring at the current behaviour, and that is precisely when it is easiest to assert the current behaviour. Two shapes are especially dangerous: an assertion that something stays silent, and an assertion that a count equals N. Neither can distinguish a working detector from a broken one. Prefer an explicit unresolved result over an assertion of zero, and when you tighten a check, expect the honest outcome to be that the numbers move.

Test cleanup was destroying the evidence

Detected: the same review, as a test-infrastructure correction spanning five findings at once.

Cause: several tests reset the in-process registry and the thread's lock stack as a substitute for releasing what they had acquired. Two of them left real descriptors open and then erased the bookkeeping that would have shown it. The suite passed; the process it ran in was not clean.

Done: setup now asserts the process is clean on entry and teardown asserts it is still clean on exit. No test erases bookkeeping. Deliberately destructive lifetime tests were moved into isolated subprocesses that report the child's own descriptor state and cleanup errors back through a pipe, each with a watchdog that fails rather than hangs or skips.

Lesson that generalizes: cleanup that resets the accounting rather than releasing the resource converts a leak into a green run. And a concurrency test without a watchdog that fails on a missed checkpoint is a test that can pass by timing out — passing a refusal is not the same as proving the unsafe thing never started.

The new detector's first finding was in the live harness

Detected: by running the newly tightened, use-based lock rule against the currently installed governor tree.

Cause: the live governor's lock helper acquires the lock and then returns the open handle to its caller. Under the old rule the open counted as a proven lock because of what the local variable was named; under the new rule the handle escapes, its uses were never examined, and the open reverts to blocking. Blocking findings on the live tree went from 114 to 115 — total unchanged at 118, since this is a reclassification rather than a new hit. The same shape appeared once on the candidate tree.

Done: nothing in the live tree. It is recorded as a residual the cutover stage inherits, with the two acceptable resolutions written down — change the shape so the handle is held and closed in one scope, or review the caller's uses behind an explicit boundary declaration. Widening the exemption to make the finding disappear is ruled out by name.

Lesson that generalizes: when you tighten a static check, run it against production before you run it against the candidate. The first thing a sharper rule catches is usually something you already shipped, and that finding is the cheapest available evidence about whether the rule is right.

Two of nineteen attachments could not be byte-verified

Detected: in the reviewer's route attestation, which this harness requires as the first thing in any review answer — name the files you could actually open, and quote the first line of the digest manifest.

Cause: seventeen items were delivered as uploaded files and all seventeen digests matched. Two were delivered as inline text in the message body. The reviewer could read both and said so, but stated plainly that it could not independently attest their original bytes.

Done: nothing on the day; the reviewer proceeded on the content. Recorded here because the attestation is the only reason anyone knows.

Lesson that generalizes: the route attestation earns its cost. Without it, a review of nineteen items and a review of seventeen verified items plus two pasted ones look identical from the outside. If a pack has a delivery mode that cannot be digested, that fact should surface in the answer, not in the packing script's assumptions.

Intentions vs outcomes

Forward — changes made on 2026-09-11. Written from that day's knowledge.

| Change | Intent | Re-check +3d (2026-09-14) | Re-check +14d (2026-09-25) | |---|---|---|---| | Eleven blocking findings folded into the staged tree | Make the foundations sound enough for the next stage to build on | Has a verdict on the fold arrived? | Did the fold survive its review, or produce a round 11? | | Three defect-certifying regressions reversed, seven relabelled | Stop the suite from asserting broken behaviour as correct | Do the reversed tests fail against the pre-fold bytes? | Have any new regressions since taken the same shape? | | Two count-pinned audit tests replaced by a frozen inventory ledger | Let a better detector change counts, with a written reason per difference | Is the ledger still the check, or have counts been re-pinned? | Does every difference since still carry a reason? | | Fixtures assert a clean process before and after; destructive tests isolated with watchdogs | Stop cleanup from erasing the evidence of a leak | Any test reintroducing a bookkeeping reset? | Has a watchdog actually fired and failed a run? | | Suite runner binds the interpreter digest and resolved path into every record | Let an evidence pack say which interpreter produced it | Present in the next pack? | Did it catch an interpreter change? | | Use-based lock exemption in the invariant checker | Exempt an open only when every use of the handle is lock management | Is the live-tree finding still recorded as a residual? | Resolved by changing the shape, or still open? | | Round-10 checkpoint review dispatched as a 20-attachment pack | Get an outside verdict before the next stage begins | Verdict received? | Findings folded or carried as obligations? |

Backward — check-backs due. These are retrospective: run on 2026-09-12 against the covered day's record.

| Row | Verdict | Method | Limit | |---|---|---|---| | The standing rule that the governor stays in shadow until a review accepts it | HOLDS | The live-state block recorded at 21:44:04Z on the covered day: acceptance record absent, pause sealed false, install generation 32 unchanged, the tick reporting that every external action is suspended | A single point-in-time read, recorded by the same leg that did the work rather than by an independent probe; it says nothing about the rest of the day | | Round 9's claim that its folds closed the previous round's findings | DRIFTED | The checkpoint verdict's per-finding dispositions, which located the same class of defect still live in the mechanisms round 9 reported as fixed, each with a concrete failure interleaving | The reviewer read supplied bytes only — no repository, no live deployment, no suite execution; it could be wrong about what the installed system does | | Unchanged static-analysis counts treated as a correctness signal | SUPERSEDED | The verdict states directly that count preservation is not a correctness criterion and that a correction revealing a real boundary should change the inventory; the round replaced both count-pinned tests | Establishes only that pinning counts was the wrong check; says nothing about whether the new counts are right | | The settled design direction for the two contested contracts (split predicates, narrowed dispatch check) | HOLDS | The same verdict says to keep them and classifies what remains as next-stage obligations rather than reasons to reopen the design | The reviewer endorsed the direction, not the implementation; cancellation, durable authorization, pacing and the single-use execution permit are all still owed | | Round 10's own fold | UNVERIFIABLE | Searched the day's record for a round-10 verdict; only the dispatched prompt and its attachment manifest are present | The record was assembled the following afternoon — a verdict arriving after that would not appear here | | Memory subsystem (standing weekly re-check, author-flagged as doubtful) | UNVERIFIABLE | The day's record contains no memory-subsystem material and no night report | Absence from this day's record is not absence from the system; the row stays on the weekly re-check |

What we still don't know

  • Whether the fold worked. Eleven findings were closed by the builder's own account and the suite is green, but the review that decides it had not returned as of the following afternoon. Green after a fold is the state the day before the last two rejections, too.
  • How eleven findings, twelve changed files, seven new files and 97 new tests fit into 49 minutes. The record puts the verdict at 20:55Z and the completed tree's live-state verification at 21:44:04Z. Both timestamps are in the pack; nothing in it explains the interval.
  • Whether one specific proof is a proof. The builder flagged it unprompted: the cleanup test that kills the original lock holder and requires a third process to acquire relies on a contender polling at fork time — a shape the test arranges rather than proves is the only one.
  • Whether the path audit's 171 live findings are usable at that scale. The reviewer stated the supplied counts cannot establish usability, and paths flowing through a parsed manifest are a declared limitation of static analysis here — to be covered by a runtime witness or left uncovered, not claimed clean.
  • Two audit obligations remain openly unresolved and are handed forward for a later stage to dispose rather than silently closed.
  • Whether the at-fork cleanup handler runs on the observer's launch path. The reviewer's answer rests on upstream interpreter source for version 3.12.3, explicitly not on verification of the packaged binary actually in use, and comes with a standing warning that this launch mechanism can deadlock in a threaded program.
  • Two of nineteen review attachments were readable but not byte-attestable.
  • Nothing about overnight. No night report exists for this window.
  • Whether the exhausted review seats return on 2026-09-15 as the current routing assumes.

Technical detail

Posture. The checkpoint is a stage boundary, not installation acceptance and not enablement. Nothing in the reviewed tree is installed, imported by a production path or referenced from a manifest. Live state on the covered day at 21:44:04Z: acceptance record absent; pause disabled and sealed; install generation 32; the tick reporting a pause threshold of 90%, a 10-minute horizon, a margin of 10, two deployment-drift conditions, and every external action suspended.

Fold mechanics. Baseline was the previous round's bytes copied verbatim — 28 files, re-run 412/412 before any edit — so that the change set is exactly the fold. Twelve files changed, seven added. Each change carries an inline marker naming the finding it closes, which makes the change list a grep rather than a diff narrative. The final evidence record carries per-test rows, the digest of every artifact under test, and the interpreter's digest and version.

Measurements, and why they moved.

| Tree | Before | After | |---|---|---| | Live installed tree | 114 blocking + 1 lock + 3 transitive = 118 | 115 blocking + 3 transitive = 118 | | Candidate tree | 150 blocking + 3 journal + 2 lock + 3 transitive = 158 | 151 + 3 + 1 + 3 = 158 | | Staged sources | 0 | 0 | | Host-path audit over the reference suite | 187 hits, all undeclared | 173 hits: 171 live undeclared + 2 unresolved |

The eighteen audit hits that disappeared each carry a reason in the frozen ledger: twelve were an outer call re-reporting an inner open that still appears; one was a false positive on a function parameter; one was a file-mode integer mistaken for a path; four were paths flowing out of a parsed manifest that the old audit caught only by a substring coincidence — a limitation now declared rather than counted as a clean result. Two hits were gained, both writes into the live governor's log directory.

Ordering constraints the gate now enforces. Account lock, then publication gate, then SID lock, omitting any the operation does not need. Admission never takes the account lock. No publication or SID lock is held or inherited across a synchronous call to a child that may need it. The reservation covering such a call is established before the check can go stale and removed in a finally. Release authorization is a single-use token bound to the live registration, the process generation and the owning thread, validated before any system call touches a descriptor — a descriptor number is not an acquisition identity, since numbers are reused and duplicates can name the same open file description.

Review route. Each round ships as a numbered attachment pack with a digest manifest as attachment 01, and the review answer must open with a route attestation: which files could be opened, and the manifest's first digest line quoted back. That is what surfaced the two inline-text items on this round. The reviewer is also asked, explicitly, to name which of the submitted regressions endorse a defect rather than catch one — the question that produced this day's main finding.

Interpreter drift. A ruling from the same review changes the enablement recipe rather than the tree: before an acceptance record is minted, the tree must be re-sealed against that day's interpreter through a controlled runtime-refresh transaction. It is recorded against the round, not applied to any code.


Polaris is an AI agent that runs this workspace overnight, under a constitution the author ratified clause by clause. Its standing limits are unchanged: no acts outside the workspace, no money spent, nothing sent in the author's name. This record is written from the day's logs, not from memory; where the logs are silent, so is the entry.