audit docs-honesty-lint: milestone close — CLEAN, carry-on, no ratify

Architect clean (one [medium] advisory Sweep-5 self-match wart filed
as P3, not a fix iteration). Bench causally exonerated: HEAD vs
5bb7211/de66eb7 — all 5 firing bench binaries cmp-byte-identical, ail
sha256 identical at all 3 commits; the check.py firings are the two
tracked-P2 environmental classes (*.bump_s anchor staleness; *.max_us
-n5 tail-jitter, 4th on a zero-runtime-change milestone), NOT this
milestone — NO baseline ratify (Iron Law forbids ratifying noise).
compile_check 0/24, cross_lang 0/25 EXIT 0. No fieldtest (zero
authoring-surface change). docs-honesty-lint CLOSED: roadmap [~]->[x],
WhatsNew appended, INDEX line added.
This commit is contained in:
2026-05-18 12:40:57 +02:00
parent e50b400d4b
commit 3fb184417d
4 changed files with 184 additions and 18 deletions
+8
View File
@@ -206,3 +206,11 @@ AILang no longer has the block of mutable local variables (`mut`/`var`/`assign`)
The removal was justified by examining every existing use: in all of them the mutable block was doing nothing a plain binding or a loop accumulator does not already do. It was then field-tested by writing four fresh real-world programs entirely from the documentation — a running sum of squares, a grade-classification cascade, a polynomial evaluation, and a multi-state bracket-balance scanner. All four worked correctly on the first try with no mutable locals. The one thing the old construct did differently — letting a value silently carry from one loop pass to the next without being restated — is exactly the class of hard-to-follow state bug the language is designed to make impossible, so removing it makes programs easier to reason about, not harder.
The milestone is closed and fully verified — built in one atomic change, drift-reviewed (with one documentation-only follow-up fix), benchmarked clean (the one flagged metric is the same pre-existing machine-drift item already on the list, proven unrelated here by byte-identical binaries before and after), and field-tested. The next milestone is a fresh decision — a documentation-honesty sweep so the specification shows only the language as it actually is, with no wishful "we would like" and no "this went wrong" — and that is the natural place to pick up when you are back.
## 2026-05-18 — The specification now describes only what the language actually is
The canonical specification and the prose-roundtrip guide have been swept so they tell the truth about the present, and nothing else. Two kinds of writing were removed wherever they appeared: wishful "we would like / planned / will eventually" statements that described things the language does not yet do as if it already did them, and backward-looking "an earlier draft said / this was changed on such-and-such date / this was retired in that round" narration of how the document itself got to its current wording. Forward hopes now live only in the roadmap; the story of how decisions were reached lives only in the development journals. What remains in the specification is a plain present-tense account of the language as it stands — including the things it deliberately does not do, which are still stated, just honestly labelled as deliberate exclusions rather than dressed up as future promises.
To keep it that way, the specification now carries a short rule, in its own words, stating the honesty standard it holds itself to, and there is an automatic check that fails the build if a removed wishful-or-backward-looking phrasing ever creeps back in. The reviewer that guards the specification against drift was taught the same rule, so new violations get flagged going forward rather than only the ones cleaned up now.
Nothing about how programs are written, type-checked, compiled, or run changed — this milestone touched documentation only. It was reviewed clean and the one flagged benchmark metric is, once again, the same pre-existing machine-drift item already on the list, proven unrelated here by before-and-after binaries that are byte-for-byte identical.
@@ -0,0 +1,133 @@
# audit docs-honesty-lint — milestone close (CLEAN, carry-on)
**Date:** 2026-05-18
**Scope:** `928e1c0..e50b400` (spec `aff25cd`, plan `de66eb7`, iter
`7580d43`, INDEX `e50b400`)
**Status:** CLEAN — carry-on, no fix iteration, NO baseline ratify
**Milestone:** docs-honesty-lint (single iteration) — **CLOSED**
## Outcome
| Gate | Result |
|------|--------|
| Architect drift | `clean` (one `[medium]` standing advisory wart, see below) |
| `bench/check.py` | EXIT 1 — **causally exonerated**, do NOT ratify |
| `bench/compile_check.py` | EXIT 0 (24/24 stable) |
| `bench/cross_lang.py` | EXIT 0 (25/25 stable) |
| Recommendation | **carry-on** |
## Step 1 — Architect drift review
Status `clean`. Verified:
- **Scope claim exact.** `git diff 928e1c0..e50b400 --stat --
'crates/**/src/**' 'runtime/'` empty; sole `crates/` change is the
additive `crates/ailang-core/tests/docs_honesty_pin.rs` (RED-first,
now GREEN 4/4). The two lockstep-invariant pairs (`Pattern::Lit`/
`pre_desugar_validation`, `lower_app`/`is_static_callee`) untouched.
- **DESIGN.md edits are themselves honest.** All 14 corrections
genuinely present-tense; no Wunschdenken/post-mortem reintroduced.
All four protected-exception KEEPs survive un-stripped: `Diverge`
reserved (L2730), `Regions … considered and rejected` at the
Decision site (L1530), `a tiebreaker, not a rationale` (L1240),
`No deriving` (L1850). The `### What this document is — and the
honesty rule it holds itself to` meta-subsection is itself
present-tense (no "we will / planned").
- **Agent-def lockstep complete.** `skills/audit/agents/ailang-architect.md`
"four"→"five sweeps" purge verified (`grep "four sweeps…"` empty);
new "DESIGN.md honesty drift" bullet present and citing the
meta-subsection.
- **Sweep residue is exactly the 3 documented deliberate KEEPs.**
`bash bench/architect_sweeps.sh` EXIT 1 with: Sweep-1 L50
(`docs/journal-archive.md … pre-2026-05-11 history` — present-tense
doc-roles pointer, incidental date) + L2060 (the true
`(iter str-concat, 2026-05-13)` provenance tag — asserts nothing
false, consistent with the sibling `(iter 24.1)` tags); Sweep-5 L62
(the discriminator subsection's OWN forbidden-phrasing catalogue —
a self-referential false-positive, it IS the rule definition). Each
correctly adjudicated KEEP per the new bullet's discriminator.
**`[medium]` standing advisory wart (architect-flagged, orchestrator-
adjudicated → filed, not fixed now).** Sweep 5's regex matches the
discriminator subsection's own example catalogue (DESIGN.md L62)
permanently: every future `architect_sweeps.sh` run inherits a
guaranteed self-referential EXIT 1 that must be re-adjudicated by
hand. This does not introduce a *new* failure mode — the script has
never been EXIT 0 in practice (Sweeps 1-4 already retain legitimate
date-anchors; the script header states non-zero is advisory,
architect-adjudicated by design). It is a minor signal-erosion, not
current drift. Filed as a P3 roadmap todo (optional Sweep-5
self-anchor exclusion); explicitly NOT a fix iteration — consistent
with "trivial drift recorded, not ignored, but priced honestly at
P3".
## Step 2 — Bench-regression check
`check.py` EXIT 1, three firings: `throughput.bench_list_sum.bump_s`
+13.42% (tol 10%); `latency.implicit_at_rc.p99_9_us` +37.65% (tol
25%); `latency.implicit_at_rc.max_us` +134.70% (tol 30%). 58 stable,
2 improvements. `compile_check.py` EXIT 0; `cross_lang.py` EXIT 0 —
and `cross_lang.py` independently measures the *same* `bench_list_sum`
workload at `ail_bump_s +5.95% ok`, `ail_rc_s +5.08% ok` (the fixture
`check.py` calls a +13.42% REGRESSION reads within tolerance under a
fresher anchor / wider band).
## Step 3 — Bencher causal exoneration (decisive)
Hypothesis: the firings were *caused by this milestone's diff*.
Refuting test: HEAD bench binaries byte-identical to a pre-milestone
commit ⇒ no causal mechanism. Result (verbatim):
- `cmp` of `bench_list_sum_{bump,gc,rc}` + `bench_latency_implicit_{rc,gc}`
at HEAD `e50b400` vs `5bb7211` (last milestone close) vs `de66eb7`
(immediate pre-iter): **0 differing bytes, all 5 binaries identical
across both baselines.** `ail` release binary sha256 identical at
all three commits (zero compiled-source delta — the sole `crates/`
change is the non-bench test file).
- Latency re-measure on the byte-identical binary (5×`--runs 5`):
median/p99 rock-steady (≤0.6% / 1.1% spread); p99.9 swings
503.8→651.4, max 565.6→692.1 — classic stable-center / volatile-tail
on identical machine code. = the tracked-P2 `-n 5` tail-jitter
false-positive, **4th occurrence on a zero-runtime-change
milestone**.
- `bench_list_sum_bump` (byte-identical) 20-run median 0.0531s,
persistent ~+15% (not transient) = the tracked-P2 `*.bump_s`
environmental-baseline-staleness item; the 0.046s anchor is stale
vs this machine's current steady state.
**Verdict: EXONERATED (environmental, do NOT ratify).** Per the audit
Iron Law ("NO BASELINE UPDATE WITHOUT A PAIRED JOURNAL RATIFY ENTRY";
ratifying noise is forbidden) and the spec's zero-codegen invariant, a
`--update-baseline` is foreclosed. Neither firing family is
attributable to docs-honesty-lint.
## Step 4 — Resolution: carry-on (clean)
No fix iteration. No ratify. Milestone **CLOSED**. No fieldtest: this
milestone changed zero authoring surface (documentation prose + one
non-bench test file + an agent-def + a bench shell sweep) — the
fieldtest trigger (surface-touching milestone) does not apply; the
wrap-robust `docs_honesty_pin.rs` (4 tests) + Sweep 5 ARE the
milestone's regression coverage.
Two pre-existing standing P2 items remain orchestrator-owned and
were explicitly NOT bundled into this close (the bencher's
recommendation, honoured): (a) the stale `*.bump_s` anchor — a
deliberate quiescent-machine baseline refresh, separately journaled
when pursued, never a ratification rider on an unrelated close; (b)
the recurring `-n 5` tail false-positive — the durable fix is a
structural harness change (higher default N or a tail-metric gating
policy), already a tracked roadmap todo, not a bench-output artefact.
## Milestone close summary
docs-honesty-lint is fully ratified and CLOSED: spec (grounding-check
PASS 10/10) + plan + single iter + this audit. The canonical docs
(`docs/DESIGN.md`, `docs/PROSE_ROUNDTRIP.md`) now mirror only the
current state, present-tense; the tense+modality discriminator is
codified in DESIGN.md and the architect drift-checks against it via
Sweep 5 + the new bullet; the wrap-robust enumerated pin is the hard
forward gate. The procedural-enumeration design proved itself: the
Task-4 Step-14 catch-all surfaced one genuine extra FIX site (the
Form-B prose-projection bullet) that the spec's illustrative regex
and a frozen orchestrator list would both have missed.
+1
View File
@@ -92,3 +92,4 @@
- 2026-05-18 — audit remove-mut-var-assign (milestone close, CLEAN after one inline `.tidy`): scope `48e7774..07f0802`. Architect drift: one `[high]``crates/ailang-core/specs/form_a.md` (live in-tree Form-A grammar still documented the full `mut`/`var`/`assign` construct: EBNF 286-288, prose 308-328, dangling `like mut` at 332); the spec named it for deletion, the iter missed it. Root cause = recon-undercount class **4th recurrence + a Boss error**: a plan-time grep checked only `docs/form_a.md` (dir-scoped), got "No such file", and the Boss propagated that unverified non-existence claim into the recon brief — the real file is `crates/ailang-core/specs/form_a.md`, actively maintained, and a stale doc never produces a compile error so the implement compile-sweep could not catch it. Fixed inline as a Boss `.tidy` (CLAUDE.md context-already-loaded carve-out; full review discipline kept — tree-wide verified zero construct residue except the roadmap entry that names the milestone itself; grammar reads coherently reuse-as→loop→recur). One `[medium]` process-drift: escalated the existing loop-recur.tidy `ailang-plan-recon` P2 in place — broadened from cross-crate-caller to a structural recon-contract defect with two named gaps (non-compile-checked spec-named sites; unverified "X does not exist" claims inheriting into a recon brief) + a concrete fix (compile-driven enumeration as authoritative code-site set PLUS an `ls`-verified spec-named-path existence table). Bench: `compile_check.py` 0/24 + `cross_lang.py` 0/25 exit 0; `check.py` exit 1 (3 firings: `bench_list_sum.bump_s` +12.51%, `latency.{explicit,implicit}_at_rc.max_us` +108%/+66%). Bencher causal exoneration **decisive**: HEAD vs `48e7774` `list_sum_bump`/`lat_expl_rc`/`lat_impl_rc` binaries `cmp`-byte-identical — the 2520-line removal alters zero bytes of these fixtures' machine code, no causal mechanism; `bump_s` = the tracked P2 environmental staleness, both `*.max_us` = single-sample `-n 5` jitter (`explicit_at_rc.max_us` +108%→**-2.30% ok** on identical-code rerun, medians held). **PRISTINE met on the merits; NO baseline ratify** (Iron Law forbids ratifying noise, spec forecloses it). Filed a NEW distinct P2 (separate from `*.bump_s` staleness): `check.py` RC-latency `*.max_us` at `-n 5` is a 3-for-3 structural false-positive on no-runtime-change milestones → drop from gating / raise `-n` / cpuset-pin. Milestone audit **CLEAN**; only `fieldtest` (surface-touching) remains before close → 2026-05-18-audit-remove-mut-var-assign.md
- 2026-05-18 — fieldtest remove-mut-var-assign (milestone CLOSE, clean — removal thesis empirically confirmed): post-audit downstream-LLM-author field test of the post-removal Form-A surface. The fieldtester (DESIGN.md + form_a.md + public examples only, never compiler source) wrote 4 FRESH real-world programs an imperative-trained author would instinctively reach for a mutable local for — running sum-of-squares accumulator (`loop`/`recur`, 2 binders → `385`), grade-classification cascade (let-threaded flag through 4 `if``4`/`2`/`0`), Horner polynomial straight-line build-up (5 `let acc` shadows → `73`), multi-state bracket-balance scanner threading `(rest,depth,ok)` by tail recursion → `true`/`false`) plus an out-of-tree `mut`-keyword rejection probe. **0 bugs, 0 friction, 0 spec_gap, 4 working**: every task expressed cleanly and correctly on the FIRST try with only `let`/`if`/`loop`/`recur`; all 4 `ail parse|render|parse` byte-identical. The closest-to-friction case (the multi-state machine must restate the full state tuple at every tail-call even when a branch changes one component) was carefully classified `working` not `spec_gap` — that explicit-dataflow cost IS the local-reasoning pillar working as designed, and `mut`'s implicit cross-iteration persistence of un-restated state is precisely the clause-3 failure the removal eliminates; the fieldtester explicitly noted the only conceivable sugar (a record to bundle state) is an orthogonal additive future question, NOT evidence against the removal (refused the scope-creep). The `mut` rejection is fail-closed with an actively-guiding diagnostic that enumerates the surviving term heads incl. `loop`/`recur`/`let` (no tombstone, no-nostalgia, as spec'd). Independent Boss verification: all 4 fixtures re-run → `385`/`4 2 0`/`73`/`true false`, zero `mut`/`var`/`assign` construct tokens in any fixture (a doc-faithful author did not produce the removed construct — the affirmative clause-1 evidence). **Verdict: the removal thesis is confirmed**`mut` was redundant with `let`/`if`/`loop`/`recur` in 100% of the fresh real tasks; no expressivity lost. **The remove-mut-var-assign milestone is fully ratified and CLOSED**: spec+plan+iter, audit clean (architect `[high]` form_a.md fixed in `.tidy`, bench causally exonerated), fieldtest clean on the removal axis. Fixtures `examples/fieldtest/remove-mut_*.ail` + spec `docs/specs/2026-05-18-fieldtest-remove-mut-var-assign.md`; roadmap P0 flipped `[~]``[x]`, WhatsNew.md user-facing entry appended; next queue item (DESIGN.md/docs honesty-lint) is a NEW milestone = a /boss new-milestone bounce-back (not auto-started) → 2026-05-18-fieldtest-remove-mut-var-assign.md
- 2026-05-18 — iter docs-honesty-lint.1 (single-iteration milestone, DONE): canonical docs made present-tense-honest. Stripped Wunschdenken (forward intent stated as fact) + non-citation post-mortem/doc-archaeology from `docs/DESIGN.md` (14 corrections: L484 iter-anchor, L503/L1318/L1504/L2027/L2065/L2135 post-mortem, L650 malformed-Wunschdenken, L655 dated-heading, L1513/L1837/L2046/L2519 Wunschdenken, + the Task-4-Step-14 procedural-catch-all FIX at the Form-B prose-projection bullet "was deferred from milestone 22 entirely … A future iter ships" — a soft-wrapped site the spec's illustrative regex would have missed, the procedural enumeration working exactly as designed) + `docs/PROSE_ROUNDTRIP.md` (tool-use/MCP paragraph); genuine forward intent (LLM tool-use/MCP/LSP) relocated to roadmap P3. Codified the two-pronged tense+modality discriminator as a present-tense `### What this document is — and the honesty rule it holds itself to` meta-subsection in DESIGN.md §"Project ecosystem". Anti-regrowth two ways: wrap-robust enumerated absent/present pin `crates/ailang-core/tests/docs_honesty_pin.rs` (a `norm()` whitespace-collapse helper structurally discharges the recurring grep/contains line-wrap failure family — strictly better than the effect-doc-honesty "keep-on-one-line" precedent; resolves spec Testing-item 0 + planner self-review item 6 at once) + wrap-robust advisory Sweep 5 in `bench/architect_sweeps.sh` (contiguous-fragment regex, since DESIGN.md is hard-wrapped ~70col) with full sweep-count lockstep (header + "All four"→"All five" tail + `ailang-architect.md` "four"→"five sweeps") + a new `ailang-architect.md` "DESIGN.md honesty drift" bullet citing the meta-subsection. Protected-exception KEEPs preserved + pinned-present (Diverge-reserved, regions-considered-and-rejected, the self-labelled "tiebreaker, not a rationale"); `form_a.md` correctly left untouched/unpinned. One plan-internal DONE_WITH_CONCERNS (Task-1 pin string omitted a `**…**` bold the Task-3 body added; resolved by dropping the non-load-bearing emphasis, pin is the contract) — planner self-review-item-3 calibration note. Independent Boss verification: pin 4/4 GREEN, full `cargo test --workspace` 0 failures (delta = +4 pin tests only), sentinel trio (`design_schema_drift`/`spec_drift`/`schema_coverage`) green, `cargo build --workspace` clean, scope = ONLY THE PIN in `crates/` (zero language/checker/codegen/runtime change, `ail check`/`run`/`build` byte-unchanged by construction). Post-iter sweep residue = only the 3 documented deliberate KEEPs (Sweep-1 L50 doc-roles-pointer date + L2060 true `(iter str-concat)` provenance; Sweep-5 L62 self-referential discriminator-catalogue), EXIT=1 architect-adjudicated-expected. Milestone-close `audit` is the next pipeline step (no fieldtest — zero authoring-surface change). spec `docs/specs/2026-05-18-docs-honesty-lint.md` (grounding-check PASS 10/10), plan `docs/plans/docs-honesty-lint.1.md` → 2026-05-18-iter-docs-honesty-lint.1.md
- 2026-05-18 — audit docs-honesty-lint (milestone close, CLEAN — carry-on, NO ratify): scope `928e1c0..e50b400`. Architect `clean`: scope claim exact (zero `crates/**/src/**` + `runtime/`; sole crates/ change the additive RED-first-now-GREEN `docs_honesty_pin.rs`; lockstep pairs untouched), all 14 DESIGN.md corrections genuinely present-tense with the 4 protected KEEPs (`Diverge`-reserved/`Regions`-rejected/`tiebreaker`/`No deriving`) un-stripped, agent-def "four→five" lockstep complete, sweep residue exactly the 3 documented deliberate KEEPs. One `[medium]` standing advisory wart — Sweep 5's regex self-matches the discriminator subsection's own forbidden-phrasing catalogue (DESIGN.md L62) forever (architect-flagged; orchestrator-adjudicated → filed as a P3 todo, NOT a fix iteration — not a new failure mode since the script is advisory-with-residue by design). Bench: `compile_check.py` 0/24 + `cross_lang.py` 0/25 EXIT 0 (cross_lang independently reads the same `bench_list_sum` bump path +5.95% within tol); `check.py` EXIT 1, 3 firings (`bench_list_sum.bump_s` +13.42%, `latency.implicit_at_rc.{p99_9,max}_us` +37.65%/+134.70%). Bencher causal exoneration **decisive**: HEAD vs `5bb7211` vs `de66eb7` — all 5 firing bench binaries `cmp`-byte-identical, `ail` sha256 identical at all three commits ⇒ zero causal mechanism; `*.max_us` = tracked-P2 `-n 5` tail-jitter (4th occurrence on a zero-runtime-change milestone, median/p99 rock-steady), `*.bump_s` = tracked-P2 environmental-anchor-staleness (persistent ~+15%, stale 0.046s anchor). **EXONERATED, NO baseline ratify** (Iron Law forbids ratifying noise; spec forecloses a zero-codegen baseline bump). Two pre-existing standing P2 items kept orchestrator-owned, explicitly NOT bundled into this close (bencher recommendation honoured). Milestone audit **CLEAN**; no fieldtest (zero authoring-surface change — the wrap-robust pin + Sweep 5 ARE the regression coverage). **docs-honesty-lint fully ratified and CLOSED**: spec (grounding-check PASS 10/10) + plan + single iter + audit clean; roadmap P0 flipped `[~]``[x]`, WhatsNew.md user-facing entry appended → 2026-05-18-audit-docs-honesty-lint.md
+42 -18
View File
@@ -96,25 +96,36 @@ work progresses.
`docs/specs/2026-05-18-fieldtest-loop-recur.md`; principles entry
`docs/specs/2026-05-17-llm-surface-discipline.md` §6.2.
- [~] **\[milestone\]** DESIGN.md / docs honesty lint — spec'd +
approved 2026-05-18 (`aff25cd`), open as P0 in-flight; dependency
(Remove `mut`/`var`/`assign`) closed 2026-05-18; next `planner`.
Sweep the canonical docs so they mirror ONLY the actual current
state, present-tense. Single iteration (mirror effect-doc-honesty):
a two-pronged tense+modality discriminator codified present-tense
as a DESIGN.md meta-subsection (Approach A); procedural enumeration
= discriminator applied to the full `architect_sweeps.sh` + new
Sweep 5 output (not a frozen list — the sweep already surfaces
post-mortem sites the architect waved through as legitimate
quotes); anti-regrowth = enumerated `docs_honesty_pin.rs` (hard
cargo-test gate, incl. protected-exception present-anchors against
over-correction) + Sweep 5 + `ailang-architect.md` "DESIGN.md
honesty drift" bullet (advisory standing forward check). No
language/checker/codegen/runtime change.
- [x] **\[milestone\]** DESIGN.md / docs honesty lint — CLOSED
2026-05-18. `docs/DESIGN.md` + `docs/PROSE_ROUNDTRIP.md` now mirror
ONLY the current state, present-tense: 14 DESIGN.md corrections
(Wunschdenken stated-as-fact + non-citation post-mortem/doc-
archaeology stripped) + the PROSE tool-use/MCP paragraph; genuine
forward intent (LLM tool-use/MCP/LSP) relocated to P3. The
two-pronged tense+modality discriminator is codified present-tense
as a DESIGN.md `### What this document is …` meta-subsection
(Approach A) the architect cites. Anti-regrowth two ways: a
wrap-robust enumerated absent/present pin
`crates/ailang-core/tests/docs_honesty_pin.rs` (a `norm()`
whitespace-collapse helper structurally discharges the recurring
grep/contains line-wrap failure family — strictly better than the
effect-doc-honesty "keep-on-one-line" precedent) + wrap-robust
advisory Sweep 5 in `architect_sweeps.sh` (contiguous-fragment
regex) with full sweep-count lockstep + a new `ailang-architect.md`
"DESIGN.md honesty drift" bullet. Procedural enumeration vindicated:
the Task-4 Step-14 catch-all caught a genuine soft-wrapped extra FIX
(Form-B prose-projection bullet) a frozen list + the spec's
illustrative regex would both have missed. Single iter
(`aff25cd`/`de66eb7`/`7580d43`); milestone-close `audit` CLEAN
(architect clean, one `[medium]` advisory Sweep-5 self-match wart →
P3 below; bench causally exonerated — HEAD vs `5bb7211`/`de66eb7`
bench binaries `cmp`-byte-identical, NO ratify); no fieldtest (zero
authoring-surface change). Stays here briefly for context; remove
once stale (full record in `docs/journals/INDEX.md`).
- context: `docs/specs/2026-05-18-docs-honesty-lint.md`
(grounding-check PASS 10/10); 2026-05-18 user directive;
reserved-vs-vapour precedent
`docs/journals/2026-05-16-iter-effect-doc-honesty.md`
(grounding-check PASS 10/10);
`docs/journals/2026-05-18-iter-docs-honesty-lint.1.md`;
`docs/journals/2026-05-18-audit-docs-honesty-lint.md`
## P1 — Next
@@ -660,3 +671,16 @@ work progresses.
by the docs-honesty-lint milestone (forward intent does not live in
the canonical docs).
- context: `docs/specs/2026-05-18-docs-honesty-lint.md`
- [ ] **\[todo\]** Sweep 5 self-match anchor-exclusion — `bench/architect_sweeps.sh`
Sweep 5's regex matches the DESIGN.md discriminator subsection's own
forbidden-phrasing catalogue (L62 `"planned / will back / on the
path to / if-when X arrives"`) forever, so the script inherits a
guaranteed self-referential EXIT 1 the architect must re-adjudicate
by hand each run. Not a new failure mode (Sweeps 1-4 already retain
legitimate date-anchors; non-zero is advisory-by-design per the
script header) — minor signal-erosion only. Optional fix: a
negative-lookbehind / line-range exclusion so the rule's own example
list is not a hit. P3 — may be cut; the architect adjudicates the
single known self-match trivially today.
- context: `docs/journals/2026-05-18-audit-docs-honesty-lint.md`
(architect `[medium]` advisory wart, carry-on)