{"slug":"living-docs","title":"living-docs","summary":"Run a project's engineering decisions as a living log — MADR-lite ADRs (supersede, never delete) for decisions expensive to reverse, issues for the work (and its cheap-to-reverse choices), research artifacts, an optional PRD, a project constitution, and living Mermaid architectur","platform":"Claude","tags":["research"],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-16T14:51:24.560839Z","repo":{"url":"https://github.com/ejklock/living-docs-skill","stars":13,"forks":3,"license":null,"updatedAt":"2026-09-22T13:24:35Z"},"bodyHtml":"<hr>\n<h2>name: living-docs\ndescription: Run a project's engineering decisions as a living log — MADR-lite ADRs (supersede, never delete) for decisions expensive to reverse, issues for the work (and its cheap-to-reverse choices), research artifacts, an optional PRD, a project constitution, and living Mermaid architecture views, where every record has exactly one home, indexes never drift, and a record is earned by materiality, not written per layer. Use when setting up or maintaining project docs, writing an ADR/PRD/constitution/issue/research note, drawing or updating an architecture diagram, or enforcing the no-drift maintenance rule.\nversion: \"0.16.0\"\nmetadata:\ntype: skill\nlayer: procedural\ntags: [documentation, adr, prd, constitution, issues, research, architecture]</h2>\n<h1>Living Docs</h1>\n<p>Living Docs is a <strong>decision log with a gate</strong>. It records the engineering decisions a future reader would pay to rediscover, traces each from its rationale to the code, and refuses to let a record exist unindexed, untyped, or silently rewritten. The spine — <strong>every piece of knowledge has exactly one home, that home is indexed, and a material decision ships with its record</strong> — carries a small set of record types: ADRs, issues, research, a constitution, an optional PRD, and living architecture views.</p>\n<p>This skill is stack-agnostic. It governs <em>how</em> decisions are recorded and maintained, never <em>what</em> technology a project uses.</p>\n<hr>\n<h2>Using this skill (progressive disclosure)</h2>\n<p>This SKILL.md is a <strong>slim stub</strong> — a trigger plus a task→topic router. The <code>living-docs</code> CLI\nholds the full, authoritative conventions and templates and discloses them progressively.\n<strong>Before authoring anything, load the topic for your task and operate from it, not from this\nstub:</strong></p>\n<ul>\n<li><code>living-docs skill living-docs --list</code> — discover every topic.</li>\n<li><code>living-docs skill living-docs --topic &lt;topic&gt;</code> — load that topic's full rules (+ template).</li>\n</ul>\n<p>Piped output is minified JSON (machine default); <code>--plain</code> for human text, <code>--json</code> to force\nJSON.</p>\n<p>Write ONLY the body below the closing ---. Frontmatter and indexes are CLI-owned: <code>living-docs set</code> / <code>supersede</code> / <code>index</code>.</p>\n<ul>\n<li>The spine invariants → <code>living-docs skill living-docs --topic spine</code>.</li>\n<li>Authoring mechanics — CLI owns every deterministic step, you write only the prose →\n<code>living-docs skill living-docs --topic procedure</code>.</li>\n</ul>\n<h2>The one rule that decides whether to write a record</h2>\n<p>Write an <strong>ADR</strong> when a future reader would pay to rediscover <em>why</em> you chose this over the\nalternatives — i.e. the decision is expensive to reverse. Otherwise put the choice in the\n<strong>issue</strong> that carries the work. When in doubt, it is an issue. A record is earned by\nmateriality, never by the fact that a change touched structure or behavior — do not manufacture\na record per layer.</p>\n<hr>\n<h2>When to invoke</h2>\n<ul>\n<li>Standing up documentation for a project (creating <code>docs/</code> structure, the docs index, ADR/issue directories) → <code>living-docs skill living-docs --topic procedure</code>.</li>\n<li><strong>Adopting living-docs in an existing/brownfield project</strong> (decisions already made but undocumented) → run <code>living-docs migrate</code> for the ordered <code>ADOPT</code> plan (ADR 0037), then <code>living-docs skill living-docs --topic migration</code> and <code>--topic procedure</code>: inventory the decisions, <strong>confirm each with the user before recording any ADR</strong>, never back-fill by inference alone.</li>\n<li><strong>Adapting a bundle authored under an older Living Docs organization</strong> (single <code>architecture.md</code>, kind-less views, hand-maintained table indexes) → run <code>living-docs migrate</code> and execute its <code>RUN</code>/<code>AUTHOR</code> steps in the printed order → <code>living-docs skill living-docs --topic migration</code>.</li>\n<li>Writing or editing an <strong>ADR</strong> (a decision expensive to reverse, with its rejected alternatives) → <code>living-docs skill living-docs --topic adr</code> (load <code>--topic procedure</code> first if not already loaded this session). A test-strategy <em>decision</em> (non-default level/technique, bar deviation) is an ADR <code>tags: [testing]</code>, not a new record type.</li>\n<li>Writing or editing a <strong>PRD</strong> (an optional product/feature spec: who asked, what is out of scope, what success looks like) → <code>living-docs skill living-docs --topic prd</code> (load <code>--topic procedure</code> first). A PRD without who-asked/out-of-scope is just a large issue — keep it an issue.</li>\n<li>Establishing or amending the <strong>constitution</strong> (foundational scope, non-negotiables) → <code>living-docs skill living-docs --topic constitution</code> (load <code>--topic procedure</code> first).</li>\n<li>Creating or editing an <strong>issue/ticket</strong> (the unit of work; it carries any cheap-to-reverse decision inline) → <code>living-docs skill living-docs --topic issue-workflow</code> (load <code>--topic procedure</code> first).</li>\n<li>Recording <strong>research</strong> (technology evaluation, external trade-offs) → load the <strong><code>research-artifacts</code></strong> skill. It owns the OKF research-note format, the source discipline, and the research → decision → issue traceable chain, and links back here for the ADR/issue artifacts. Pairs with the <code>deep-research</code> skill.</li>\n<li>Drawing or updating an <strong>architecture, data-flow, or tool-calling diagram</strong> → <code>living-docs skill living-docs --topic architecture-diagrams</code>.</li>\n<li>A doc has grown too large or mixes concerns → <strong>split into a semantic index</strong> → <code>living-docs skill living-docs --topic semantic-index</code>.</li>\n<li><strong>Reading the corpus as an agent</strong> (what governs X <em>now</em>) → run <code>living-docs effective</code> (active records only, supersede chains collapsed; <code>--topic &lt;term&gt;</code> to filter, <code>--full</code> for bodies — ADR 0050), <strong>never <code>index.md</code> directly</strong>.</li>\n<li>Sizing a record's body (aim ~100 lines, <code>check</code> advises at 120; research exempt; never trim a load-bearing rationale) → <code>living-docs skill living-docs --topic size-targets</code>.</li>\n<li>Enforcing the <strong>no-drift maintenance rule</strong> after any structural change → run <code>living-docs check</code>; treat a non-zero exit as blocked; treat each advisory (<code>SIZE</code>, <code>LIVENESS stale-proposed</code>, <code>MOVED-SOURCE</code>) as work to schedule. Detail → <code>living-docs skill living-docs --topic check</code>; the maintaining loop → <code>--topic procedure</code>.</li>\n<li>Authoring or checking the <strong>OKF format</strong> of any doc (frontmatter <code>type</code>, reserved <code>index.md</code>/<code>log.md</code>, bundle-relative links, <code># References</code>) → <code>living-docs skill living-docs --topic okf-format</code>.</li>\n<li>Understanding the <strong>doc trail</strong> (constitution → PRD → ADR → issues → code) and which record type answers which question → <code>living-docs skill living-docs --topic doc-trail</code>.</li>\n</ul>\n","files":[{"path":"hooks/pre-commit","sizeBytes":1098,"isText":false},{"path":"hooks/session-context.sh","sizeBytes":1487,"isText":true},{"path":"rules/adr-conventions.md","sizeBytes":7098,"isText":true},{"path":"rules/architecture-diagrams.md","sizeBytes":7615,"isText":true},{"path":"rules/check.md","sizeBytes":3646,"isText":true},{"path":"rules/code-comment-hygiene.md","sizeBytes":1937,"isText":true},{"path":"rules/constitution-conventions.md","sizeBytes":3327,"isText":true},{"path":"rules/doc-trail.md","sizeBytes":3817,"isText":true},{"path":"rules/issue-workflow.md","sizeBytes":2723,"isText":true},{"path":"rules/okf-format.md","sizeBytes":2364,"isText":true},{"path":"rules/prd-conventions.md","sizeBytes":3726,"isText":true},{"path":"rules/procedure.md","sizeBytes":5725,"isText":true},{"path":"rules/semantic-index.md","sizeBytes":4851,"isText":true},{"path":"rules/size-targets.md","sizeBytes":1492,"isText":true},{"path":"rules/spine.md","sizeBytes":1446,"isText":true},{"path":"SKILL.md","sizeBytes":6049,"isText":true},{"path":"templates/adr.md","sizeBytes":1129,"isText":true},{"path":"templates/architecture-index.md","sizeBytes":568,"isText":true},{"path":"templates/architecture-view.md","sizeBytes":495,"isText":true},{"path":"templates/claude-hard-rules.md","sizeBytes":8372,"isText":true},{"path":"templates/constitution.md","sizeBytes":1176,"isText":true},{"path":"templates/context-index.md","sizeBytes":921,"isText":true},{"path":"templates/glossary.md","sizeBytes":1270,"isText":true},{"path":"templates/issue.md","sizeBytes":663,"isText":true},{"path":"templates/prd.md","sizeBytes":1101,"isText":true},{"path":"templates/research.md","sizeBytes":952,"isText":true},{"path":"tests/fixtures/01-fence-link-clean/docs/foo.md","sizeBytes":144,"isText":true},{"path":"tests/fixtures/01-fence-link-clean/docs/index.md","sizeBytes":27,"isText":true},{"path":"tests/fixtures/02-fence-link-dirty/docs/foo.md","sizeBytes":62,"isText":true},{"path":"tests/fixtures/02-fence-link-dirty/docs/index.md","sizeBytes":27,"isText":true},{"path":"tests/fixtures/03-link-forms/docs/bar.md","sizeBytes":58,"isText":true},{"path":"tests/fixtures/03-link-forms/docs/foo.md","sizeBytes":145,"isText":true},{"path":"tests/fixtures/03-link-forms/docs/index.md","sizeBytes":45,"isText":true},{"path":"tests/fixtures/04-frontmatter-quoted-commented/docs/a.md","sizeBytes":24,"isText":true},{"path":"tests/fixtures/04-frontmatter-quoted-commented/docs/b.md","sizeBytes":24,"isText":true},{"path":"tests/fixtures/04-frontmatter-quoted-commented/docs/c.md","sizeBytes":42,"isText":true},{"path":"tests/fixtures/04-frontmatter-quoted-commented/docs/index.md","sizeBytes":51,"isText":true},{"path":"tests/fixtures/05-nested-key-trap/docs/foo.md","sizeBytes":38,"isText":true},{"path":"tests/fixtures/05-nested-key-trap/docs/index.md","sizeBytes":27,"isText":true},{"path":"tests/fixtures/06-block-scalar-ok/docs/foo.md","sizeBytes":28,"isText":true},{"path":"tests/fixtures/06-block-scalar-ok/docs/index.md","sizeBytes":27,"isText":true},{"path":"tests/fixtures/07-supersede-broken/docs/0001-old.md","sizeBytes":65,"isText":true},{"path":"tests/fixtures/07-supersede-broken/docs/index.md","sizeBytes":32,"isText":true},{"path":"tests/fixtures/08-reference-link-broken/docs/foo.md","sizeBytes":75,"isText":true},{"path":"tests/fixtures/08-reference-link-broken/docs/index.md","sizeBytes":27,"isText":true},{"path":"tests/fixtures/09-okf-canonical/docs/datasets/crypto_bitcoin.md","sizeBytes":2090,"isText":true},{"path":"tests/fixtures/09-okf-canonical/docs/datasets/index.md","sizeBytes":181,"isText":true},{"path":"tests/fixtures/09-okf-canonical/docs/index.md","sizeBytes":297,"isText":true},{"path":"tests/fixtures/09-okf-canonical/docs/tables/blocks.md","sizeBytes":728,"isText":true},{"path":"tests/fixtures/09-okf-canonical/docs/tables/index.md","sizeBytes":434,"isText":true},{"path":"tests/fixtures/09-okf-canonical/docs/tables/inputs.md","sizeBytes":2196,"isText":true},{"path":"tests/fixtures/09-okf-canonical/docs/tables/outputs.md","sizeBytes":2270,"isText":true},{"path":"tests/fixtures/09-okf-canonical/docs/tables/transactions.md","sizeBytes":5649,"isText":true},{"path":"tests/fixtures/09-okf-canonical/PROVENANCE.md","sizeBytes":1464,"isText":true},{"path":"tests/fixtures/10-mermaid-valid/doc.md","sizeBytes":287,"isText":true},{"path":"tests/fixtures/11-mermaid-invalid/doc.md","sizeBytes":141,"isText":true},{"path":"tests/run.sh","sizeBytes":3826,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"clean","suspicious":0,"notes":0,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-22T13:52:14.634779Z","sha256":"DEEA9467066787ED60ACDD0F977227B8F19B40E905D89AD7F767C74C3D709055","sizeBytes":53998},"review":null,"source":{"repositoryUrl":"https://github.com/ejklock/living-docs-skill","path":"skills/living-docs","license":null,"commit":"81120ac776cded25e842ce6f9d055696364c40d7","subtreeSha":"1DACB528F3F6349F89966A4E72F93024748130EF2788298468F6EF26063E7BB1","lastSyncedAt":"2026-09-22T13:51:04.056645Z"},"reviewedAt":"2026-09-22T13:56:10.518276Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/ejklock/living-docs-skill/tree/main/skills/living-docs"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install ejklock-living-docs-skill@llmmart"},{"target":"git","command":"git clone https://github.com/ejklock/living-docs-skill.git"}]}