Error ledger
Every specification error, and what caught it
This project argues that probabilistic work belongs inside a deterministic boundary that leaves evidence. It is built that way: one seat specifies and never commits, one builds and is instructed that where the specification and the source disagree the source wins, and one human ratifies anything irreversible. This page is what that produces — the specification errors, and the mechanism that caught each.
How to read this
A specification error is not a bug.
Everything here is an error in something Chanakya — the specifying seat — wrote: a prompt, a gate, a claim on this site. Some were caught before they reached anyone. Most were not.
- Nothing on this page reached a published surface uncorrected, except where an entry says it did.
- “Caught by” names the mechanism, not a person's diligence. That is the point of recording it.
- Numbering began on 2026-08-14, after a session that produced nine errors. The fourteen before it are listed first, unnumbered, because renumbering would break every citation in the governing protocol.
- Entries #18 to #20 are recorded by number in a contemporaneous handover, but the incidents were never written up. They are left as a gap rather than reconstructed.
- This ledger is written by the seat it grades. That is author and judge in one chair, and the reason every entry names a source you can check.
Before the ledger
Fourteen, before anyone was counting.
Two sessions that predate the numbering. They are the reason it exists.
2026-07-30 — nine in one session. None shipped. All were caught by the builder's gate or by verification before publishing. The accuracy review that followed produced the first four standing rules.
-
2026-07-30
A ban on grepping for `approved` that forced a revert of correct work.
-
2026-07-30
The test environment variable named wrongly in a prompt.
-
2026-07-30
`AGENT_KEY_REGISTRY` stated as required when it is optional.
-
2026-07-30
“Glama is free” — sign-up gates on a payment card.
-
2026-07-30
Told Kannan to cancel a subscription that did not exist.
-
2026-07-30
Called the awesome-mcp queue dead; the maintainer replied in minutes.
-
2026-07-30
Declined the Docker path on an assumption the approval email disproved.
-
2026-07-30
A SECURITY.md channel instruction that contradicted two existing files.
-
2026-07-30
The merge-3 diff gate mis-specified for a stacked branch.
2026-08-06 to 08-11 — five more. One of them crossed a hard stop.
-
2026-08-06 to 08-11 · caught by Kannan
Wrangler stated as 4.119.0, “verified from the repo”. Wrangler is not a dependency at all; 4.119.0 was what
npxpulled into Chanakya's own sandbox. Kannan's was 4.105.0. An environment claim from inference. -
2026-08-06 to 08-11 · caught by self, before it reached a prompt
Asserted that two of five routes exceeded the model's context window. The window is 128,000 tokens. One fetch of the model documentation settled it.
-
2026-08-06 to 08-11 · caught by a live run
Predicted every response would truncate at
max_tokens: 256. It did not fire on a 1,240-character output. Withdrawn explicitly in the next prompt rather than dropped quietly. -
2026-08-06 to 08-11 · caught by Kannan — “are you sure?”
PART 24 was written without reading PART 23. It lost the copy separator, the preflight and the divergence report, and instructed Hanuman to run
wrangler secret put— crossing the secrets hard stop. -
2026-08-06 to 08-11 · caught by the validator's own behaviour
An eight-row gate table needed twelve: no negation case, no “approved by” case. The resulting validator rejected valid caveats — which R2 of the same prompt instructed the model to write.
The numbered ledger
Thirty-seven, since 2026-08-14.
Each entry names the date, what caught it, and the standing rule it produced where it produced one.
-
#1 · 2026-08-14/17 · caught by self, before shipping · M3
A CI requirement specified without reading
pr-gate.yml— it asked for a commit from acontents: readworkflow. -
#2 · 2026-08-14/17 · caught by Hanuman · M3
Predicted the policy hash would change.
canonicalizenormalises the input, so it could not. -
#3 · 2026-08-14/17 · caught by Kannan · inherited boilerplate
“No push” carried over from an earlier prompt template. Eight commits sat unbacked-up for four days.
-
#4 · 2026-08-14/17 · caught by a terminal error · M3
npm cispecified for a repository with no lockfile and zero dependencies. -
#5 · 2026-08-14/17 · caught by terminal output · M3
“GET
/advisorreturns 405.” It returns 404. The route guard was read instead of the handler. -
#6 · 2026-08-14/17 · caught by self, on re-check · M1
A
/mcpbaseline truncated byhead -c 900was written into a runbook as expected output — a rollback trigger aimed at a healthy deploy. -
#7 · 2026-08-14/17 · caught by self · one surface
Sent a stale local file after updating only the Drive copy.
-
#8 · 2026-08-14/17 · caught by Hanuman's hard gate · M1, M2
A
--depth 1clone brokemerge-base; the conclusion drawn was “disjoint histories”. It nearly caused three branch deletions on a fiction. -
#9 · 2026-08-14/17 · caught by outside review · M2, M3
Picked the Drive planning folder by which one held newer files rather than resolving its parent chain. An entire session's output went into the retired archive — including the document whose purpose is “do not work from the archive”.
-
#10 · 2026-08-21/23 · caught by the primary source · M1
Asserted that a handover file did not exist in Drive, from a search index that lagged behind a file created twenty minutes earlier. A negative asserted from an incomplete view.
-
#11 · 2026-08-21/23 · caught by Hanuman's gate · M3
A gate specified
python3 _verify/verify.py— a path that existed only in a Chanakya-produced bundle, never in the repository. -
#12 · 2026-08-21/23 · caught by Hanuman's gate · M3
A gate predicted
grep -c "^- "would return 17; the actual answer was 30. Two sections were counted and asserted as a whole-file total. -
#13 · 2026-08-21/23 · caught by Hanuman's gate · M3
Required Hanuman to reproduce a CI failure that could not exist on his machine: he built the committed artifact, so his drift gate was green by construction.
-
#14 · 2026-08-21/23 · caught by Hanuman's gate · M3
Named a local directory
Griha; the working copy isGriha-repo. A local path inferred from a GitHub repository name — a trap a two-month-old handover already recorded. -
#15 · 2026-08-21/23 · caught by Hanuman's gate · invariant portability
Required a working-tree sha256 as a reference invariant. On a Windows checkout the files are CRLF: 11,558 − 11,357 = 201 = the line count, exactly one byte per line. No correct machine could have matched it.
-
#16 · 2026-08-21/23 · caught by an earlier hand-run diff · M1
A baseline run reported all seven LICENSE files as altered, including three that were correct —
grep -Fagainst a clause that wraps across two lines. -
#17 · 2026-08-21/23 · caught by Hanuman's report · one surface
Created a replacement file in Drive before trashing the original; the sync client resolved the transient duplicate by renaming one
… (1). -
#18–#20 · 2026-08-23 to 08-30 · detail not recorded
Recorded by number in the 2026-08-31 handover, which states that the builder's divergence reporting caught #19 and #20. The incidents themselves were never written up. They are left as a gap; reconstructing them from a count would be the kind of thing this page exists to record.
-
#21 · 2026-08-31 · caught by Hanuman · never gate an unmeasured value
A pre-state table carried a plausible-looking blob id in a row explicitly labelled “not measured”. A hash reads as evidence even when the prose says otherwise.
-
#22 · 2026-08-31 · caught by a cache-busted re-fetch · treat WebFetch as cached
Nearly reported a deploy as failed, from a response cached fifteen minutes earlier. Same family as #10 — a lagging index mistaken for ground truth.
-
#23 · 2026-09-01 · caught by running the gate before shipping it · test your own gates
A draft case study failed its own gate: one vendor token survived in the explanations table.
-
#24 · 2026-09-03 · caught by Hanuman · M4
A revert instruction,
git checkout -- <file>, would have discarded the whole session's uncommitted work rather than the one line deleted for a negative test. The trial run printed 40 passed — the wipe, on screen — and 41 passed was written into the prompt anyway. The measurement was taken and then not read. -
#25 · 2026-09-03 · caught by Hanuman · M5
An exact diffstat,
+3,363 / −45, was pinned to a step that left the wording to the builder. He produced+3,362 / −44and reported it. One line, because the trial had rewritten a tree annotation he correctly left alone. -
#26 · 2026-09-03 · caught by Hanuman · M6
A whole prompt written on the premise that a pull request was “closed without merging”. It had merged four minutes after the check. On GitHub a merged PR is also a closed PR — “0 open, 3 closed” was misread. The prompt was retracted in full.
-
#27 · 2026-09-03 · caught by Hanuman · M7
A gate searched for
“21 scenarios”and missed“21 conformance scenarios”. It gated the phrasing instead of the fact. -
#28 · 2026-09-05 · caught by reading the amendment · read the settlement before reopening it
Proposed rewording the claim ceiling without reading the amendment section that had already settled exactly that question.
-
#29 · 2026-09-05 · caught by the amendment's own text · the backlog is not a source
Repeated “working-group access has weeks of latency” from a backlog entry. An amendment had already shown it false: no gate, no queue, calls every second Friday.
-
#30 · 2026-09-08 · caught by diffing the merged result against the pre-tested copy · M10
A prompt handed four files inside code fences and said “write this verbatim”, never saying the fence lines were delimiters. All four shipped with a stray closing fence as their last line.
-
#31 · 2026-09-09 · caught by Hanuman's exact-match check · M11
A multi-line find string joined by
\ncould not match a CRLF working tree. It was written and tested on a Linux clone of the same repository, where the defect is invisible. -
#32 · 2026-09-09 · caught by checking every repository after the fact · a claim is not a fact
The maintainer page claimed a published error ledger and linked to the claim-ceiling anchor. No ledger was published anywhere. The page was read twice while auditing other claims without the link being followed.
-
#33 · 2026-09-09 · caught by Hanuman's gate · M2 corollary
A gate checked one repository's file against a different surface's wording of the same claim statement. The file was correct; the gate was not.
-
#34 · 2026-09-09 · caught by the failure of #33 · verify what you inherit
A page claimed the five claim statements were canonical in another repository's README. Two of the five differ by scope. Both lists are right; the sentence asserting they were one list was not.
-
#35 · 2026-09-10 · caught by self, by test-merging instead of asserting · M12
Nearly reported that merging a long-lived branch would revert five parts of work, from reading a diff between two tips as a merge preview. It merges cleanly.
-
#36 · 2026-09-10 · caught by Hanuman's gate · test your own gates
A gate battery shipped without being run against the tree it was written from. One expected value was wrong — a phrase that appears twice by design was gated as appearing once.
-
#37 · 2026-09-11 · caught by the primary source, while building this page · the ledger is not exempt
A handover summarised this ledger as “none self-caught by the specifying seat”. The 2026-08-15 log records one of nine caught by that seat before it reached anyone, and #35 above is another. The overstatement was in the summary, not the record.
What it produced
Twelve rules, none of them “be more careful”.
Each rule exists because a specific error made it necessary. The containment is mechanical, because exhortation does not survive a fast session.
- M1 — never truncate a source of truth, then treat the truncation as authoritative.
- M2 — one read surface per fact. Full clones, not excerpts. A gate's expected value comes from the file the gate runs against.
- M3 — claim locality. A folder's identity comes from its parent chain, not its contents; an environment claim comes from that environment, not an inference about it.
- M4 — reverting a negative test is not the same operation as reverting a file.
- M5 — an exact number may only be pinned to a deterministic step.
- M6 — a repository state is true at a timestamp, not in general. A merged pull request is also a closed one.
- M7 — gate the fact, not the phrasing.
- M8 — diff against the most similar precedent, not the most recent. Recency is not relevance.
- M9 — eliminating an option needs the same evidence standard as asserting one.
- M10 — when a prompt hands over file content, say that the delimiters are delimiters.
- M11 — a find string that spans a line ending is not portable across machines.
- M12 — a diff between two tips is not a merge preview. Test-merge before claiming a conflict.
Four of the twelve were written in the last week, which is the honest reading of this page: the rate of new error classes has not yet flattened.
The honest reading
What this does and does not establish.
A ledger is evidence of a mechanism working, not evidence that the specification is now correct.
- It shows that a separation of duties catches what the specifying seat cannot catch in itself. Two of fifty-one were self-caught before reaching anyone.
- It does not show that the current specification is free of errors. It shows the opposite is likely, and that something other than the author will find them.
- It is self-reported. No independent observer maintains it. Every entry names a source — a log, a handover, a commit, a builder's report — and those sources are in version control or in the project's working record.
- The claim limits that govern this site are stated in the standards constraints and are gated byte-identically across six surfaces. That gate enforces that the wording is the same everywhere; it cannot establish that a statement is true.