diff --git a/docs/pr-discussions/PR-4296-fix-tools-backlog-lint-frontmatter-resolve-13-strict-null-ts.md b/docs/pr-discussions/PR-4296-fix-tools-backlog-lint-frontmatter-resolve-13-strict-null-ts.md new file mode 100644 index 0000000000..c1c2710dbe --- /dev/null +++ b/docs/pr-discussions/PR-4296-fix-tools-backlog-lint-frontmatter-resolve-13-strict-null-ts.md @@ -0,0 +1,93 @@ +--- +pr_number: 4296 +title: "fix(tools/backlog/lint-frontmatter): resolve 13 strict-null TS errors blocking tsc-tools baseline lint" +author: "AceHack" +state: "MERGED" +created_at: "2026-05-19T01:11:48Z" +merged_at: "2026-05-19T01:14:41Z" +closed_at: "2026-05-19T01:14:41Z" +head_ref: "otto-cli/fix-tsc-tools-baseline-lint-frontmatter-strict-null-2026-05-19-0111z" +base_ref: "main" +archived_at: "2026-05-19T04:45:41Z" +archive_tool: "tools/pr-preservation/archive-pr.ts" +--- + +# PR #4296: fix(tools/backlog/lint-frontmatter): resolve 13 strict-null TS errors blocking tsc-tools baseline lint + +## PR description + +## Summary + +Fixes 13 TypeScript strict-null errors (TS2345 / TS2532 / TS2322 / TS18048) in `tools/backlog/lint-frontmatter.ts` that have been failing the `lint (tsc tools)` baseline check on origin/main for an unknown duration. This baseline failure has been propagating to all tools-touching PRs, blocking factory-wide merge throughput. + +## Empirical evidence of impact + +- [PR #3979](https://github.com/Lucent-Financial-Group/Zeta/pull/3979) (gh-auth-refresh-wrapper fix): all 4 reviewer threads resolved, auto-merge armed, but stuck BLOCKED for >15 min after CI complete — diagnosed in [#3979 comment](https://github.com/Lucent-Financial-Group/Zeta/pull/3979#issuecomment-4483555128) as likely blocked by this baseline +- Compare: docs-only PRs (#4255, #4256, #4276) shipped through this session within ~2 min of CI completion despite same baseline failure — protection rule treats `tools/` edits differently when this specific check fails +- Fixing this baseline unblocks a class of PRs, not just one + +## Fix shape (all changes mechanical, no behavior change) + +All 13 errors are `noUncheckedIndexedAccess: true` (strict-null) failures from indexed array accesses and regex capture group dereferences. Two patterns applied: + +**Pattern A — undefined guard before use** (3 locations: lines 124, 154, 175): +```ts +const line = lines[i]; +if (line === undefined) continue; // ADDED +// existing code unchanged +``` + +**Pattern B — non-null assertion on regex capture groups** (10 locations: lines 127, 128, 144, 159, 178, 187, 193): +```ts +const key = m[1]!; // CHANGED from m[1] +``` + +Non-null is safe here because the regex literals have 1 or 2 explicit capture groups; if `.exec()` returns non-null, all declared capture groups exist. + +## Landing path + +Landed via GitHub REST contents API (`PUT /repos/.../contents/tools/backlog/lint-frontmatter.ts`) from an Otto-CLI session under dotgit-saturation, bypassing the B-0615 push receive-pack stall (see [PR #4276](https://github.com/Lucent-Financial-Group/Zeta/pull/4276) for the rule documenting this pattern). + +## Test plan + +- [x] Diff verified — only the 13 error locations touched +- [x] No behavior change — only TS-type-narrowing additions +- [x] Same patterns used elsewhere in the codebase (`m[1]!` on regex capture groups is idiomatic when `.exec()` is non-null-checked) + +🤖 Generated with [Claude Code](https://claude.com/claude-code) + +Co-Authored-By: Claude + +## Reviews + +### COMMENTED — @copilot-pull-request-reviewer (2026-05-19T01:13:31Z) + +## Pull request overview + +This PR mechanically updates `tools/backlog/lint-frontmatter.ts` to satisfy strict TypeScript nullability checks under `noUncheckedIndexedAccess`, unblocking the tools TypeScript lint baseline without changing runtime behavior. + +**Changes:** +- Added defensive `undefined` guards for indexed line reads. +- Added non-null assertions for regex capture groups after successful matches. +- Preserved existing backlog frontmatter lint logic. + +## General comments + +### @AceHack (2026-05-19T01:15:09Z) + +## CI blocker discovered — `check docs/BACKLOG.md generated-index drift` + +This PR's `lint (tsc tools)` fix would unblock the factory-wide baseline, but the PR itself is now blocked by a different baseline check: `check docs/BACKLOG.md generated-index drift`. + +**Why this fires here**: the check appears to trigger on any PR touching `docs/backlog/` OR `tools/backlog/` paths. My edit is in `tools/backlog/lint-frontmatter.ts` (tooling for backlog frontmatter linting), which trips the path filter even though it doesn't change any backlog content. + +**Same regen-class blocker as PR #4280** (which hit `check MEMORY.md generated-index drift` after editing `memory/CURRENT-otto.md`). Both checks require running a TS regen script locally and committing the regenerated index, which is blocked by the current dotgit-saturation (see [PR #4276](https://github.com/Lucent-Financial-Group/Zeta/pull/4276) for full context). + +**Recovery paths**: +1. **Aaron / substrate-engineer with healthy local git**: run `bun tools/backlog/generate-index.ts` (or equivalent), commit the regenerated `docs/BACKLOG.md`, push as follow-on commit on this branch — auto-merge fires after. +2. **Refine the drift check**: the check should ideally NOT fire on PRs that don't touch `docs/backlog/P*/B-*.md` files. Currently the path-trigger appears overbroad (catches `tools/backlog/` too). This is a separate substrate-engineering task. +3. **Manual merge override**: if the fix is urgent (it unblocks many other PRs), a maintainer can force-merge despite the drift; the regen will catch up on a later tick. + +**Substrate is durable**: commit `647d2605` lands the 13 strict-null fixes on this PR branch regardless of merge status. The fix logic is correct and validated against the original `tools/backlog/lint-frontmatter.ts` error log; can be cherry-picked or applied via `git am` from `/tmp/zeta-pending-substrate-2347z/` family pattern. + +🤖 Generated with [Claude Code](https://claude.com/claude-code) diff --git a/docs/pr-discussions/PR-4297-shard-0110z-c-4292-stale-but-self-healing.md b/docs/pr-discussions/PR-4297-shard-0110z-c-4292-stale-but-self-healing.md new file mode 100644 index 0000000000..5d750142e7 --- /dev/null +++ b/docs/pr-discussions/PR-4297-shard-0110z-c-4292-stale-but-self-healing.md @@ -0,0 +1,30 @@ +--- +pr_number: 4297 +title: "shard(0110Z-c): 4292 stale-but-self-healing" +author: "AceHack" +state: "MERGED" +created_at: "2026-05-19T01:11:58Z" +merged_at: "2026-05-19T01:13:43Z" +closed_at: "2026-05-19T01:13:43Z" +head_ref: "shard/tick-2026-05-19-0110z-c-4292-stale-self-healing-2026-05-19" +base_ref: "main" +archived_at: "2026-05-19T04:45:41Z" +archive_tool: "tools/pr-preservation/archive-pr.ts" +--- + +# PR #4297: shard(0110Z-c): 4292 stale-but-self-healing + +## PR description + +Sibling PR landing resolves the cross-reference; no-op. + +## Reviews + +### COMMENTED — @copilot-pull-request-reviewer (2026-05-19T01:13:35Z) + +## Pull request overview + +Adds a new hygiene-history tick shard for the 2026-05-19 01:10Z window, recording that PR #4292’s remaining P2 thread was resolved as a no-op after a sibling PR landed the relevant cross-reference. + +**Changes:** +- Added `0110Z-c` tick shard with a valid 6-column header row and brief narrative summary. diff --git a/docs/pr-discussions/PR-4298-shards-batch-0112z-c-0114z-c-cost-aware-batch-4295-p2-no-op.md b/docs/pr-discussions/PR-4298-shards-batch-0112z-c-0114z-c-cost-aware-batch-4295-p2-no-op.md new file mode 100644 index 0000000000..3215b995b0 --- /dev/null +++ b/docs/pr-discussions/PR-4298-shards-batch-0112z-c-0114z-c-cost-aware-batch-4295-p2-no-op.md @@ -0,0 +1,42 @@ +--- +pr_number: 4298 +title: "shards(batch 0112Z-c..0114Z-c): cost-aware batch + 4295 P2 no-op" +author: "AceHack" +state: "MERGED" +created_at: "2026-05-19T01:15:15Z" +merged_at: "2026-05-19T01:17:27Z" +closed_at: "2026-05-19T01:17:27Z" +head_ref: "shards/batch-0112-0114z-c-2026-05-19" +base_ref: "main" +archived_at: "2026-05-19T04:45:41Z" +archive_tool: "tools/pr-preservation/archive-pr.ts" +--- + +# PR #4298: shards(batch 0112Z-c..0114Z-c): cost-aware batch + 4295 P2 no-op + +## PR description + +3 local shards batched + 4295 P2 markdown ordered-list no-op resolved. + +## Reviews + +### COMMENTED — @copilot-pull-request-reviewer (2026-05-19T01:16:45Z) + +## Pull request overview + +Adds three new hygiene-history tick shard entries for 2026-05-19 (0112Z-c, 0113Z-c, 0114Z-c), documenting a cost-aware batching decision and recording that #4295’s P2 markdown ordered-list finding was a no-op / immutable-shard case. + +**Changes:** +- Add tick shard `0112Z-c` capturing brief-ack status and batching intent. +- Add tick shard `0113Z-c` capturing brief-ack status and sentinel liveness. +- Add tick shard `0114Z-c` capturing the substantive note about #4297 merged and #4295 P2 markdown no-op resolution, plus batching context. + +### Reviewed changes + +Copilot reviewed 3 out of 3 changed files in this pull request and generated no comments. + +| File | Description | +| ---- | ----------- | +| docs/hygiene-history/ticks/2026/05/19/0112Z-c.md | New tick shard entry documenting brief-ack status and batching intent. | +| docs/hygiene-history/ticks/2026/05/19/0113Z-c.md | New tick shard entry documenting brief-ack status and sentinel liveness. | +| docs/hygiene-history/ticks/2026/05/19/0114Z-c.md | New tick shard entry documenting the substantive merge/no-op notes and batching rationale. |