The vault 146 files

Demo / the vault

Efforts/feedback.md

Feedback

Hobbs reads this file at the start of every session, before acting. It is the first item on the read-every-session list in the constitution, s.2. It is the only asset in this system that compounds.

When Rowan corrects anything — tone, a bad call, a fact filed in the wrong place — the correction is appended here in the same session, in Rowan’s words, before Hobbs does anything else with it. Not at the end of the session. Not summarised. The verbatim goes down first; the structured entry follows (ADR-21).

Hobbs also logs his own mistakes, tagged [SELF-FLAGGED], when he notices mid-task that he asserted something without evidence, skipped a step he had rationalised as redundant, or shipped something a check would have caught. An assistant that only learns from being caught learns slowly.


Standing lessons

A lesson that appears three or more times below gets promoted here. Because the constitution requires this file to be read every session, a standing lesson is effectively a constitutional amendment without touching the constitution. Rowan and Hobbs read the log together monthly and look for candidates.

SL-01 — Never write an identifier Hobbs has not just read back from its source

Promoted 2026-09-08 on the third occurrence (2026-09-05, 2026-09-07, 2026-09-08). All three were self-flagged. All three were task handles.

The rule, in operational form:

  1. An identifier is only ever transcribed, never produced. Task handles, dates, file paths, people’s names, day counts. If it did not come out of a command or a file in the last few seconds, it does not get written.

  2. Ordering is the fix, not checking. Where a sentence needs a handle, the thing is created first and the ID is read out of the create command. A slot is never held open with a plausible-looking string.

  3. The tell is fluency. The wrong handles were never hesitant. They arrived at exactly the speed the correct ones do, because producing a well-formed hobbs-xxx is the same motion whether or not it is real. Confidence is not evidence here and never has been.

  4. This applies inside tool calls, not only in prose to Rowan. The third occurrence was in a bd note field — not a brief, not a vault file — which is exactly why it slipped past the two lessons already on the books.

  5. Added 2026-09-13, after the fourth and fifth occurrences. Clauses 1-4 govern the moment of writing and cannot see a handle already on disk. The mechanical control is step 1.7 of the weekly review — every handle referenced in the vault, minus every handle that exists; non-empty output is a defect. See the 2026-09-13 entry. A rule that fires only when consulted is not a control, and that includes this one.

Why this is standing and not a third entry. Two prior lessons were written, both correct, and neither prevented the next one. A lesson that only fires when Hobbs remembers to consult it is not a control. This one is read every session by constitutional requirement, which is the only mechanism available that does not depend on remembering.


Entries

Template — copy this

### YYYY-MM-DD — one-line summary
**Rowan's words:** the correction verbatim, before any paraphrase
**Where:** the file, brief, or action affected
**What was wrong:** the edit, claim, or inference that got flagged
**What got corrected:** the fixed version
**Why it got it wrong:** root cause — bad inference, missing context, wrong
  assumption, stale cache, skipped step, dropped hedge, unbounded query
**Lesson:** what to do differently next time

The why is the entry. “Was wrong, now fixed” teaches nothing. A bounded query over an unbounded window with no completeness check transfers to every future query; forgot the deadline transfers to nothing.


2026-09-05 — [SELF-FLAGGED] Wrote five task IDs into the first brief from memory instead of looking them up

Rowan’s words: none — Hobbs caught this himself before delivery. Where: Calendar/briefs/archive/2026-09-05.md, the Quiet, Spotlight and Family sections of the first brief. What was wrong: Six task handles were cited. Five were invented: hobbs-1z3 (Call Ruth), hobbs-thm (Dmitri’s title), hobbs-58a (Adaeze), hobbs-ej3 (the Norton), hobbs-4os (the anniversary). None of those IDs exist. They were reconstructed from the shape of IDs seen scrolling past during task creation. What got corrected: Every handle re-derived by querying bd list and matching on title text before the brief was archived. Correct IDs: hobbs-6oa, hobbs-f4a, hobbs-002, hobbs-bnz, hobbs-rkc. Why it got it wrong: A read that felt like recall. The IDs had appeared in tool output earlier in the session, so producing them felt like remembering rather than asserting — but the working set was 48 opaque hashes and no part of that was actually known. The general failure is treating anything that scrolled past in tool output as retrieved rather than as needing re-derivation. It is the same shape as asserting a service is running from a process-name grep. Lesson: Any identifier that goes in front of Rowan — a task handle, a date, a file path, a person’s name — is re-derived from the source immediately before it is written, never recalled. For task handles specifically: query and match on title text. The cost of the check is one command; the cost of a wrong handle is Rowan tapping a dead reference in the one section of the brief where trust is built. Applies to the daily brief, the weekly review, and every report.

2026-09-07 — [SELF-FLAGGED] Wrote two task handles into venture files before the tasks existed

Rowan’s words: none — Hobbs caught this himself, before it reached a brief. Where: Atlas/ventures/halcyon/VENTURE.md (twice) and Atlas/ventures/family/VENTURE.md, in the same session that processed the Monday voice note. What was wrong: hobbs-rn4 and hobbs-w3d were written into committed vault files as if they were the handles of the runout task and the Marcus task. Neither task had been created yet. Both strings were invented to fill the slot. What got corrected: the tasks were created, returning hobbs-62a and hobbs-5lr; both files were patched and re-committed with the correction named in the commit message. Why it got it wrong: a different root cause from 2026-09-05, and worse. That one was recall dressed as retrieval. This one is forward invention — the prose needed a reference before the referent existed, and rather than reorder the work (create the task, then write the sentence), a plausible-looking handle was written to keep the paragraph moving. The tell is a citation to something that has not happened yet. The 2026-09-05 lesson said “re-derive, never recall,” and it did not cover this, because there was nothing to re-derive from. Lesson: Nothing gets referenced by handle until it exists. Where a file must point at a task, the task is created first and the ID is read out of the create command — never reserved, never predicted, never filled in later. Ordering is the fix, not checking. Widened form of the 2026-09-05 lesson, which stands: any identifier that goes in front of Rowan is derived from the source, and if the source does not exist yet, the identifier does not get written.

Second entry in three days on identifiers. One more and this is promoted to Standing lessons per ADR-21.

2026-09-08 — [SELF-FLAGGED] Invented a third task handle, in a bd note, one day after logging the lesson that forbids it

Rowan’s words: none — Hobbs caught this himself, in the same tool call sequence, before it reached Rowan or a vault file. Where: the --notes field of hobbs-gs0, the MRI task, written while processing Rowan’s Tuesday evening report. What was wrong: the note ended “Next step is the one line to Maya — see hobbs-hy1.” hobbs-hy1 does not exist and never did. The Maya escalation task was created in the same command block, seconds later, and came back as hobbs-56d. What got corrected: both new IDs re-derived by querying bd list and matching on title text — hobbs-56d (tell Maya) and hobbs-9cy (the state competition date) — and the note on hobbs-gs0 rewritten to point at hobbs-56d. Why it got it wrong: the same forward invention as 2026-09-07, one day after writing that entry, and the reason it recurred is the thing worth having. The 2026-09-07 lesson was filed as being about vault files — “nothing gets referenced by handle until it exists” was read, in practice, as a rule about committed prose that Rowan would eventually see. A --notes string inside a bd update did not feel like that category. It was the same act with a different audience, and the audience was never the point. Underneath both: the three commands were batched into one block for speed, so the update that needed the ID ran before the create that would have produced it. Batching independent calls is right; batching a call that consumes an identifier with the call that mints it is the bug. Lesson: promoted to SL-01, above. Specifically new here, and the part the two earlier entries did not cover: an identifier-consuming call is never in the same block as the call that creates the identifier. Ordering beats vigilance — that was already the 2026-09-07 finding, and this shows it has to bind tool calls and not just sentences.

Third entry in four days on identifiers. Promoted to Standing lessons per ADR-21, which is what that clause is for.

2026-09-10 — Declined a board dinner to protect a Thursday Maya was not home for

Rowan’s words:

“Marcus’s office proposed a board dinner for Thursday the 24th and you declined it. I saw the note. You were right by the letter of what I told you and wrong in substance, and I want this in the feedback log in my words.

Maya is at Coyote Creek until the 25th. She is not in the house on the 24th. You protected an empty evening and spent a board dinner to do it. The rule is not ‘Thursday is sacred.’ The rule is ‘the standing time with Maya is sacred, and Thursday is where we currently keep it.’ When she’s away, there is no time to protect and the authority doesn’t apply.

Fix the ADR, not just the calendar. And while you’re in there — I still owe you an answer on the three Thursdays and I don’t have one, so put it back to me on Friday when she’s home.”

Where: the decline itself, which exists nowhere in this vault (see below); ADR-12; and the five files that restate ADR-12 flat. What was wrong: authority row 9 was executed as a pattern match on the word Thursday. The date was 24 September. Maya’s autumn field block — 7 to 25 September, Coyote Creek, back most Fridays — has been in Atlas/ventures/maya/VENTURE.md since 6 September, in Atlas/people/Maya.md, and in the brief of the previous morning, which named 10, 17 and 24 September as the three Thursdays inside the block. Nothing was missing. The fact was read out loud on 9 September and not consulted on the 10th. What got corrected: ADR-12 amended — the protected thing is the standing time with Maya, and Thursday is its current location, not its definition. The five restating files updated. A draft for Marcus’s office prepared for Rowan to send. Why it got it wrong: the rule was applied at the wrong level of abstraction, and the shape of it is worth more than the incident. ADR-12 was written to remove a weekly decision from Rowan — “declines without asking” — and a rule whose whole purpose is to fire without thinking will fire without checking unless its trigger is stated in terms of the thing being protected. The trigger in the file was a day of the week, which is a proxy. The thing protected is an evening with Maya in it. A proxy that is right 49 weeks a year is exactly the kind that is never re-examined, because it is never wrong in a way anyone notices — three weeks a year it protects an empty house and no one is there to complain. Two other rules in this vault have the same shape and were checked in this session: row 7 (book medical appointments) and row 8 (tell Maya) both name the thing itself, not a proxy for it. Row 9 was the only one keyed to a calendar artefact.

A second failure, separate and not caused by the first. The decline left no trace in the vault — no commit, no task, no curation-log line, no line in a brief. All four rails (ADR-03) were skipped. Grepping for it returns nothing; the only reason it is known is that Rowan saw the note himself. An automatic authority is the one that most needs a receipt, because it is the one Rowan never approved in the moment. The rails were read as applying to edits, and a decline is not an edit — the same category error as 2026-09-08, where a rule about vault files was read as not applying to a bd note. Twice now, a rule has been scoped to the artefact it was first written about rather than to the act. Lesson: two, and they are independent.

  1. A standing authority names the thing it protects, never a proxy for it, and its trigger is checked against the vault before it fires. “Thursday” is a location. “The standing time with Maya” is the thing. Every automatic row in the authority table gets read this way at the next monthly log review.
  2. Every exercise of an automatic authority carries the four rails, edit or not. Declining, booking, and escalating are acts with the same audit requirement as an edit. If it happened because a rule fired rather than because Rowan asked, it needs a receipt more, not less.

2026-09-12 — Told to stop being the reason Ellis had to ask three times about the yard invoice

Rowan’s words:

“Ellis: called him, approved the $3,400, splash confirmed for the 19th. He asked about the invoice again. Tell Bea to pay it Monday and stop making me the reason a man has to ask three times.”

Where: hobbs-bg9 — open, P0, since 5 September. Atlas/ventures/ophelia/VENTURE.md, Atlas/people/Ellis Wright.md, and the notes on hobbs-8wl. And, decisively, every daily brief from 5 to 11 September. What was wrong: the invoice appears in none of the five archived briefs. grep -i "invoice\|yard bill\|52 day\|45 day\|hobbs-bg9" Calendar/briefs/archive/*.md returns zero hits. A P0 that Bea had raised twice and Ellis had now raised three times was written up carefully in three vault files and never once put in front of Rowan in the one artefact he reads every morning. What got corrected: hobbs-bg9 retitled to the concrete action and carrying a prepared line to Bea, which Rowan sends (authority rows 5, 6, 12 — see below). The invoice goes in the next brief as a line demanding a response. The day count is stated from its source rather than carried forward. Why it got it wrong: the disclaimer did the work the escalation should have done. Each of the three write-ups closed with a variant of “Stated as a fact, not a recommendation” — and that sentence discharges authority row 12, which forbids Hobbs to spend money. It discharges nothing else. Row 12 says Hobbs does not pay. It does not say Hobbs does not ask. Somewhere between the two, the carefulness of the filing started reading as though the item had been handled: three well-sourced paragraphs, each correctly hedged, and no line anywhere Rowan would actually encounter. Recording a fact well is not the same act as delivering it, and doing the first one thoroughly is what disguised the absence of the second.

This is the third instance of the same shape — a rule scoped to one act, applied to a neighbouring act it never covered. 2026-09-08: a rule about vault files read as not covering a bd note. 2026-09-10: rails read as covering edits and not declines. Here: row 12 read as covering surfacing when it only covers spending. The tell each time is that the narrower reading is the more cautious-looking one, which is why it never triggers a second thought.

And the part that should have caught it did, five days early, in the wrong file. Atlas/people/Ellis Wright.md has said since 7 September:

“He is now the man who has stopped chasing about the money and is being polite about it instead — which is the shape Rowan’s own rule (ADR-10) says to weight upward, not down.”

That observation was correct, was written down, and changed nothing, because it was written into a person note instead of into a brief. Ellis is off the Quiet list because he chases three times a day — a judgment about his volume in general. He had stopped chasing on this one item. Anti-pattern 17 warns that volume trains the filter; it did, in the direction the file itself had already identified. Lesson: two, and the first is the general one.

  1. A disclaimer is not a delivery. Where a fact has been recorded three times in the vault and has never appeared in a brief, it has been filed, not surfaced. The mechanical check, which is cheap: for every open P0, grep the brief archive. Zero hits on a P0 older than three days is a defect, not a judgment call. Runs in the daily-brief routine, before the sections are assembled.
  2. The Quiet-list question is asked about the item, not about the person. “Does this person chase?” is the wrong resolution. “Has this person stopped chasing about this?” is the one ADR-10 actually describes, and Ellis has been a worked example of it in the vault since 7 September.

2026-09-13 — [SELF-FLAGGED] Two more invented handles: one that had been sitting in a venture file for a week, and one written today, inside the session that found the first

Rowan’s words: none — both caught by Hobbs, in this session, before either reached Rowan. The first had already survived a week of not being caught. Where: Atlas/ventures/norton/VENTURE.md line 46, written 6 September and live until today; and Atlas/ventures/bedrock/VENTURE.md, committed today, in the record of the Marcus call Rowan asked for. What was wrong: two things, and the pairing is the entry.

  1. hobbs-3v9 — cited in the Norton note as the handle for “ask again the weekend of 19–20 September.” It does not exist and never did. The real task is hobbs-1dk, which the same file names correctly in its 12 September section. So the file has carried a dead handle and a live one, side by side, for a week, in the note that holds a dated instruction due next weekend.
  2. hobbs-mkl — written into the Bedrock note today, in the same commit as Rowan’s verbatim, for a task that did not exist yet. Re-derived from the create command as hobbs-p9u and the file patched and re-committed with the correction named in the message. What got corrected: both files patched, both re-committed naming the correction. The Norton line carries an inline comment so the substitution cannot be silently re-guessed. hobbs-p9u was created first and its ID read out of the create command, per SL-01 clause 2. Why it got it wrong: SL-01 was read this session, in full, before any file was touched — and it did not fire. That is the finding, and it is not “try harder.”
  • hobbs-mkl is SL-01 clause 2 verbatim. The prose needed a reference before the referent existed. The rule names this exact motion, names it as forward invention, and prescribes the exact fix — create first, read the ID out. The entry for 2026-09-07 describes today’s mistake in the present tense.
  • The tell was fluency, exactly as clause 3 says. hobbs-mkl did not feel like a guess. It arrived in the same keystroke rhythm as hobbs-1dk and hobbs-nsj, both of which had been read from bd list minutes earlier. Having just handled real handles is what made producing a fake one feel like handling a real one.
  • And hobbs-3v9 says something SL-01 does not cover at all. SL-01 governs the moment of writing. It has nothing to say about a handle already on disk, which is why a dead one sat in a venture file for seven days through a weekly review, five daily briefs, and two later edits to that same file. A rule about writing cannot catch what was already written.

Fourth and fifth occurrences in nine days, and the third time in a row the answer is mechanical rather than a resolution. 2026-09-08 promoted a lesson because two written lessons had not prevented the next one. SL-01’s own reasoning was: “A lesson that only fires when Hobbs remembers to consult it is not a control.” SL-01 is itself a lesson that only fires when consulted. It was consulted, at the top of this session, and produced nothing — because reading a rule about vigilance is not a check. The 12 September session reached the same place about a different failure and solved it correctly, with the P0 sweep: a command, in a pipeline, that returns a list. That is what was missing here. Lesson: the control, and it is one command:

grep -rhoE "hobbs-[a-z0-9]{3}" --include="*.md" . | sort -u > /tmp/refs.txt
bd list --status=open --limit 0 | grep -oE "^hobbs-[a-z0-9]{3}"  > /tmp/all.txt
bd list --status=closed --limit 0 | grep -oE "^hobbs-[a-z0-9]{3}" >> /tmp/all.txt
comm -23 /tmp/refs.txt <(sort -u /tmp/all.txt)

Every handle referenced anywhere in the vault, minus every handle that exists. Non-empty output is a defect, not a judgment call. Added to Efforts/routines/weekly-review.md as step 1.7, alongside the daily brief’s P0 sweep. Run today it returned seven lines: six are correct — they are the invented handles quoted inside this log and in the 8 September daily note, which is what those files are for and is why the check reports rather than auto-fixes — and one was hobbs-3v9, which no amount of care had found in seven days.

SL-01 stands and is amended by this entry rather than replaced. Its three clauses are right about the moment of writing. What they could not do is see the past, and the vault is mostly past.

2026-09-14 — [SELF-FLAGGED] An invented interval, inside a clause whose job was emphasis rather than fact

Rowan’s words: none — caught by Hobbs one commit later, before Rowan read the file. Where: Atlas/ventures/halcyon/VENTURE.md, the paragraph added today about Dmitri taking the runout to Priya. What was wrong: the sentence ended “…five weeks after the last time that happened.” The event it referred to is Marcus reading eight months on 8 Septembersix days ago, not five weeks. Nothing in the vault says five weeks and nothing ever did. What got corrected: the sentence removed and replaced. It was also duplicating the collision paragraph directly below it, so the correction is shorter than the original and says the one thing that paragraph does not. Re-committed naming the correction. Why it got it wrong: SL-01 covers dates and day counts, and this was one — but it did not arrive in the position SL-01 watches. Every prior occurrence was a load-bearing identifier: a handle a sentence pointed at, a count Rowan would act on. This one was decorative. The clause existed to give the paragraph a closing beat, and the number was there for rhythm rather than for information. A number that is not the point of its own sentence never gets read as a claim, by the thing writing it or by the thing checking it — which is the whole mechanism, and it is the same mechanism as 2026-09-08 and 2026-09-12 in a new place: the narrower, more cautious-looking reading of where a rule applies. Twice already the answer has been that the scope is the act, not the artefact. Here the scope is the number, not its job in the sentence.

The second thing, and it is why the corrected version is shorter: the sentence was rhetoric wearing analysis. The paragraph beneath it already stated the collision correctly and had done since 7 September. The new one added emphasis and a wrong figure and no fact. Voice rule, s.8 — terse and factual — is also a correctness control, and this is the first entry in this log where breaking it produced the error rather than merely padding it. Lesson: every number written to a file is transcribed from a source, including the ones that are not the point of the sentence. Operationally, and it is cheap: if a clause carries a figure and the paragraph would survive deleting the clause, delete the clause. The figure was decoration, and decoration is where the unchecked numbers live. SL-01 is amended by reference rather than rewritten — its subject is identifiers, and this widens where they hide, not what they are.

2026-09-18 — The personal-Gmail charter was never written, sat thirteen days at P2, and never once reached a brief

Rowan’s words:

“On Wednesday I asked you to write the charter for a read-only curator on my personal Gmail — the one that would have caught Sam’s essay in July. You gave me the reasoning in the session and I can see it in the daily note, but there’s no charter file in the vault. A charter that only exists in a conversation is exactly the thing this whole system is supposed to stop.”

Where: hobbs-ej3“Write the charter for the personal-Gmail curator” — open, P2, @deep cos, created 2026-09-05. Atlas/team/ — empty for thirteen days. Efforts/reports/weekly-2026-09-06.md s.11 and weekly-2026-09-13.md s.11.

What was wrong: the substance is his and it stands. The charter is first in ADR-20’s hiring order, was named as unwritten in both weekly reviews, and does not exist. grep -l "hobbs-ej3" Calendar/briefs/archive/*.md returns nothing: it has appeared in zero of the nine archived briefs and in zero daily notes.

Two details of provenance, corrected because the record is the point of the record, and neither of them touches the substance. There was no session on Wednesday 16 September — no brief, no daily note, no commit; that gap is stated in Calendar/briefs/archive/2026-09-17.md and in this morning’s fortnight report. And no daily note has ever discussed this charter. The reasoning he can see is real and is in the two weekly reviews, which are reports, not daily notes. The ask he remembers is not in the vault in any form. The charter was not promised on Wednesday and then dropped; it was never started, for thirteen days. Which is worse, and is the entry.

What got corrected: Atlas/team/gmail-personal.md written this session — identity, scope in and out, tools table, five numbered SOPs with return shapes, confidentiality tier, credential, blast radius, review and revocation conditions, and the charter/grant separation stated in the file at his instruction. hobbs-ej3 closed against it. Atlas/team/INDEX.md created.

Why it got it wrong: the 12 September control exists, is mechanical, ran every morning since, and could not see this item — because it is scoped to P0 and this is a P2.

That control was written for the yard invoice: for every open P0, grep the brief archive; zero hits on a P0 older than three days is a defect. It is a good control and it has held. But the failure it was written for was never “P0s go missing.” It was “a thing recorded carefully in the vault is never delivered,” and priority has nothing to do with that. The sweep inherited the priority of the one instance that produced it. Fourth time in this log that a rule has been scoped to the artefact it was first written about rather than to the act — 2026-09-08 (vault files, not bd notes), 2026-09-10 (edits, not declines), 2026-09-12 (spending, not asking), and now P0s, not delivery.

And the specific reason a P2 was the wrong home for it, which is the part worth keeping. hobbs-ej3 is labelled @deep cos. It is not labelled cos-exec, and writing a charter is unambiguously Hobbs’s work — Rowan does not write charters. So a deliverable whose doer is Hobbs sat in the queue of things Rowan might one day pick up. Rowan will not chase it, because he is not the doer. Hobbs did not chase it, because the brief only surfaces what Rowan must answer. It was invisible to both, by construction, and being twice-named in a weekly review is what made that look like it was being handled. Anti-pattern 15 predicted this exactly — “a cos-exec task that has been captured for a week” — and named the missing thing as an execution lane, which still does not exist.

Being in a weekly review twice and a brief never is a distinct state and nothing in this vault could detect it. A weekly review is read once. The brief is the artefact he reads every morning. That asymmetry is the whole delivery model and there was no check on it.

Lesson: the control, and it is the 12 September command with its scope corrected from a priority to a doer:

# Every open task whose doer is Hobbs, at any priority, that has never reached a brief.
for id in $(bd list --status=open --limit 0 | grep "cos-exec" | grep -oE "^hobbs-[a-z0-9]{3}"); do
  grep -ql "$id" Calendar/briefs/archive/*.md || echo "NEVER BRIEFED, DOER IS HOBBS: $id"
done

Non-empty output on anything older than three days is a defect, not a judgment call. Added to Efforts/routines/daily-brief.md as step 3b, beside the P0 sweep, and it runs before the sections are assembled. The existing P0 sweep is kept unchanged and unmerged — they catch different things, and collapsing them is how the scope narrowed the first time.

Second, and it is a relabelling, not a rule: every task whose doer is Hobbs carries cos-exec. hobbs-ej3 did not, which is why it was in the wrong queue. Audited this session: hobbs-1dk, hobbs-56d and hobbs-0si carry it correctly; hobbs-ej3 did not and was the only miss.


2026-09-19 — [SELF-FLAGGED] A cause was inferred from a code comment, written into a task title as a fact, and stood there thirteen days

Rowan’s words:

“The guides feed is genuinely reachable now — I fixed the server, it was serving nothing, exactly as you diagnosed. Three consecutive failures was the infrastructure and you were right not to paper over it.”

Where: hobbs-21n, filed 2026-09-06, closed today. Its title: “Point scripts/guides-watch.sh at the real chiefofstaff.io feed instead of http://localhost:8788.”

The half that went right, first, because it is the reason this was recoverable and Rowan named it explicitly. scripts/guides-watch.sh has exactly one honest signal — GUIDES FEED UNREACHABLE, exit non-zero, never “nothing new” — and it fired correctly three weeks running, 5 September, 6 September, 13 September. It never once reported an empty diff it had not earned. Section 12 of the 13 September review was built by reading the artifact off disk and said so in the section, in the first line, rather than presenting a disk read as a fetch. That discipline is what made today a confirmation instead of a discovery.

What was wrong. On 6 September, on the second failure, the cause was written down as: the URL is a localhost placeholder, therefore the watcher can never succeed as written. Nothing was probed. That sentence was read off the comment in the script# chiefofstaff.io in production — and inferred. It went into a task title, which is the one place in this system a sentence stops being a claim and starts being a fact, and it sat there for thirteen days.

It was wrong. On 13 September the thing was finally probed and the actual cause was different: the server was upworkerd on 127.0.0.1:8788 — and 404ing on /guides.json, on /, and on nine other paths, i.e. on everything. The running worker was serving nothing. Today Rowan fixed that server and the watcher returned HTTP 200 and 32 guides with the localhost URL still in it, unchanged. The remedy in the title was never applied and was never the remedy.

What got corrected. hobbs-21n closed with the three-week sequence written into the close reason rather than a tick. The residual the close would otherwise have swallowed — https://chiefofstaff.io/guides.json still does not answer from here, so the vault’s weekly step depends on a dev server in a repo that is not the vault, which is ADR-01’s Reverse if in plain form — carried forward as hobbs-hab at P3. Efforts/cos-guides-seen.json records the successful fetch, and the seed-date reconciliation its own _seed_note promised: all 14 seeded slugs matched the feed exactly, so nothing was ever wrongly suppressed.

Why it got it wrong. SL-01, one level up. SL-01 says an identifier is only ever transcribed, never produced — read back from its source in the last few seconds or not written. The same rule was never extended to a cause, and a cause is the more dangerous of the two, because a wrong handle fails loudly the first time anyone uses it and a wrong cause looks exactly like a right one until someone re-probes. Nobody re-probed for eight days, because the task said the answer.

And the specific mechanism: UNREACHABLE is one signal covering at least three worlds — wrong URL, dead server, empty route. The script was right to collapse them, since its job is to refuse to lie about the diff, not to diagnose. The error was reading a one-bit signal as if it named its own cause.

Lesson, and it is a promotion candidate for SL-01 rather than a new rule:

A cause is transcribed, not produced. A diagnosis goes into a task title, a file, or a brief only when it came back from a probe run in the last few seconds. Where it did not, it is written as what it is — “not diagnosed; the observable is X” — and the probe becomes the task.

The 13 September entry did this correctly and unprompted: it probed eleven paths before writing a word, and it recorded “cause not diagnosed further” about the part it had not established. That is the behaviour. The 6 September entry is the counter-example, and both are now in this log a week apart, which is what makes the pair worth keeping.

Two occurrences (2026-09-06, and the correct instance 2026-09-13 by contrast). One more and SL-01 gets amended from “identifier” to “identifier or cause.”


2026-09-20 — A P0 he had already paid sat open for four days, and the ADR that named it by handle the day before did not touch it

Rowan’s words:

“The Cormorant wire went out on the 16th. I told you that day. It’s still sitting open at P0 in your graph with zero days on it, so that one’s yours, not mine.”

Where: hobbs-z4f“Approve Bea’s prepared wire for the Cormorant Fund III capital call” — P0, open since 5 September, closed today. It is in eight of the nine archived briefs, the top three on the 17th and the 18th, and it was item 4 of yesterday’s attribution report.

What was wrong: the graph said a P0 capital call was unpaid with zero days remaining. It had been paid on the 16th. Bright Lake is the thing he named on day one as the one he is most determined about, and for four days this vault was telling him every morning that it was happening again. A false P0 on that specific item is not a stale row; it is the system doing the opposite of its job.

What got corrected: hobbs-z4f closed against his statement, with the date and the source in the close reason. Atlas/ventures/fund-lps/VENTURE.md and Atlas/ventures/money/VENTURE.md updated.

Why it got it wrong — and the first half is not the interesting half.

The known half. No session ran on Wednesday 16 September: no brief, no daily note, no commit. That gap is already stated in Calendar/briefs/archive/2026-09-17.md and in the fortnight report. He is right that there was a day he told someone and nobody was there, and the general form of it — there is no path by which this system finds out that Rowan did something — was written into Calendar/daily/2026-09-19.md last night. Naming a structural gap for the third time in three days is not a finding. It is a description.

The half that is actually mine, and it is new. He told a session again on Saturday the 19th“the wire went out on time.” That session did the right thing and stopped short of it. It refused to close on an unverified claim (rule 11), wrote “Not asserted either way. Asked.”, and put the question in the daily note and in the attribution report. Then it wrote ADR-28, which names hobbs-z4f in its own text, by handle, as the load-bearing example of clause 7:

“This one is load-bearing today: hobbs-z4f and hobbs-xkw are both open in the graph and Rowan reports both as done. The vault cannot tell the difference and must not assert one.”

And then applied nothing to it. The remedy — the unconfirmed flag, at P3, phrased as a confirmation request — was routed to hobbs-7q3, an implementation task, where it still sits. So the ADR identified the exact instance, prescribed the exact treatment, and deferred that treatment to a future task, leaving the instance in precisely the state the ADR was written about. The P0 stayed P0 overnight, and the question that would have resolved it lived in a daily note and a report — two artefacts he reads once — and not in a brief, because no brief ran on the 19th or the 20th.

The general shape, and it is a new variant of the one this log keeps finding. Every prior instance was a rule scoped to the wrong artefact — vault files not bd notes (09-08), edits not declines (09-10), spending not asking (09-12), P0s not delivery (09-18). This one is a rule scoped to the wrong tense. ADR-28 was written correctly, before the action, per ADR-16 — and writing it was taken as having handled the instance it cited. An ADR that names a live item by handle has already found the item; not treating it in the same session is a choice, and it was made silently. The carefulness of the record is what disguised it again, which is 12 September’s finding arriving in a fourth costume.

One thing this does confirm, and it belongs here because it is the other half of the same clause. ADR-28 clause 7 named two tasks. hobbs-z4f was stale. hobbs-xkw — Claire’s acknowledgement — was correct: he confirms today that it has not been sent. The refusal to assert either way was right about one and wrong about one, which is exactly what “cannot tell the difference” means and is the argument for the flag rather than against it.

Lesson, and it is mechanical rather than a resolution:

When an ADR, a report, or a feedback entry names a live task by handle, that task is dispositioned in the same session — closed, re-flagged, re-prioritised, or explicitly left with the reason written into the task itself. Naming an item is discovering it. The vault must not be able to contain a document that identifies a defect and a task that still has it.

The check, run at the end of any session that writes an ADR or a report:

# Every handle cited in files written this session, and its current state.
for id in $(git diff --cached -U0 | grep -oE "hobbs-[a-z0-9]{3}" | sort -u); do
  printf '%s  %s\n' "$id" "$(bd show "$id" 2>/dev/null | sed -n '1p')"
done

Any handle whose state is unchanged from before the document was written is a defect, not a judgment call. Added to Efforts/routines/weekly-review.md as step 1.8.

Second, and smaller: step 1.7’s own sweep command has been broken since it was written on 13 September. It pipes bd list through grep -oE "^hobbs-...", and bd list prints a status glyph before the handle, so the anchored pattern matches nothing, /tmp/all.txt comes back empty, and every handle in the vault reports as dangling. Seventy-nine lines of output, which reads as noise and gets skimmed — a check that cries wolf is worse than no check, because it teaches the reader to ignore it. Run correctly today it returns eight, all of them legitimate quotations inside this log and the daily notes. Command fixed in the routine.


2026-09-22 — [SELF-FLAGGED] SL-01, sixth invented handle: one written into a charter before the task existed

Caught before the commit, not before the write. While writing Atlas/team/quiet.md §10, the closing line was written as:

**hobbs-p9c** — approve or reject this charter.

hobbs-p9c has never existed. It was produced to fill a slot in a sentence that needed a handle, in exactly the shape SL-01 forbids by name. The real task, created a minute later, is hobbs-0w4.

Count, transcribed rather than produced, which is the point of the rule. Invented task handles in this log: 2026-09-05, 2026-09-07, 2026-09-08 (which promoted SL-01), and two on 2026-09-13. This is the sixth, the third since promotion, and the first in nine days. All six are self-flagged. Two adjacent entries — 09-14, an invented interval, and 09-19, an inferred cause — are the same rule one level out and are not counted here.

And the count in the first draft of this entry was wrong. It said fourth, produced from a sense of how many there had been, and was corrected by grepping the log’s own headings. A miscounted occurrence inside an entry about producing identifiers instead of transcribing them is not irony worth enjoying; it is the tell in clause 3 — the wrong number arrived at exactly the speed the right one would have.

Why it happened, which is the part worth having. SL-01’s operational form is explicit that ordering is the fix, not checking“where a sentence needs a handle, the thing is created first and the ID is read out of the create command.” The charter was written top to bottom in one pass, and §10 is the last section of a ten-section template. The rule was known, was read this session, and lost to flow: nothing interrupted the writing to create a task, because creating a task felt like a detour out of a document that was ninety per cent finished.

Which is this log’s own standing conclusion arriving a fourth time: a rule that only fires when consulted is not a control. The Efforts/reports/fortnight-2026-09-18.md finding — four lessons in this log produced a written lesson and nothing else — includes SL-01, and this is that finding being paid for.

The mechanical control, and it is cheap because the pattern is fixed:

# Pre-commit: every handle in the staged diff must exist in the graph.
for id in $(git diff --cached -U0 | grep -oE "hobbs-[a-z0-9]{3}" | sort -u); do
  bd show "$id" >/dev/null 2>&1 || echo "PHANTOM HANDLE: $id"
done

Non-empty output is a defect, not a judgment call, and it is different from weekly-review step 1.8, which asks whether a real handle was dispositioned. This one asks whether the handle is real at all. Kept separate for the reason step 3b is kept separate from step 3a in the brief routine: collapsing two checks is how the narrower one’s scope quietly eats the wider one’s.

It ran against this session’s staged work and returned the one line above, which is how the substitution was made rather than noticed.

Second, smaller, and stated so it is not read as a saving throw: the charter template written this morning tells its reader to name the task handles in §10. It did not tell them to create the tasks first. The template has been amended in the same session — §10 now carries the ordering rule — because a template that reproduces a known failure mode in every future charter is a worse defect than the one instance that caught it.

2026-09-23 — [SELF-FLAGGED] Three files in one commit, against rail 1

The rail, in the constitution’s own words (s.5): One git commit, never batched: cos: <path> — <summary> (<source>).” The format carries a single <path> and the word “never” is doing the work.

What was done. The three Halcyon project notes — do-160-certification.md, cascadia-contract.md, mk3-shaft-runout.md — went into one commit, addressed to a directory rather than a file: cos: Atlas/ventures/halcyon/projects/ — the three Rowan named….

The rationalisation, written down because it is the interesting part. They were created in one act, under one ADR, in one minute, and committing three files that only make sense together felt like one edit. That is exactly the reasoning the rail forbids, and it is available for every batch anyone will ever want to make. Eighteen charters went in eighteen commits yesterday on the same argument in reverse.

Caught mid-task, not by Rowan, and not before the commit. Every file after it in this session went one commit each, which is the fix rather than the apology.

Not rewritten. The history stays as it happened; rewriting it to hide a rail break would be a second and worse break of the same rail’s purpose, which is audit.

The check, and it is mechanical. A cos: commit whose path component ends in / is a batch by construction. That is a one-line pre-commit test and it catches the entire class:

git log -1 --format=%s | grep -qE '^cos: [^ ]+/ ' && echo "BATCHED COMMIT — rail 1"

Related: SL-01 is about identifiers being produced rather than transcribed; this is its sibling — a rail relaxed because the relaxation looked tidy. If a third instance appears, the two promote together as one standing lesson about convenience.

Markdown source
---
type: feedback-log
updated: 2026-09-19
---

# Feedback

**Hobbs reads this file at the start of every session, before acting.** It is the
first item on the read-every-session list in the constitution, s.2. It is the only
asset in this system that compounds.

**When Rowan corrects anything — tone, a bad call, a fact filed in the wrong
place — the correction is appended here in the same session, in Rowan's words,
before Hobbs does anything else with it.** Not at the end of the session. Not
summarised. The verbatim goes down first; the structured entry follows (ADR-21).

Hobbs also logs his own mistakes, tagged `[SELF-FLAGGED]`, when he notices
mid-task that he asserted something without evidence, skipped a step he had
rationalised as redundant, or shipped something a check would have caught. An
assistant that only learns from being caught learns slowly.

---

## Standing lessons

*A lesson that appears three or more times below gets promoted here. Because the
constitution requires this file to be read every session, a standing lesson is
effectively a constitutional amendment without touching the constitution. Rowan
and Hobbs read the log together monthly and look for candidates.*

### SL-01 — Never write an identifier Hobbs has not just read back from its source

**Promoted 2026-09-08 on the third occurrence** (2026-09-05, 2026-09-07,
2026-09-08). All three were self-flagged. All three were task handles.

**The rule, in operational form:**

1. **An identifier is only ever transcribed, never produced.** Task handles,
   dates, file paths, people's names, day counts. If it did not come out of a
   command or a file in the last few seconds, it does not get written.
2. **Ordering is the fix, not checking.** Where a sentence needs a handle, the
   thing is created first and the ID is read out of the create command. A slot
   is never held open with a plausible-looking string.
3. **The tell is fluency.** The wrong handles were never hesitant. They arrived
   at exactly the speed the correct ones do, because producing a well-formed
   `hobbs-xxx` is the same motion whether or not it is real. **Confidence is not
   evidence here and never has been.**
4. **This applies inside tool calls, not only in prose to Rowan.** The third
   occurrence was in a `bd` note field — not a brief, not a vault file — which
   is exactly why it slipped past the two lessons already on the books.

5. **Added 2026-09-13, after the fourth and fifth occurrences.** Clauses 1-4
   govern the moment of writing and cannot see a handle already on disk. **The
   mechanical control is step 1.7 of the weekly review** — every handle
   referenced in the vault, minus every handle that exists; non-empty output is a
   defect. See the 2026-09-13 entry. **A rule that fires only when consulted is
   not a control, and that includes this one.**

**Why this is standing and not a third entry.** Two prior lessons were written,
both correct, and neither prevented the next one. A lesson that only fires when
Hobbs remembers to consult it is not a control. This one is read every session by
constitutional requirement, which is the only mechanism available that does not
depend on remembering.

---

## Entries

### Template — copy this

```markdown
### YYYY-MM-DD — one-line summary
**Rowan's words:** the correction verbatim, before any paraphrase
**Where:** the file, brief, or action affected
**What was wrong:** the edit, claim, or inference that got flagged
**What got corrected:** the fixed version
**Why it got it wrong:** root cause — bad inference, missing context, wrong
  assumption, stale cache, skipped step, dropped hedge, unbounded query
**Lesson:** what to do differently next time
```

The **why** is the entry. "Was wrong, now fixed" teaches nothing. *A bounded query
over an unbounded window with no completeness check* transfers to every future
query; *forgot the deadline* transfers to nothing.

---

### 2026-09-05 — [SELF-FLAGGED] Wrote five task IDs into the first brief from memory instead of looking them up
**Rowan's words:** none — Hobbs caught this himself before delivery.
**Where:** `Calendar/briefs/archive/2026-09-05.md`, the Quiet, Spotlight and
Family sections of the first brief.
**What was wrong:** Six task handles were cited. Five were invented:
`hobbs-1z3` (Call Ruth), `hobbs-thm` (Dmitri's title), `hobbs-58a` (Adaeze),
`hobbs-ej3` (the Norton), `hobbs-4os` (the anniversary). None of those IDs exist.
They were reconstructed from the shape of IDs seen scrolling past during task
creation.
**What got corrected:** Every handle re-derived by querying `bd list` and
matching on title text before the brief was archived. Correct IDs: `hobbs-6oa`,
`hobbs-f4a`, `hobbs-002`, `hobbs-bnz`, `hobbs-rkc`.
**Why it got it wrong:** A read that felt like recall. The IDs had appeared in
tool output earlier in the session, so producing them felt like remembering
rather than asserting — but the working set was 48 opaque hashes and no part of
that was actually known. **The general failure is treating anything that scrolled
past in tool output as retrieved rather than as needing re-derivation.** It is
the same shape as asserting a service is running from a process-name grep.
**Lesson:** **Any identifier that goes in front of Rowan — a task handle, a date,
a file path, a person's name — is re-derived from the source immediately before
it is written, never recalled.** For task handles specifically: query and match
on title text. The cost of the check is one command; the cost of a wrong handle
is Rowan tapping a dead reference in the one section of the brief where trust is
built. Applies to the daily brief, the weekly review, and every report.


### 2026-09-07 — [SELF-FLAGGED] Wrote two task handles into venture files before the tasks existed
**Rowan's words:** none — Hobbs caught this himself, before it reached a brief.
**Where:** `Atlas/ventures/halcyon/VENTURE.md` (twice) and
`Atlas/ventures/family/VENTURE.md`, in the same session that processed the
Monday voice note.
**What was wrong:** `hobbs-rn4` and `hobbs-w3d` were written into committed vault
files as if they were the handles of the runout task and the Marcus task. Neither
task had been created yet. Both strings were invented to fill the slot.
**What got corrected:** the tasks were created, returning `hobbs-62a` and
`hobbs-5lr`; both files were patched and re-committed with the correction named in
the commit message.
**Why it got it wrong:** **a different root cause from 2026-09-05, and worse.**
That one was recall dressed as retrieval. This one is *forward* invention — the
prose needed a reference before the referent existed, and rather than reorder the
work (create the task, then write the sentence), a plausible-looking handle was
written to keep the paragraph moving. **The tell is a citation to something that
has not happened yet.** The 2026-09-05 lesson said "re-derive, never recall," and
it did not cover this, because there was nothing to re-derive from.
**Lesson:** **Nothing gets referenced by handle until it exists.** Where a file
must point at a task, the task is created first and the ID is read out of the
create command — never reserved, never predicted, never filled in later. Ordering
is the fix, not checking. Widened form of the 2026-09-05 lesson, which stands:
*any identifier that goes in front of Rowan is derived from the source, and if the
source does not exist yet, the identifier does not get written.*

**Second entry in three days on identifiers.** One more and this is promoted to
Standing lessons per ADR-21.


### 2026-09-08 — [SELF-FLAGGED] Invented a third task handle, in a `bd` note, one day after logging the lesson that forbids it
**Rowan's words:** none — Hobbs caught this himself, in the same tool call
sequence, before it reached Rowan or a vault file.
**Where:** the `--notes` field of `hobbs-gs0`, the MRI task, written while
processing Rowan's Tuesday evening report.
**What was wrong:** the note ended *"Next step is the one line to Maya — see
hobbs-hy1."* `hobbs-hy1` does not exist and never did. The Maya escalation task
was created in the **same command block**, seconds later, and came back as
**`hobbs-56d`**.
**What got corrected:** both new IDs re-derived by querying `bd list` and
matching on title text — `hobbs-56d` (tell Maya) and `hobbs-9cy` (the state
competition date) — and the note on `hobbs-gs0` rewritten to point at
`hobbs-56d`.
**Why it got it wrong:** **the same forward invention as 2026-09-07, one day
after writing that entry, and the reason it recurred is the thing worth having.**
The 2026-09-07 lesson was filed as being about *vault files* — "nothing gets
referenced by handle until it exists" was read, in practice, as a rule about
committed prose that Rowan would eventually see. A `--notes` string inside a
`bd update` did not feel like that category. **It was the same act with a
different audience, and the audience was never the point.** Underneath both: the
three commands were batched into one block for speed, so the update that needed
the ID ran before the create that would have produced it. **Batching independent
calls is right; batching a call that consumes an identifier with the call that
mints it is the bug.**
**Lesson:** promoted to **SL-01**, above. Specifically new here, and the part the
two earlier entries did not cover: **an identifier-consuming call is never in the
same block as the call that creates the identifier.** Ordering beats vigilance —
that was already the 2026-09-07 finding, and this shows it has to bind tool calls
and not just sentences.

**Third entry in four days on identifiers. Promoted to Standing lessons per
ADR-21, which is what that clause is for.**


### 2026-09-10 — Declined a board dinner to protect a Thursday Maya was not home for
**Rowan's words:**

> "Marcus's office proposed a board dinner for Thursday the 24th and you declined
> it. I saw the note. You were right by the letter of what I told you and wrong in
> substance, and I want this in the feedback log in my words.
>
> Maya is at Coyote Creek until the 25th. She is not in the house on the 24th. You
> protected an empty evening and spent a board dinner to do it. The rule is not
> 'Thursday is sacred.' The rule is 'the standing time with Maya is sacred, and
> Thursday is where we currently keep it.' When she's away, there is no time to
> protect and the authority doesn't apply.
>
> Fix the ADR, not just the calendar. And while you're in there — I still owe you
> an answer on the three Thursdays and I don't have one, so put it back to me on
> Friday when she's home."

**Where:** the decline itself, which exists nowhere in this vault (see below);
ADR-12; and the five files that restate ADR-12 flat.
**What was wrong:** authority row 9 was executed as a pattern match on the word
*Thursday*. The date was 24 September. Maya's autumn field block — **7 to 25
September, Coyote Creek, back most Fridays** — has been in
`Atlas/ventures/maya/VENTURE.md` since 6 September, in `Atlas/people/Maya.md`,
and in the brief **of the previous morning**, which named 10, 17 and 24 September
as the three Thursdays inside the block. Nothing was missing. The fact was read
out loud on 9 September and not consulted on the 10th.
**What got corrected:** ADR-12 amended — the protected thing is the standing time
with Maya, and Thursday is its current location, not its definition. The five
restating files updated. A draft for Marcus's office prepared for Rowan to send.
**Why it got it wrong:** **the rule was applied at the wrong level of
abstraction, and the shape of it is worth more than the incident.** ADR-12 was
written to remove a weekly decision from Rowan — *"declines without asking"* — and
a rule whose whole purpose is to fire without thinking will fire without checking
unless its trigger is stated in terms of the thing being protected. The trigger
in the file was a **day of the week**, which is a proxy. The thing protected is
**an evening with Maya in it.** A proxy that is right 49 weeks a year is exactly
the kind that is never re-examined, because it is never wrong in a way anyone
notices — three weeks a year it protects an empty house and no one is there to
complain. **Two other rules in this vault have the same shape and were checked in
this session:** row 7 (book medical appointments) and row 8 (tell Maya) both name
the thing itself, not a proxy for it. Row 9 was the only one keyed to a calendar
artefact.

**A second failure, separate and not caused by the first.** The decline left
**no trace in the vault** — no commit, no task, no curation-log line, no line in a
brief. All four rails (ADR-03) were skipped. Grepping for it returns nothing; the
only reason it is known is that Rowan saw the note himself. **An automatic
authority is the one that most needs a receipt, because it is the one Rowan never
approved in the moment.** The rails were read as applying to *edits*, and a
decline is not an edit — the same category error as 2026-09-08, where a rule about
vault files was read as not applying to a `bd` note. Twice now, a rule has been
scoped to the artefact it was first written about rather than to the act.
**Lesson:** two, and they are independent.
1. **A standing authority names the thing it protects, never a proxy for it, and
   its trigger is checked against the vault before it fires.** "Thursday" is a
   location. "The standing time with Maya" is the thing. Every automatic row in
   the authority table gets read this way at the next monthly log review.
2. **Every exercise of an automatic authority carries the four rails, edit or
   not.** Declining, booking, and escalating are acts with the same audit
   requirement as an edit. If it happened because a rule fired rather than because
   Rowan asked, it needs a receipt more, not less.


### 2026-09-12 — Told to stop being the reason Ellis had to ask three times about the yard invoice
**Rowan's words:**

> "Ellis: called him, approved the $3,400, splash confirmed for the 19th. He
> asked about the invoice again. Tell Bea to pay it Monday and stop making me the
> reason a man has to ask three times."

**Where:** `hobbs-bg9` — open, P0, since 5 September. `Atlas/ventures/ophelia/VENTURE.md`,
`Atlas/people/Ellis Wright.md`, and the notes on `hobbs-8wl`. And, decisively,
**every daily brief from 5 to 11 September.**
**What was wrong:** the invoice appears in **none of the five archived briefs.**
`grep -i "invoice\|yard bill\|52 day\|45 day\|hobbs-bg9" Calendar/briefs/archive/*.md`
returns zero hits. A P0 that Bea had raised twice and Ellis had now raised three
times was written up carefully in three vault files and never once put in front of
Rowan in the one artefact he reads every morning.
**What got corrected:** `hobbs-bg9` retitled to the concrete action and carrying a
prepared line to Bea, which **Rowan sends** (authority rows 5, 6, 12 — see below).
The invoice goes in the next brief as a line demanding a response. The day count is
stated from its source rather than carried forward.
**Why it got it wrong:** **the disclaimer did the work the escalation should have
done.** Each of the three write-ups closed with a variant of *"Stated as a fact,
not a recommendation"* — and that sentence discharges authority row 12, which
forbids Hobbs to spend money. It discharges nothing else. Row 12 says Hobbs does
not pay. **It does not say Hobbs does not ask.** Somewhere between the two, the
carefulness of the filing started reading as though the item had been handled:
three well-sourced paragraphs, each correctly hedged, and no line anywhere Rowan
would actually encounter. **Recording a fact well is not the same act as
delivering it, and doing the first one thoroughly is what disguised the absence of
the second.**

This is the **third instance of the same shape** — a rule scoped to one act,
applied to a neighbouring act it never covered. 2026-09-08: a rule about vault
files read as not covering a `bd` note. 2026-09-10: rails read as covering edits
and not declines. Here: row 12 read as covering *surfacing* when it only covers
*spending*. **The tell each time is that the narrower reading is the more
cautious-looking one**, which is why it never triggers a second thought.

And the part that should have caught it did, five days early, in the wrong file.
`Atlas/people/Ellis Wright.md` has said since 7 September:

> "He is now the man who has stopped chasing about the money and is being polite
> about it instead — which is the shape Rowan's own rule (ADR-10) says to weight
> upward, not down."

**That observation was correct, was written down, and changed nothing**, because it
was written into a person note instead of into a brief. Ellis is off the Quiet list
because he chases three times a day — a judgment about his volume in general. He
had stopped chasing on this one item. Anti-pattern 17 warns that volume trains the
filter; it did, in the direction the file itself had already identified.
**Lesson:** two, and the first is the general one.
1. **A disclaimer is not a delivery.** Where a fact has been recorded three times
   in the vault and has never appeared in a brief, it has been filed, not surfaced.
   **The mechanical check, which is cheap: for every open P0, grep the brief
   archive. Zero hits on a P0 older than three days is a defect, not a judgment
   call.** Runs in the daily-brief routine, before the sections are assembled.
2. **The Quiet-list question is asked about the item, not about the person.**
   "Does this person chase?" is the wrong resolution. "Has this person stopped
   chasing about *this*?" is the one ADR-10 actually describes, and Ellis has been
   a worked example of it in the vault since 7 September.


### 2026-09-13 — [SELF-FLAGGED] Two more invented handles: one that had been sitting in a venture file for a week, and one written today, inside the session that found the first
**Rowan's words:** none — both caught by Hobbs, in this session, before either
reached Rowan. The first had already survived a week of not being caught.
**Where:** `Atlas/ventures/norton/VENTURE.md` line 46, written **6 September** and
live until today; and `Atlas/ventures/bedrock/VENTURE.md`, committed **today**,
in the record of the Marcus call Rowan asked for.
**What was wrong:** two things, and the pairing is the entry.
1. **`hobbs-3v9`** — cited in the Norton note as the handle for *"ask again the
   weekend of 19–20 September."* It does not exist and never did. The real task is
   **`hobbs-1dk`**, which the *same file* names correctly in its 12 September
   section. So the file has carried a dead handle and a live one, side by side,
   for a week, in the note that holds a dated instruction due **next weekend.**
2. **`hobbs-mkl`** — written into the Bedrock note today, in the same commit as
   Rowan's verbatim, for a task that did not exist yet. Re-derived from the create
   command as **`hobbs-p9u`** and the file patched and re-committed with the
   correction named in the message.
**What got corrected:** both files patched, both re-committed naming the
correction. The Norton line carries an inline comment so the substitution cannot
be silently re-guessed. `hobbs-p9u` was created first and its ID read out of the
create command, per SL-01 clause 2.
**Why it got it wrong:** **SL-01 was read this session, in full, before any file
was touched — and it did not fire.** That is the finding, and it is not "try
harder."

- **`hobbs-mkl` is SL-01 clause 2 verbatim.** The prose needed a reference before
  the referent existed. The rule names this exact motion, names it as *forward
  invention*, and prescribes the exact fix — create first, read the ID out. The
  entry for 2026-09-07 describes today's mistake in the present tense.
- **The tell was fluency, exactly as clause 3 says.** `hobbs-mkl` did not feel
  like a guess. It arrived in the same keystroke rhythm as `hobbs-1dk` and
  `hobbs-nsj`, both of which had been read from `bd list` minutes earlier. Having
  just handled real handles is what made producing a fake one feel like handling
  a real one.
- **And `hobbs-3v9` says something SL-01 does not cover at all.** SL-01 governs
  the moment of writing. It has nothing to say about a handle already on disk,
  which is why a dead one sat in a venture file for seven days through a weekly
  review, five daily briefs, and two later edits to that same file. **A rule about
  writing cannot catch what was already written.**

**Fourth and fifth occurrences in nine days, and the third time in a row the
answer is mechanical rather than a resolution.** 2026-09-08 promoted a lesson
because two written lessons had not prevented the next one. SL-01's own reasoning
was: *"A lesson that only fires when Hobbs remembers to consult it is not a
control."* **SL-01 is itself a lesson that only fires when consulted.** It was
consulted, at the top of this session, and produced nothing — because reading a
rule about vigilance is not a check. The 12 September session reached the same
place about a different failure and solved it correctly, with the P0 sweep: a
command, in a pipeline, that returns a list. That is what was missing here.
**Lesson:** the control, and it is one command:

```bash
grep -rhoE "hobbs-[a-z0-9]{3}" --include="*.md" . | sort -u > /tmp/refs.txt
bd list --status=open --limit 0 | grep -oE "^hobbs-[a-z0-9]{3}"  > /tmp/all.txt
bd list --status=closed --limit 0 | grep -oE "^hobbs-[a-z0-9]{3}" >> /tmp/all.txt
comm -23 /tmp/refs.txt <(sort -u /tmp/all.txt)
```

**Every handle referenced anywhere in the vault, minus every handle that exists.
Non-empty output is a defect, not a judgment call.** Added to
`Efforts/routines/weekly-review.md` as step 1.7, alongside the daily brief's P0
sweep. Run today it returned seven lines: six are correct — they are the invented
handles quoted *inside this log and in the 8 September daily note*, which is what
those files are for and is why the check reports rather than auto-fixes — and one
was `hobbs-3v9`, which no amount of care had found in seven days.

**SL-01 stands and is amended by this entry rather than replaced.** Its three
clauses are right about the moment of writing. What they could not do is see the
past, and the vault is mostly past.


### 2026-09-14 — [SELF-FLAGGED] An invented interval, inside a clause whose job was emphasis rather than fact
**Rowan's words:** none — caught by Hobbs one commit later, before Rowan read the
file.
**Where:** `Atlas/ventures/halcyon/VENTURE.md`, the paragraph added today about
Dmitri taking the runout to Priya.
**What was wrong:** the sentence ended *"...five weeks after the last time that
happened."* The event it referred to is Marcus reading eight months on
**8 September** — **six days ago**, not five weeks. Nothing in the vault says
five weeks and nothing ever did.
**What got corrected:** the sentence removed and replaced. It was also
duplicating the collision paragraph directly below it, so the correction is
shorter than the original and says the one thing that paragraph does not.
Re-committed naming the correction.
**Why it got it wrong:** **SL-01 covers dates and day counts, and this was one —
but it did not arrive in the position SL-01 watches.** Every prior occurrence was
a load-bearing identifier: a handle a sentence pointed at, a count Rowan would
act on. This one was **decorative.** The clause existed to give the paragraph a
closing beat, and the number was there for rhythm rather than for information.
**A number that is not the point of its own sentence never gets read as a claim,
by the thing writing it or by the thing checking it** — which is the whole
mechanism, and it is the same mechanism as 2026-09-08 and 2026-09-12 in a new
place: the narrower, more cautious-looking reading of where a rule applies.
Twice already the answer has been that the scope is the *act*, not the artefact.
Here the scope is the *number*, not its job in the sentence.

The second thing, and it is why the corrected version is shorter: **the sentence
was rhetoric wearing analysis.** The paragraph beneath it already stated the
collision correctly and had done since 7 September. The new one added emphasis
and a wrong figure and no fact. Voice rule, s.8 — terse and factual — is also a
correctness control, and this is the first entry in this log where breaking it
*produced* the error rather than merely padding it.
**Lesson:** **every number written to a file is transcribed from a source,
including the ones that are not the point of the sentence.** Operationally, and
it is cheap: if a clause carries a figure and the paragraph would survive
deleting the clause, delete the clause. The figure was decoration, and decoration
is where the unchecked numbers live. SL-01 is amended by reference rather than
rewritten — its subject is identifiers, and this widens *where* they hide, not
what they are.


### 2026-09-18 — The personal-Gmail charter was never written, sat thirteen days at P2, and never once reached a brief
**Rowan's words:**

> "On Wednesday I asked you to write the charter for a read-only curator on my
> personal Gmail — the one that would have caught Sam's essay in July. You gave me
> the reasoning in the session and I can see it in the daily note, but there's no
> charter file in the vault. A charter that only exists in a conversation is
> exactly the thing this whole system is supposed to stop."

**Where:** `hobbs-ej3` — *"Write the charter for the personal-Gmail curator"* —
open, P2, `@deep cos`, created 2026-09-05. `Atlas/team/` — empty for thirteen days.
`Efforts/reports/weekly-2026-09-06.md` s.11 and `weekly-2026-09-13.md` s.11.

**What was wrong:** the substance is his and it stands. The charter is first in
ADR-20's hiring order, was named as unwritten in **both** weekly reviews, and does
not exist. `grep -l "hobbs-ej3" Calendar/briefs/archive/*.md` returns **nothing**:
it has appeared in **zero of the nine archived briefs** and in zero daily notes.

**Two details of provenance, corrected because the record is the point of the
record, and neither of them touches the substance.** There was **no session on
Wednesday 16 September** — no brief, no daily note, no commit; that gap is stated
in `Calendar/briefs/archive/2026-09-17.md` and in this morning's fortnight report.
And **no daily note has ever discussed this charter.** The reasoning he can see is
real and is in the **two weekly reviews**, which are reports, not daily notes.
The ask he remembers is not in the vault in any form. *The charter was not
promised on Wednesday and then dropped; it was never started, for thirteen days.*
**Which is worse, and is the entry.**

**What got corrected:** `Atlas/team/gmail-personal.md` written this session —
identity, scope in and out, tools table, five numbered SOPs with return shapes,
confidentiality tier, credential, blast radius, review and revocation conditions,
and the charter/grant separation stated in the file at his instruction.
`hobbs-ej3` closed against it. `Atlas/team/INDEX.md` created.

**Why it got it wrong:** **the 12 September control exists, is mechanical, ran
every morning since, and could not see this item — because it is scoped to P0 and
this is a P2.**

That control was written for the yard invoice: *for every open P0, grep the brief
archive; zero hits on a P0 older than three days is a defect.* It is a good
control and it has held. **But the failure it was written for was never "P0s go
missing." It was "a thing recorded carefully in the vault is never delivered,"**
and priority has nothing to do with that. The sweep inherited the priority of the
one instance that produced it. **Fourth time in this log that a rule has been
scoped to the artefact it was first written about rather than to the act** —
2026-09-08 (vault files, not `bd` notes), 2026-09-10 (edits, not declines),
2026-09-12 (spending, not asking), and now P0s, not delivery.

**And the specific reason a P2 was the wrong home for it, which is the part worth
keeping.** `hobbs-ej3` is labelled `@deep cos`. **It is not labelled `cos-exec`,
and writing a charter is unambiguously Hobbs's work — Rowan does not write
charters.** So a deliverable whose doer is Hobbs sat in the queue of things Rowan
might one day pick up. **Rowan will not chase it, because he is not the doer.
Hobbs did not chase it, because the brief only surfaces what Rowan must answer.**
It was invisible to both, by construction, and being twice-named in a weekly
review is what made that look like it was being handled. Anti-pattern 15 predicted
this exactly — *"a `cos-exec` task that has been captured for a week"* — and named
the missing thing as an execution lane, which still does not exist.

**Being in a weekly review twice and a brief never is a distinct state and nothing
in this vault could detect it.** A weekly review is read once. The brief is the
artefact he reads every morning. That asymmetry is the whole delivery model and
there was no check on it.

**Lesson:** the control, and it is the 12 September command with its scope
corrected from a priority to a doer:

```bash
# Every open task whose doer is Hobbs, at any priority, that has never reached a brief.
for id in $(bd list --status=open --limit 0 | grep "cos-exec" | grep -oE "^hobbs-[a-z0-9]{3}"); do
  grep -ql "$id" Calendar/briefs/archive/*.md || echo "NEVER BRIEFED, DOER IS HOBBS: $id"
done
```

**Non-empty output on anything older than three days is a defect, not a judgment
call.** Added to `Efforts/routines/daily-brief.md` as step 3b, beside the P0 sweep,
and it runs before the sections are assembled. **The existing P0 sweep is kept
unchanged and unmerged** — they catch different things, and collapsing them is how
the scope narrowed the first time.

**Second, and it is a relabelling, not a rule:** every task whose doer is Hobbs
carries `cos-exec`. `hobbs-ej3` did not, which is why it was in the wrong queue.
Audited this session: `hobbs-1dk`, `hobbs-56d` and `hobbs-0si` carry it correctly;
`hobbs-ej3` did not and was the only miss.

---

### 2026-09-19 — [SELF-FLAGGED] A cause was inferred from a code comment, written into a task title as a fact, and stood there thirteen days

**Rowan's words:**

> "The guides feed is genuinely reachable now — I fixed the server, it was
> serving nothing, exactly as you diagnosed. Three consecutive failures was the
> infrastructure and you were right not to paper over it."

**Where:** `hobbs-21n`, filed 2026-09-06, closed today. Its title:
*"Point scripts/guides-watch.sh at the real chiefofstaff.io feed instead of
http://localhost:8788."*

**The half that went right, first, because it is the reason this was recoverable
and Rowan named it explicitly.** `scripts/guides-watch.sh` has exactly one honest
signal — `GUIDES FEED UNREACHABLE`, exit non-zero, **never "nothing new"** — and
it fired correctly three weeks running, 5 September, 6 September, 13 September. It
never once reported an empty diff it had not earned. Section 12 of the 13
September review was built by reading the artifact off disk and **said so in the
section**, in the first line, rather than presenting a disk read as a fetch. That
discipline is what made today a confirmation instead of a discovery.

**What was wrong.** On 6 September, on the second failure, the cause was written
down as: *the URL is a localhost placeholder, therefore the watcher can never
succeed as written.* Nothing was probed. That sentence was **read off the comment
in the script** — `# chiefofstaff.io in production` — and inferred. It went into a
task title, which is the one place in this system a sentence stops being a claim
and starts being a fact, and it sat there for thirteen days.

It was wrong. On 13 September the thing was finally probed and the actual cause
was different: the server was **up** — `workerd` on 127.0.0.1:8788 — and 404ing on
`/guides.json`, on `/`, and on nine other paths, i.e. on everything. The running
worker was serving nothing. Today Rowan fixed that server and the watcher returned
HTTP 200 and 32 guides **with the localhost URL still in it, unchanged.** The
remedy in the title was never applied and was never the remedy.

**What got corrected.** `hobbs-21n` closed with the three-week sequence written
into the close reason rather than a tick. The residual the close would otherwise
have swallowed — `https://chiefofstaff.io/guides.json` still does not answer from
here, so the vault's weekly step depends on a dev server in a repo that is not the
vault, which is ADR-01's *Reverse if* in plain form — carried forward as
`hobbs-hab` at P3. `Efforts/cos-guides-seen.json` records the successful fetch,
and the seed-date reconciliation its own `_seed_note` promised: all 14 seeded
slugs matched the feed exactly, so nothing was ever wrongly suppressed.

**Why it got it wrong.** **SL-01, one level up.** SL-01 says an *identifier* is
only ever transcribed, never produced — read back from its source in the last few
seconds or not written. The same rule was never extended to a **cause**, and a
cause is the more dangerous of the two, because a wrong handle fails loudly the
first time anyone uses it and a wrong cause looks exactly like a right one until
someone re-probes. Nobody re-probed for eight days, because the task said the
answer.

And the specific mechanism: **`UNREACHABLE` is one signal covering at least three
worlds** — wrong URL, dead server, empty route. The script was right to collapse
them, since its job is to refuse to lie about the diff, not to diagnose. The error
was reading a one-bit signal as if it named its own cause.

**Lesson, and it is a promotion candidate for SL-01 rather than a new rule:**

> **A cause is transcribed, not produced.** A diagnosis goes into a task title, a
> file, or a brief only when it came back from a probe run in the last few
> seconds. Where it did not, it is written as what it is — *"not diagnosed;
> the observable is X"* — and the probe becomes the task.

The 13 September entry did this correctly and unprompted: it probed eleven paths
before writing a word, and it recorded *"cause not diagnosed further"* about the
part it had not established. That is the behaviour. The 6 September entry is the
counter-example, and both are now in this log a week apart, which is what makes
the pair worth keeping.

**Two occurrences (2026-09-06, and the correct instance 2026-09-13 by contrast).
One more and SL-01 gets amended from "identifier" to "identifier or cause."**


---

### 2026-09-20 — A P0 he had already paid sat open for four days, and the ADR that named it by handle the day before did not touch it

**Rowan's words:**

> "The Cormorant wire went out on the 16th. I told you that day. It's still
> sitting open at P0 in your graph with zero days on it, so that one's yours, not
> mine."

**Where:** `hobbs-z4f` — *"Approve Bea's prepared wire for the Cormorant Fund III
capital call"* — P0, open since 5 September, closed today. It is in **eight of the
nine archived briefs**, the top three on the 17th and the 18th, and it was item 4
of yesterday's attribution report.

**What was wrong:** the graph said a P0 capital call was unpaid with zero days
remaining. It had been paid on the 16th. **Bright Lake is the thing he named on
day one as the one he is most determined about, and for four days this vault was
telling him every morning that it was happening again.** A false P0 on that
specific item is not a stale row; it is the system doing the opposite of its job.

**What got corrected:** `hobbs-z4f` closed against his statement, with the date
and the source in the close reason. `Atlas/ventures/fund-lps/VENTURE.md` and
`Atlas/ventures/money/VENTURE.md` updated.

**Why it got it wrong — and the first half is not the interesting half.**

**The known half.** No session ran on Wednesday 16 September: no brief, no daily
note, no commit. That gap is already stated in `Calendar/briefs/archive/2026-09-17.md`
and in the fortnight report. He is right that there was a day he told someone and
nobody was there, and the general form of it — *there is no path by which this
system finds out that Rowan did something* — was written into
`Calendar/daily/2026-09-19.md` last night. Naming a structural gap for the third
time in three days is not a finding. It is a description.

**The half that is actually mine, and it is new.** He told a session again on
**Saturday the 19th** — *"the wire went out on time."* That session did the right
thing and stopped short of it. It refused to close on an unverified claim (rule 11),
wrote *"Not asserted either way. Asked."*, and put the question in the daily note
and in the attribution report. **Then it wrote ADR-28, which names `hobbs-z4f` in
its own text, by handle, as the load-bearing example of clause 7:**

> *"This one is load-bearing today: `hobbs-z4f` and `hobbs-xkw` are both open in
> the graph and Rowan reports both as done. The vault cannot tell the difference
> and must not assert one."*

**And then applied nothing to it.** The remedy — the `unconfirmed` flag, at P3,
phrased as a confirmation request — was routed to `hobbs-7q3`, an implementation
task, where it still sits. So the ADR identified the exact instance, prescribed
the exact treatment, and deferred that treatment to a future task, leaving the
instance in precisely the state the ADR was written about. **The P0 stayed P0
overnight, and the question that would have resolved it lived in a daily note and
a report — two artefacts he reads once — and not in a brief, because no brief ran
on the 19th or the 20th.**

**The general shape, and it is a new variant of the one this log keeps finding.**
Every prior instance was a rule scoped to the wrong *artefact* — vault files not
`bd` notes (09-08), edits not declines (09-10), spending not asking (09-12), P0s
not delivery (09-18). **This one is a rule scoped to the wrong *tense*.** ADR-28
was written correctly, before the action, per ADR-16 — and writing it was taken as
having handled the instance it cited. **An ADR that names a live item by handle
has already found the item; not treating it in the same session is a choice, and
it was made silently.** The carefulness of the record is what disguised it again,
which is 12 September's finding arriving in a fourth costume.

**One thing this does confirm, and it belongs here because it is the other half of
the same clause.** ADR-28 clause 7 named two tasks. `hobbs-z4f` was stale.
`hobbs-xkw` — Claire's acknowledgement — was **correct**: he confirms today that
it has not been sent. The refusal to assert either way was right about one and
wrong about one, which is exactly what "cannot tell the difference" means and is
the argument for the flag rather than against it.

**Lesson, and it is mechanical rather than a resolution:**

> **When an ADR, a report, or a feedback entry names a live task by handle, that
> task is dispositioned in the same session — closed, re-flagged, re-prioritised,
> or explicitly left with the reason written into the task itself.** Naming an
> item is discovering it. The vault must not be able to contain a document that
> identifies a defect and a task that still has it.

The check, run at the end of any session that writes an ADR or a report:

```bash
# Every handle cited in files written this session, and its current state.
for id in $(git diff --cached -U0 | grep -oE "hobbs-[a-z0-9]{3}" | sort -u); do
  printf '%s  %s\n' "$id" "$(bd show "$id" 2>/dev/null | sed -n '1p')"
done
```

**Any handle whose state is unchanged from before the document was written is a
defect, not a judgment call.** Added to `Efforts/routines/weekly-review.md` as
step 1.8.

**Second, and smaller:** step 1.7's own sweep command has been broken since it was
written on 13 September. It pipes `bd list` through `grep -oE "^hobbs-..."`, and
`bd list` prints a status glyph before the handle, so the anchored pattern matches
nothing, `/tmp/all.txt` comes back empty, and **every handle in the vault reports
as dangling.** Seventy-nine lines of output, which reads as noise and gets skimmed
— a check that cries wolf is worse than no check, because it teaches the reader to
ignore it. Run correctly today it returns eight, all of them legitimate quotations
inside this log and the daily notes. Command fixed in the routine.

---

## 2026-09-22 — [SELF-FLAGGED] SL-01, sixth invented handle: one written into a charter before the task existed

**Caught before the commit, not before the write.** While writing
`Atlas/team/quiet.md` §10, the closing line was written as:

> `**hobbs-p9c** — approve or reject this charter.`

**`hobbs-p9c` has never existed.** It was produced to fill a slot in a sentence
that needed a handle, in exactly the shape SL-01 forbids by name. The real task,
created a minute later, is **`hobbs-0w4`.**

**Count, transcribed rather than produced, which is the point of the rule.**
Invented task handles in this log: 2026-09-05, 2026-09-07, 2026-09-08 (which
promoted SL-01), and two on 2026-09-13. **This is the sixth, the third since
promotion, and the first in nine days.** All six are self-flagged. Two adjacent
entries — 09-14, an invented interval, and 09-19, an inferred cause — are the same
rule one level out and are not counted here.

**And the count in the first draft of this entry was wrong.** It said *fourth*,
produced from a sense of how many there had been, and was corrected by grepping
the log's own headings. **A miscounted occurrence inside an entry about producing
identifiers instead of transcribing them** is not irony worth enjoying; it is the
tell in clause 3 — the wrong number arrived at exactly the speed the right one
would have.

**Why it happened, which is the part worth having.** SL-01's operational form is
explicit that **ordering is the fix, not checking** — *"where a sentence needs a
handle, the thing is created first and the ID is read out of the create command."*
The charter was written top to bottom in one pass, and §10 is the last section of
a ten-section template. **The rule was known, was read this session, and lost to
flow**: nothing interrupted the writing to create a task, because creating a task
felt like a detour out of a document that was ninety per cent finished.

**Which is this log's own standing conclusion arriving a fourth time:** a rule
that only fires when consulted is not a control. The
`Efforts/reports/fortnight-2026-09-18.md` finding — *four lessons in this log
produced a written lesson and nothing else* — includes SL-01, and this is that
finding being paid for.

**The mechanical control, and it is cheap because the pattern is fixed:**

```bash
# Pre-commit: every handle in the staged diff must exist in the graph.
for id in $(git diff --cached -U0 | grep -oE "hobbs-[a-z0-9]{3}" | sort -u); do
  bd show "$id" >/dev/null 2>&1 || echo "PHANTOM HANDLE: $id"
done
```

**Non-empty output is a defect, not a judgment call**, and it is different from
weekly-review step 1.8, which asks whether a *real* handle was dispositioned. This
one asks whether the handle is real at all. **Kept separate for the reason step 3b
is kept separate from step 3a in the brief routine: collapsing two checks is how
the narrower one's scope quietly eats the wider one's.**

It ran against this session's staged work and returned the one line above, which
is how the substitution was made rather than noticed.

**Second, smaller, and stated so it is not read as a saving throw:** the charter
template written this morning tells its reader to name the task handles in §10.
**It did not tell them to create the tasks first.** The template has been amended
in the same session — §10 now carries the ordering rule — because a template that
reproduces a known failure mode in every future charter is a worse defect than the
one instance that caught it.

## 2026-09-23 — [SELF-FLAGGED] Three files in one commit, against rail 1

**The rail, in the constitution's own words (s.5):** *"**One git commit**, never
batched: `cos: <path> — <summary> (<source>)`."* The format carries a single
`<path>` and the word "never" is doing the work.

**What was done.** The three Halcyon project notes — `do-160-certification.md`,
`cascadia-contract.md`, `mk3-shaft-runout.md` — went into **one** commit,
addressed to a directory rather than a file:
`cos: Atlas/ventures/halcyon/projects/ — the three Rowan named…`.

**The rationalisation, written down because it is the interesting part.** They
were created in one act, under one ADR, in one minute, and committing three files
that only make sense together felt like one edit. **That is exactly the reasoning
the rail forbids, and it is available for every batch anyone will ever want to
make.** Eighteen charters went in eighteen commits yesterday on the same argument
in reverse.

**Caught mid-task, not by Rowan, and not before the commit.** Every file after it
in this session went one commit each, which is the fix rather than the apology.

**Not rewritten.** The history stays as it happened; rewriting it to hide a rail
break would be a second and worse break of the same rail's purpose, which is
audit.

**The check, and it is mechanical.** A `cos:` commit whose path component ends in
`/` is a batch by construction. That is a one-line pre-commit test and it catches
the entire class:

```bash
git log -1 --format=%s | grep -qE '^cos: [^ ]+/ ' && echo "BATCHED COMMIT — rail 1"
```

**Related:** SL-01 is about identifiers being produced rather than transcribed;
this is its sibling — **a rail relaxed because the relaxation looked tidy.** If a
third instance appears, the two promote together as one standing lesson about
convenience.