Skip to content

backlog: P2 doc-lint suite from drain-log corpus patterns#465

Merged
AceHack merged 2 commits intomainfrom
backlog/doc-lint-suite-from-corpus
Apr 25, 2026
Merged

backlog: P2 doc-lint suite from drain-log corpus patterns#465
AceHack merged 2 commits intomainfrom
backlog/doc-lint-suite-from-corpus

Conversation

@AceHack
Copy link
Copy Markdown
Member

@AceHack AceHack commented Apr 25, 2026

Summary

Compounding-substrate work on Otto-268+ drain-log corpus: three findings classes from docs/pr-preservation/_patterns.md (PR #448) have reached observation density warranting pre-commit-lint automation. P2 BACKLOG row promotes them.

Classes promoted

Compounding rationale

Each class is ~20-50 lines of regex + tests. Could land as three separate scripts or one combined tools/lint/doc-lint.sh. Wire into pre-commit + .github/workflows/gate.yml per existing lint-script convention.

Compounding with Otto-114 forward-mirror substrate-fix shape: structural change converts per-PR fix-toil into never-recurring. The 3 classes have already paid for themselves in verify-and-resolve replies; pre-commit-lint catches future instances at author-time and prevents the round-trip.

Composes with

  • docs/pr-preservation/_patterns.md — full pattern index + per-class observation citations.
  • Lower-density candidate classes (D-F) — multi-CLI capability-map cluster, shellcheck-rule-ID precision, stable-identifier-vs-line-number xref — promote when density justifies.

Test plan

  • BACKLOG row cites all observation PRs per class.
  • Effort estimate (M) reflects realistic scope (~20-50 lines/class + test cases + CI wiring).
  • Composability with existing lint scripts noted.

🤖 Generated with Claude Code

Compounding-substrate work on Otto-268+ drain-log corpus: three
findings classes from `docs/pr-preservation/_patterns.md` have
reached observation density warranting pre-commit-lint automation.

Classes promoted to BACKLOG:

A. Inline-code-span line-wrap (4 PRs: #191, #195, #219, #423).
   Regex check for backtick spans crossing newlines.
B. Count-vs-list cardinality (5 PRs: #191, #219, #430, #85, #426).
   Regex on "N items / phases / audits / drift classes / PRs"
   patterns + count surrounding list + warn on mismatch.
C. Pipe-in-Markdown-table-row (3+ PRs). Regex check on table rows
   for unescaped `|` inside code spans.

Effort: M. Each class ~20-50 lines of regex + tests. Could land
as separate scripts or combined `tools/lint/doc-lint.sh`. Wire
into pre-commit + gate.yml per existing lint-script convention.

Composes with lower-density candidate classes (D-F) from the
multi-CLI capability-map cluster + shellcheck-rule-ID precision +
stable-identifier-vs-line-number xref — promote when density
justifies. References `docs/pr-preservation/_patterns.md` (PR #448).

Compounding with Otto-114 forward-mirror substrate fix: structural
change converts per-PR fix-toil into never-recurring class. The
3+ existing classes have already paid for themselves in
verify-and-resolve replies; pre-commit-lint catches future
instances at author-time.
Copilot AI review requested due to automatic review settings April 25, 2026 07:31
@AceHack AceHack enabled auto-merge (squash) April 25, 2026 07:31
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Promotes three recurring documentation hygiene findings (from the drain-log corpus) into a new P2 BACKLOG item proposing a doc-lint suite wired into pre-commit and CI.

Changes:

  • Adds a new P2 BACKLOG checkbox item describing a “Doc-lint suite” and its rationale.
  • Enumerates three lint classes (inline-code-span line-wrap, count-vs-list cardinality, pipe-in-table-row) with observation citations and proposed lint heuristics.
  • Notes a rough effort estimate and intended integration points (tools/lint/, .github/workflows/gate.yml).

Comment thread docs/BACKLOG.md Outdated
Comment thread docs/BACKLOG.md Outdated
Comment thread docs/BACKLOG.md Outdated
AceHack added a commit that referenced this pull request Apr 25, 2026
Codex/Copilot caught 4 findings on PR #466's surface-class
clarification:

- Three hyphen-line-wrap renderings (`synthesis-` / `synthesis-over-`
  / `synthesis-` at end-of-line render with extra space when Markdown
  treats newline as whitespace). Reflowed all three to keep the term
  contiguous on one line.
- Surface-class taxonomy still listed `docs/pr-preservation/**` as
  history-class which would include `_patterns.md`. Tightened to the
  per-log glob `docs/pr-preservation/*-drain-log.md` with explicit
  pointer to the synthesis-over-history exception below.

Same shape as the inline-code-span line-wrap class documented in
`_patterns.md` (Class A in PR #465 BACKLOG row) but for prose-line
hyphenation rather than code-span line-wrap. Worth noting in a
future expansion of the doc-lint suite — extend the regex to
catch `\w-$` end-of-line patterns.
AceHack added a commit that referenced this pull request Apr 25, 2026
…on (#466)

* drain(#448 follow-up): resolve _patterns.md surface-class contradiction

Codex P2 + Copilot P1 both flagged that `_patterns.md` was classified
as "current-state operational substrate" while sitting in
`docs/pr-preservation/**` (which the file itself classifies as
history-class). Internal contradiction.

Resolved by introducing a third named surface class:
**synthesis-over-history** — current-state-tracking abstractions
over history-class corpora. Co-located with the corpus they
abstract over (so `_patterns.md` stays in `docs/pr-preservation/`
alongside the per-log records). The underscore prefix is named as
a candidate convention for "synthesis-indices over history-class
corpora."

Updated three sections:

1. "Surface-class taxonomy" — added "Synthesis-over-history
   surfaces" section with `_patterns.md` as the canonical example.
2. "How to update this file" — replaced the "current-state
   operational substrate" claim with the synthesis-over-history
   distinction + co-location rationale.
3. Closing line — clarified Otto-279 carve-out applies to the
   per-log records (history-class); synthesis-over-history is
   the third class distinct from both pure history-class and
   pure current-state.

Composes with the future BP-NN promotion path: the four-stable-
outcome-classes + history-class surfaces + synthesis-over-history
third class are mature enough to codify together in
`docs/AGENT-BEST-PRACTICES.md` as a single stable rule.

Other #448 reviewer findings (cited drain-logs not in current
corpus) are stale-resolved-by-reality — drain-logs are landing
across PRs #437-#465; the corpus is converging.

* drain(#466 follow-up): fix hyphen-line-wrap + tighten taxonomy glob

Codex/Copilot caught 4 findings on PR #466's surface-class
clarification:

- Three hyphen-line-wrap renderings (`synthesis-` / `synthesis-over-`
  / `synthesis-` at end-of-line render with extra space when Markdown
  treats newline as whitespace). Reflowed all three to keep the term
  contiguous on one line.
- Surface-class taxonomy still listed `docs/pr-preservation/**` as
  history-class which would include `_patterns.md`. Tightened to the
  per-log glob `docs/pr-preservation/*-drain-log.md` with explicit
  pointer to the synthesis-over-history exception below.

Same shape as the inline-code-span line-wrap class documented in
`_patterns.md` (Class A in PR #465 BACKLOG row) but for prose-line
hyphenation rather than code-span line-wrap. Worth noting in a
future expansion of the doc-lint suite — extend the regex to
catch `\w-$` end-of-line patterns.
AceHack added a commit that referenced this pull request Apr 25, 2026
Multiple Copilot threads on #441 caught count-mismatch errors in the
#195 drain-log:

- Threads 11-14 header → Threads 11-15 (5 IDs listed, not 4).
- "All 14 threads" → "All 15 threads".
- "6 STALE-RESOLVED-BY-REALITY" → "7" (Threads 4-9 = 6 + Thread 10 = 1).
- "Thread count at drain start: 14" → "15" (the count-off-by-one was
  on the DEFERRED bucket).
- Final-resolution sentence body's grouped totals are now
  authoritative: 3+7+5=15 with the bucket breakdowns explicit.

This is a clean instance of the count-vs-list cardinality pattern
documented in `_patterns.md` (and the doc-lint suite BACKLOG row
#465 Class B). Ironic-but-load-bearing: my own drain-logs exhibit
the same recurring patterns I documented as drain-corpus findings.
The corpus is genuinely self-correcting at scale.
AceHack added a commit that referenced this pull request Apr 25, 2026
…-log

Multiple Copilot threads on #445 caught count-mismatch errors:

- Header claimed "9 across 4 waves (2 + 1 + 3 + 2 + 1 cascade)" —
  the "+1 cascade" doesn't correspond to any Wave 5 section in the
  body. Body has exactly 4 waves with 2+1+3+2=8 thread-sections.
- Final-resolution claimed "All 9 threads resolved" — should be 8.

Fix: aligned both header + final-resolution to the body's actual
8-thread-across-4-waves structure. Wave breakdown explicit
(Wave 1: 2, Wave 2: 1, Wave 3: 3, Wave 4: 2 — sum 8) so the math
is verifiable from the heading.

Same count-vs-list cardinality pattern documented in `_patterns.md`
(Class B in PR #465 BACKLOG row) — the doc-lint suite would catch
this at author-time.
AceHack added a commit that referenced this pull request Apr 25, 2026
…rain-log

Multiple Codex/Copilot threads on #444 caught:

- L16: '3 were Otto-279' → '2 were Otto-279' (matches body's
  Threads C1-C2 = 2 OTTO-279 SURFACE-CLASS).
- L22: 'Outcome distribution: 4 OTTO-279' → '2 OTTO-279 + 2 dups'
  (matches L161 final-resolution math: 4 + 5 + 2 + 2 dups = 13).
- L56: Thread A3 'Copilot P1 ×2' → 'Copilot P1 ×3' (3 thread IDs
  listed: ejy1 + eenN + eenr).
- L87: non-portable `grep -i "actionlint\|shellcheck"` → portable
  `grep -iE "actionlint|shellcheck"` (BSD/macOS grep doesn't
  support `\|` BRE alternation; the `-E` extended-regex form is
  POSIX-portable). Captured the rationale inline so the verification
  command actually works on macOS.

Same count-vs-list cardinality pattern (Class B in PR #465 doc-lint
suite BACKLOG row) — third drain-log of mine to exhibit it (after
#195 and #231). The shellcheck-rule-precision class also surfaces
via the `\|` portability finding (related to SC2086-vs-SC2046 from
#427 drain-log).
AceHack added a commit that referenced this pull request Apr 25, 2026
Codex P2 + Copilot threads on #437 caught:

- Lines 6-7 fragment + count mismatch: header said '10 unresolved
  ..., 1 P1' (suggesting 11) while body summarized 14 = 10 first-
  wave + 4 second-wave. Reworded into a single unambiguous summary:
  '10 unresolved at first-wave; post-merge cascade then surfaced
  3 more (1 Codex P1 + 2 Copilot P2). Total 13.'
- Second-wave header '1 P1 + 3 P2 post-merge cascade' → '1 Codex P1
  + 2 Copilot P2 — 3 threads total' (only 3 thread sections A/B/C
  exist in body).
- Pattern observation 2 'Stale-resolved-by-reality at ~70%' (7 of
  14) → '~54%' (7 of 13) matching corrected total.
- Final-resolution 'All 14 threads' → 'All 13 threads (10 first-
  wave + 3 second-wave)'.

Same count-vs-list cardinality pattern as #195/#231/#377/#444
drain-log fixes — fourth instance in my own logs. Strong validation
that doc-lint Class B (PR #465 BACKLOG) would compound.
AceHack added a commit that referenced this pull request Apr 25, 2026
* hygiene(#268): pr-preservation drain-log for #135 (auto-loop-35 Itron mapping)

Otto-268 backfill task: drain-log for PR #135 covering 14 total threads
across 2 waves (10 first-wave pre-merge + 4 second-wave post-merge cascade).

Per Otto-250 training-signal discipline: full per-thread record with
reviewer authorship, severity, outcome class (FIX / STALE-RESOLVED-BY-
REALITY / OTTO-279 SURFACE-CLASS), and resolution path. Pattern
observations capture the three load-bearing patterns: Otto-279 as
mature uniform reply stamp; stale-resolved-by-reality at ~70% on this
PR; Codex catching subset-vs-superset framing errors in benchmark
canonical definitions (DORA / K-relations).

* drain(#437 follow-up): fix count mismatches in #135 drain-log

Codex P2 + Copilot threads on #437 caught:

- Lines 6-7 fragment + count mismatch: header said '10 unresolved
  ..., 1 P1' (suggesting 11) while body summarized 14 = 10 first-
  wave + 4 second-wave. Reworded into a single unambiguous summary:
  '10 unresolved at first-wave; post-merge cascade then surfaced
  3 more (1 Codex P1 + 2 Copilot P2). Total 13.'
- Second-wave header '1 P1 + 3 P2 post-merge cascade' → '1 Codex P1
  + 2 Copilot P2 — 3 threads total' (only 3 thread sections A/B/C
  exist in body).
- Pattern observation 2 'Stale-resolved-by-reality at ~70%' (7 of
  14) → '~54%' (7 of 13) matching corrected total.
- Final-resolution 'All 14 threads' → 'All 13 threads (10 first-
  wave + 3 second-wave)'.

Same count-vs-list cardinality pattern as #195/#231/#377/#444
drain-log fixes — fourth instance in my own logs. Strong validation
that doc-lint Class B (PR #465 BACKLOG) would compound.
AceHack added a commit that referenced this pull request Apr 25, 2026
…rain-log

Multiple Codex/Copilot threads on #461 caught:

- L7 'Thread count at drain: 3' → '4' (body has Threads 1-4).
- L17 'Codex caught three findings' → 'four' matching body.
- L122 'merged to main' → 'merged to main as `5698f9d`' for
  consistency with other drain-logs that include the merge SHA
  for auditability.

Same count-vs-list cardinality pattern (Class B in PR #465 doc-lint
suite BACKLOG row) — 5th instance in my own drain-logs (#195 / #231
/ #377 / #135 / #430). The pattern is genuinely universal author-
side; even when explicitly aware of it, instances slip through.
AceHack added a commit that referenced this pull request Apr 25, 2026
Codex P2 + Copilot P1+P2 caught:

- Inline code span split across newline (`docs/` on one line,
  `research/openai-codex-cli-capability-map.md` on the next) —
  reflowed to single-line so the path renders as one token.
- Capability-map cluster listed `docs/research/codex-cli-first-
  class-2026-04-23.md` as if in-tree, but PR #231 is still OPEN
  at time of this drain-log so the file isn't yet in main.
  Reframed as 'pending merge of PR #231; will be in-tree once
  that PR lands' with the in-tree
  `openai-codex-cli-capability-map.md` listed first.

Same forward-author-to-future-state-of-main drift class as #377
(38% stale-resolved density). The drain-log itself exhibits the
pattern it documents — cited a forthcoming-but-not-yet-landed
file as if already present.

Inline-code-span line-wrap is the 5th observation of that class
in the corpus (now: #191 / #195 / #219 / #423 / #460). At this
density the doc-lint Class A (PR #465 BACKLOG) is high-leverage
automation.
AceHack added a commit that referenced this pull request Apr 25, 2026
…dex) (#461)

* hygiene(#268+): pr-preservation drain-log for #430 (#221 follow-up Codex)

Otto-268 follow-on: drain-log for the 4-finding cascade PR #430
(post-merge follow-up to #221 Amara 4th courier ferry absorb).
Captures four substantive Codex post-merge corrections.

Per Otto-250 training-signal discipline. Pattern observations:

1. Verbatim-claim accuracy under absorbing-side annotation —
   "preserved verbatim" claims must reflect any absorbing-side
   annotations (proposal-flag markers, footnotes, inline bracketing).
   Same shape as #235's "byte-for-byte ... excluding whitespace"
   contradiction fix.
2. Count-vs-list cardinality is now a 4th-observation pattern
   (#191 / #219 / #430 / #85). At this density, pre-commit-lint
   candidate: regex on "N drift classes / phases / audits / items"
   patterns + count the surrounding list to verify.
3. Terminology drift between parent absorb + canonical vocabulary
   ("decision-proxy-consult" vs canonical "decision-proxy-evidence")
   is recurring. Fix template: align absorption-notes text to
   canonical; preserve verbatim ferry content per Otto-227.
4. Stabilize effort-summary correction is a concrete instance of
   "claim summary doesn't match per-item tally" — future doc-lint
   candidate (sum-vs-tally check).

* drain(#461 follow-up): fix count mismatches + add merge SHA in #430 drain-log

Multiple Codex/Copilot threads on #461 caught:

- L7 'Thread count at drain: 3' → '4' (body has Threads 1-4).
- L17 'Codex caught three findings' → 'four' matching body.
- L122 'merged to main' → 'merged to main as `5698f9d`' for
  consistency with other drain-logs that include the merge SHA
  for auditability.

Same count-vs-list cardinality pattern (Class B in PR #465 doc-lint
suite BACKLOG row) — 5th instance in my own drain-logs (#195 / #231
/ #377 / #135 / #430). The pattern is genuinely universal author-
side; even when explicitly aware of it, instances slip through.
AceHack added a commit that referenced this pull request Apr 25, 2026
…#460)

* hygiene(#268+): pr-preservation drain-log for #428 (#126 follow-up Gemini xref)

Otto-268 follow-on: drain-log for the targeted single-finding cascade
PR #428 (post-merge follow-up to parent #126 Grok CLI capability map).
Captures one Gemini capability-map cross-reference truth-update.

Per Otto-250 training-signal discipline. Pattern observations:

1. Cross-capability-map xref consistency is its own class. The repo
   has a growing family of CLI capability maps (Codex / Grok /
   Gemini / Claude Code) that form a related-document cluster
   needing joint cross-reference maintenance. Future doc-lint
   candidate: maintain manifest of related-document clusters and
   warn on edit-without-sweep.

2. Multi-CLI capability-map family is its own substrate pattern.
   Worth documenting in `_patterns.md`: when multiple capability
   maps cover overlapping but distinct CLIs, they form a cluster
   that benefits from shared structure (status taxonomy, parity-
   matrix shape, score-summary conventions) and joint
   cross-reference maintenance.

3. Targeted single-finding follow-ups are the cheapest cascade
   shape — 1 finding / 1 commit / 1 merge gate. Cascade-pattern
   amortized cost is dominated by the few-thread cascades.

URL → PR-number defensive pattern continues (lesson from #454/#455
collision earlier this session).

* drain(#460 follow-up): fix capability-map xref + inline-code-span split

Codex P2 + Copilot P1+P2 caught:

- Inline code span split across newline (`docs/` on one line,
  `research/openai-codex-cli-capability-map.md` on the next) —
  reflowed to single-line so the path renders as one token.
- Capability-map cluster listed `docs/research/codex-cli-first-
  class-2026-04-23.md` as if in-tree, but PR #231 is still OPEN
  at time of this drain-log so the file isn't yet in main.
  Reframed as 'pending merge of PR #231; will be in-tree once
  that PR lands' with the in-tree
  `openai-codex-cli-capability-map.md` listed first.

Same forward-author-to-future-state-of-main drift class as #377
(38% stale-resolved density). The drain-log itself exhibits the
pattern it documents — cited a forthcoming-but-not-yet-landed
file as if already present.

Inline-code-span line-wrap is the 5th observation of that class
in the corpus (now: #191 / #195 / #219 / #423 / #460). At this
density the doc-lint Class A (PR #465 BACKLOG) is high-leverage
automation.
- P1 :4481 — Class B regex example: keep `\b\d+\s+...\b` on a single
  line of backticks (was crossing newline, rendering as two adjacent
  spans rather than one regex; ironically a Class A pattern instance
  inside the Class A description).
- P2 :4488 — Class C: cite markdownlint rule by full identifier
  `MD056/table-column-count` (consistent with how it's recorded in
  docs/pr-preservation/141-ci-fix-log.md:35; helps grep-ability).
- P2 :4501 — keep `stable-identifier-vs-line-number` contiguous
  (was hard-wrapped mid-token as `stable-identifier-vs-line-` /
  `number`, rendering as 'line- number' with extra space).

All three findings are pattern instances of classes this same
BACKLOG row promotes to lint-suite candidates — appropriate
self-application.
AceHack added a commit that referenced this pull request Apr 25, 2026
…e docs) (#441)

* hygiene(#268): pr-preservation drain-log for #195 (bootstrap reference docs)

Otto-268 backfill: drain-log for PR #195 covering 14 threads across three
outcome classes — including a NEW outcome class introduced by this PR:
DEFERRED-TO-MAINTAINER, for the surface-class-vs-faithful-attribution
tension on bootstrap/ docs documenting the maintainer's personal
ethical framework.

Per Otto-250 training-signal discipline. Pattern observations capture
four load-bearing patterns:
1. DEFERRED-TO-MAINTAINER is a legitimate fourth outcome class.
2. Single-line clickable relative-link citation as a factory pattern.
3. Inline-code-span line-wrap rendering bug as recurring class.
4. Surface-class disciplines still emerging — bootstrap/ documents
   current-state-operational-substrate AND maintainer's personal
   framework simultaneously; needs a third surface class or explicit
   carve-out within current-state.

* drain(#441 follow-up): fix count mismatches in #195 drain-log

Multiple Copilot threads on #441 caught count-mismatch errors in the
#195 drain-log:

- Threads 11-14 header → Threads 11-15 (5 IDs listed, not 4).
- "All 14 threads" → "All 15 threads".
- "6 STALE-RESOLVED-BY-REALITY" → "7" (Threads 4-9 = 6 + Thread 10 = 1).
- "Thread count at drain start: 14" → "15" (the count-off-by-one was
  on the DEFERRED bucket).
- Final-resolution sentence body's grouped totals are now
  authoritative: 3+7+5=15 with the bucket breakdowns explicit.

This is a clean instance of the count-vs-list cardinality pattern
documented in `_patterns.md` (and the doc-lint suite BACKLOG row
#465 Class B). Ironic-but-load-bearing: my own drain-logs exhibit
the same recurring patterns I documented as drain-corpus findings.
The corpus is genuinely self-correcting at scale.

* hygiene(#441): add Reviewer field to Threads 2/3 + drop stale 14-thread note

Two Copilot/Codex catches on the #195 drain-log:

1. Copilot P2: Threads 2 and 3 omitted the `Reviewer:` field that
   Thread 1 includes per the stated 'full per-thread record with
   reviewer authorship' template. Add `Reviewer:
   copilot-pull-request-reviewer` to both for template consistency.

2. Codex P2: 'header said 14 unresolved' parenthetical in
   final-resolution was stale after earlier count-fix to 15
   (Thread-A2 fix in commit 4f54bee corrected the header). Drop
   the stale note; body grouped totals (3+7+5=15) now match the
   header without contradiction.
AceHack added a commit that referenced this pull request Apr 25, 2026
Four Copilot catches converging on the same root cause: the
shape-divergence section was citing drain-log PR-numbers
(#437-#465) when readers will look for #437-drain-log.md etc.
and not find them — drain-log FILE numbers reference the
PRESERVED PR (e.g., #421/#422/#423), not the drain-log PR
itself. The current file corpus ends at #434.

Fixes:

- :374 + :394 — drop the misleading "#437-#465" PR-range citation;
  cite the actual in-repo abbreviated-shape examples
  (#421/#422/#423) by file path; drop the unsupported "22+"
  numeric estimate in favour of "the 2026-04-25 backfill wave".
- :380 — abbreviated template snippet now matches what the
  in-repo abbreviated logs actually use: `Finding:` bullet
  included, `Thread ID:` and `:LINE` placeholders dropped
  (those are canonical-shape fields, not abbreviated-shape).
  Reader can now copy/paste the template accurately.
- :388 — soften the "Substance is preserved" overstatement to
  the objective claim: key metadata (reviewer/severity/outcome/
  commit) is preserved; verbatim original-comment + verbatim
  reply text are NOT preserved; multi-section structure +
  file:line locator + Thread ID are also typically omitted.

The fixes are themselves Class A (count-vs-list cardinality on
"#437-#465" range) + truth-drift on a freshly-landed doc —
appropriate self-application of the discipline this section
documents.
@AceHack AceHack merged commit 5df62de into main Apr 25, 2026
13 checks passed
@AceHack AceHack deleted the backlog/doc-lint-suite-from-corpus branch April 25, 2026 08:12
AceHack added a commit that referenced this pull request Apr 25, 2026
…iated shape divergence (#467)

* hygiene(_patterns.md): document Otto-250-canonical vs Otto-268-abbreviated drain-log shape divergence

Multiple post-merge reviewer threads on the Otto-268-wave drain-logs
(#437-#465) flagged that the abbreviated inline shape doesn't match
the canonical Otto-250 multi-section format used in older drain-logs
(#108, #247, etc.). The findings are correct: the shapes ARE
different, and the abbreviated shape compresses verbatim
reviewer/reply text into short prose.

Documenting both shapes here in `_patterns.md` as a known
divergence + three maintainer-decision options:

(a) Rewrite — high churn, highest faithfulness.
(b) Accept divergence — document both as valid.
(c) Hybrid — canonical for substantive logs (math / crypto /
    algorithms / ADRs); abbreviated for low-substance.

Until maintainer decides, drain-runners writing future logs default
to canonical; existing Otto-268-wave logs stay abbreviated with
this known-divergence pointer.

This is the right place for the documentation per the synthesis-
over-history surface-class declaration: `_patterns.md` reflects
current corpus state including known shape divergences, separate
from the per-log records.

Composes with the per-PR drain-log threads currently flagging the
shape-conformance gap on #437/#441/#442/#444/#445/#446/#447/#449/
#460/#461/#464/#466 — those threads can now reply with a one-line
pointer to this section instead of repeating the maintainer-
decision-pending framing.

* hygiene(#467): fix 4 Copilot findings on shape-divergence section

Four Copilot catches converging on the same root cause: the
shape-divergence section was citing drain-log PR-numbers
(#437-#465) when readers will look for #437-drain-log.md etc.
and not find them — drain-log FILE numbers reference the
PRESERVED PR (e.g., #421/#422/#423), not the drain-log PR
itself. The current file corpus ends at #434.

Fixes:

- :374 + :394 — drop the misleading "#437-#465" PR-range citation;
  cite the actual in-repo abbreviated-shape examples
  (#421/#422/#423) by file path; drop the unsupported "22+"
  numeric estimate in favour of "the 2026-04-25 backfill wave".
- :380 — abbreviated template snippet now matches what the
  in-repo abbreviated logs actually use: `Finding:` bullet
  included, `Thread ID:` and `:LINE` placeholders dropped
  (those are canonical-shape fields, not abbreviated-shape).
  Reader can now copy/paste the template accurately.
- :388 — soften the "Substance is preserved" overstatement to
  the objective claim: key metadata (reviewer/severity/outcome/
  commit) is preserved; verbatim original-comment + verbatim
  reply text are NOT preserved; multi-section structure +
  file:line locator + Thread ID are also typically omitted.

The fixes are themselves Class A (count-vs-list cardinality on
"#437-#465" range) + truth-drift on a freshly-landed doc —
appropriate self-application of the discipline this section
documents.
AceHack added a commit that referenced this pull request Apr 25, 2026
…arch) (#444)

* hygiene(#268): pr-preservation drain-log for #377 (setup-tooling research)

Otto-268 backfill: drain-log for PR #377 covering 13 threads — notable
for high stale-resolved density (38%, 5 of 13) where the doc was
authored against a future-state of main that adjacent PRs landed
during the review window.

Per Otto-250 training-signal discipline. Pattern observations capture
four load-bearing patterns:
1. High stale-resolved density (38%) when research doc forward-
   authors against future state of main; adjacent PRs landing
   produces natural drift.
2. "CLAUDE.md-level rule" cite shape is undisciplined — Otto-NNN IDs
   live in memory files; CLAUDE.md has the rule shapes. Fix template
   for any factory-rule cross-reference.
3. Runner-matrix vs current-truth drift is recurring; research docs
   need explicit "post-#NNN landing" annotations.
4. Otto-114 forward-mirror landing is a high-leverage substrate
   improvement — converts memory-file dangling-citation findings from
   re-fix-required to verify-and-resolve.

* drain(#444 follow-up): correct Otto-248 memory file path in #377 drain-log

Codex P1 caught that the cited memory file path in #377's drain-log
()
doesn't exist; actual file is the longer
.

This was a fix-induced citation error inherited from #377's research
doc (which used the same wrong abbreviated path). Both #377 and
#444 needed correction — landed paired (#377 force-pushed earlier
this tick, #444 corrected here). The drain-log inherited the wrong
citation from the research doc it was logging.

* drain(#444 follow-up): fix count mismatches + portable grep in #377 drain-log

Multiple Codex/Copilot threads on #444 caught:

- L16: '3 were Otto-279' → '2 were Otto-279' (matches body's
  Threads C1-C2 = 2 OTTO-279 SURFACE-CLASS).
- L22: 'Outcome distribution: 4 OTTO-279' → '2 OTTO-279 + 2 dups'
  (matches L161 final-resolution math: 4 + 5 + 2 + 2 dups = 13).
- L56: Thread A3 'Copilot P1 ×2' → 'Copilot P1 ×3' (3 thread IDs
  listed: ejy1 + eenN + eenr).
- L87: non-portable `grep -i "actionlint\|shellcheck"` → portable
  `grep -iE "actionlint|shellcheck"` (BSD/macOS grep doesn't
  support `\|` BRE alternation; the `-E` extended-regex form is
  POSIX-portable). Captured the rationale inline so the verification
  command actually works on macOS.

Same count-vs-list cardinality pattern (Class B in PR #465 doc-lint
suite BACKLOG row) — third drain-log of mine to exhibit it (after
#195 and #231). The shellcheck-rule-precision class also surfaces
via the `\|` portability finding (related to SC2086-vs-SC2046 from
#427 drain-log).

* hygiene(#444): reconcile 377 drain-log outcome distribution math

Codex P2 + Copilot both caught: header said '4 FIX + 2 dups' but
Section A enumerates 6 FIX thread-IDs (A1×1 + A2×2 + A3×3) and
Section B enumerates 5 STALE thread-IDs (B5 explicit dup of B3).
Header didn't match the per-section enumeration end-to-end; intro
prose ('3 were real-fix factual corrections' + '2 were combined')
disagreed with the header in turn.

Pick a single counting rule (by thread-ID) and apply it
consistently:
- 6 FIX (3 unique findings, 3 duplicate reviewer threads on the
  same fixes — combined into one fix commit c8d91b5)
- 5 STALE-RESOLVED-BY-REALITY (4 unique + 1 dup B5≡B3)
- 2 OTTO-279
- = 13 thread-IDs covering 9 unique findings

Fix header + intro prose + final-resolution all to match this
single rule. The 'unique findings' count (9) is preserved in
parentheses for cross-reference.
AceHack added a commit that referenced this pull request Apr 25, 2026
Append-only row per Otto-229 discipline: drained 17 unresolved
threads across 8 of my own drain-log PRs (initial 13 + 4 cascade
findings on this drain wave's fixes). Documents the
'drain-log self-correction at scale' pattern — Codex/Copilot
reviews caught Class A/B pattern instances inside the same doc-lint
BACKLOG row that promotes them to lint candidates (appropriate
self-application).

PRs drained: #449 / #442 / #441 / #464 / #456 / #465 / #467 / #444.
Auto-merge SQUASH armed across the queue.

Cron f38fa487 minutely fire verified live throughout the tick.
AceHack added a commit that referenced this pull request Apr 25, 2026
…ty map) (#445)

* hygiene(#268): pr-preservation drain-log for #231 (Codex CLI capability map)

Otto-268 backfill: drain-log for PR #231 — textbook case of the
post-merge reviewer-cascade pattern. 9 threads drained across 4 waves
(2 + 1 + 3 + 2 + 1 cascade pattern); every commit triggered a fresh
Codex/Copilot review wave catching new factual issues against the
freshly-changed surface.

Per Otto-250 training-signal discipline. Pattern observations capture
four load-bearing patterns:
1. Post-merge reviewer-cascade as dominant pattern; wave-by-wave the
   findings shift class (structural → rendering → internal-consistency
   → version-currency).
2. Codex enforces version-currency on the doc itself — Wave 4
   reclassifications cite OpenAI release notes (Sept 15 2025 + March 26
   2026); reviewer-enforces-rule pattern is the inverse of CLAUDE.md
   author-side version-currency rule.
3. "Partial (narrowing)" status annotation as a useful sub-state for
   gaps that are shrinking on measurable schedule.
4. Discriminator-falsification finding pattern (AGENTS.md-read
   test relying on values repeated in same doc) — same shape as
   randomized-canary in security testing.

* drain(#445 follow-up): fix thread/wave count mismatches in #231 drain-log

Multiple Copilot threads on #445 caught count-mismatch errors:

- Header claimed "9 across 4 waves (2 + 1 + 3 + 2 + 1 cascade)" —
  the "+1 cascade" doesn't correspond to any Wave 5 section in the
  body. Body has exactly 4 waves with 2+1+3+2=8 thread-sections.
- Final-resolution claimed "All 9 threads resolved" — should be 8.

Fix: aligned both header + final-resolution to the body's actual
8-thread-across-4-waves structure. Wave breakdown explicit
(Wave 1: 2, Wave 2: 1, Wave 3: 3, Wave 4: 2 — sum 8) so the math
is verifiable from the heading.

Same count-vs-list cardinality pattern documented in `_patterns.md`
(Class B in PR #465 BACKLOG row) — the doc-lint suite would catch
this at author-time.
AceHack added a commit that referenced this pull request Apr 25, 2026
…#470)

Promote the 'CommonMark MD032 — line-leading + / - parsed as
list marker' pattern to a named recurring-findings class in
_patterns.md after 5 instances in a single tick (2026-04-25):

- #377: '+ manifest files' continuation line
- #280: '+ provenance-aware scoring' continuation
- #195: '+ Kenji (Architect)' owner-list continuation
- #235: '+ git history' (Amara verbatim ferry)
- #219: '- [link]' (Amara verbatim ferry)

Document the two-branch fix decision tree:

- Author-controlled prose → reflow inline (replace '+'-separator
  with comma, extend prior line, etc).
- Verbatim ferry / courier content (Otto-227) → add to
  markdownlint ignore list (precedent: docs/aurora/** in #469,
  docs/amara-full-conversation/**).

Composes with Class A inline-code-span line-wrap (same shape:
line-wrap hits a CommonMark special character at line start).
Pre-commit-lint candidate noted for the doc-lint suite from
#465.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants