Files changed: - .gitignore - AGENTS.md - CHANGES.md - INSTALL.md - VERSION - docs/explanation/knowledge-and-commitment.md - docs/explanation/telemetry-and-evaluation.md - docs/explanation/why-gates-are-code.md - docs/how-to/run-the-weekly-review.md - docs/how-to/set-up-the-mcp-server.md - docs/how-to/trace-and-score-sessions.md - docs/how-to/troubleshoot.md - docs/reference/commands/README.md - docs/reference/commands/configuration.md - docs/reference/commands/finding-and-checking.md - docs/reference/commands/git.md - docs/reference/commands/instance-health.md - docs/reference/commands/pages.md - docs/reference/commands/raw-material-and-uploads.md - docs/reference/configuration.md - docs/reference/exit-codes.md - instructions/dev/doc-pull-through.md - instructions/dev/tracker-testing.md - instructions/gates.md - instructions/ingest-queue.md - instructions/mcp-read-server.md - instructions/migrate-corpus.md - instructions/migrations/10.0.0-settings-tiers.md - instructions/setup-instance.md - raw/CONTRACT.md - reports/CONTRACT.md - tools/CONTRACT.md - tools/README.md - tools/bugreport.py - tools/chemenu/cli_contract.py - tools/chemenu/commands/_util.py - tools/chemenu/commands/config_cmd.py - tools/chemenu/commands/docs_verify.py - tools/chemenu/commands/doctor.py - tools/chemenu/commands/export_cmd.py - tools/chemenu/commands/git_publish.py - tools/chemenu/commands/new_page.py - tools/chemenu/commands/review_cmd.py - tools/chemenu/commands/task_cmd.py - tools/chemenu/commands/upload_cmd.py - tools/chemenu/config.py - tools/chemenu/config_shapes.py - tools/chemenu/legacy_settings.py - tools/chemenu/mcp/__main__.py - tools/chemenu/mcp/server.py - tools/chemenu/reference_doc.py - tools/chemenu/review.py - tools/chemenu/settings.py - tools/chemenu/tasks/__init__.py - tools/chemenu/tasks/caldav.py - tools/chemenu/tasks/config.py - tools/chemenu/tasks/superproductivity.py - tools/chemenu/telemetry/policy.py - tools/chemenu/tests/conftest.py - tools/chemenu/tests/record_sp_fixtures.py - tools/chemenu/tests/test_bugreport.py - tools/chemenu/tests/test_caldav.py - tools/chemenu/tests/test_config_shapes.py - tools/chemenu/tests/test_doctor.py - tools/chemenu/tests/test_git_publish.py - tools/chemenu/tests/test_legacy_settings.py - tools/chemenu/tests/test_mcp_server.py - tools/chemenu/tests/test_new_page.py - tools/chemenu/tests/test_review.py - tools/chemenu/tests/test_settings.py - tools/chemenu/tests/test_sp_recorded.py - tools/chemenu/tests/test_superproductivity.py - tools/chemenu/tests/test_task_cmd.py - tools/chemenu/tests/test_tasks_config.py - tools/chemenu/tests/test_telemetry_policy.py - tools/chemenu/tests/test_tracker_live.py - tools/chemenu/tests/test_upload.py - tools/chemenu/tests/tracker_live.py - tools/chemenu/upload.py Co-Authored-By: Claude Code <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SnAJ7Z3CpVD3PRbN73QtU2
9.5 KiB
type, name, description
| type | name | description |
|---|---|---|
| types/instruction.md | doc-pull-through | Which document makes a claim about a surface you are about to change - a wikitool command's behaviour, a stage's rules, an AGENTS.md rule/gate/invariant, a README-shaped human doc, a docs/ page's reasoning - and so needs updating in the same session, since tools/wikitool docs verify never reads a cell's prose. |
Update every document that makes a claim about the surface you changed
tools/wikitool docs verify is a hard oracle over presence, not content: it checks that a
command is listed, that a contract exists, that an ignore canary is (or isn't) caught - never
what a table cell, a contract section, or a README paragraph actually says. A command's flag
can change, a gate's threshold can move, a contract's wording can go false, and every one of
those checks stays green (Gitea #90; Gitea #91 narrows what the command-table check matches, but
adds no reading of cell content). Content quality of every document below is therefore session
work, the same duty AGENTS.md's Changelog section states for README.md, tools/README.md and
the pages under docs/ - this instruction exists because that duty used to stop at the human docs
while the contracts rotted next to a green check (ten stale error-contract rows accumulated this
way; see Gitea #89 for one).
When to run
Before tools/wikitool docs verify/publish in a build session that changed behaviour -
stack-build step 5 sends you here. Read the table below and update every row whose surface you
touched; a row that does not apply needs no action.
Steps
-
Name the surface(s) you changed. A
wikitoolcommand's flags or behaviour, a stage's rule, anAGENTS.md-level rule/gate/invariant, a workflow a human runs by hand, or the reasoning behind a design decision - one change can touch more than one row. -
For each surface, update every document the table names - not only the one you were already editing:
Touched surface Document(s) that make a claim about it A wikitoolcommand's behaviour, flags, or interfaceIts cli_contract.CommandRecord(name, synopsis, properties, exit status, retry policy -tools/chemenu/cli_contract.py), thenwikitool docs contract --applyto regenerate its copy in tools/CONTRACT.md andwikitool docs reference --applyfor the human reference underdocs/reference/(a new group incli_contract.GROUPSfirst needs its page there, with a title, a one-sentence head and the marker pair)A stage's authoring rules ( raw/,kb/,types/,reports/,work/,tools/,instructions/)The touched <stage>/CONTRACT.mdA rule, gate, or invariant AGENTS.mditself statesThe relevant AGENTS.mdsection (Invariants, Gates, File naming, Routing, ...)A workflow, stage, or command a human operates by hand Whichever of README.md,tools/README.md,INSTALL.mdor the pages underdocs/tutorials/,docs/how-to/anddocs/reference/names it - AGENTS.md § File naming says which document is for which reader. A new page goes into the area its kind of documentation belongs to; that area'sREADME.mdsays whichThe reasoning behind a gate, boundary, or design decision The docs/explanation/page that carries it, if one exists (AGENTS.md § File naming lists all seven reached from AGENTS.md itself, plus an eighth reached only from CLAUDE.md). A decision with no page yet is the gap worth closing: reasoning that lives only in a Gitea issue never ships -dist exportcarriesdocs/explanation/and no issue tracker, so a distributed instance gets the mechanism without the whyA task-tracker adapter ( tools/chemenu/tasks/), its recorded fixtures, or the live suiteinstructions/dev/tracker-testing.md, and MANIFEST.jsonbeside the fixtures when they were re-recordedA skill's own step sequence or catalogue The skill's SKILL.mdsource underinstructions/<name>/orinstructions/dev/<name>/; for a shipped skill (not underinstructions/dev/) whose name ordescriptionchanged, or one added or removed,wikitool docs reference --applyfor the skill cataloguedocs/reference/skills.mdA section of the tiered settings ( wikitool.json,.wikitool-local.json;config_shapes.SETTINGS_SECTIONS)Its shape - a field, a default, what is required or tolerated - is its record in tools/chemenu/config_shapes.py, which the loader reads; change it there, thenwikitool docs reference --applyfor its region in docs/reference/configuration.md. What a setting does is the hand-written prose around that region. Also the setup-instance.md decision point that offers the section during setup, anddoctor's own row in tools/CONTRACT.md, sincedoctoris what reports the section's stateAn installation instruction - preflight.md, setup-instance.md, bootstrap.md, upgrade-instance.md - or tools/prerequisites.txtINSTALL.md, the human guide to the same procedure - for upgrade-instance.md, docs/how-to/update-an-instance.md instead. Read it against the instruction: what to prepare, the sentence for the agent, what the agent asks, where it stops and why.docs verifychecks only the two enumerable overlaps - the prerequisites lists, whichwikitool docs prerequisites --applyregenerates from the manifest, and the setup questions: a question the agent asks the user carries<!-- setup-question: <key> -->where it is asked insetup-instance.md, andINSTALL.md§ "What the agent asks you" names it with the same marker. Every other sentence is this session's to compare.INSTALL.mddoes not retell the steps, so a change to their order or wording alone moves nothing theredev-setup.md, the release workflow ( version bump/version release/publish/CI), or another developer-facing processdocs/dev/development.md, read against it the same way - nothing checks this pair at all. A page under docs/dev/is never shipped, so it may link intoinstructions/dev/and cite issue numbersA new page type the stack requires, or a new collection Its type-spec and COLLECTION.md(both as the.templatean instance adopts), the collection table in kb/CONTRACT.md, and both adoption paths: setup-instance.md for a fresh instance and upgrade-instance.md for an existing one, where an unadopted template is whatdocs verifyrefuses. A new or changedroot: kbtype-spec or its schema - description,layout:, subtype enum, required fields - also needswikitool docs reference --applyfordocs/reference/page-types.md -
A heading you changed means a table of contents to regenerate - by the tool, never by hand. Every reference file over 100 lines carries one (
AGENTS.md, the stage contracts,kb/CONVENTIONS.md, eachCOLLECTION.md, the flatinstructions/**.mdform, the type-specs, thedocs/pages in all five areas - each with the<name>.templateit ships as, where one exists, and aSKILL.mdthe one exception). Adding, renaming, reordering or deleting a##/###heading in one of them makes its region stale, anddocs verifyfails on stale exactly as it fails on missing:tools/wikitool docs toc # dry run: which files would change tools/wikitool docs toc --apply # write themThe region is generated, so AGENTS.md invariant 1 applies to it like any other: editing the list by hand is the failure, not the fix - and a hand-written entry survives until the next
--applysilently disagrees with it. It is cheap to over-run:--applyis idempotent and a file whose headings did not move is left untouched. -
Do not re-derive what
docs verifyalready checks mechanically - existence, table-row membership, ignore-canary state. That enumeration lives once, in tools/CONTRACT.md's owndocs verifyrow; copying it here would be a second copy that drifts, the exact failure this instruction exists to describe (Gitea #90). This instruction is only about the prose no check reads.
Decision points
- The change touched no document in the table? Nothing to do - not every stack change moves a claim. A pure bugfix with an unchanged interface is the common case.
- Unsure whether a
docs/explanation/page's reasoning moved? Read it. Adocs/page carries no normative sentence and nothing verifies it by construction (AGENTS.md § File naming), so an unsure guess defaults to reading the page rather than skipping the question -stack-closestep 3 asks it again in the closing phase as a backstop, not as the only time it is asked. - The surface is a whole new stage, collection, or gate? The table's rows are the steady state; a new row-worthy category is itself a change to this instruction - add the row here rather than leaving the next session to rediscover the gap.
Scope
Applies to stack-development sessions only - wiki content changes have their own provenance and
cross-reference rules (kb/CONTRACT.md, wiki-manage), which already pull the relevant pages
through as part of the normal skill. Not a replacement for stack-close step 3, which re-asks
the docs/-staleness question after the green CI run as the second, final check.