Part of Polaris — an experiment in delegated stewardship

Nine Green Checks That Could Not See

Ashita Orbis | August 30, 2026 | 29 min read | daily log

This entry covers Saturday 2026-08-30. There is no night report in this record's night-report slot; a report dated 2026-08-30 sits in the day directory instead, and it covers the daytime of 2026-08-30 plus the small hours after midnight — its last logged item is a note at 03:30 and a fix that landed minutes before it was written. Everything below is from that record and the day's own reports, assembled the following morning.

The short version

  • A read-only audit read the contents of monitored jobs for the first time, covering 21 of the 123 monitored jobs that produce a file. Nine were passing every check while the content behind them was degenerate, stale, or partly dead. Two were correctly red. One passed its 50 KB floor comfortably while losing two-thirds of its usual size.
  • The worst case: one job has produced 133 reports since it began, and every single one of them selected the same project and the same action. Freshness, size, shape and provenance all pass; the artifact carries no information.
  • The daily public activity feed has failed to publish since 2026-08-22 — seven consecutive days, both attempts each day, all rejected by its own citation check. Roughly 30 minutes of generation is spent and discarded daily.
  • A scheduler that exists to notice when a long-running work program stops moving noticed nothing for 41 hours. Replaying the window through the corrected rule shows it owed an alarm on 212 of its 292 checks, the first one 35.3 hours before anyone looked.
  • It was silent because two finished agents' idle shell prompts still matched the pattern for "a worker is live" — 24.6 hours of apparent activity from two dead sessions.
  • That was fixed the same day, and then the repaired alarm was muted for six hours by the very test that proved it worked: two paused ticks reset a 249-tick count to one. The clock now runs on whether the work moved, not on how long one state has held.
  • The agent's memory index was silently dropping about 96 of its 241 entries before any session could read them. After repair a fresh session reads all 154 index rows, and all 241 memories are still stored at full length.
  • Two of three credentials exported in the shell profile were found written into roughly 34 lines across about 20 saved session transcripts. The third was clean and was deliberately not rotated. What echoes them into transcripts is still unidentified.

What changed in the harness

The stall alarm. The scheduler's escalation clock was re-anchored: it now measures time since the watched program last moved, not how long the watcher has been sitting in one state. Intent — no state change, no kill switch, and no newly-named session can reset the alarm's clock. The alarm's own proposal stream was keyed the same way, so flapping between states can no longer restart its three-tick confirmation. Intent — an alarm that has to repeat itself three times cannot be silenced by interrupting it every second tick.

Row evidence. Every logged tick now records the liveness determination it made and, for any proposal, what class of proposal it is (an action to dispatch, or a question to escalate). Intent — a reviewer can re-derive any row from that row alone, without knowing the design.

Memory index. The index was rebuilt against measured ceilings rather than an assumed byte cap, 88 entries were moved to an archive file at full length, and a new flag was added that means "live and correct, but not needed in every session's context" without lying about the project's status. Intent — a fresh session reads the index end to end, and nothing is quietly cut off the bottom. Supporting fixes: the tool that writes the index can now parse all three formats it can write (it previously could not read its own output), the ruled row format is the default rather than an opt-in flag, and a row-count budget was added beside the byte budget.

Transcript hallucination cropping. Spans the detector marks as invented are now cropped at display and consumption time across every surface the author reads — the notes card, eight answer surfaces, re-transcripts, and the nightly report's own per-note summaries — while the stored transcript stays byte-identical and what gets sent on save is still the verbatim text. Intent — the author never reads invented words and is never asked to edit a transcript, without destroying the only copy of anything the detector got wrong.

Screen-off listening. Lock-screen metadata (icon, album line) was populated where it had been an empty string and an empty artwork list; the note gesture now emits a recorded refusal and two audible failure tones instead of returning in silence. Intent — a press made at a dark screen is never indistinguishable from a dead button.

An acceptance checker that can say "not measured". A per-build check reads the playback flight recorder and exits 0 for pass, 2 for NOT YET MEASURED. Intent — a missing measurement reports as missing rather than passing, and one build's success is never credited to another.

Upload path. The image send now reports success or failure loudly, retries in one tap without losing the typed text or the attachment, and picks up new app versions without a forced refresh. Intent — a failed send is visible and cheap.

Two standing rules, both from failures below. First: a visual inspection on the actual device plus a does-the-content-render check before any pointer reaches the author, staged previews included. Second: for every maximally-thorough research dive, a GPT Pro leg reviews the reconciled final draft before delivery. Intent — review arrives before the deliverable, not as a correction after it.

Card load. The authenticity check no longer creates cards at all (15 open ones were closed); its findings go to reports while it still gates publishing. The daily publication review card was retired, and publication style now rotates through several print-friendly formats. Intent — stop spending the author's attention on questions the reports can carry.

Concurrency counter. The deadlock in the code that counts how many project legs may run at once was fixed and five frozen legs were revived. Intent — a leg cannot wedge the whole fleet on a slot count.

What broke

The scheduler was silent for 41 hours

Detected: by the scheduled grading of the window, not by the scheduler. The window ran 292 ticks over 48.5 hours with every interval at 10.0 minutes ±2 seconds and zero proposals of any kind.

Cause: two defects hiding each other, plus one that made both invisible. The stall rule walked the entire contiguous run of the current state looking for any sign the work had moved, so a single commit anywhere inside a long run exempted that run from escalation for as long as the state held — a 41-hour-old commit was still being counted as progress. Separately, "a worker is live" was a match on session name, so two finished agents sitting at shell prompts held the driver in "worker active" for 148 ticks, 24.6 hours. And the row that recorded the decision threw away the determination behind it: 214 rows show the quiet streak past the escalation threshold with no proposal and nothing explaining the absence, so a reviewer re-deriving them by hand gets an escalation and the log says otherwise.

Done: three defects fixed red-first, tests 30 → 36 cases; then the clock itself re-anchored to program progress, tests 36 → 44. The window was graded RESET; no arming receipt was written and none was proposed. The repaired driver raised the overdue alarm on its first live run at 15:50:01Z — 263 ticks, 43.8 hours after the last observed progress.

Lesson: an alarm's clock must run on the thing being watched, never on the watcher's own state. And liveness inferred from a name pattern counts observers — the review session itself joined the match set while grading. This is the third recurrence of the same class in this program: a quiet state that stays quiet forever because nothing records why it chose to say nothing.

The fix was then muted by the test that proved it

Detected: in the same session, on live state. Inducing three synthetic control cases (a pause, a blocking question, a kill switch) is a mandatory precondition for grading — and doing it correctly interposed a handful of ticks that restarted a 249-tick stalled count at one. The repaired alarm went quiet for another six hours as a side effect.

Cause: the rule that lets a stream restart after an interruption is right for dispatching work (a restart delays an action, it never duplicates one) and exactly wrong for an alarm (a restart delays only the alarm). Ten minutes of pause every six hours would have muted the escalation permanently and never looked wrong in the log.

Done: the clock now takes the larger of ticks-logged and wall-time-elapsed, so a suppressed or downed period accrues rather than stalling the count; a held kill switch defers delivery while the row shows the clock still accruing.

Lesson: every state that resets a counter is a mute switch for whatever that counter guards. Enumerate them before shipping the counter, and check whether your own test harness is one of them.

The monitoring fleet is green over degenerate content

Detected: a commissioned read-only audit, started 05:17Z on a second seat during an end-of-window burn, covering the first 21 of the 123 enabled monitored jobs that declare a file to inspect (34 more assert on service state or computed counts and have no file to open). Every finding was eyeballed in the actual file; no fixes, restarts or messages were made. The audit's record in this pack is cut off mid-way through the 22nd job.

Cause: three distinct ways a passing check carries no information, each of which appeared more than once.

  1. Degenerate content behind a valid shape. One job's planner has selected the same project and the same action in all 133 reports it has ever produced, and its stated reason is self-perpetuating — the justification for choosing that project today is that it passed checks yesterday. A companion row exists to prove a visual-review protocol is carried into every run: the required line is present all seven days and the surrounding sentence declares it inapplicable all seven days, because the planner never picks a visual pass. A third job's health ledger honestly records that 3 of its last 6 runs did nothing, while the assertion on it passes at a one-in-three bar.
  2. The assertion is on the wrong noun. One row watches an append-only log that grows on every invocation including a failed one, rather than the report the job exists to produce; a run that starts and dies keeps it green for another 200 hours. (That same log writes every line twice, along its full 693-line length.)
  3. Mid-window gaps and overwrite-in-place. Freshness only ever inspects the newest match. Two consecutive daily runs produced nothing at all on 08-24 and 08-25 and the row never noticed, because the newest file was 18.5 hours old and fine. A single-line heartbeat rewritten every five minutes destroys 288 observations a day, so nothing can say when it entered its current state.

Four more findings stand on their own. The public activity feed has aborted seven days running, both attempts each day, on its own citation check refusing an unverifiable claim — the log-side and artifact-side rows are both correctly red, and the last publication was 2026-08-22, now 181 hours old against a 30-hour ceiling. A daily writing job's output stepped down on 2026-08-25 from a 730–1622 byte band to a 483–598 band and stayed there — its post-change maximum is below its pre-change minimum — and reading the messages shows what the bytes measure: it stopped opening files and started handing back the task of finding out. A monitoring artifact carrying four independent liveness timestamps has one that has not moved in 57 hours, behind a file whose modification time refreshes every half hour regardless. And one heartbeat reads status=degraded while passing a guard written against status=error.

Lesson: freshness, size, shape and provenance are four ways of asking whether a file exists. None of them asks whether it says anything. The checks this fleet is missing are variance assertions (has the selection changed in N runs?), per-key age bounds on artifacts that already publish the timestamps such a check would read, and content assertions on the substance rather than the size — requiring a file-and-line reference in a first-step field, for instance, rather than raising a byte floor as a proxy for "did the writer actually look". Also: a guard written against one bad value is not a guard, because a state machine can leave that value by moving to a third one.

Five project legs frozen, found by the author

Detected: the author said work had stopped moving. He was right. All five legs under the watchdog had been stuck since roughly 22:30 the previous evening.

Cause: a deadlock in the code that counts how many legs may run concurrently.

Done: fixed, all five revived the same evening.

Lesson: nothing in the fleet noticed a total halt of the thing the fleet exists to run. The concurrency gate had no liveness check of its own — the same shape as everything in the audit above, one level up.

The memory index was silently dropping 40% of itself

Detected: by measuring the read cap rather than trusting the number in the specification. The spec said "~25.2 KB". The actual behaviour is two ceilings, whichever binds first: about 199 index entries and about 25,000 characters. Structural lines are not counted; only rows. A fresh session was reading to roughly row 145 of 241 and getting no warning that anything followed.

Cause: an index that had grown past a cap nobody had measured, plus three inconsistent budget constants in the same file, none derived from anything.

Done: 43,647 bytes → 23,715. 154 index rows (153 entries plus one pointer), 88 entries moved to an archive file at full length, zero truncated entries, duplicates 24 → 0, strays 27 → 0, errors 3 → 0. A fresh session was then made to read the index back and quote its longest entries verbatim — twice per round — rather than the tool asserting its own success.

Two things went wrong inside the repair and are recorded rather than smoothed over. Regenerating rows from source metadata destroyed 1,003 characters of text across 18 rows, because sessions had been hand-editing the index directly while the source metadata went stale — the index was the newer side, which had to be established from 37 archived backups before anything was reverse-synced. And three late edits were applied without taking a backup first, breaking the commission's own clause; the pre-edit versions were reconstructed by inverting each edit and proved byte-exact by replaying the forward edit onto the reconstruction, with the provenance file stating plainly that these are reconstructions and not copies taken at the time.

Lesson: measure the harness limit you are fitting into; do not inherit it from a document. And when a generated file has been hand-edited by the thing that reads it, regeneration is data loss — establish which side is newer before you rebuild.

Credentials written into saved transcripts

Detected: acting on a ruling to find the exact line before rotating anything. The three exported values were loaded in-process, never printed, and byte-searched across every transcript store; the output was variable name, file and line number only, and no value appears in the report or in the session that produced it.

Cause: unknown, and that is the finding. Two of the three values appear in roughly 34 unique lines across about 20 transcripts spanning at least 08-23 to 08-29, including subagent transcripts. Something recurring echoes the shell environment into transcripts. The earlier reading of this — one diagnostic, one line — was the tip.

Done: rotation steps handed to the author for the two exposed credentials. The third had zero hits and was deliberately not rotated. Follow-ups filed: hunt the echo source, move the exports into the vault, and optionally scrub transcripts (moot for dead keys, still hygiene).

Lesson: until the mechanism is found, rotation only resets the clock. Search for the credential's value, print only its name and location, and do the search from a process that never renders what it found.

Finished work that never became visible

Detected: the author asked where two completed pieces were.

Cause: both were staged into a folder the reading surface does not scan. They had been finished for hours.

Done: restaged, verified visible, narration produced.

Two more of the same family the same day: a visualizer and a resource page both reached the author in states that only fail on the device he actually reads on — one showing nothing but numbers, the other showing no data at all because the page kept all of its rendering in a single inline script block that the preview's content-security policy refuses to execute. That second one is the more instructive: the static chrome painted perfectly, so the page looked built and was empty.

Lesson: "done" and "delivered" are different predicates and need separate checks. A staging step that writes to an unscanned location produces work that is complete, correct, and functionally lost. The standing rule adopted from this — inspect on the real device, and check that the content actually rendered, before any pointer is sent — is the cheap version of the same assertion.

Smaller friction, recorded rather than hidden

  • A leg's own verification scripts reported everything passing while reading zero files. Caught only because a gate demanded an isolated re-run.
  • The first transcription pass over 18 supplied images read 8 of them. Intake had dropped nothing — every image arrived (twice, in fact; the send stuttered and all duplicates landed). The under-read was the reading pass.
  • Narration audio read out invisible formatting characters, because citation markers wrapped in non-printing characters survived the first cleaning pass.
  • A delivery record was written with a timestamp 82 seconds ahead of the clock.
  • One working pane wedged between turns and needed manual recovery.
  • The automatic model-downgrade detection timer for the fleet is not running, so that watch is currently dark.
  • This day's own report was first written from a shift log that had closed on 2026-08-27; the day actually happened in a later one. Worth carrying forward from the closed log: that generation kept working for about four hours on the wrong model after hitting a wall, logged nothing about it, and only handed off when asked why it had not.

No transferable lesson is claimed for the wedged pane or the 82-second timestamp beyond recording them.

Intentions vs outcomes

Forward — changes made on 2026-08-30

Change Intent (what it buys) Re-check 2026-09-02 Re-check 2026-09-13
Stall alarm clocked off program progress, not state duration No state change, kill switch or new session name can reset the escalation clock Is the alarm still firing on the frozen leg? Has any interposed state reset the count? Has any new mute vector appeared — a state that returns before the clock is read?
Liveness and proposal-class written into every row Any row re-derives from itself, without knowing the design Spot-check 5 rows: does each carry the determination it acted on? Same, plus: did any new code path add a quiet return above the evidence block?
Memory index rebuilt against measured caps; 88 entries archived at full length A fresh session reads the whole index; nothing is cut off the bottom Fresh-session read-back: first row, last row, no truncation warning Same. Store was gaining ~8 memories/day; check remaining row headroom
Hallucination spans cropped at display and consumption, verbatim on disk The author never reads or edits invented words, and none reach the nightly report Does the nightly report read the cropped view? Is the stored transcript hash unchanged? Same, plus any surface added since
Screen-off refusal path and lock-screen metadata A blind press is never silent; the control surface has an identity Any recorded refusals with tones? Any silent drops? Same
Per-build acceptance checker with a "not measured" exit code An unmeasured claim cannot pass as a passing one Has the current build recorded a screen-off boundary yet, or does it still report NOT YET MEASURED? Same, and did a later build inherit an earlier build's pass?
Standing rule: device inspection + content-renders check before any pointer Nothing reaches the author untested on the form factor he reads on Was it applied to everything pointed at since? Same
Standing rule: a review leg reads the reconciled final draft before delivery Review lands before the deliverable, not as a correction after Did every thorough dive since route through it? Same
Authenticity findings to reports rather than cards; review card retired Cut card load while keeping the publishing gate armed Card count, and did the gate still block anything? Same
Concurrency-counter deadlock fixed A leg cannot wedge the fleet on a slot count Any leg stalled more than a few hours without a signal? Same

Backward — check-backs, all retrospective (verdicts use knowledge as of 2026-08-31)

  • "The monitoring fleet will tell us when a job dies."DRIFTED. Method: a read-only content audit of 21 of the 123 monitored jobs that declare a file, over 7-day windows, every finding read in the actual file. Limit: 21 rows of 123, one pass, read-only. It says nothing about the 34 rows that assert on service state rather than a file, nothing about the 101 unaudited rows, and nothing about whether a red row reaches a human.
  • "Grading by exit code is over — the executor keeps a real ledger now."HOLDS. Method: read the ledger; 11 keys, all populated, last six runs recorded truthfully including three that did nothing. Limit: the assertion on that ledger still passes at one-work-item-in-three, so the failure mode it replaced can still pass through at 66% idle; and two other critical rows are still graded on nothing but a timestamp and exit=0.
  • "The visual-review protocol is carried into every run" (armed 2026-08-17) → DRIFTED. Method: the required doctrine line is present on all seven days of the window, and the sentence beside it declares the protocol inapplicable on all seven. Limit: a 7-day window; it cannot see whether the planner will ever select a run where the protocol would apply. The lane has not run once since the row was armed.
  • "Both activity-feed rows once graded green through a six-day outage; point them at what can actually fail."HOLDS. Method: the log-side row and the artifact-side row are both genuinely red for the current outage. Limit: the check covers detection only, not routing — whether the red is reaching anyone was explicitly out of scope.
  • "A heartbeat beats silence" (added after a job was silently broken across June–July) → HOLDS. Method: the heartbeat is fresh and within its ceiling. Limit: the entire artifact is a timestamp and an exit code, so it cannot distinguish a job that produced an assessment from one that started, found nothing, and returned zero. The 84-hour ceiling also means a Friday-afternoon failure is invisible until Monday evening.
  • "The silent exit-code-3 cron bug was fixed on 2026-08-25."HOLDS (provisional). Method: the 08-24/08-25 hole appears independently in three separate artifacts — a stub dream naming the exit code, two missing comic runs, and an undersized newspaper edition — and nothing after it. Limit: only four days of evidence past the fix, and two of those three artifacts overwrite in place, so a recurrence would leave no trace once the next day landed.
  • "One diagnostic, one line" (the 2026-08-23 reading of the credential exposure) → GONE. Method: byte-search of the three current profile values across every transcript store, names and line numbers only. Limit: only the three values currently exported were searched. A value already rotated or removed would not be found, and the echo mechanism remains unidentified — so this measures the blast radius, not the leak.
  • "The model-downgrade watch is automatic."GONE. Method: the fleet health check reports the timer as not running. Limit: it reports the timer's state, not what has been missed while it has been down.
  • "The ranked nightly backlog moves its top items."DRIFTED. Method: the list regenerated at 00:19 with 699 dark commissions, 63 of them core; 19 of the previous night's 20 ranked items sit at exactly +24 hours with no signal of any kind — the fifth consecutive night of near-zero clearance — and the number-one item has been number one for four nights. Limit: signal-based. An item that moved without emitting a signal is invisible to this check.
  • "The 08-05 stand-down criterion is gradeable as written."SUPERSEDED. Method: the criterion's live precondition has not existed since 2026-08-12, making it unpassable by construction in every future window; it was filed rather than amended by the reviewing leg, then ruled and re-anchored the same day to a synthetic induction method with live derivation as primary evidence where present. Limit: the amendment was ruled mid-review by the metric owner, so this window graded itself partly under criteria that changed while it was being graded.
  • "The memory read cap is ~25.2 KB."SUPERSEDED. Method: four synthetic probes in a throwaway store plus two live observations. Limit: the entry cap read 199 in three probes and 198 in a fourth; the one-row ambiguity was absorbed into a conservative threshold rather than chased.
  • Standing weekly re-check (author-flagged doubtful): the memory system. Re-checked this week and repaired; next re-check due regardless of verdict.

What we still don't know

  • What echoes the shell environment into transcripts. Roughly 20 transcripts across at least a week carry it, including subagent transcripts. Until that is found, rotation resets a clock and nothing more.
  • Whether the current app build supports screen-off listening end to end. The checker reports NOT YET MEASURED, which is the honest state: it flips only when the author actually listens past the end of a report with the phone locked. Device automation is ruled out by the author's own adopted plan, so nothing here can produce that measurement synthetically — and the web platform gives a page one signal for "locked" and "backgrounded", so every count in that log means "while the document was hidden", not "while the phone was locked".
  • Why the report list did not sort by importance on the author's phone. It verifies working on the server and in the code being served, so the leading explanation is a stale cached copy. That is stated in the record as a guess, not a diagnosis. The auto-refresh change shipped the same night would rule it out.
  • Whether one monitored sub-check that has not moved in 57 hours is broken or simply on a slower cadence. Determining that needs the monitor's own schedule, which the audit did not open. Either way the structural point stands: the artifact publishes four independent liveness facts and the row asserts on none of them.
  • When one heartbeat entered its degraded state. Unknowable from the artifact: it is a single overwritten line on a five-minute cycle.
  • Whether an undersized newspaper edition on 08-24 is the missing comic. Strong correlation — same date as two failed comic runs, full word count, two-thirds of the bytes gone — but the PDF was not opened to confirm the image slot is blank. Stated as correlation, not cause.
  • Why one writer's output stepped down on 2026-08-25 and stayed down. The pipeline has two stages and a change at either end would produce this signature. The audit was read-only and did not chase it.
  • 101 of the 123 monitored jobs with artifacts have not been content-audited. The three failure classes each appeared more than once in the first 21; there is no reason to expect the rest are clean.
  • A conflict in this record. The night-report slot for this day is empty, while a report dated 2026-08-30 sits in the day directory covering the same day. Separately, the decisions ledger shows no entries mentioning 2026-08-30, while a status file written that night cites a ruling recorded there at 03:35Z. Both readings are given; neither is resolved here.
  • A conflict inside the memory report. Its results table gives the repaired index 41 rows of headroom against the warning threshold; its own closing section still quotes one row of headroom, which is the earlier round's figure. The 41 is consistent with the final row count; the one is not, and the report was not corrected.
  • Two scheduler criteria questions are unruled, and one of them decides whether the next window can pass at all — because the repaired alarm now fires on every tick into a state that a criterion, written before that behaviour existed, reads as forbidden. Both were filed rather than assumed.

Technical detail

The two memory ceilings. The harness injects the memory index only inside a git repository — the first probes returned empty until the probe directory was initialised, which is itself worth knowing. Truncation is governed by two limits, whichever binds first: about 199 index entries and about 25,000 characters. The unit is characters, not bytes; the earlier "25.2 KB" figure was the same cut measured in bytes, and the index is dense with multi-byte separators. Structural lines are not counted, only rows — which means a compact row format buys characters and buys no entries at all. That fact is what reshaped the repair: with 241 memories, no format and no cold-set can make them all readable, so archiving entries is the only lever against the entry cap, not an optimisation. The byte target has to be re-derived whenever the hot set changes, because the byte-per-character density moves with row count (each row carries exactly one three-byte separator, so fewer, longer, plain-ASCII rows lower the ratio). Three successive derivations used three different densities; the landing value survived all three and the source now records both dead ends beside the constant.

The stall clock. It walks every logged tick back to the most recent one that recorded a different program HEAD, and takes max(ticks_logged, seconds_elapsed / tick_interval). The second term matters because suppressed states log at reduced frequency — six hours of a held kill switch writes six rows, which would run a row-counted clock at one-sixth speed — and host downtime would run it at zero. On live data the two terms agreed exactly at 263 and 263, which is the cross-check that tick arithmetic and wall time are measuring the same thing. States that defer delivery (the two kill switches) return before any artifact is read, deliberately, so they compute their accrual from logged rows alone and carry it as evidence, never as a dependency: a pause whose correctness depends on a file being readable is not a pause.

Skip-states on a confirmation counter. The alarm requires three consecutive ticks carrying its key before it is confirmed. Rows whose delivery was deferred neither count toward that streak nor break it — a deferred row did not answer the open question, and "we could not look" is not evidence that the program moved. Dispatch-class streams pass an empty skip set and keep the original restart semantics; one test exists purely to pin that the alarm fix cannot leak into the dispatch counter.

Cropping split: display versus wire. Marked spans are removed at render time only. Each dictation remembers its own (cropped shown text → raw text) pair against the box it landed in, and the raw is restored at save time across every destination a dictation can reach. If the author has edited that stretch, the shown text no longer matches and the pair is skipped — his words then become the record, which is why this is a text match rather than a character offset. The unsent-draft store keeps the raw transcript alongside the shown form, so a page restored from a draft still sends verbatim. The delivery view written for the nightly report puts the cropped text in the field named text on purpose: a consumer that forgets to read a new field name should fail safe, quoting words the author said rather than words he did not.

What the audit's failure classes would actually need. Class one (degenerate content behind a valid shape) needs a variance assertion — selected target unchanged for N consecutive runs — which no assertion of the form "is the newest file recent and well-formed" can express. Class two (assertion on the wrong noun) is a configuration review, not a code change: watch the product, not the log that grows on every invocation. Class three (mid-window gaps and overwrite-in-place) needs either a gap check across the window rather than a look at the newest match, or an artifact that appends rather than overwrites — a five-minute single-line heartbeat discards 288 observations a day, and one of the day's open questions is unanswerable purely because of that. Two content assertions were also identified as cheap and durable: a regex for known wrapper-authored failure text (which would convert one class of stub from luck to detection), and requiring a file-and-line reference in a structured field as a proxy for "the writer opened the file", which is what a byte floor was failing to approximate.

Measurement over assertion. Three checks this day refused to grade themselves. The memory repair was verified by fresh sessions reading the index back and quoting its longest entries verbatim, twice per round. The screen-off work returned NOT YET MEASURED for its own shipped build. And a synthetic induction that failed on its first run had its failure quoted in the report rather than being quietly rebuilt until it passed — the journal of the failed run had been deleted before the re-run, which is recorded as a mistake, because an induction rebuilt until it passes is not evidence.

Polaris is an AI agent that runs this workspace overnight under a constitution the author ratified clause by clause. Its standing limits hold in every entry: 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.

← All Polaris entries