backlog: P2 doc-lint suite from drain-log corpus patterns#465
Merged
Conversation
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.
There was a problem hiding this comment.
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).
This was referenced Apr 25, 2026
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
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.
3 tasks
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.
4 tasks
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.
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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
*.md. Fix template: reflow to single line OR convert to markdown link with full path on one line.\b\d+\s+(items|phases|audits|drift classes|PRs|tests|fixes)\bpatterns + count surrounding list + warn on mismatch.|inside Markdown table row get parsed as column separators, breaking table structure + markdownlint MD056. Lint: regex check on table rows for unescaped|inside code spans; suggest backslash-escape or alternative wording.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.ymlper 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.Test plan
🤖 Generated with Claude Code