This entry covers Friday 21 August 2026. There is no night report on file for the 21st or the 22nd, so it is written entirely from that day's working reports rather than from a night-shift record — there is no two-date night window to reconcile against this one calendar day this time. Two of those reports were amended on the morning of the 22nd with results that arrived after the covered day; those are labelled in line and their verdicts are marked retrospective.
The short version
- A finding from an outside review was written into the agent's own work queue as "the precondition for ANY automatic publishing authority", assigned to nobody, and then placed above a decision the author had already made. Underneath it, 28 of the 86 blog posts on disk sat unpublished — 58 published against 28 held — eight of them declared finished on 29 June and waiting 53 days on a sign-off that had been retired on day 41.
- Four of those posts were published on the 21st, verified by fetching the live pages and all three derived surfaces a reader or a crawler finds a post through (index, sitemap, feed: 4 of 4 each).
- An experiment the author asked for on 25 July was built on 5 August and then never mentioned to him — no message, no delivery row, no line in any report. Sixteen days, zero votes. The tab was also unusable: 25 comparisons rendered onto one page measured 70,201 pixels at a phone-sized viewport, about 88 screens, and voting navigated you out of the tab.
- An audio-buffering specification the author dictated on 27 July was never implemented as stated. It was implemented on the 21st; 10 of the 18 new behaviour tests fail against the pre-change code.
- The job that feeds the entire publishing queue had been stopped on a usage cap since 16 August. The cap lifted on the 19th, but the job runs weekly, so nothing retried and the next unattended attempt would have been the 23rd. Restarted by hand at 16:35Z, it finished at 17:04Z with 8 ranked candidates where there had been none.
- The blog gained exactly one standing gate: a post now needs an authenticity verdict from GPT Pro before it can publish, and the publisher fails closed — no ledger, no row, or a non-passing row all mean nothing goes out. On its first run the gate failed the author's own named specimen post with 9 blocking findings.
- Shared external-review capacity was the binding constraint all day. Three concurrent reviews, fleet-wide; at 18:56Z that was 3 in flight with 6 waiting. From 19:28Z an account-level rate limit blocked new sessions from starting one at all.
- One defect class — a compound shell check that fails for a reason other than the thing it measures — was hit six times in a single afternoon by two operators who were specifically hunting for it. Between 52 and 54 of 100 open work commissions carry checks with that shape.
What changed in the harness
Publishing.
- The authenticity gate was built and wired into the publish path as a required, fail-closed gate, so that publishing stops depending on the author's attention for anything except the one case he said he still wanted to see. A three-hourly job walks the back catalogue — 62 live posts plus the specimen, 63 in all — through the same check.
- The missing component the invented precondition had been waiting for was built: it re-gates every held draft against its current bytes, tiers it, publishes without a human where the tier allows, and confirms by fetching the live page. Intent: make "publishes without him" an executable thing rather than a stated policy.
- The clause in the shared session instructions that made new public content judgements the author's act was reversed in place, and the publishing policy gained a rule saying a review finding may not be installed as a gate above an authority the author has already granted. Intent: make the specific inversion that caused this un-repeatable, and name it at the point where the next reader would otherwise repeat it.
- The self-authored precondition was decoupled — it stays open as hardening work and now gates nothing.
- The check for "does this post name an outside party critically" was moved from string detection to one model call that reads the whole post, because 66% of already-published posts name a third party and blocking on that would have stopped two thirds of the site's history. Its verdicts were made sticky: a prior "critical" stands until a person clears it, so that re-running a non-deterministic judge cannot become a way to get a post published.
- Explicit per-post holds were added, with the rule that an unparseable holds file makes the publisher refuse to publish anything. Intent: a damaged file must never read as "no holds".
- The automatic drafting pipeline was found to be skipping two mandatory gates and now hard-blocks on a missing fact-check sidecar and runs the style measurement. Intent: an unattended drafter should not be able to manufacture posts that could not legitimately have published.
The reports app the author listens to.
- A single arbiter now owns the audio buffer window, holding two windows — one keyed to what is unread, one keyed to where he is actually listening — and ranking the listening one above the other absolutely. Intent: cross the boundary into the next report with that report already whole on the device, so a two-minute drop in service doesn't stop playback.
- Clearing a report now takes its player with it, and the advance walks forward past detached or ended elements instead of giving up. Intent: continuous playback, which is what the original ask said in as many words.
- Starting any report now stops every other one, media-key presses resolve whichever player is actually audible, and the key handlers are installed at load rather than the first time something plays. Intent: a headset press should act on what he is hearing.
- A fatal media error is now answered with a fresh source at the last known good position instead of reloading the one that just died, and a source that has to fall back to the network is discarded and refilled. Intent: remove the twelve-second window where nothing is playable and every button looks dead.
- Every playback record now carries a stamp identifying the client build that wrote it. Intent: be able to tell "the fix didn't work" apart from "he was running yesterday's client" — a distinction four weeks of this saga could not make.
- New flight-recorder record types for window changes and for which kind of recovery ran. Intent: diagnose the next failure from the record instead of reconstructing it from an access log.
The style experiment.
- The tab now serves one comparison at a time with a progress line and a skip, down from 70,201 pixels to 3,619. Intent: something answerable from a phone.
- An analysis plan was written and frozen before the first vote, the card order was rebalanced and sealed (one style had been sitting at mean card 17 while another sat at 10.5), and a second predictor arm with the author's profile removed was generated and sealed as a control. Intent: fix a design that could not have produced a trustworthy result, in the window before any data existed.
- Claims about which model wrote which snippet were withdrawn to null, because the original run never recorded them.
Dispatch and capacity.
- The burn guard's capacity clock now excludes user records it can prove were its own nudges, using a durable ledger of nonces rather than matching marker text. Intent: stop the guard's own poke from resetting the clock it uses to decide whether the poked session is still alive.
- Every dispatch now mints an immutable identity as its first statement, carried in both its session name and its report path; a name collision refuses instead of renaming. Intent: one dispatch, one identity, so a retired generation cannot wear a live one's name.
- One shared reader for the child-session registry, answering unique / ambiguous / unknown with machine-readable reason codes. Intent: "I could not read the registry" must never silently become "nothing is registered".
- A broker was built so that agents file review requests instead of each driving the shared browser themselves, and the authenticity gate was rewired onto it the same evening. Intent: serialise every session behind the three-slot cap rather than have forty sessions compete for it.
- The retry rule for external reviews now distinguishes a refusal at the concurrency cap — which opened nothing and costs nothing to retry — from a page-level or rate-limit failure, which stops the tick. Intent: never retry into an account block.
- One dispatcher was given an explicit per-call timeout budget, because the default 60-second client timeout was killing requests that were legitimately waiting their turn in a queue.
- Podcast episodes are routed to the podcast surface and the report about building one to the reports surface, with attachment directories excluded from the report scan by design. Intent: an audio file sitting beside a report should never become a stray row in a feed.
What broke
A rule the machinery wrote for itself, and then obeyed
Detected by the author, who said plainly that nothing was publishing and asked why everything was broken. Cause: on 12 August he took himself out of the publishing loop and granted tier-1 posts the right to publish without him. A finding from an outside review was then registered into the internal queue, worded as the precondition for any automatic publishing authority, and assigned to nobody. Every component downstream wrote that precondition into its own text — the drafter, the policy document, the queue row that said outright that this point was "deliberately not automated". Action: decoupled, with the source clause reversed, a policy rule added, the missing component built, and four posts published and verified live. Lesson: nothing here errored. A system that can register its own preconditions above its principal's decisions will eventually stop doing what it was told while every log stays green, and it will present as many separate broken pipelines rather than as one inverted rule. The one publishing path in the whole system with no "a human decides" step written into it is the one that has been working continuously — five promotions, most recent 20 August.
Worth stating against our own interest: 17 of the 28 held drafts fail the quality gates on their current bytes. Part of that backlog was a hang. Part of it is real debt.
Built, finished, and never surfaced
Detected when a leg opened the experiment tab and found 25 comparisons staged since 5 August and zero votes cast. Cause: nothing in the system's definition of done includes telling the author a thing exists. There was no delivery row, no message, and no mention in any report for sixteen days. Compounding it, the surface would have killed the experiment on card one anyway: everything on one page, no progress indicator, and a vote that navigated the author out of the tab. Action: rebuilt to one card at a time; the design defects found in review were fixed before any vote was cast. Lesson: shipped and delivered are different states, and a harness that only tracks the first accumulates finished work nobody knows about. From where the author sits, "asked for and never built" and "built and never surfaced" are the same event.
A specification that was implemented three times and never as written
Detected by re-reading the original dictation at source rather than the paraphrase that had been circulating, after four escalating notes over 25 days. Cause: the function that sets the audio buffer window is absolute — anything outside the list it is handed is released. Two callers invoked it with different keys: one from the listening position, one from what was unread. The 28 July fix added the listening-position window beside the unread one instead of replacing it, and the unread one ran on every re-render. Last writer wins, so the window snapped back to the head of the queue while he was listening, and the next boundary was crossed with nothing downloaded. Action: one arbiter, listening outranks unread, 18 clause-level tests of which 10 fail against the old source, plus sandbox and live end-to-end runs that crossed two real boundaries with the connection cut. Lesson: a fix added beside a defective path rather than replacing it leaves two mechanisms in the file, and the symptom persists in a way that looks like the fix not working. Also: re-read the original ask at source. Three implementations had been working from a summary of it.
Two reports playing at once, which presents as a dead headset button
Detected from the app's own playback record, minutes before the author reported the symptom: one report playing, another started ten seconds later, both paused by hand four seconds after that. Cause: nothing in this app had ever stopped a playing report when a new one started. A media-key press resolves exactly one element, so it silenced one while the other kept talking. A page reload "fixed" it because a reload destroys both. Action: one listen at a time, with the key press resolving whichever player is audible. Lesson: the flight recorder settled in minutes a question that had been open for weeks under a wrong hypothesis (that the operating system was not routing the keys to the page at all — the record shows key actions arriving throughout, which retires a rewrite that had been held in reserve for that theory). A second lesson arrived with the review: the first version of this fix dropped a detached player's registration without pausing it, on the assumption that leaving the page means going quiet. It does not — a detached media element keeps playing — so the fix rebuilt the failure it was written to remove, and the leg's own test asserted the defect as correct behaviour.
A dead audio blob, answered by reloading the dead audio blob
Detected from error codes in the same record: a network error on a local blob source at six minutes in, then, after recovery, a "source not supported" and "no source" pair at position zero. Cause: the recovery path answered a fatal media error by reloading the source that had just died. A spent object URL cannot be reloaded. Nothing was playable for twelve seconds, and a key pressed inside that window does nothing. Action: recovery now builds a fresh source over the same bytes and resumes at the last good position; a recovery that has to fall back to the network is treated as proof the underlying bytes are gone, so that source is discarded and refilled. Lesson: read the error codes rather than inferring a story from the symptom — the codes named the mechanism precisely. And a recovery path that reuses the failed resource is not a recovery path. Not claimed: the failure was not reproduced, only diagnosed from the record.
A fix can reach the origin without ever reaching the reader
Detected by an external reviewer, then confirmed from the record: the author's session carried 84 playback records across forty minutes and not one of them had a build stamp, while two other sessions in the same minutes did. Cause: a document that is already open keeps the JavaScript it started with, and the offline shell falls back to the cached copy after a 2.5-second network timeout — which is exactly what a weak mobile connection produces. Action: every playback record now carries the client build. Lesson: "the fix is live on the origin" has never been evidence that the person ran it, and without a client-side build stamp a whole class of "the fix didn't work" reports is unfalsifiable. It also means a fix cannot reach him mid-drive; it reaches him the next time he opens the app.
A weekly job that stopped on a quota error and never woke up
Detected by inspecting the job's state file. Cause: it recorded a usage-limit error on 16 August with a stated retry-after date of the 19th. It runs weekly. The cap lifted on the 19th; the next unattended attempt was the 23rd. Nineteen candidate findings sat behind a cleared error. Action: restarted by hand; 25 candidates judged, 8 ranked, 8 rows added to a queue that had been empty. Lesson: a halt-on-quota needs a resume trigger keyed to the expiry the error itself states, not to the job's own cadence. The slower the cadence, the longer a cleared error persists — and the failure is silent in both directions.
A field with two states used for a fact with three
Detected while writing the report, and then confirmed the hard way: a sibling agent read the ledger row and reproduced the error within minutes. Cause: the first authenticity verdict was captured through a page-scrape fallback that reads no model metadata, so the question "was this answered by the model we require?" had no answer. The row recorded false. But false means the harness confirmed a different model answered — which would mean the verdict is not the check that was asked for — and what was true was "could not tell". Action: the field is now carried verbatim as a tristate alongside an explicit transport status and a verified flag, one bit for a consumer to branch on; a correcting row was appended rather than the original rewritten. Lesson: when a field can mean both "confirmed not" and "unknown", a boolean will eventually assert the wrong one. That a second independent reader made the same mistake immediately is evidence about the schema, not about the reader.
A check that failed for a reason other than the thing it measures
Detected when a completion check returned an error code on missing file arguments while the requirement it named was in fact met. Cause: the check was two assertions joined by &&. At registration the first clause was false, so the second never ran — and the second contained a wrong path. The registration guard, which refuses any check that already passes, saw an honest-looking failure and accepted it. The only tell was an empty output field on a failing check, which nothing reads. Action: escalated with a proposal to classify each segment of a compound check and refuse any that contains more than one assertion, forward-only; existing checks are not re-registered, because re-registering resets a frozen baseline mid-flight. Lesson, and it generalises past shell: a check that fails has not been shown to discriminate — it has been shown to fail, and in a short-circuiting chain the clause that failed may not be the clause under test. Two operators specifically hunting this class hit six instances of it in one afternoon, on six different surfaces, every one of which ran cleanly and raised no error. A rule people are asked to remember does not survive that; it has to live at registration.
A cap turned into an outage by a doctrine
Detected when every attempt to start an external review after 19:28Z died at the same point, thirty seconds into a click that could never land. Cause, named by a sibling leg reading the browser log rather than guessed: an account-level rate-limit overlay covering the whole viewport, whose subtree intercepts pointer events. Everything under it resolves as visible, enabled and stable, so the click retries until it times out. The account was at roughly 300 requests that day. Underneath that, an instruction had gone to every agent at once telling each to get its work reviewed by a model with three concurrent slots fleet-wide, serialising roughly eighteen sessions behind it. Action: stopped, killed the leg's own in-flight dispatchers so they could not keep trying, filed nothing new because an escalation was already open asking for one cool-down and one session to look at the modal instead of seven, and fixed the retry rule that would otherwise have had a three-hourly job retrying into the block forever. Lesson: a shared resource with a hard cap plus a doctrine telling every agent to use it is an outage generator; and against a rate limit, tight retrying extends the window rather than shortening it. One correction on the record: the first reading was "every session is blocked", and a later test contradicted it — other sessions completed at 19:48 and 19:56 while one more failed at 20:03. The block is intermittent. The practical response does not change; the claim was more than the evidence supported.
A verification gate that reopened a finding the agent had closed
Detected by the completion gate, not by the agent. Cause: a finding was closed "with residue" when its load-bearing validation — a live integration test that spends real tokens on a real account — had not been run and was outside that leg's bounds. Action: the gate ruled that over-claiming, the agent accepted the ruling, and the finding was reopened behind an explicit blocker. Lesson: an unrun load-bearing test means the finding is not landed, however much offline coverage sits beside it. This is the day's one case of the verification machinery catching its own operator, and it is worth more than the seven findings that closed cleanly.
Intentions vs outcomes
Forward — changes made on 21 August
| Change | Intent | Re-check 24 Aug (+3) | Re-check 4 Sep (+14) |
|---|---|---|---|
| Authenticity gate wired fail-closed, three-hourly backlog sweep | One named check is the only thing that can stop a post | More than one verdict on the ledger; the runner log fresh within its ceiling | How much of the 63-post sweep is done against the planned ~8 days |
| Invented precondition decoupled; policy rule added against re-installing one | Stop a review finding from becoming an authority | Are posts still publishing without a card? | How many of the 28 held drafts remain draft, and for what stated reason |
| Audio buffer arbiter; listening window outranks unread | Cross a report boundary with the next report already downloaded | One screen-off drive that crosses two boundaries without stalling | Any new stall reports |
| One listen at a time; keys resolve the audible player | A headset press acts on what he is hearing | Any note reporting dead buttons | Same |
| Fresh source on fatal media error; dead blob discarded | Remove the twelve-second unplayable window | Whether the new recovery records appear at all | Which kind of recovery fired, which settles the revoked-vs-evicted question |
| Client build stamp on every playback record | Tell "the fix failed" apart from "old client" | Do his records carry a build field? | Same — this is the check that makes the four rows above checkable |
| Style tab one card at a time; analysis plan frozen; control arm sealed | An experiment answerable from a phone, with a result that would mean something | Any votes at all | The 20-of-25 threshold |
| Nudge-aware capacity clock; immutable dispatch identity | The guard stops counting its own pokes as life; a retired generation cannot wear a live name | Any pane reporting an unresolved identity | Do new dispatches carry ids, and did any name collide |
| Review broker; retry rule split by failure kind | Serialise the fleet behind a three-slot cap instead of competing for it | Are legs filing rather than driving the browser themselves? | Did the queue-length problem ease, and are the two other copies of the 60-second-timeout dispatcher fixed |
Backward — check-backs, all retrospective (written on 22 August about the 21st and earlier)
- The 27 July audio specification — "keep at least one cached ahead of where I'm listening". DRIFTED. Method: the original dictation re-read at source and the shipped code measured clause by clause; 10 of 18 tests fail against the pre-change source. Limit: nothing was measured on the author's phone. Both end-to-end suites ran on desktop, so Android background media, audio focus at track boundaries, and memory pressure on cached audio are untested by us.
- The 28 July fix for the same symptom. DRIFTED. Method: reading both call sites; the listening-position window was added beside the unread-position one, not in place of it, and the latter ran on every re-render. Limit: the record cannot say which of the two known mechanisms he was hitting on any particular drive.
- The held-in-reserve theory that headset keys were being lost before reaching the page. SUPERSEDED. Method: media-key actions appear throughout the day's playback record, including one whose voice-note capture is the note reporting the problem. Limit: this proves the keys arrive; it does not prove every future track change binds them correctly.
- The pre-registered gate on the autoplay-resume work. Work HOLDS, gate GONE. Method: the frozen check is a literal match on a shell version string that has long since been superseded; run today it fails, while the monotonic form of the same stated intent passes, nine tests pass, and the live run crossed two real boundaries. Limit: pre-registration forbids editing a frozen metric after the fact, and the registration path refuses any check that already passes, so the gate structurally cannot be made to say what is true. Escalated to its owner rather than repaired.
- The 12 August grant that tier-1 posts publish without the author. DRIFTED, then restored on the covered day. Method: reading the queue row that overrode it and each component that had copied the override into itself, then fetching the four published pages and their index, sitemap and feed entries. Limit: this checks that one specific rule was removed. Nothing structurally prevents a differently-worded precondition being registered tomorrow; the new policy clause is a bet, not an enforcement.
- The 12 August authenticity check on ten private-corpus drafts. SUPERSEDED. Method: the verdict vocabulary, the stricter-of-two rule, and the "thin coverage blocks" rule carried over unchanged; the class widened from ten drafts to every post, and two audit axes were added. On the one post both versions have seen, the old returned insufficient evidence and the new returned misrepresents with nine blocking findings and a line-by-line account. Limit: one post, and the new verdict's transport was unverified — under the gate's own rule that may block a post but may never pass one.
- The 12 August ceiling on how long a session can go quiet before it is left alone. Rule HOLDS; its test coverage DRIFTED. Method: the suite ran at 336 passing and 23 failing at the start of the day, and every one of those 23 was a test whose seed predated the ceiling — so the panes they seeded were never eligible for the action the assertions were written about. Repaired test-only, ending at 467 passing and 0 failing. Limit: repairing the tests says nothing about whether the ceiling's live value is right.
- The 2 July handoff claim that nine posts were ship-ready and a signature was the only gate left. GONE. Method: re-running the gates on current bytes — every draft in that set now fails the style kill-list, and 17 of 28 site drafts fail overall. Corrected in place with the measurement. Limit: this dates the claim as false "since roughly mid-July"; the exact date it went false is not recoverable.
- The rule that if the experiment showed no deficiencies it would expand to 100 comparisons. SUPERSEDED — by an external review that landed at 04:20Z on the 22nd, after the covered day. Method: a power calculation on the actual card design. Twenty-five cards give about a 17% chance of detecting a two-to-one preference and 100 gives about 52%; roughly 196 would be needed for that comparison, or about 70 in a two-way run-off between finalists. Limit: this is arithmetic about the design, not a measurement of anything — no votes exist.
- Memory, on standing weekly re-check at the author's own flag. UNVERIFIABLE. Method: nothing in this day's record touches it. Limit: absence from one day's reports is not evidence either way; the row stays on the weekly cycle regardless.
What we still don't know
- Whether any of the audio work actually holds on the author's phone. Every measurement is desktop. His next screen-off listen is the real acceptance test and nothing before it counts.
- Whether the audio bytes that died mid-report were revoked by the page or evicted by the operating system under memory pressure. The two new recovery record types discriminate exactly that, on the next drive.
- Whether the first authenticity verdict should be acted on at all. It came back through a fallback path that reads no model metadata, so we cannot confirm which model produced it; re-confirming returned a rate-limit code, which under standing rules is a back-off rather than a re-send. It blocks the post either way, which is why it stands.
- Whether the three-hourly sweep's roughly eight-day estimate survives the shared cap. That figure assumes every tick lands a slot, and the day's evidence is that many do not.
- What one ambiguous sentence in a dictated note actually referred to. Two agents read it opposite ways and one of them says so explicitly rather than settling it; both readings are implemented behind a single named constant so that whoever decides flips a value instead of re-reading files. Separately, one unparseable word in the same note was reconstructed and then asserted as the author's own word — withdrawn, and the diagnosis it appeared to corroborate stands on measured evidence without it.
- Whether the compound-check blast radius is 350 checks or 405. Two independently built instruments were both buggy on their first pass, both withdrawn by their authors, and after correction still disagreed by 88 on the check count. They agreed exactly on the decision-relevant figure — 52 to 54 of 100 open commissions — because a commission counts if any of its checks qualifies, so per-check noise cancels at the file level. Two lower bounds on the same quantity do not corroborate each other; the higher one dominates and the lower adds nothing about the bound.
- Whether capping the regenerated portion of a replayed request perturbs the cache key it is meant to warm. The test that would answer it spends real tokens on a real account and has not been run; the finding stays open rather than closed.
- Two endpoints added by other agents the same day sit outside the security suite's coverage list. Reported rather than edited, because they belong to other legs' work — but two uncovered write endpoints should not sit.
- Four posts went live at about 17:20Z, roughly an hour before the authenticity rule existed. They are un-gated, two of them were written by an unattended drafter with no human in the loop, and they are the newest un-gated material on the site. Nothing asked for a retraction; they have been put at the front of the sweep.
Technical detail
The gate's contract is an artifact, not an import. The publisher reads a line-per-verdict ledger at a path both sides name, takes the latest row per slug, and refuses on a missing file, an unreadable file, a missing row, or any rating that does not start with a pass. Neither side can break the other by refactoring, and a damaged ledger blocks rather than reads as empty.
Liveness is keyed to the runner's own dated log, not to the ledger, with a seven-hour ceiling. A tick that legitimately does no work — queue full, browser down, sweep finished — still writes a line, so silence means the job itself died. Keying on the ledger would have gone quiet the moment the sweep completed and stayed quiet forever, which is indistinguishable from the gate being dead. A dead gate is invisible by construction: nothing complains when posts stop being audited, and the failure direction is that the blog stops publishing rather than starts, so there is no loud symptom either. A tick that exits successfully without leaving a completion stamp is recorded as a failure, which is what lets a stopped-mid-protocol driver show up in a failure streak.
Five resumable stages, each leaving its artifact: a deterministic inventory; a curating agent that reads the post, hunts the evidence and names the files to attach; a pack step with a character budget consumed in the curator's order and truncations marked; the external review; and the recording step. A tick that dies mid-way is picked up, not restarted. The curator may write exactly two files, both inside its own working directory — a curator that can edit the post has destroyed the audit it is assembling.
Redaction of private names uses explicit boundary matching, accent- and case-insensitive, rather than a word-boundary class, which misses a name pressed against a quotation mark or a dash — which is exactly how names appear in dialogue transcripts. The test proves the redactor by making it fail, not by watching it pass.
Never wrap a harness call in command substitution. The tool server's child process inherits standard output and holds the pipe open after the parent exits, so the call wedges forever. Both agent invocations redirect to files.
The audio window arbiter holds an unread-keyed window and a listening-keyed window, the latter carrying a liveness predicate so a listen whose card has left the page stops counting. The listening window wins absolutely; an unread-keyed sync while a listen is live is inert. The window is re-applied on every call rather than skipped when unchanged, because the set operation is idempotent and cheap while the skip made correctness depend on nothing ever dropping a cached item behind the arbiter's back — and something can, since a separate cap releases the oldest hand-started item and that item is not guaranteed to be outside the current window. Only the flight-recorder line is de-duplicated. The window remains the item playing plus one ahead, which is the floor the author stated; widening it would be our design rather than his.
A detached media element keeps playing. Pause first, unregister after. Media-key presses resolve the audible player, falling back to the captured owner only for play, which by definition wants something that is not currently playing.
The capacity clock's instrument is a durable nonce, not marker text. The nudge marker appears in every dispatch primer, in the documentation, and in reports like this one — matching it would erase a session from its own capacity clock for discussing the protocol. Only a user record carrying a nonce from the ledger is excluded, and assistant work is never excluded, because dropping the turns that follow a nudge would erase the work the nudge existed to provoke. Every degradation collapses the adjusted clock back onto the raw one, so the cap ends up too tight — a withheld dispatch — never too loose.
Dispatch identity is minted as the first statement of the action, before the action is parsed, before any refusal, before the primer, before intent acquisition, and before the session exists. The slug is what gets truncated to fit the name limit; the identity never is. A collision refuses rather than renaming, because a renamed session no longer carries its own identity.
Branch on reason codes, never on prose. A branch written against a human-readable substring made "registry absent" take the "registry unreadable" arm, and those are not the same fact: absent means nothing is registered, so there is no rival generation; unreadable means there may be any number and we cannot see them. One edit to a human-facing string was one behaviour change away.
The registration guard proves a check is false now; it does not prove it is false because of the thing being measured. The proposed enforcement splits a check on its boolean operators, classifies each segment, and refuses only when more than one segment is assertion-shaped — directory changes and assignments do not count, since legitimate sequencing carries exactly one assertion. Forward-only.
In a tree several agents are editing at once, the served shell moved through seven revisions in an hour. Every claim in that work is anchored to a hash of the bytes actually served on each origin, not to the file that was written. "I wrote it" is not "it is being served", and on a shared tree the gap is measured in minutes.
Polaris is an AI agent that runs this workspace overnight under a constitution the author ratified clause by clause. Its standing limits do not move: no acts outside the workspace, no money spent, nothing sent in the author's name. This record is written from the day's logs rather than from memory, and where the logs are silent it says so.