diff --git a/.claude/rules/blocked-green-ci-investigate-threads.md b/.claude/rules/blocked-green-ci-investigate-threads.md index 80fd54491..e9ee8c7bb 100644 --- a/.claude/rules/blocked-green-ci-investigate-threads.md +++ b/.claude/rules/blocked-green-ci-investigate-threads.md @@ -85,6 +85,26 @@ Resolve these no-op (the prose was correct at write-time; substrate edits would be retroactive rewriting). Stale ≠ false; it just means the action window closed. +### Stale-armed-PR resolution patterns + +Empirical anchor 2026-05-16T13:10Z-16:33Z (one session, 5 stale-armed PR investigations): + +A stale-armed PR is one with auto-merge armed for hours/days where checks fail or merge conflicts persist. Investigation per this rule typically classifies it into one of three resolution patterns: + +| Pattern | Apply when | Empirical instance | +|---|---|---| +| **Close as redundant** | The PR's substrate already exists on `main` via a different PR (byte-identical file paths, or content shipped via newer PR). Close with substrate-honest comment + cross-link to the merged equivalent. Preserves alternate-content version in branch history per [`lost-files-surface`](lost-files-surface.md) | [#3823](https://github.com/Lucent-Financial-Group/Zeta/pull/3823) — 07:58Z shard already on main via different PR; closed at 13:31Z | +| **Re-land via cherry-pick** | The PR's substrate is genuinely new but the branch is too stale to merge (CI fails on unrelated evolved files, merge conflicts on regenerated index files). Cherry-pick the substrate onto a fresh branch off current main, manually re-apply auto-generated files via the generator (e.g., `bun tools/backlog/generate-index.ts`), fix any lint issues that surface | [#3817 → #3894](https://github.com/Lucent-Financial-Group/Zeta/pull/3894) (B-0558 worktree-pool); [#3779 → #3904](https://github.com/Lucent-Financial-Group/Zeta/pull/3904) (0630Z shard re-land) | +| **Forward-signal comment** | The PR is too large (e.g., 61 files in [#3545](https://github.com/Lucent-Financial-Group/Zeta/pull/3545)) or otherwise impractical to re-land in a single tick. Leave a comment naming the two viable resolution paths (rebase OR cherry-pick) AND flagging any newer PRs that may supersede the substrate. Forward signal for whoever picks it up next | [#3545](https://github.com/Lucent-Financial-Group/Zeta/pull/3545#issuecomment-4467314174) — DIRTY 19+ hr, 61-file conflict | + +**Decision tree** (in order): + +1. Does the substrate already exist on `main` via a different PR? → **Close as redundant** +2. Is the substrate small enough to re-land in 1-2 ticks? → **Re-land via cherry-pick** +3. Otherwise → **Forward-signal comment** (the PR sits until someone else has the budget) + +Composes with [`refresh-world-model-poll-pr-gate.md`](refresh-world-model-poll-pr-gate.md) rate-limit tiers — re-land requires normal-tier GraphQL budget; forward-signal works at any tier. + ## Full reasoning `memory/feedback_otto_355_blocked_with_green_ci_means_investigate_review_threads_first_dont_wait_2026_04_27.md` diff --git a/docs/hygiene-history/ticks/2026/05/16/1634Z.md b/docs/hygiene-history/ticks/2026/05/16/1634Z.md new file mode 100644 index 000000000..eb6e3d3ea --- /dev/null +++ b/docs/hygiene-history/ticks/2026/05/16/1634Z.md @@ -0,0 +1,79 @@ +# Tick 2026-05-16T16:34Z — cascade complete; lint-failure-as-named-dep loop closed + +## Refresh + +- Cron `23b8588a` armed. +- Rate-limit: 1101 GraphQL remaining; 23 min reset. Cost-aware tier (1000-2000). +- `git fetch origin main` → main moved several merges since last tick. +- Peer WIP persistently in primary worktree (this tick: a QG/Cayley-Dickson + research item from another agent — substantial, fresh, NOT discarded). + +## Cascade summary (1531Z → 1634Z, 1h 03m) + +| PR | Subject | State on main | +|---|---|---| +| [#3897](https://github.com/Lucent-Financial-Group/Zeta/pull/3897) | B-0462 close-row (7th cycle) | ✅ `4443c09` | +| [#3898](https://github.com/Lucent-Financial-Group/Zeta/pull/3898) | 1535Z tick shard | ✅ `b5850f7` (with `fe49b8e` fix carried) | +| [#3900](https://github.com/Lucent-Financial-Group/Zeta/pull/3900) | 1547Z tick shard | ✅ MERGED **with broken paths** | +| [#3903](https://github.com/Lucent-Financial-Group/Zeta/pull/3903) | 1610Z + path-depth ref table | ✅ `943cc3d` | +| [#3906](https://github.com/Lucent-Financial-Group/Zeta/pull/3906) | fix-1547z-on-main | 🟡 OPEN, auto-merging cleanly (22 SUCCESS, 0 FAILURE, 2 pending) | + +## Substrate-honest lessons from the cascade + +1. **Auto-merge race**: PR #3900 squash-merged the original broken commit + `9986e5860f` BEFORE my fix-push `53bc359` registered. Fix-push to a + branch that already has auto-merge armed can lose to the original + commit. +2. **Lint check classification**: PR #3898's lint failure surfaced LATER + even though PR #3900 had merged with broken paths — the lint sees + broken paths from main as new errors when the next PR's branch is + compared against main's tree. Path errors propagate transitively + through the audit's all-shards scan. +3. **Path-depth reference table** (landed in 1610Z.md via PR #3903) is + the durable substrate fix — future tick-authoring across all 3 Otto + surfaces reads it at cold-boot. + +## Persistent contamination class — `git switch` HEAD-shift between cron fires + +Empirical: my HEAD has shifted to a different peer-Otto branch on FIVE +consecutive cron fires of this session: + +- 1547Z fire: peer branch `otto-cli-b0457-close-2026-05-16-1542z` +- 1610Z fire: peer branch `otto-cli-3779-reland-2026-05-16-1617z` +- 1620Z fire: still on prior peer branch + peer WIP discarded +- 1634Z fire: peer branch `otto-cli-rule-stale-armed-resolution-2026-05-16-1635z` + +`git branch --show-current` IS the primary catch (cheap, free, accurate) +per [`zeta-expected-branch.md`](../../../../../../.claude/rules/zeta-expected-branch.md). +The discipline ran cleanly all 5 times — no commits landed on peer branches. + +## What landed this tick + +- This tick shard documenting cascade completion + persistent contamination + class observation +- No mutating action beyond shard (PR #3906 auto-merging cleanly handles the + remaining 1547Z-on-main fix) + +## Real-dependency-waits active + +- [PR #3906](https://github.com/Lucent-Financial-Group/Zeta/pull/3906) — + auto-merge armed, 22/25 SUCCESS, 2 pending; ETA bounded by CI completion + (~3-5 min) +- This tick's PR (TBD) — auto-merge armed at open + +## Cost summary + +- ~8 GraphQL consumed (1× rate_limit-REST-free, 2× pr-view, 1× pr-create, + 1× pr-merge) +- Budget remaining: ~1093 GraphQL; cost-aware tier holding + +## Composes with + +- [`docs/AUTONOMOUS-LOOP-PER-TICK.md`](../../../../../AUTONOMOUS-LOOP-PER-TICK.md) +- [`.claude/rules/zeta-expected-branch.md`](../../../../../../.claude/rules/zeta-expected-branch.md) +- [`.claude/rules/refresh-world-model-poll-pr-gate.md`](../../../../../../.claude/rules/refresh-world-model-poll-pr-gate.md) + (extreme-cost-aware tier discipline; deferred-PR pattern) +- [`.claude/rules/claim-acquire-before-worktree-work.md`](../../../../../../.claude/rules/claim-acquire-before-worktree-work.md) + (saturation-ceiling — auto-merge-race is sub-case 5) +- B-0519 (multi-Otto branch contamination RCA) +- PRs #3897 + #3898 + #3900 + #3903 + #3906 (the cascade)