Two-part handover following the repo's existing convention: Part A for a fresh Claude session, Part B for the owner. Part A leads with the trap rather than the deliverables, because it is the thing most likely to cause damage: main advanced 13 commits mid-audit and had already fixed two of the audit's findings, so this branch would have reverted them without the merge. Includes the fetch-and-merge commands to re-check the baseline if main has moved again overnight. Also records, so a future session does not undo them: - The tense split — past-tense records are annotated, never rewritten. "Finishing the job" by rewriting the milestone docs or the 41 completed plans is the wrong instinct and destroys the audit trail. - One finding was WITHDRAWN during the audit (the asset table lists esbuild entry points, so imported-only sources are correctly absent). Adding them back would reintroduce a non-defect. - The known false-positive link-check hit inside a ```diff fence. - The submodule invariant: git diff main..HEAD -- user must stay empty. An earlier git reset -- user here silently reverted main's pin bump; that was caught, and the check is written down so it is not re-broken. - P5's booby trap: removing shortcode-gallery-plusplus may take shortcode-core with it and break stories. Part B is the two things only the owner can do: one command to open the PR (tea needs an interactive TTY), and the 7 recommendation decisions with why each needs a human. Notes that the PR body file lives in a Claude job dir and is reconstructable from the spec if it has been cleaned up. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
12 KiB
Documentation Reconciliation — Handover
Date: 2026-07-25
Branch: feat/docs-reconcile (worktree .worktrees/docs-reconcile, dev server :8091)
State: Work complete and pushed. Remaining: open the PR (needs one interactive command) and decide on 7 logged recommendations. No code was changed; no user/ commits were made.
Two audiences:
- Part A — Claude → future Claude: exact state, the one trap that nearly caused a regression, and what must not be "tidied up".
- Part B — Mischa: the two things only you can do.
Part A — Handover (Claude → future Claude)
What this branch delivers
A whole-repo reconciliation of the documentation against the code, after five weeks in which the app changed and the docs did not. The code was treated as the source of truth throughout.
Three deliverables:
docs/reference/superseded-decisions.md(new) — the supersession ledger. 14 reversals, each with what was planned, where, what is true now, when it changed, and why. Plus a "decisions that were not reversed" section so old planning docs don't all read as suspect.- Inline
> **Superseded …**notes at each stale claim, in the 4 milestone docs,summary.md,pm-analysis.md, anddesign-system-light.md. Reuses the repo's existing> History:/> **Changed 2026-07:**patterns — do not invent a third convention. - Corrections to the nine present-tense docs (
CLAUDE.md,README.md,CONCEPTS.md,docs/README.md,docs/working/README.md,reference/architecture.md,reference/design-system.md,reference/design-system-light.md,guides/posting.md).
Plus the compounded learning (docs/solutions/conventions/reconciling-drifted-docs-tense-tiering-and-a-supersession-ledger.md),
the design/verification record (docs/working/specs/2026-07-25-docs-reconciliation-design.md), and the
unacted findings (docs/working/2026-07-25-doc-drift-recommendations.md).
The governing idea — do not undo this
Scope was split by tense, because the halves need opposite treatment:
| Kind | Staleness is | Treatment |
|---|---|---|
Present-tense: CLAUDE.md, reference/, guides/, README.md, CONCEPTS.md |
a defect | corrected against the code |
Past-tense: plans/, specs/, milestones/, summary.md, pm-analysis.md |
correct and expected | annotated only, never rewritten |
A completed plan is supposed to be stale — that is what makes it a record. If a future session is tempted to "finish the job" by rewriting the milestone docs or the 41 completed plans to match today's code, that is the wrong instinct and destroys the audit trail. The banners are the fix.
Commits (all on feat/docs-reconcile, all pushed)
origin/feat/docs-reconcile == local HEAD == 7c9c140.
8202d2a— the reconciliation: ledger + inline notes + the nine present-tense correctionsd946eaa— compounded learning intodocs/solutions/conventions/+ newCONCEPTS.mdDocumentation cluster7c9c140— merge ofmain(see the trap below)
Net diff vs main is 19 files, +897/−60, no deletions, and the submodule gitlink is byte-identical
to main.
⚠️ The trap — main moved 13 commits mid-audit
This is the most important thing on this page.
While the audit ran, the location-override work was merged into the outer repo, advancing main by 13
commits. It independently fixed two of the audit's own findings:
829325c— carved out the single-map-path exception forjs/src/location-map.jsinCLAUDE.mda517331— set2026-07-23-post-form-location-override.mdto✅ Complete
Had this branch been merged without first merging main in, it would have reverted both. Both
conflicts were resolved in main's favour (its wording was better informed in each case), and the
audit's own notes were then corrected to stop claiming credit for fixes it did not make.
If you pick this up on 2026-07-26 or later, main may have moved again. Do this first:
cd .worktrees/docs-reconcile
git fetch origin
git log --oneline HEAD..origin/main # anything here? then merge before touching the PR
git merge origin/main # read each conflict as a finding, not a chore
Two rules that came out of this, now recorded in the learning doc §6:
- Re-check the baseline before publishing, not only before starting. A long audit races the work it audits.
- When the incoming version is better, take it wholesale. An audit has no special authority over the work it audits.
Submodule situation
user/in this worktree is on branchfeat/docs-reconcileatdd19995— I moved it off the outer repo's older pin (02fa4e9) so the audit ran against the state that actually runs. Auditing the pin would have reported a shipped feature as unbuilt.- No commits were made inside
user/.git -C user statusis clean. Nothing to push there. - The merge commit preserves
main's pin bump todd19995. The no-gitlink-commit rule inCLAUDE.mdis about not bumping the pin as a side effect of routine work — not about discarding a bumpmainalready made. An earliergit reset -- userhere had silently reverted it to the old pin; that was caught and fixed. Verify before any future commit on this branch:git diff main..HEAD -- usermust be empty.
What was verified, and how
Nothing was inferred from prose. Full table in the spec doc; the load-bearing ones:
| Claim | Verified against |
|---|---|
| Nav labels | partials/base.html.twig:27-31 |
| Asset sources → outputs | the theme's package.json build script |
css-compiled/ provenance |
CSS imports in js/src/*.js; assets.addCss in base.html.twig:7-8 |
| No light mode | absence of prefers-color-scheme / data-theme and of light hex values in css/ |
| Photo rules (1–6, required) | user/pages/02.post/post-form.md:35-46 |
entry-actions routes |
entry-actions.php:63-73 |
| Env-suffix rule | Makefile guard-env:41-43 + the make-env-target macro at :45-46 |
travel-memories removal |
git log -- services/ → a80b0a9, then a real docker compose build failure |
One finding was withdrawn after reading package.json: the asset table lists esbuild entry
points, so imported-only sources (api-utils.js, location-map.js, map-style.js, post-form.css)
are correctly absent from it. If a future pass "fixes" that table by adding them, it is reintroducing a
non-defect.
Checks run before pushing: no conflict markers anywhere; ce-compound's frontmatter validator exits 0;
all relative links resolve. One link check hit is a known false positive —
../reference/architecture.md inside a ```diff fence in the learning doc, quoting
docs/working/README.md's literal content, where that path is correct.
Not done, deliberately
- The PR is not open.
tearequires an interactive TTY for the SSH passphrase. Command in Part B. - None of the 7 recommendations were acted on, per instruction. They are decisions, not chores — several are behaviour changes that would have made this diff unreviewable as documentation.
- No
user/changes, including theitaly-2025demo fixtures (recommendation P6).
Do not, without being asked
- Rewrite any past-tense doc to match current code — annotate instead.
- Act on
docs/working/2026-07-25-doc-drift-recommendations.md. P5 in particular is booby-trapped: removingshortcode-gallery-plusplusmay takeshortcode-corewith it (it is a GPM dependency and is not inplugins.txt), which would break stories. Addshortcode-coreexplicitly first, in its own step, then remove and verify a story page renders. - Bump the submodule pin beyond preserving
main's. content-push— nothing here touches content.
Environment
Worktree dev server on http://localhost:8091 (itte_docs-reconcile_grav, from .worktree-env).
Nothing in this branch needs a running server — it is documentation only — so tearing it down is safe:
make worktree-rm NAME=docs-reconcile # compose down → submodule deinit → worktree remove → prune
The branch is pushed, so removing the worktree loses nothing. Note main's cfe070e fixed
worktree-rm so it no longer unregisters user/ for the main checkout — that fix is in this branch via
the merge.
Part B — For Mischa
1. Open the PR (one command)
cd /home/mischa/Nextcloud/Projects/travel-blog-intotheeast/.worktrees/docs-reconcile
tea pr create --login git.gorinskat.nl --repo m038/intotheeast-com \
--head feat/docs-reconcile --base main \
--title "docs: reconcile documentation against the code; add a supersession ledger" \
--description "$(cat /home/mischa/.claude-work/jobs/18e4d444/tmp/pr-body.md)"
Or in the browser: https://git.gorinskat.nl/m038/intotheeast-com/pulls/new/feat/docs-reconcile
⚠️ The body file lives in a Claude job directory and disappears when that job is deleted. If it is
already gone, the PR description is reconstructable from
docs/working/specs/2026-07-25-docs-reconciliation-design.md plus the recommendations doc.
2. Decide on the recommendations
docs/working/2026-07-25-doc-drift-recommendations.md, ordered. The first is a live bug:
| What | Why it needs you | |
|---|---|---|
| P1 | make start / make setup fail on any clean checkout — docker-compose.yml still builds travel-memories, whose source you removed in a80b0a9 |
Three options (delete the service / put it behind a compose profile / re-point build). It is your call whether that project ever runs alongside Grav again. It works on your machine only because a pre-removal Docker image is cached — it breaks in every new worktree and after any docker image prune |
| P2 | A repeatable make docs-check |
The half you deferred. Every defect this pass found was mechanically checkable, so this is what stops the drift recurring. Sequence it after P1, or the first thing it reports is P1 |
| P3 | Plan status can silently lag a merge | Three options, cheapest is naming the plan path in the feature commit |
| P4 | README.md was designated authoritative for a list it did not hold |
Structural: either generate the command tables from the Makefile, or soften the CLAUDE.md pointer |
| P5 | shortcode-gallery-plusplus has no consumer |
⚠️ See the booby-trap warning in Part A before touching it |
| P6 | italy-2025 demo fixtures still ship map.md / stats.md for retired views |
A user/ submodule change, so it was out of scope here |
| P7 | Structural notes — e.g. whether design-system-light.md should move out of reference/, since it documents a theme that does not exist |
Judgement calls, both defensible |
3. Worth knowing
The three findings most likely to have bitten you in practice:
posting.mdwould have failed if followed — it said photos were optional; they are required, 1–6.- Every
make remote-*command inREADME.mdwas unrunnable — all documented without the-test/-prodsuffixguard-envrequires.deploy-cycle.mdhad it right the whole time; the defect was a second copy of the knowledge drifting from the first. docs/working/README.mdadvertisedsummary.mdas "current state" whilesummary.mddescribes Leaflet,/tracker,/mapand/stats. An index that vouches for a stale doc is worse than the stale doc, because it defeats your judgement before it engages.
Related
docs/working/specs/2026-07-25-docs-reconciliation-design.md— design, scope rationale, and the full verification tabledocs/reference/superseded-decisions.md— the ledger itselfdocs/working/2026-07-25-doc-drift-recommendations.md— the 7 unacted findingsdocs/solutions/conventions/reconciling-drifted-docs-tense-tiering-and-a-supersession-ledger.md— the compounded learningdocs/solutions/conventions/claude-md-content-tiering.md— the prior learning this extends; flagged as a consolidation candidate if a third documentation learning appears