Using ledger
Ledger is the operating discipline for a codebase worked on over a long horizon: hundreds of turns, thousands of changes, across sessions that share no memory. At that scale the thing that kills a project is not a bad commit — it is silent rot. Prose stops describing the code, rules go unenforced, dead surface becomes undeletable because nobody can prove it is dead, and claims pile up that nobody can check.
Every skill here exists to keep one of those from happening. This one tells you which to reach for.
The seven rules
These compress most of the pack. They are worth holding in view even when no skill is loaded.
- Narrowest sufficient evidence. Run the check that would actually fail. Never the full suite by reflex.
- Never fake a green. No suppressing empty results, no lowered thresholds, no narrowed scope to hide a file.
- Return the budget; do not invent headroom. Restoring a limit that was already granted is not masking. Widening an unexamined wait is.
- Brevity is not the goal. A smaller word count alone is not an improvement.
- No quotas. Age, length, and count are discovery aids, never criteria.
- A green signal is not evidence. Coverage is not correctness. A passing rerun proves nothing. A queued merge is not a landing. A zero-hit search proves nothing until it has matched a known positive.
- A mechanism's existence is not a reason to use it. Tools invite the work they are capable of.
And the one that subsumes several of them: verify the world, not the self-report. A keyword probe on a worker's own output lets a worker that did nothing pass by claiming success.
Before you start working
Measured, not assumed: given a realistic prompt in a session with a full tool
set, this pack's skills often did not load at all — and in every one of those
runs nothing else loaded either. The model simply began working. The first move
was ls -la.
That is not a neutral outcome. It means the discipline that would have applied
was never in view, and the work proceeded on whatever the model already
believed. The pull toward starting is strongest exactly when a rule would
have changed what you did.
| The thought |
What is actually true |
| "Let me look around first, then decide." |
Looking around is the work, and it is already governed. scoping-a-change exists because the base you infer from a directory listing is wrong for a fresh branch, a stacked branch, and any branch after a merge. |
| "This one is simple enough to just do." |
Simple tasks are where a rule is cheapest to follow and least likely to be followed. The expensive ones get attention on their own. |
| "I'll check the discipline once I know what I'm dealing with." |
By then you have chosen an approach, and the rule now reads as an objection to your own plan rather than as guidance. |
| "I know this rule already." |
Knowing it is not the failure mode. Every rule in the seven above is one a competent engineer already agrees with, and the pack exists because agreement does not survive contact with a deadline. |
| "No skill obviously matches." |
Then the answer is in the table below rather than in your first instinct. If it is genuinely not here, say so — that is a finding about this pack. |
Reaching for the wrong one costs a few seconds. Reaching for none is how a
change lands with nothing behind it.
Where to reach for what
| When you are… |
Load |
| tired of answers that claim things ran when nothing did — yours included |
receipts |
| starting in a new repository, or a skill reports a missing adapter value |
adapting-to-a-project |
| about to state that something works, passes, is covered, or is done |
what-counts-as-evidence |
| choosing which checks to run, or about to repeat one that passed |
refusing-busywork |
| handed a request for new work, before any design or plan exists for it |
qualifying-a-request |
| writing or reviewing acceptance criteria, exit conditions, or what a behavior means |
specifying-acceptance |
| turning an approved approach into units, their order, and where each runs |
planning-the-work |
| carrying one unit to done, or deciding what its exit gate must contain |
running-a-bounded-loop |
| working out what a change actually touches |
scoping-a-change |
| adding a guard, rule, or validator; asserting a fix works |
proving-the-regression |
| writing or reviewing a test that touches ports, files, env, clocks, or teardown |
designing-concurrent-tests |
| investigating a test that fails intermittently |
diagnosing-flakes |
| writing or editing any prose, anywhere |
writing-complete-propositions |
| documenting a command, default, error, or install path |
fact-checking-by-execution |
| cleaning prose that reads like a leaked reasoning transcript |
trimming-session-vantage |
| deleting code, or replacing hand-rolled code with a dependency |
proving-code-is-dead |
| adding, auditing, or retiring decision records |
curating-decision-records |
| reviewing a change, or answering review on your own |
reviewing-as-cis-complement |
| pushing, force-pushing, or checking whether something landed |
pushing-safely |
| recording a UI demo as visual evidence |
recording-ui-evidence |
| accepting something against a real deployment, or answering a report that it drifted |
validating-real-scenarios |
| asking whether something delivered earlier still holds |
metabolizing-knowledge |
Load more than one when more than one applies. They are written to compose, and each names the boundary where it hands off.
The five pillars
If you want the shape rather than the index:
- Documentation is the substrate, not the byproduct. For a human team docs are a courtesy; for an agent they are the working memory. Every fact gets one home, and a rule that becomes mechanical is promoted into a check and deleted from the prose. —
writing-complete-propositions, fact-checking-by-execution
- Agent-native by construction. Written for the case where a model is the author, which changes what the failures are: prose carries the authoring session's viewpoint, speculative surface accretes fast and evenly, and the worker will report success — including to itself, by writing down what a thing means and treating that as having built it, and by reading a green suite as a working product. —
trimming-session-vantage, what-counts-as-evidence, specifying-acceptance, validating-real-scenarios, proving-code-is-dead
- Loop engineering: each iteration cheap and true. A long-horizon loop dies of wasted turns. What a request earns before it earns a change, verified bases, an arrangement that says where each unit runs, narrowest checks, and a gate that decides when one is finished. —
qualifying-a-request, scoping-a-change, planning-the-work, running-a-bounded-loop, refusing-busywork
- Long-horizon automation needs a durable record. A reader 500 turns later must resolve every reference and re-derive every decision. —
curating-decision-records, recording-ui-evidence
- Rot resistance as a build requirement, not a cleanup task. Pin the absence of dead values so a stale reference fails a check instead of aging quietly. Prove code is dead before deleting it. Every other discipline here produces knowledge; exactly one reclaims it, and without that one the record only grows. —
proving-the-regression, designing-concurrent-tests, diagnosing-flakes, reviewing-as-cis-complement, pushing-safely, metabolizing-knowledge
The adapter is not an adoption gate
No skill in this pack names a command. Project-varying values — test lanes, CI ownership, hooks, source globs, protected designs — live in .ledger.yml at the repository root, and the skills that need to run something read it.
A missing .ledger.yml does not mean these disciplines do not apply here. Most of them never touch it: what a signal proves, whether a passage carries its propositions, whether code is provably dead, what a review must cover, whether a guard has been seen to fail — none of that needs to know your test command. Apply them regardless.
Only two things change when the file is absent:
- A skill that needs to execute a specific project command says the value is missing and stops there, rather than guessing. A wrong command is worse than a missing one, because it runs and produces a result you will believe.
adapting-to-a-project is worth running at some point, so those skills stop being blocked. It is a convenience, not a precondition.
Treating the file's absence as "this pack is not adopted here, skip it" is the one reading to avoid. It was a real observed failure: with this router in context and no adapter present, the discipline was skipped wholesale on exactly that reasoning.
1---2name: using-ledger3description: The map of this pack — the seven rules, and which discipline to reach for at each stage of a change.4---56# Using ledger78Ledger is the operating discipline for a codebase worked on over a long horizon: hundreds of turns, thousands of changes, across sessions that share no memory. At that scale the thing that kills a project is not a bad commit — it is silent rot. Prose stops describing the code, rules go unenforced, dead surface becomes undeletable because nobody can prove it is dead, and claims pile up that nobody can check.910Every skill here exists to keep one of those from happening. This one tells you which to reach for.1112## The seven rules1314These compress most of the pack. They are worth holding in view even when no skill is loaded.15161. **Narrowest sufficient evidence.** Run the check that would actually fail. Never the full suite by reflex.172. **Never fake a green.** No suppressing empty results, no lowered thresholds, no narrowed scope to hide a file.183. **Return the budget; do not invent headroom.** Restoring a limit that was already granted is not masking. Widening an unexamined wait is.194. **Brevity is not the goal.** A smaller word count alone is not an improvement.205. **No quotas.** Age, length, and count are discovery aids, never criteria.216. **A green signal is not evidence.** Coverage is not correctness. A passing rerun proves nothing. A queued merge is not a landing. A zero-hit search proves nothing until it has matched a known positive.227. **A mechanism's existence is not a reason to use it.** Tools invite the work they are capable of.2324And the one that subsumes several of them: **verify the world, not the self-report.** A keyword probe on a worker's own output lets a worker that did nothing pass by claiming success.2526## Before you start working2728Measured, not assumed: given a realistic prompt in a session with a full tool29set, this pack's skills often did not load at all — and in every one of those30runs nothing else loaded either. The model simply began working. The first move31was `ls -la`.3233That is not a neutral outcome. It means the discipline that would have applied34was never in view, and the work proceeded on whatever the model already35believed. **The pull toward starting is strongest exactly when a rule would36have changed what you did.**3738| The thought | What is actually true |39|---|---|40| "Let me look around first, then decide." | Looking around *is* the work, and it is already governed. `scoping-a-change` exists because the base you infer from a directory listing is wrong for a fresh branch, a stacked branch, and any branch after a merge. |41| "This one is simple enough to just do." | Simple tasks are where a rule is cheapest to follow and least likely to be followed. The expensive ones get attention on their own. |42| "I'll check the discipline once I know what I'm dealing with." | By then you have chosen an approach, and the rule now reads as an objection to your own plan rather than as guidance. |43| "I know this rule already." | Knowing it is not the failure mode. Every rule in the seven above is one a competent engineer already agrees with, and the pack exists because agreement does not survive contact with a deadline. |44| "No skill obviously matches." | Then the answer is in the table below rather than in your first instinct. If it is genuinely not here, say so — that is a finding about this pack. |4546Reaching for the wrong one costs a few seconds. Reaching for none is how a47change lands with nothing behind it.4849## Where to reach for what5051| When you are… | Load |52|---|---|53| tired of answers that claim things ran when nothing did — yours included | `receipts` |54| starting in a new repository, or a skill reports a missing adapter value | `adapting-to-a-project` |55| about to state that something works, passes, is covered, or is done | `what-counts-as-evidence` |56| choosing which checks to run, or about to repeat one that passed | `refusing-busywork` |57| handed a request for new work, before any design or plan exists for it | `qualifying-a-request` |58| writing or reviewing acceptance criteria, exit conditions, or what a behavior means | `specifying-acceptance` |59| turning an approved approach into units, their order, and where each runs | `planning-the-work` |60| carrying one unit to done, or deciding what its exit gate must contain | `running-a-bounded-loop` |61| working out what a change actually touches | `scoping-a-change` |62| adding a guard, rule, or validator; asserting a fix works | `proving-the-regression` |63| writing or reviewing a test that touches ports, files, env, clocks, or teardown | `designing-concurrent-tests` |64| investigating a test that fails intermittently | `diagnosing-flakes` |65| writing or editing any prose, anywhere | `writing-complete-propositions` |66| documenting a command, default, error, or install path | `fact-checking-by-execution` |67| cleaning prose that reads like a leaked reasoning transcript | `trimming-session-vantage` |68| deleting code, or replacing hand-rolled code with a dependency | `proving-code-is-dead` |69| adding, auditing, or retiring decision records | `curating-decision-records` |70| reviewing a change, or answering review on your own | `reviewing-as-cis-complement` |71| pushing, force-pushing, or checking whether something landed | `pushing-safely` |72| recording a UI demo as visual evidence | `recording-ui-evidence` |73| accepting something against a real deployment, or answering a report that it drifted | `validating-real-scenarios` |74| asking whether something delivered earlier still holds | `metabolizing-knowledge` |7576Load more than one when more than one applies. They are written to compose, and each names the boundary where it hands off.7778## The five pillars7980If you want the shape rather than the index:81821. **Documentation is the substrate, not the byproduct.** For a human team docs are a courtesy; for an agent they are the working memory. Every fact gets one home, and a rule that becomes mechanical is promoted into a check and *deleted* from the prose. — `writing-complete-propositions`, `fact-checking-by-execution`832. **Agent-native by construction.** Written for the case where a model is the author, which changes what the failures are: prose carries the authoring session's viewpoint, speculative surface accretes fast and evenly, and the worker will report success — including to itself, by writing down what a thing means and treating that as having built it, and by reading a green suite as a working product. — `trimming-session-vantage`, `what-counts-as-evidence`, `specifying-acceptance`, `validating-real-scenarios`, `proving-code-is-dead`843. **Loop engineering: each iteration cheap and true.** A long-horizon loop dies of wasted turns. What a request earns before it earns a change, verified bases, an arrangement that says where each unit runs, narrowest checks, and a gate that decides when one is finished. — `qualifying-a-request`, `scoping-a-change`, `planning-the-work`, `running-a-bounded-loop`, `refusing-busywork`854. **Long-horizon automation needs a durable record.** A reader 500 turns later must resolve every reference and re-derive every decision. — `curating-decision-records`, `recording-ui-evidence`865. **Rot resistance as a build requirement, not a cleanup task.** Pin the absence of dead values so a stale reference fails a check instead of aging quietly. Prove code is dead before deleting it. Every other discipline here produces knowledge; exactly one reclaims it, and without that one the record only grows. — `proving-the-regression`, `designing-concurrent-tests`, `diagnosing-flakes`, `reviewing-as-cis-complement`, `pushing-safely`, `metabolizing-knowledge`8788## The adapter is not an adoption gate8990No skill in this pack names a command. Project-varying values — test lanes, CI ownership, hooks, source globs, protected designs — live in `.ledger.yml` at the repository root, and the skills that need to *run* something read it.9192**A missing `.ledger.yml` does not mean these disciplines do not apply here.** Most of them never touch it: what a signal proves, whether a passage carries its propositions, whether code is provably dead, what a review must cover, whether a guard has been seen to fail — none of that needs to know your test command. Apply them regardless.9394Only two things change when the file is absent:9596- A skill that needs to execute a specific project command says the value is missing and stops there, rather than guessing. A wrong command is worse than a missing one, because it runs and produces a result you will believe.97- `adapting-to-a-project` is worth running at some point, so those skills stop being blocked. It is a convenience, not a precondition.9899Treating the file's absence as "this pack is not adopted here, skip it" is the one reading to avoid. It was a real observed failure: with this router in context and no adapter present, the discipline was skipped wholesale on exactly that reasoning.