A redesigned reader for the history behind your code. This release introduces Overview, Records, and Timeline views, a more focused browsing experience, blue light and dark themes, and a new visual identity. The rewritten README includes a recorded walkthrough and a live example built from this repository.
Rebuild the reader's presentation and navigation, rewrite the README, and prepare the repository's live example. The work resumed in Codex after the Claude Code session stopped at the verification gates.
Prepares v0.9.5 with the redesigned reader, new visual identity, revised README, and recorded tour. Updates installation pins and assigns the merged redesign receipts to the release. The live reader and public changelog deploy from master.
Rebuilds the README around Ledger's identity, a real scrolling reader tour, a shorter setup path, and direct links into the live example. Refines the reader to near-white light surfaces and charcoal/slate dark surfaces with blue accents, and gives record highlights rounded corners with tighter padding.
Makes Records and Timeline easier to browse with pill controls, custom dropdown menus, and a compact left navigation. Area, Release, and Tag filters live in the desktop rail and move into the toolbar on smaller screens. Near-white light surfaces and warm charcoal dark surfaces with copper and apricot accents replace...
Replaces the gradient L and text strokes with a punched-receipt silhouette: a square opening in a solid sheet with a clipped corner. Light and dark logo lockups pair it with an outlined lowercase wordmark. The reader, favicon, and README use the new identity without external fonts or new dependencies.
Recomposes the reader around recent changes and compact browsing controls. The overview uses linked counts, a primary history list, and unboxed repository context. Records and the public changelog are denser; detail panels read as documents, with a collapsed relationship map after the named references.
Elevates the reader and public changelog using Dossier's redesigned reader as a visual reference. Neutral grayscale surfaces, stronger typography, labeled kind icons, a latest-change shortcut, and more generous controls improve scanning and navigation across desktop and mobile. The theme switch offers Light and Dark...
Rewrites the README around the rebuilt reader and publishes a live example. The README leads with the reader's overview of this repository, links the live reader and public changelog on GitHub Pages, pins 0.9.4, and gains a section on the reader's three views, the record panel, the palette, the keyboard, and the lig...
Rebuilds the reader's web presentation from the ground up. The reader now owns its visual system (D009): its own color, type, and spacing tokens with light-dark() themes, a validated categorical palette for record kinds, and no dependency on the retired Dossier tokens. The internal reader gains three views. Overvi...
Freshness, corrected. ledger stale stopped reading a record as drift when the record simply pointed at its files by pattern, by directory, or by path. The fixes came out of triaging the first outside adopter's stale report, where 156 of 169 signals named symbols that are in the tree.
Bumps the package to 0.9.4 and writes the v0.9.4 release record over receipts 0192 through 0194 and this one, with Public Notes for the GitHub Release. The release carries the two stale fixes found while triaging Kore's report: coverage patterns are searched rather than dropped, and directory headings and path ancho...
Two more ways a record could be read as drift when it was not. A Changed Files heading that names a directory path, such as ### internal/composer, CHANGELOG.md, now matches the record's files under that directory, so the block's anchors are checked against them; the candidate has to carry a separator, so a prose h...
ledger stale now searches the files a record's coverage patterns cover. Patterns such as src/** became Git :(glob) pathspecs and are searched with git grep for the symbols and anchors the record's exact files did not account for. When the search cannot run, because Git is missing, the workspace is outside a...
Codex hooks can now keep their approval across Ledger versions. ledger hooks install --host codex --launcher makes the hooks run a generated script that holds the pinned command. A version bump rewrites only that script, so .codex/hooks.json stays the same, and Codex keeps running the hooks without asking again....
Records can be written whole from any surface, and the reader now follows records to the files, symbols, and records they name. This release adds: section bodies for every authoring command, and ledger updateledger context, a review packet for a change set ledger doctor --fix, and a health check for installed...
Agents can write records over MCP, with your confirmation. Ledger's MCP server moves to version 2 of the MCP TypeScript SDK and speaks protocol revision 2026-07-28 alongside the 2025 revisions. Over MCP, agents can now: create change entries, product notes, backlog items, and decision records promote records start,...
The reader looks like Dossier. The static reader and the public changelog take Dossier's plum-tinted neutrals, its teal, violet, and coral status colors, its system font stacks, radii, and motion, and keep Ledger's emerald accent. The masthead is compact, wide screens put the facet rail on the left, and the theme to...
Drafts fit the change. Hook drafts and ledger new --from-diff take symbols and anchors only from the lines a diff changed. A ledger ci run before the turn ends lists the failing files and names the session whose hook will draft their receipt. ledger release --update adds a late receipt to an existing release r...
Fixes from an audit of 0.8.0. Hooks for parallel tool calls keep every edited path, a .ledger/ inside a repository subdirectory drafts receipts and checks coverage for its own files, and every new draft is announced. The reader ranks search exactly like ledger search and its palette works from disk....
Adoption. Fixes from Ledger's first outside adoption, in Kore: agents are told about the receipt the hooks drafted for them, one configured command runs Ledger in every hook and instruction, adopt infers its configuration from the tracked tree, docs reconcile never overwrites curated routing files, and linked se...
This session continued after a context compaction. Kyle trusted Kore's changed Codex hooks by hand and asked whether that step could be streamlined. He then chose to build the fix as 0.9.3 and move Kore to it: 0189: hooks install --host codex --launcher and the generated .ledger/bin/ledger.mjs, so a version bump...
Kyle asked for everything left on the 0.9.x list in one patch release. This session built 0.9.2 on release-0.9.2, one milestone per commit: record bodies from every surface, and ledger update (0176) ledger context (0177) doctor --fix and the hooks check (0178) Go, Rust, Python, and Swift symbols (0179) reade...
Continued the 2026-09-17 session after S0003 closed. Kyle deleted Dossier's merged next branch and found that the Codex app treats /hooks as a message, so 0172 (kylebegeman/ledger#28) names the app's Hooks page in the Codex installer hint. Kyle then delegated the MCP dependency choice: D008 moves MCP to the v2 SDK,...
Resumed S0002 after its usage limit. Finished inline code in the reader (0146), including double-backtick spans and shortened summaries, and recaptured the three README screenshots that showed literal backticks. Fixed ledger stale and ledger doctor failing on a receipt that lists a PNG (0147), and folded 0142 to...
This records the 0.9.3 release and Kore's move to it: Published. 0.9.3 went out from kylebegeman/ledger#33 (tag v0.9.3, npm latest). Its GitHub Release notes are identical to ledger release notes v0.9.3. Smoke test. The published package installed the Codex launcher in a scratch repository. The script printed...
Bumps the package to 0.9.3 and writes the v0.9.3 release record over the receipts landed since v0.9.2, 0188 to 0191. Pins. The README quick start, the installed-hook note, the CI example, the adopt card, the schema example, and the publishing workflow pin 0.9.3. The quick start for other repositories installs the...
The doctor symbols check now gives advice only for code under coverage: When no tracked file matches git.requireEntryFor, it passes, names the patterns, and suggests pointing them at the code receipts should cover. It no longer reports the TypeScript parser. When TypeScript or JavaScript sits beside an outlined la...
ledger hooks install --host codex --launcher writes Codex hooks that run node .ledger/bin/ledger.mjs hook <event> --host codex. It also writes that script, which runs agents.command with the hook's arguments. A later install with a new --command rewrites only the script, so .codex/hooks.json stays byte for...
This records that 0.9.2 was published from kylebegeman/ledger#31 (tag v0.9.2, npm latest), with GitHub Release notes identical to ledger release notes v0.9.2, and that Kore moved to it in kylebegeman/forge#32 (Kore receipt 0010). It also covers: Smoke test. A run of the published package in a throwaway Go repo...
Bumps the package to 0.9.2 and writes the v0.9.2 release record over the receipts landed since v0.9.1, 0175 to 0186. Pins. The README quick start, the installed-hook note, the CI example, the adopt card, and the schema example pin 0.9.2. Screenshots. The four README screenshots are recaptured with...
Two maintenance scripts, and a palette fix they surfaced. scripts/readme-screenshots.mjs captures the README's four reader screenshots. It uses Playwright, installed with npm install --no-save, and frames each image the way CONTRIBUTING describes. It serves this repository's readers itself, and...
docs/COMMANDS.md is a command reference generated from the operation registry, the same source as ledger help, the MCP tools, and the JSON API. For every command it gives: the usage and help exactly as ledger help prints them a table of flags with their values and descriptions whether it prints JSON, whether i...
The public changelog can be published as a site people follow. Atom feed. ledger render --profile public writes feed.xml with the newest 50 releases and their notes as HTML content. Entry ids are name-based UUIDs of the project and release, so they survive a moved site. The feed's updated time comes from the new...
Summary excerpts in the reader read as plain prose. A summary's list markers and paired **strong** markers are dropped, even when the strong text wraps a code span. As a result, a receipt that opens with bullets no longer shows - **Go:** in its row or panel. Code spans keep their backticks and their content,...
Both reader profiles now mark what is new or changed since the viewer's last visit. Markers. A changed record gets a New or Updated chip. A note under the result count shows how many records changed, filters the list to them (the changed URL parameter), and offers Mark all as seen. What counts as a visit. A load m...
The internal reader can now follow a record to the things it names, and back. Entity views. In a record's panel, selecting a file, pattern, or symbol lists every record that names it. A bar above the list names the entity and counts the records. A path also counts the records whose coverage pattern covers it, and a...
Drafts, hook drafts, and ledger stale now read Go, Rust, Python, and Swift declarations. Before, only TypeScript, JavaScript, and Markdown yielded symbols, so a Go receipt had to be written without them. Go: functions, methods as Type.Method, and types, constants, and variables, grouped or not. Rust: items, and...
ledger doctor gains a hooks check and a --fix flag. The hooks check. It finds Ledger's entries in the Claude Code, Codex, and Cursor hook files and warns when: an entry runs a command other than agents.command<agents.command> version fails or times out the command prints no Ledger version, as when another...
ledger context prints one review packet for a change set: the working tree by default, --staged, or --base with --head. Per changed file. The Git change, coverage, docs impact, and the receipts in the change that list it. Also the newest records that mention it, with their invariants and conflict rules. Reco...
Records can be written whole from the CLI, the JSON API, and MCP. Section bodies. new, feedback, backlog new, decision new, promote, and the new update accept sections, keyed by heading. On the CLI, they come from --section Heading=text and --sections-file, which reads every ## Heading block of a...
Records that 0.9.1 published from kylebegeman/ledger#29 and that Kore moved to it in kylebegeman/forge#31 (Kore receipt 0009). That Kore change also names the Codex app's Hooks page in Kore's docs/PLAN.md, so the handoff drops that follow-up. The next slice is new features, when Kyle chooses them.
Bumps the package to 0.9.1 and writes the v0.9.1 release record over the receipts landed since v0.9.0: 0171: the publish record, resolved product notes, and the render budget 0172: the Codex app's hook review in the installer hint 0173: MCP on the v2 SDK with confirmed write tools this receipt The README quick start...
Ledger's MCP server now runs on version 2 of the TypeScript SDK (@modelcontextprotocol/server and @modelcontextprotocol/node in place of @modelcontextprotocol/sdk 1.30). It speaks protocol revision 2026-07-28 and the 2025 revisions from one set of definitions. ledger mcp serves through serveStdio, where th...
ledger hooks install --host codex now says to trust the hooks with /hooks in the Codex CLI or on the Hooks page of the Codex app's settings. Its second step says to trust them again whenever the hook file changes, because Codex skips a changed hook until then. The README says the same. The handoff says Kyle trus...
Records that 0.9.0 published from kylebegeman/ledger#26 and that Kore moved to it in kylebegeman/forge#30 (Kore receipt 0008). The handoff's next slices are now MCP protocol 2026-07-28, which waits for Kyle's approval of new production dependencies, and new features. It also notes that Kore's changed Codex hooks nee...
Records that 0.8.2 published from kylebegeman/ledger#25 and that Kore moved to it in kylebegeman/forge#29 (Kore receipt 0007). Then it bumps the package to 0.9.0 and writes the v0.9.0 release record over the Dossier visual system (0168), the compact sidecars (0169), and this receipt. The README quick start, the inst...
The search index, its shards, graph.json, and graph/contracts.json are now written as compact JSON. shardSearchIndex also counts each document's exact serialized bytes and separators, so a shard never exceeds maxSearchIndexBytes unless one document alone does. This repository's internal reader went from 3,61...
The static reader and the public changelog now use Dossier's visual system. The values were copied from Dossier b48ea15 (core/internal/render/assets/tokens.css), never imported: plum-tinted neutrals, teal, violet, and coral status tones, and borders in place of shadows Dossier's system font stacks, with no font...
Bumps the package to 0.8.2 and writes the v0.8.2 release record over the receipts that landed after v0.8.1: the publish record (0158), the Windows test timeout (0159), B010's closure (0162), the draft fixes (0163), the records cleanup (0164), release --update (0165), the TypeScript loader and dependency updates (0...
The symbol extractor now finds the TypeScript compiler API wherever it is, and treats a module without one as unavailable. resolveTypeScriptModule reads TypeScript 5.0 to 5.4 through their default export. It rejects TypeScript 7.0, which ships no JavaScript API, and then tries @typescript/typescript6, the packag...
ledger release <version> --update adds the selected entries that an existing release record does not list. Their ids join entries, their lines join ## Changes, and updated moves to today. The summary, public notes, verification, and known issues stay as written. With --include-unreleased and --assign, on...
ledger stale reported 66 signals in historical records, and now reports none. Receipts from 0003 to 0072, plus 0103 and 0116, name commands, exports, and helpers that later refactors renamed or moved. The 0.4 operation registry replaced every *Command function in src/cli.ts, for example. Each record now lists...
Drafts now list only the symbols a diff touched. Every extractor reports where each symbol sits, getChangedLineRanges reads the changed lines from git diff --unified=0, and a draft keeps a file's symbol only when a changed line falls inside it. A line inside a subsection counts only for the innermost heading, an...
Backlog item B010 is landed. Its last acceptance check, a second live Claude Code session in Kore, passed on 2026-09-17 with Ledger 0.8.1. The session was given an ordinary rename across four files and edited them in one message. Session S0002 recorded all four paths, and the Stop hook drafted Kore receipt On the ne...
A new vitest.config.ts sets the test timeout to 30 seconds on Windows and keeps the 5 second default elsewhere. Git-heavy and transaction-heavy tests no longer fail on a slow Windows runner, and a slow test still shows up on macOS and Linux.
Records that @kylebegeman/ledger 0.8.1 was published on 2026-09-17 from kylebegeman/ledger#22, with GitHub Release notes produced by ledger release notes for the first time and identical to the release record's Public Notes, and that Kore moved to 0.8.1 in kylebegeman/forge#26 with Kore receipt 0004. The handoff...
The README demo now runs its Ledger processes on a pinned day. The asset script loads scripts/readme-clock.mjs with node --import, which shifts Date so time starts at LEDGER_README_NOW (default 2026-09-17T12:00:00Z) and keeps advancing, so the session names and dates the cards show no longer depend on the...
Under git.coverage: any, an earlier change entry now covers a changed file only when it names that file. A pattern such as src/**, a prefix: or glob: reference, or a directory ending in / still covers files from a receipt that is part of the change set, but no longer from an older one, for coverage and for...
Bumps the package to 0.8.1 and writes the v0.8.1 release record over the fixes from the audit of 0.8.0, receipts 0149 through 0154, this one, and the two decisions Kyle delegated afterward, 0156 and 0157. The release workflow now takes the GitHub Release notes from ledger release notes, which prints the same text...
verify --run matches the whole backticked command against verification.allow, environment assignments included, so a receipt can no longer set NODE_OPTIONS or PATH on an allowlisted command; this repository's allowlist names LEDGER_UPDATE_CONTRACT=1 npx vitest ** for the contract bullets. Docs impact treat...
The four record editors that hooks and authoring commands use, setFrontmatterScalars, setFrontmatterArray, ensureFrontmatterArrays, and replaceSectionBody, now write the line ending the record already uses. Each reads the ending from the first line break and joins with it, so a CRLF session record stays CRLF...
hooks install now removes Ledger's own entries from a host hook group and keeps whatever else the group holds, so a command a user added to Ledger's group survives a reinstall without a second Ledger group. agents --write replaces the first managed block and removes any later copies instead of leaving a stale se...
Hooks for parallel tool calls no longer lose edited paths. The workspace write lock now waits with jittered backoff, up to five seconds, while another live process holds it, instead of failing at once, and the hook dispatcher re-reads the catalog and retries a touch or draft whose plan went stale while it waited. Gi...
The renderer finds Markdown code spans with a one-pass scanner over backtick runs instead of a lookaround regex, which was quadratic on unpaired runs of increasing length. A shortened summary that is entirely one code span keeps its text instead of becoming "...", and why, which only feeds search, is shortened wit...
The reader now scores search the way ledger search does: the sidecar omits each record's terms text, and the runtime passed an empty string in its place instead of leaving it undefined, so the shared scorer never derived it and the terms weight was always zero. The command palette falls back to the rendered ro...
The reader runtime now handles the ready promise of every view transition it starts. When the browser skips the animation, as it does in a hidden tab or when a newer transition starts, ready rejects while the update still runs, and the reader no longer logs an unhandled InvalidStateError on each load and filte...
ledger stale and ledger doctor no longer stop when a record lists a screenshot or another file that is not UTF-8 text. The stale run's file cache treats such a file like a missing one: it adds nothing to the text that symbols and anchors are checked against, and a block that names only binary files is skipped. T...
The static reader now renders Markdown code spans in record prose as inline code: library and record panel summaries, Invariants and Verification bullets, and the public changelog's release notes. The text is escaped first, then a backtick run pairs with the next run of the same length on the line, as in Markdown, a...
With comment: "true", the composite action now keeps the Ledger summary in one pull request comment. It appends a hidden <!-- ledger-ci-summary --> marker, looks for a github-actions[bot] comment that carries it, and updates that comment in place, posting a new one only on the first run. A pull request from a...
Docs impact now follows git.coverage. Under current, the default, nothing changes: only change entries in the change set give a source file its docs impact evidence. Under any, a file those entries do not satisfy may take its evidence from an earlier receipt that lists it and carries a reviewed docsImpact de...
ledger verify --run now understands agents.command. When it is not plain ledger, a Verification command written with it, such as npx ledger validate or a pinned npx --yes @kylebegeman/ledger@0.8.0 ready, matches the same ledger pattern in verification.allow, and a bare ledger command runs through the...
The Stop and SessionEnd hooks no longer draft a receipt for work another receipt already records. A change entry counts as linked when either the session or the entry names the other in related. With Git, only touched paths that still differ from HEAD are pending, and a change entry that is new or modified in the...
Bumps the package to 0.8.0 and writes the v0.8.0 release record over receipts 0128 through 0137, this one, and the follow-up fixes 0142 through 0148, with Public Notes for the GitHub Release. Reinstalls this repository's own Claude Code hooks, agents block, and skill with 0.8.0, which saves agents.command and adds...
The README is rewritten to show what Ledger looks like and how it is used: a reader screenshot up front, a capture loop diagram, the context an agent receives at session start, the drafted receipt notice, ledger ready, ledger packet, ledger adopt in a Go repository, and ledger ci --github, all as images of r...
ledger adopt reads git ls-files and writes a configuration that fits the repository: coverage roots for every tracked top-level directory (hidden ones only for .github) plus the root Makefile and primary manifest, ignores for generated code and untracked build output (templ, sqlc output from every tracked sq...
Trust. Records now carry proof: a pull request needs its own receipt, docs impact is judged per file, verification commands run and leave evidence, stale anchors are detected against the code, and CI annotates pull requests. The reader runtime is typed, bundled, and browser-tested, the engine has a typed client, and...
Capture. Records now get written by the workflow: host hooks for Claude Code, Codex, and Cursor start a session record, track touched paths, inject a memory packet, and draft a receipt; a shipped skill and a managed AGENTS.md block tell agents how to use Ledger; authoring commands create every record kind;...
The engine server from decision D005. ledger serve --api turns Ledger into a local memory engine: one loopback process with a JSON API, an event stream, live reload, and MCP over HTTP, and CLI commands delegate to its warm cache.
The 0.4 foundation from decision D005. Every command is now generated from one operation registry, source records are served from an incremental catalog cache, and every file-oriented surface shares one retrieval contract. This is the base the 0.5 engine server builds on.
Built Ledger 0.8.0 on adoption-0.8: the five B010 milestones (0131 to 0135), the README overhaul and emerald mark (0137), and release prep (0141) in pull request #20. Then fixed what checking the README against the code found (0142 to 0145), and hit the usage limit while finishing inline code in the reader (0136),...
ledger session prune never deletes a session record another record links: an expired session is kept when any non-session record lists its id in related, or when its own related names an existing record. --write deletes only unlinked expired sessions and, in the same transaction, closes kept sessions that ar...
A new user-prompt-submit hook for Claude Code and Codex tells the agent, once per drafted receipt, which draft the Stop hook wrote for its session and to finish it rather than create another; announcements are tracked in the derived .ledger/cache/hook-notices.json. SessionStart context and the pre-compact handof...
agents.command in .ledger/config.yaml is the one command prefix that runs Ledger in a repository, default ledger. ledger hooks install --command saves it there, rewriting the YAML through the document API so comments, quoting, and key order survive, in the same transaction as the hook file. Every agent-facin...
ledger docs reconcile now refuses to replace a routing file Ledger did not generate unless --force is passed. On refusal it writes neither routing file, prints each refused file with its reason, what it would have written, and the two remedies, and exits 1 with a machine-readable written: false and refused l...
B007's live acceptance check ran in Kore on 2026-09-16. A fresh Claude Code session given an ordinary task received Ledger context on start, recorded its edit on session S0001, and left draft receipt 0002 on stop, which the agent finished to pass ledger ready when asked. Product note 0129 records what did not work...
Kore, the first outside adopter named by D007, installed Ledger 0.7.0 through npx with Claude Code and Codex hooks, the skill, and the agents block (kylebegeman/forge#23, Kore receipt 0001). This entry records that state on Ledger's side. Product notes 0125, 0126, and 0127 capture the install friction: TypeScript-sh...
A release audit of receipts 0112 through 0123 with fixes applied inline. The composite action's optional pull request comment read GITHUB_STEP_SUMMARY from its own step, which GitHub gives every step as a different file, so the comment step never found a summary; the Ledger step now copies its summary to...
Bumps the package to 0.7.0, marks Phase 11 trust as shipped in the roadmap, lands backlog B008 with promotion notes naming every receipt, captures the dogfood finding about hook drafts colliding with hand-written receipts as product note 0122, and rewrites the handoff for the next session. The v0.7.0 release record...
The anchor freshness check from 0116 now separates literal anchors from descriptions. extractAnchors returns structured anchors: each backticked span in an - Anchor: bullet is a literal, and a bullet without backticks is split on commas into descriptive anchors. isCheckableAnchor skips descriptions that contai...
Reader artifacts now stay under their per-file budgets as a catalog grows. The serialized search index drops each record's terms text, which Node and the browser derive from the weighted fields with searchTermsFor, and when it still exceeds maxSearchIndexBytes it is written as shards under search/ behind a m...
The reader's browser code is now a typed module, src/reader/runtime.ts, compiled against the DOM library with strict null checks, and its stylesheet is a plain src/reader/styles.css. esbuild bundles both into dist/reader/ (npm run build:reader, part of build and run before test), and...
The registry is now ledgerOperationTable, an object keyed by machine name whose value types are the concrete operation definitions; ledgerOperations is derived from it in help order. Three types follow from the table: LedgerOperationName, LedgerOperationInput<K>, and LedgerOperationOutput<K>....
ledger ci --github prints one GitHub Actions workflow command per failing signal, with the file path for coverage, docs impact, and validation issues and with data escaped per the workflow command rules, and appends a Markdown summary table with a "What to fix" list to the file named by GITHUB_STEP_SUMMARY. The...
ledger stale now reads the - Anchor: bullets of every Changed Files block, resolves the block to the record's file references, and reports stale-anchor when an anchor no longer appears in any of those files, naming the file. When an invariant cites a stale anchor or a stale symbol in backticks, it reports...
ledger verify reads the Verification section of change entries and parses each bullet that starts with a backticked command into an environment prefix and argv. --run executes the commands that match the verification.allow patterns from the project root, under a timeout and output cap, and writes...
Symbol extraction now says what it did. extractCodeSymbolsDetailed and extractFileSymbolsDetailed return the symbols together with the extractor that produced them (typescript, regex, markdown, or none) and a fallback reason when the parser was unavailable; asking for the TypeScript parser explicitly now...
buildDocsImpact now produces one evidence record per changed source file. A file is satisfied only through a change entry in the same change set that lists it and either carries a reviewed docsImpact declaration or references docs; the file's evidence names the entry, the declaration status and reason, and the d...
Coverage now distinguishes a change entry that belongs to the change under inspection from any record that happens to mention a path. Under the new default git.coverage: current, a required changed path is covered only when a change entry listing it is itself added or modified in the working tree, staged diff, or...
Bumps the package to 0.6.0, marks Phase 11 capture as shipped in the roadmap, rewrites the handoff for the next session, and records in backlog B007 which receipts promoted each part of the slice. The v0.6.0 release record groups receipts 0106 through 0111 and carries Public Notes for the GitHub Release.
ledger skills install writes .agents/skills/ledger/SKILL.md, an Agent Skills entry that tells a skills-aware agent when to call packet, explain, search-packet, conflict, session note, new, promote, backlog new, decision new, scratch, and ready, and what --json and MCP offer. Codex and Cur...
ledger hooks install --host claude-code|codex|cursor merges Ledger's lifecycle hooks into the host's project hook file (.claude/settings.json, .codex/hooks.json, .cursor/hooks.json), keeping every entry that is not Ledger's and replacing earlier Ledger entries, with --dry-run to print the merged file and...
ledger ready distinguishes a structurally valid draft from a record that is ready to land. It checks draft change entries by default, or any records named by id or path, or a --kind and --status selection. A record is ready when validation is clean for it (errors and warnings, including missing files and...
session is a seventh record kind stored under .ledger/sessions/ with an expires date, optional host and hostSession fields, and Summary, Learned, and Next sections. ledger session start (alias ledger scratch) creates one or returns the active record for the same host session; session touch appends to...
Four operations join the registry: backlog new, decision new, promote <id>, and release notes <version>. The first two render the project's backlog and decision templates with the next sequential id, area tags, and optional decision, related, and docs links. promote drafts a change entry linked to a backlo...
Added docs/HANDOFF.md, a durable resume point describing the published state, the releases and receipts from this cycle, every decision taken in conversation, the next slices in order, the conventions in force, and open threads. Added a repository AGENTS.md that routes a new session to the handoff, the generated...
Bumped the package to 0.5.0 and marked the roadmap's Phase 11 engine server as shipped. The release record for v0.5.0 groups the engine server (0099), CLI delegation (0100), live reload (0101), MCP resources and prompts (0102), and shared search scoring (0103).
src/searchCore.ts now holds the search weights, normalizeSearchText, fuzzyScore, and scoreSearchFields once. ledger search scores through it, and the static reader runtime embeds the same functions by serializing them with Function.prototype.toString() at build time, replacing the hand-copied browser imp...
The MCP server registers three resources and two prompts alongside its tools. ledger://records/{id} lists every record in the catalog and reads its raw Markdown; ledger://packet/{path} returns a token-bounded handoff packet for a URL-encoded project path; ledger://contract returns the operations contract as JS...
The reader runtime now opens an EventSource on /events whenever the page is served over HTTP, announces rebuilt events in the live status region, and reloads the page 150 ms later so filters, pagination, and the open record in the URL survive. A rebuild-failed event leaves the last good render in place with...
When ledger serve --api is running for a project, CLI commands that work inside that workspace now run inside the engine instead of parsing the catalog themselves. src/operations/delegate.ts reads .ledger/daemon.json for the project containing the current directory, probes the engine's health with a 400 ms tim...
ledger serve --api starts the engine in src/engine.ts: one hardened loopback HTTP server hosting the static reader, a JSON API generated from the operation registry, a server-sent event stream, MCP over Streamable HTTP, and a server card. POST /api/v1/operations/{name} runs any operation that works inside a wo...
Bumped the package to 0.4.0, turned the render-budget doctor check from a warning into a failure when a generated reader artifact exceeds its budget, and marked the roadmap's Phase 11 foundation as shipped.
Added src/retrieval.ts with retrieveByPath, the one place that decides which records a file path is related to. It matches the target against every record's file references with a single matcher (exact path, then coverage patterns, then a directory suffix), returns each match with its metadata, matched reference...
Every read of the source records now goes through readLedgerCatalog in src/catalogCache.ts. It stats each Markdown file and serves unchanged files from a derived cache under .ledger/cache/, parsing only files whose size or mtime changed and whose SHA-256 content hash differs. Files modified within two seconds...
Replaced the 1,830-line command switch in src/cli.ts with an operation registry. Each of the 31 operations is defined once under src/operations/definitions/ with its machine name, CLI path and flags, zod input schema, loose zod output schema, workspace requirement, mutation flag, handler, human formatter, and op...
First release since v0.3.1 to reach npm. Carries the Windows test portability fixes and newest-first reader ordering that landed in July, records the accepted next-version direction and retired proposals, and fixes the release pipeline so tags publish and produce GitHub Releases.
Bumped the package to 0.3.2, made the release workflow publish through npm trusted publishing with an NPM_TOKEN fallback and create a GitHub Release from the release record's public notes, removed the Homebrew install instructions, replaced the master and next branch model with pull requests into master, req...
Added a from-scratch brainstorm of Ledger's next version to the docs scratchpad as Markdown plus a styled HTML view, recorded the accepted direction and Kyle's four supporting decisions as D005, recorded the retired and reshaped proposals as D006, replaced the roadmap's Phase 10 next slices with a pointer to that re...
Moved document ordering into the reader model. buildStaticReaderModel now sorts rendered documents by date descending with a numeric-aware identifier tiebreak, also descending, before the search index is derived, so both profiles share one newest-first order. The public-only presentational copy sort in renderStaticR...
Repaired the two tests that broke the windows-latest CI matrix on Node 22 and 24 since the v0.2.0 push. The projectPaths test compared the absolute output of resolveProjectPath against a hard-coded POSIX string, which can never match on Windows because path.resolve prepends the current drive letter; it now compares...
Layered year grouping onto the public changelog through the path entry 0083 reserved: release entries sort newest-first, the first entry of each year carries a year-start mark, and a large muted year heading renders as a pseudo-element inside that entry's own grid, so the filter runtime can re-append rows without di...
Removed the system stop from the theme toggle. The reader follows the operating system preference silently until a reader makes a choice; the toggle then flips between light and dark from whatever theme is currently resolved, and the explicit choice persists. While no choice is stored, the toggle icon tracks the res...
Removed the inline details expansion and rebuilt records as thin list rows that open a slide-out detail panel. Each row is a single line of kind, id, title, status, and date, with a clamped summary and tag chips in comfortable density. The full record content ships in an inert template per row and is cloned into a f...
Aligned the interface accent with the sunset mark. Interactive elements now use a saturated burnt orange in light mode and the mark's luminous orange in dark mode, with matching soft fills and a warm canvas glow. Decision chips returned to their steel blue tones because copper decisions would have blended into the o...
Moved the reader accent from copper to a brighter azure blue in both themes and gave the brand mark its own warm identity: a yellow to orange to red sunset gradient tile with a warm yellow pip. The interactive accent now reads vivid blue while the mark deliberately contrasts warm against the cool interface. Decision...
Replaced the indigo and purple accent family with a warm copper and terracotta ramp across both themes, following project direction to drop the purple color. The brand mark, canvas glow, interactive states, focus rings, pressed facets, active filter pills, pagination, and palette highlights all follow the new accent...
Restructured the reader around a search-first layout. The search field now spans the full content width above dropdown filter pills, the browse rail moved to the right side of the results, and generous spacing separates the search region from the library. Results paginate with a configurable page size and windowed p...
Replaced the reader's filled-card visual language with a flat editorial layout directed by project review feedback. Records now read as a hairline-divided list with visible dates, expanded context renders as plain content groups, and only a handful of surfaces remain: outlined containers with a thin stroke and no fi...
Rebuilt the generated Ledger website from first principles. The old bordered dashboard and dense always-expanded cards were replaced with a borderless, responsive reader built around strong typography, filled surfaces, restrained depth, compact record summaries, and a dedicated public release feed. The new visual sy...
Completed an active production audit of the Ledger 2.0 hardening work. File boundaries, recoverable writes, validation, public rendering, serving, CLI and MCP inputs, migrations, releases, and publishing automation now fail safely and consistently under malformed, oversized, concurrent, and adversarial inputs. Gener...
Stale-knowledge checks now honor explicit symbols:name acknowledgements for historical symbol anchors. The compatible @types/node and Vitest patch versions in the lockfile were also refreshed after the final dependency audit.
CI now covers maintained Node LTS releases across Linux, macOS, and Windows, audits production dependencies, and installs the packed package. Release automation validates tag and package versions, supports npm OIDC trusted publishing with a token fallback, and no longer silently succeeds without publishing credentials.
Integrity artifacts can now be used as read-only baselines through CLI, MCP, and library APIs. The static reader also has a separate fail-closed public profile that exports only released release records and explicit public notes.
CLI --json output and MCP JSON text payloads now share a versioned success and failure envelope. Operational error codes come from typed boundary errors or a safe system-error normalizer rather than matching human message wording.
The reader server now defaults to a host-validated loopback mode and requires explicit, token-authenticated network exposure for non-loopback binding. It also adds symlink-safe file resolution, method and URI limits, bounded HTTP server settings, restrictive response headers, static CSP metadata, and graceful connec...
Ledger source mutations now use a shared journaled file transaction with a workspace lock, optimistic source hashes, staged replacements, rollback copies, and interrupted-operation recovery. Release assignment and release creation now commit together, while entry creation, migrations, docs routing, and validation ba...
Ledger now confines configured paths and record references to the discovered project root, including checks for existing symlink chains that escape the workspace. Config and record YAML parsing plus source discovery now have explicit size, count, alias, aggregate-byte, and nesting limits.
Moved symbol extraction into a reusable module and added a TypeScript parser path for top-level TypeScript and JavaScript symbols, with regex fallback for portable installs.
Added explicit docsImpact frontmatter declarations so source changes can mark docs as updated, not needed, or unaffected with a reviewed reason. The docs impact report now lists declarations and ignores TODO placeholder reasons.
Changed the static reader search index from one flat term string into weighted search fields and updated the browser runtime to rank and reorder visible cards by score.
Added configurable static-reader artifact budgets and render metrics. ledger render now reports generated bytes and write time, while ledger doctor checks the generated HTML, search index, graph, total bytes, and write duration against render.budgets.
Accepted the architecture hardening and static search feature backlog, then landed the first implementation slice: token-budgeted agent packets, lazy static search and graph artifacts, local static reader serving, doctor diagnostics, stale-knowledge detection, and role-specific agent instructions.
Hardens the release write preflight so release --assign --write verifies the release output directory before mutating entries. This closes the remaining safe edge case from the audit pass where an absent or unwritable releases directory could still fail after assignment had started.
Fixes safe issues found during a full bug sweep: release assignment now preflights release-file writes before mutating entries, MCP exposes integrity verification, CI reuses changed-file discovery, and this repo's Ledger config ignores generated docs/llm/START_HERE.md.
Adds ledger release <version> --assign, which writes the selected release version back to the selected change entries before optionally writing the release record. Also updates the README positioning to make Ledger's agent-first focus explicit while preserving full CLI support for humans.
Adds faceted reader metadata and improves the generated static reader with quick browse controls for kinds, releases, and areas plus relationship sections on record cards.
Adds ledger verify-integrity, which computes SHA-256 hashes for every Ledger source record, combines them into a catalog hash, and writes JSON plus Markdown integrity artifacts.
Extends the managed docs plane so ledger docs reconcile writes both the docs routing manifest and docs/llm/START_HERE.md, and adds ledger docs migrate to generate cleanup guidance for docs folders.
Adds ledger mcp, a stdio Model Context Protocol server exposing read-oriented Ledger tools for validation, query, explain, conflict guidance, agent packets, and docs impact.
Adds a release-grade npm script, simplifies CI to use that script, adds a tag-driven release workflow, and improves issue and pull request templates for public collaboration.
Adds --text to ledger query. Text filtering searches normalized metadata such as id, title, status, release, path, areas, files, symbols, docs, relationships, and section names.
Prepares the v0.1.2 patch release by bumping package metadata, assigning the latest landed changes to release: "v0.1.2", and generating the Ledger release record.
Adds docs/llm/manifest.json to Git and Ledger coverage ignore paths. The generated docs routing manifest no longer appears as untracked work or missing Ledger coverage after ledger docs reconcile.
Adds ledger docs reconcile, which builds and writes the configured docs routing manifest from the current docs audit. The generated manifest lists non-generated docs files with their Ledger docs classifications.
Adds generated by-decision.json and by-backlog.json indexes. These group normalized Ledger documents by relationship ids declared in decisions: and backlog: frontmatter.
Adds Markdown report output for conflict guidance. ledger conflict <path...> --write-report now writes .ledger/reports/conflict.md while preserving the existing console and JSON workflows.
Adds lightweight symbol extraction to ledger new --from-diff. Draft entries now populate symbols: from changed TypeScript/JavaScript declarations and Markdown headings, and changed-file anchors include detected symbols.
Reworks the README into a fuller public project landing page with a branded header, badges, quick starts, command map, example entry, agent workflow, release workflow, docs relationship, library usage, and development guidance. The package metadata is bumped to 0.1.1, existing change entries are assigned to the...
Completes an active bug sweep and integration pass across the Ledger package. The pass fixes safe issues in CLI testability, config and frontmatter diagnostics, git coverage, generated entry escaping, rendered search payloads, and npm package contents.
Improves release generation with semver-like version validation, explicit release status/date support, and separate public notes plus internal Ledger entry details in rendered release records.
Enhances the static reader model and HTML output with extracted summaries, invariants, verification checks, and the Ledger icon asset. The reader cards now show the highest-value maintenance context without requiring users to open raw Markdown first.
Improves ledger new --from-diff by using Git status details, preserving quoted YAML frontmatter strings, adding docs references for changed docs files, and rendering status-aware changed-file starter sections.
Adds an end-to-end CLI test that runs a complete Ledger workflow in a temporary workspace: init, new, validate, index, render, query, docs classify, and CI.
Adds runtime validation for .ledger/config.yaml so malformed nested config values fail with explicit errors instead of being silently merged into defaults.
Adds ledger ci [--staged] [--json] for running the core Ledger guard set in one command. The command composes validation, docs reference audit, Git coverage, and docs impact into a compact pass/fail summary for humans or a nested JSON result for automation.
Adds ledger render for generating .ledger/dist/index.html, a single-file offline reader for Ledger source records. The reader includes catalog stats, filters, rendered entry summaries, embedded JSON data, and Markdown source access for every record.
Adds ledger docs classify [path...] [--json] for exposing Ledger's docs lifecycle classifier directly through the CLI. With paths, it classifies only those targets. Without paths, it discovers and classifies the configured docs root.
Adds ledger docs impact for checking whether changed source files have an explicit docs impact. The command reports changed source files, docs files, Ledger files, changed Ledger entries, docs referenced by those entries, and source files that still lack any docs impact.
Adds ledger unreleased for listing landed or shipped change entries that have not been assigned to a release. Adds ledger release <version> for rendering a valid Ledger release document from version-assigned entries or from the current unreleased set.
Adds ledger conflict <path...> for retrieving merge-conflict guidance tied to the files a user or agent is resolving. The command can print human-readable guidance or emit JSON for merge tooling and agent workflows.
Adds ledger query for filtering records by kind, status, and area. Expands ledger explain with --json for tool output and --agent for compact invariants plus verification context.
Adds ledger coverage to compare Git changed files against Ledger entries. The command uses git.requireEntryFor and git.ignore config to decide which changed paths require coverage, supports --staged, and can emit JSON for CI or agent tools. ledger new --from-diff now also supports --staged.
Expands ledger init so new projects get the same core source templates Ledger uses itself: change, backlog, decision, release, and coverage policy files. Adds test coverage for initWorkspace(..., { withDocs: true }) to ensure the Ledger root, templates, policy file, and optional docs routing starter files are cr...
Renames Ledger's default project directory from .changes/ to .ledger/ so the on-disk structure matches the product and SDK name. Adds the first managed-docs lifecycle slice: ledger init --with-docs, ledger docs audit, and ledger docs check. The docs feature starts as scaffold, audit, report, and strict bro...
Creates the standalone Ledger package concept and initial project records. Ledger is defined as a repo-native change memory system for humans and coding agents. The bootstrap includes product docs, architecture docs, schema docs, roadmap docs, implementation planning, and Ledger's own .ledger/ directory.
v0.1.1docscliarchitecture
No matching records
Try a broader phrase or reset the active filters.
No records yet
Recorded changes, decisions, and backlog items will appear here.