Twelve drift findings and four works-well findings, each citing file paths, line numbers, commit hashes or rows in analysis/data/. Every 'neckbeard mechanism' field names a concrete rule in neckbeard v0.1.1 or states explicitly that none exists.
54 lines
3.0 KiB
Markdown
54 lines
3.0 KiB
Markdown
# F-010: Hand-written "Stand" labels are older than the commits that touched the same file
|
|
|
|
category: doc-drift
|
|
confidence: medium
|
|
|
|
evidence:
|
|
- Label vs. last commit on `main` (`analysis/data/docs_inventory.tsv`, `git log -1`):
|
|
|
|
| file | "Stand" label | last commit |
|
|
|---|---|---|
|
|
| `CLAUDE.md:18` | 2026-08-01 | 2026-08-09 |
|
|
| `roadmap.md:3` | 2026-08-06 | 2026-08-09 |
|
|
| `hosts/overmind.md:14` | 2026-07-31 | 2026-08-09 |
|
|
|
|
- The labels are not merely old, they are contradicted inside their own file:
|
|
`hosts/overmind.md` carries the table label "**Stand** 2026-07-31" at line 14 and the
|
|
sentence "Stand 2026-08-09 **sieben**" at line 28.
|
|
- `CLAUDE.md` is labelled "Projektrealitäten (Stand 2026-08-01)" while containing a rule
|
|
section headed "Commit-Konventionen (seit 2026-08-07)" — six days newer than the label
|
|
above it.
|
|
- Scale of the surface: 40 documents, 813 extracted claim lines, of which 68 carry an
|
|
explicit date assertion (`analysis/data/claims.tsv`, trigger `date-claim`).
|
|
- The whole document set is young — every management doc is ≤ 8 days old
|
|
(`docs_inventory.tsv`, max `days_since_change` = 8) — so this is drift accumulating at
|
|
high speed, not neglect over time.
|
|
|
|
impact: The label is what a reader uses to decide whether to trust a section, and here it
|
|
systematically under-reports freshness, which trains readers to distrust current content
|
|
and, worse, gives no signal at all when a section really is stale. In `roadmap.md` the
|
|
combination is actively misleading: "Stand 2026-08-06" over numbers that were already wrong
|
|
on 2026-08-09 (F-001).
|
|
|
|
root-cause pattern: **Hand-maintained metadata about a file, kept inside the file.**
|
|
Git already knows the answer; the label is a second source of truth that must be updated by
|
|
hand and therefore is not.
|
|
|
|
neckbeard mechanism: Prevented by `AGENTS.md:79` — `STATUS.md` is "Generated overview …
|
|
do not edit by hand", produced by `scripts/gen_status.py` — combined with
|
|
`AGENTS.md:101-103`: "Deterministic jobs (status generation, validation, link checks) are
|
|
done by scripts, not by you. If a deterministic job lacks a script, propose one instead of
|
|
doing it by inference." A file's freshness is exactly such a deterministic job.
|
|
`docs/aar/2026-08-09-neckbeard-v1-creation.md` reinforces it from experience:
|
|
"Deterministic jobs belong in scripts, not inference — this rule paid for itself repeatedly",
|
|
and "Git is the changelog. No separate log file." (`WORKFLOW.md:140`) is the same principle
|
|
applied to history.
|
|
Note for Session 2: `schema.yaml` requires a `date` field on adr, design and aar artifacts
|
|
(`kind: date`), which is a *creation/decision* date and legitimately hand-set — that is not
|
|
the same thing as a freshness label and should not be conflated when migrating.
|
|
|
|
confidence note: medium — the dates are exact, but a "Stand" label may be intended as
|
|
"state of the described system as last verified", not "state of this text". Under that
|
|
reading the labels are defensible for `hosts/overmind.md`; they are not for
|
|
`roadmap.md`, whose own header says "Zahlen hier veralten, das Board nicht".
|