Why PRs are not green, not merged, or not worked on at all while nobody is at the keyboard — and what rules replace the ones that cause that.
Decided 2026-09-17 — Fede adopted all of it except the settings registry (section 5, "Hygiene without a flag platform", first bullet), which is deferred: "too much for now".
Contents
CI speed is on its own page → Ship in 15 Minutes.
The machine ships. The problem is the night and the morning baseline, not throughput.
| Fede-authored PRs, 2026-08-18 → 09-17 | |
|---|---|
| Opened / merged / closed unmerged / open now | 1,607 / 1,439 / 161 / 7 |
| Median time to merge | 37 minutes |
| 90th percentile | 4.4 hours |
| Merged within 24 hours | 98.5% |
| Merged outside 7am–7pm Denver | 44% |
So "always shipping" is already mostly true. Three numbers explain the mornings that feel bad:
| Symptom | Number |
|---|---|
| PRs ever held by the auto-merge guard | 512 of 1,607 (32%) |
| Top hold reasons | dangerous-diff path 179 · 🟡 changes suggested 132 · changes-requested standing 50 |
| PRs needing more than 3 review rounds | 33.5% |
| PRs over 600 lines | 613 (38%), median 4 review rounds |
| Nights with a ≥3-hour dead stretch, last 14 | 7 |
| Finished-subagent notifications unanswered for 5+ minutes | 22,581 of 66,931 (34%) |
Read together: a third of PRs get held, a third need four or more rounds, and half the nights the fleet stops before those are cleared. Whatever is unfinished at the dead stretch is what Fede finds at 7 am. Seven open PRs this morning was a normal night, not a bad one.
Timeline (Denver time):
Root cause A, mechanical. Each session is woken by a small waiter process that watches the GitHub event file. Waiters did not die when their turn ended. They lived up to 24 hours holding the session's "I already have a waiter" lock, so the next real waiter could not arm, and the stale one consumed each verdict and woke nobody. Found on the machine: 11 waiters whose Claude process had exited days earlier, some since September 10; the machine-wide duty lock held by a waiter from a turn that ended at 8:57 pm. Fixed today in the waiter script: a waiter exits within five minutes of its session ending, and a lock held by an orphan is taken over.
Root cause B, behavioral. Seven of the last fourteen nights have a three-hour-or-longer dead stretch, always after midnight. In 30 days, one in three "subagent finished" notifications (22,581 of 66,931) went unanswered for more than five minutes. The 25 longest silences were sessions that wrote a done-or-parked summary, or asked Fede a yes-or-hold question and stopped for a day. None were errors or limits.
Root cause C, structural. Thirteen distinct mechanisms can stop a green PR from merging without a person. Each is reasonable alone. Together they mean a PR needs a live session to clear it several times, and a sleeping session clears nothing.
| Hold | Keep? | Change |
|---|---|---|
| Changes-requested review standing | keep | The session that pushes the fix dismisses the stale review in the same turn. Never left for morning. |
| No verdict on current head | keep | Automatic. Nothing to do. |
| 🟡 changes suggested | change | No longer holds. 🟡 = merge, then open one follow-up issue per finding. Only 🔴 blocking holds. |
| Stacked base | keep | Automatic. |
| Dangerous-diff path | keep, narrow | Only auth, IAM, middleware, secrets, the guard itself. Admin routes under /api/admin behind admin auth are not dangerous. |
| Merge-evidence (green with zero tests run) | keep | This is the one hold that catches real risk. |
| Draft | keep | Drafts are not work in progress. A draft older than 24h is closed by its owner. |
| hold-for-review label | keep, Fede-only | Unchanged. Sessions never apply it. |
| Stale approval after push | keep | Automatic. |
| Hand-armed auto-merge disarmed by event | change | The guard re-arms itself on a clean verdict; sessions must not treat "not armed" as a hold. |
| Red main freeze | keep | Driver rule already exists. |
| CI red | keep | Fix. |
| Review workflow self-modify | keep | Rare. |
Fede's constraint: ship aggressively, keep customers stable, no proliferation of forgotten flags.
Rule: there are exactly three places a behavior can be switched, and they are all product configuration, not engineering flags.
| Switch kind | Where it lives | Who flips it | Lifetime |
|---|---|---|---|
Company live switch (claraLive) | customer page | Fede | forever; it is the go-live |
| Company setting (e.g. reminders opt-in, vendor calendar capture, lead source) | customer page, settings card | ops or the customer | forever; it is a product feature |
| Property setting (e.g. per-property reminder recipient) | property page | ops or the customer | forever |
What is banned: environment flags for behavior (*_ENABLED), code-level release toggles, allowlists in code, "temporary" gates. Today there are 5 env flags and 6 org/property settings. The 5 env flags get a removal PR each or become a company setting.
How a risky change ships:
Hygiene without a flag platform:
Decision: A, minus the settings registry.
Read-only pull from GitHub + Vercel + git history, 2026-09-28. Full numbers and every PR in the sample: appendix below.
| Metric | Prior week (09-15–21) | Last week (09-22–28) |
|---|---|---|
| PRs merged | 1,432 | 1,915 |
| Open→merge, 90th percentile (hours) | 6.4 | 4.8 |
| Merge→live, 90th percentile (minutes) | 20 | 71 |
| Share of PRs needing 3+ review rounds | 44% | 30% |
Review is not the problem — last week beat the prior week on every review measure while shipping 34% more work. What got slower is the last mile: once a PR merges, it now waits for a 30-minute batch window before it goes live, so a typical PR now takes about 1.4 hours from opening to live, up from 1.0 hour.
| Time sink | PR-hours lost | Share of open→merge time |
|---|---|---|
| Waiting for the first review verdict | 1,054 | 9% |
| Fix loop (rounds that came back red) | 2,941 | 24% |
| Final stretch — merged within 24h of going green | 3,361 | 27% |
| Final stretch — sat green >24h unmerged ("parked green") | 4,656 | 38% |
| Merge to live (separate from the above; waiting on the deploy batch) | 1,586 | — |
The single biggest sink, parked-green PRs, is only 40 PRs — all in Gera's lane, none armed for auto-merge, 4 carrying a hold-for-review label.
Mostly normal. A PR with 50+ comments has, by design, about 10 review rounds — each round writes a run summary, a verdict summary, and inline findings, and the ≥50-comment PRs are big (median 1,570 lines changed). Reading a sample of what triggered the blocking reviews on these PRs: about 60% were real code defects worth catching. Roughly 20% was avoidable noise from the review system itself — mainly the plan reviewer posting a brand-new comment on every push instead of updating one (13% of all comments on these PRs, concentrated in a spike from 09-16 to 09-19 while its red verdict held merges), plus sessions pinging for a review that was already running (another ~7% together with the "already running" replies). One genuine review-system bug sat in the window and was fixed on 09-18: a blocking review that quoted an earlier green verdict was being misread as an approval.
Not ranked, but worth a decision: the 30-minute deploy batch costs about 25 minutes median per PR (merge→live went from 13 to 37 minutes median). Deploying immediately whenever nothing has shipped in the last 30 minutes would win most of that back without losing the batching benefit.
Read-only pull, 2026-09-28 23:50 UTC, scope: 409 fede-propflow PRs opened 09-25–28 (372 merged, 22 open, 15 closed), every verdict/comment/check/deploy event, vs. the prior week (09-18–24, 812 PRs). Full report: scratchpad/pr-cycle-retro-2026-09-28.md.
| Metric | Prior week (09-18–24) | This window (09-25–28) |
|---|---|---|
| Open→merged, median / p90 | 56 min / 6.0 h | 31 min / 4.0 h |
| Merged→live, median / p90 | 15 min / 48 min | 43 min / 1.2 h (worse) |
| Review rounds per PR (mean) | 3.1 | 2.2 |
| PRs open >24 h | 2 merged | 2 merged + 5 still open |
The typical PR is faster than last week. What Fede sees is the tail: 50 PRs (12%) took more than 4 hours, and they hold most of the time — 823 PR-hours spent open in the window, 246 (30%) of it PRs sitting as drafts.
| # | Change | Rule text | Est. PR-h saved/week | Where it lives | Status |
|---|---|---|---|---|---|
| 1 | No draft waits for Fede | "Never park a PR as a draft for Fede. If merging would turn anything on at a customer, the PR is cut wrong: first merge a company/property setting that defaults off (PR 1), then build on top and merge dark. A draft older than 2 h is escalated by the orchestrator; drafts are for work in progress, never for approval." | ~430 | Personal ~/.claude/CLAUDE.md › Shipping | applied |
| 2 | Guard updates the branch itself on a "main moved" hold | "When the guard holds for 'main moved since merge base', it runs update-branch itself (once per hour at most). Adding rows to a drift-test inventory or baseline is not a check change." | ~185 | Auto-merge guard (Gera's lane) | Smith ask |
| 3 | Deploy-stall alarm | "If production is more than 45 min behind a merged main commit, run deploy-stall-check.sh: one bridge post with the cancelled-run ids, and promote-now if the fix is a customer bug." | ~170 | New script + personal CLAUDE.md | applied |
| 4 | Hard 1,000-line ceiling | "review:self fails any PR over 1,000 substantive lines. 600–1,000 lines needs ## Why not split in the body." | ~70–140 | Repo PR (self-review script) + repo CLAUDE.md | repo PR pending |
| 5 | Sweep every open PR >4h | "Any fede-authored PR open more than 4 h that is not armed, merged, or waiting on a named check is swept: the orchestrator messages its owner within 30 min, and the nightly sweep lists every one with owner and cause." | ~90 | Personal CLAUDE.md › Always shipping + sweep script | applied |
| 6 | Extend review:self to catchable 🔴s | Real-name scan against the gold set and knowledge exports; a Proof block must carry an eval run id whose head SHA equals the PR head; fence and drift tests for touched files run locally under nice instead of being skipped under load. | ~80 | Repo PR (self-review) + builder prompt | repo PR pending |
| 7 | No stacks — enforce the existing rule | "gh pr create --base other than main is refused unless the base is int/*." | ~40 | ~/.claude/scripts pre-tool hook | repo PR pending |
| 8 | One round rule, not three | "Rounds are fine while each finds a new defect. Two 🔴 on the same mechanism: stop patching, push one redesign with the reason in the body. A 🔴 saying the last blocker is still open means the push was wrong: fix before the next push. Suggestions (🟡) never earn a round." Resolves the clash between Constitution IV.8, Fede's 09-17 "never split" ruling, and the repo manual. | ~15 | Repo CLAUDE.md (replaces "round count is not a stopping condition") + Constitution IV.8 | applied |
Estimates scale the 4-day window by 1.75 for a weekly figure; they overlap, so do not add them up.
Problem: work that merges dark gets forgotten — the first-email engine sat unfinished for days, and several weekend features are dark with no owner tracking the turn-on.
review:self requires whenever a diff adds a setting key: Dark: <setting key> | feature: <plain words> | proof: <Willows/Fairhaven link or "pending"> | turn-on: Fede.~/.claude/scripts/dark-register.sh: one gh search call for merged PRs (last 60 days) carrying a Dark: line, then a read-only admin settings read per company for that key. Writes a JSON block into this page. No build check, no settings registry (Fede, 09-17: "too much for now").Fede, 2026-09-29: "we built a lot of stuff in the last two weeks and I don't know if everything's on or off." This fills the register above with real data. Method: grouped ~3,570 merged PRs (2026-09-15 to 2026-09-29) into features, found each feature's setting key in the settings registry (src/lib/domain/portfolio/registry/keys.ts), then read the LIVE value straight from production DynamoDB on 2026-09-29 for the four companies below. No customer names, no phone numbers.
| Feature | What it does | Setting key | Merged | Western Slope | JP&Co (Camellia + Yale 25) | Situs Group | Willows (test) | Proof |
|---|---|---|---|---|---|---|---|---|
| Email-lead engine | Replies to Zillow/listing-site emails by finding or creating the AppFolio guest card and answering from the right mailbox. | Organization.settings.leadSource === 'listing_site_email' | 09-15→09-29 | OFF (leadSource=appfolio_guest_cards) | OFF (unset) | OFF (unset) | ON | no proof link |
| Guest-card first-email engine | Clara's first reply on a new guest card walks property → availability → calendar → knowledge. Always runs now — the on/off switch was deleted 09-29 (#13519). | leasing.guestCardReplyScope (default system_only) | 09-18→09-29 | ON, system-only scope | ON, system-only scope | ON, system-only scope | ON, system-only scope | no proof link |
| Guest card written from a call | A leasing call creates or updates the AppFolio guest card. | PropertyLeasingSettings.guestCardWriteFromCalls (property, default off) | 09-15→09-29 | ON (all 70 properties) | OFF (Camellia, Yale 25) | OFF | ON | go-live tracker |
| Guest card written from a text | Same as above, for a leasing text thread. | PropertyLeasingSettings.guestCardWriteFromTexts (property, default off) | 09-15→09-29 | OFF | OFF | OFF | ON | no proof link |
| Clara texts the application link | Clara sends the AppFolio application link herself, in her own thread, instead of AppFolio texting it from its own number. | Organization.applicationLinkClaraTexts (default off) | 09-15→09-29 | OFF | OFF | OFF | OFF | no proof link |
| Self-guided tours | Prospect books and enters a home without a person present. Only 1 of 3 planned PRs is merged (#12855); nothing reads the switch yet. | Organization.selfGuidedToursEnabled (default off) | 09-29 | OFF | OFF | OFF | OFF | not buildable yet — see below |
| Promise ledger / matters / nags | Tracks a spoken promise and pages staff if it's not kept. Retirement is in #13801 (open, armed for auto-merge tonight, 2026-09-29); until it merges, extraction still runs everywhere and only the caller-voice leg and PM nag ladder are off. | mixed: caller leg = Property.promiseLedgerCallerOutboundEnabled (default off) | 09-16→09-29 | OFF | OFF | n/a (org not live) | OFF | no proof link |
| Staff tour alerts | A staff person who opts in gets texted/emailed when a tour is booked, moved or cancelled. | per-person opt-in under Settings > My notifications — not a company switch | 09-17→09-29 | n/a (per person) | n/a (per person) | n/a (per person) | n/a (per person) | no proof link |
| Coworker back-and-forth (staff texts Clara) | Staff can text Clara to find/create a guest card, add a note, or book/move/cancel a showing. Always on since 09-29 — both switches guarding it were removed (#13577, #13613). | none (removed 09-29) | 09-25→09-29 | ON | ON | ON | ON | no proof link |
| Tour time windows | Offers a morning/afternoon window in the first email or on a call before booking an exact slot. | Organization.tourTimeRangesEnabled (default off) | 09-15→10-01 | ON (10-01, staff_fede_relay_20261001) | ON (10-01, staff_fede_relay_20261001) | ON (10-01, staff_fede_relay_20261001) | ON (10-01, dry run) | Willows real-send proof, #13798 |
| Call-routing V2 (new phone-routing engine) | A from-scratch call router, built to test for design flaws without touching the routing every company uses today. | call_routing.v2 (org, default off, fails closed) | 09-15→09-29 | OFF (old router) | OFF (old router) | OFF (old router) | OFF (old router) | no proof link — zero rows exist anywhere, incl. the Willows/Fairhaven POC it was built for |
| Module switches (Leasing / Maintenance / Renewals / Collections) | Every send and write checks whether that module is turned on for the building. | enabledModules.* (company + property, absent = on) | 09-16→09-29 | Leasing ON; Renewals, Maintenance, Collections OFF | Leasing, Renewals, Maintenance ON | Everything explicitly OFF | Leasing, Renewals, Maintenance ON | go-live tracker |
| Listings location facts | Geocodes each home so Clara can describe nearby streets and landmarks. | Organization.locationFactsEnabled (default off) | 09-29 | OFF | OFF | OFF | OFF | no proof link |
| Voice fast lane | Engineering-only tool: try a voice-agent change on a real call before opening a PR, on a throwaway line. | none needed — internal, not customer-facing | 09-17→09-29 | n/a | n/a | n/a | n/a | n/a |
| Staff can ask Clara to text a prospect from the leasing desk | Staff ask Clara to text a prospect; the text_prospect tool writes by id behind the provenance guard. The cut-over merged 2026-10-17 (#20857); the tool is in the live desk’s tool set behind leasing.staffAskedProspectTextEnabled, still OFF everywhere. A platform admin sets it from the customer page, Leasing row “Staff can ask Clara to text a prospect”. Owner lane: coworker-loop redesign (docs/planning/coworker-loop-redesign-2026-10-17.md), session 007. Turn-on: Fede, blocked until these follow-ups are closed: #20664 (language and verbatim text unchecked), #20665 (double send), #20666 (person at several homes: which line), #20726 (Supervised buildings refuse staff-asked texts). | leasing.staffAskedProspectTextEnabled (Organization field, default off) | 10-17 (#20637, merge commit 78f6651925); 0 days dark at merge | OFF (default) | OFF (default) | OFF (default) | OFF (default; Willows and Fairhaven) | pending — live Willows/Fairhaven run of the staff-asked text not yet done |
Live values read 2026-09-29 by targeted get-item/query calls against propflow-prod (org PROFILE row + one sample property's LEASING_SETTINGS row per company); no full-table scans. Org ids: Western Slope org_c42d9150…, JP&Co org_jpco, Situs Group org_a3376147…, Willows org_sandbox.
Row for #20637 (staff-asked prospect text) added by hand 2026-10-17; it is not part of the 09-29 live read above.
#12871 and #12910 armed for auto-merge; #12879 and #12892 stacked behind them, armed as each parent merges. All four are the self-guided-tours chain; the feature above reads OFF everywhere until they land.
Not recommended — the data does not support it. Fede rejected one on 09-19, and the WIP problem is made of the drafts in change 1, not of too many live PRs. Enforcing change 1 plus the existing 3-per-session soft limit is enough. Nor a round cap that merges on 🟡: 🟡 already never holds, and 73% of 🔴 findings in the window were real defects.
Red-cause labels are from a keyword classifier (rough: 56% agreement with a model-read sample). "Machine-written" excludes only the three rows of human/session prose from the comment-source breakdown above.
| PR | author | comments | rounds | red rounds | red causes | repeat-blocker reds | machine-written | open→merge h | lines |
|---|---|---|---|---|---|---|---|---|---|
| #9425 | fede | 156 | 16 | 9 | defect 6, stale 2, process 1 | 1 | 76% | 13.5 | 2684 |
| #9721 | fede | 122 | 19 | 13 | defect 10, proof 1, process 1, reversal 1 | 1 | 75% | 14.5 | 3030 |
| #9782 | fede | 118 | 22 | 3 | process 2, reversal 1 | 1 | 99% | 19.4 | 3624 |
| #8962 | fede | 96 | 12 | 5 | defect 5 | 2 | 83% | 15.7 | 2237 |
| #9426 | fede | 89 | 15 | 12 | defect 7, proof 3, process 2 | 1 | 85% | 8.8 | 3994 |
| #12017 | fede | 87 | 15 | 9 | proof 8, defect 1 | 4 | 78% | 8.1 | 2249 |
| #9633 | fede | 82 | 8 | 6 | defect 4, proof 1, infra 1 | 2 | 78% | 3.3 | 3114 |
| #9635 | fede | 81 | 10 | 9 | defect 5, proof 3, process 1 | 4 | 74% | 4.2 | 1337 |
| #10775 | fede | 81 | 14 | 8 | defect 8 | 4 | 94% | 24.2 | 1490 |
| #9427 | fede | 78 | 13 | 3 | process 2, stale 1 | 1 | 95% | 17.6 | 904 |
| #9933 | fede | 78 | 13 | 10 | defect 7, stale 2, infra 1 | 2 | 91% | 4.8 | 1705 |
| #9105 | fede | 78 | 11 | 4 | process 2, defect 2 | 2 | 82% | 12.5 | 3608 |
| #9783 | fede | 77 | 11 | 9 | defect 8, process 1 | 6 | 88% | 19.5 | 1774 |
| #9990 | gera | 76 | 15 | 13 | defect 13 | 7 | 84% | 30.4 | 8432 |
| #12027 | fede | 75 | 11 | 6 | defect 3, proof 2, reversal 1 | 4 | 69% | 5.5 | 2354 |
| #9921 | fede | 73 | 10 | 8 | defect 5, process 2, proof 1 | 5 | 89% | 4.0 | 1973 |
| #9203 | fede | 73 | 15 | 5 | defect 5 | 1 | 84% | 7.8 | 1370 |
| #9046 | fede | 72 | 15 | 8 | defect 6, process 1, reversal 1 | 5 | 99% | 14.9 | 1401 |
| #9956 | fede | 72 | 12 | 9 | proof 2, ci-red 2, defect 2, stale 2, process 1 | 4 | 88% | 5.0 | 8935 |
| #8649 | fede | 71 | 13 | 8 | defect 5, proof 2, process 1 | 2 | 86% | 8.9 | 1648 |
| #9149 | gera | 70 | 10 | 3 | defect 3 | 0 | 77% | 4.3 | 1010 |
| #10134 | fede | 68 | 9 | 7 | defect 4, process 3 | 1 | 94% | 2.8 | 1722 |
| #11865 | gera | 67 | 22 | 0 | - | 0 | 88% | 14.1 | 1584 |
| #9994 | gera | 66 | 13 | 12 | defect 6, rule 4, proof 2 | 9 | 67% | 29.7 | 4000 |
| #12977 | fede | 65 | 9 | 7 | defect 6, rule 1 | 5 | 88% | 8.3 | 2015 |
| #9497 | fede | 64 | 10 | 8 | defect 6, proof 1, stale 1 | 6 | 88% | 6.1 | 683 |
| #9844 | gera | 64 | 10 | 1 | rule 1 | 0 | 78% | 3.4 | 979 |
| #8523 | gera | 64 | 14 | 3 | defect 2, proof 1 | 1 | 89% | 23.7 | 2430 |
| #13187 | fede | 63 | 13 | 12 | defect 11, rule 1 | 7 | 100% | open | 1344 |
| #12791 | gera | 62 | 12 | 4 | defect 3, process 1 | 1 | 100% | 32.5 | 1533 |
| #9272 | fede | 62 | 12 | 6 | defect 3, reversal 2, ci-red 1 | 0 | 100% | 4.9 | 799 |
| #9484 | fede | 61 | 7 | 3 | stale 2, process 1 | 2 | 87% | 10.2 | 294 |
| #9653 | fede | 61 | 10 | 8 | defect 8 | 1 | 87% | 6.4 | 2603 |
| #9435 | fede | 60 | 13 | 5 | defect 2, proof 2, ci-red 1 | 3 | 92% | 12.4 | 411 |
| #12974 | gera | 60 | 9 | 6 | defect 4, proof 2 | 0 | 87% | 4.0 | 1518 |
| #10131 | fede | 59 | 10 | 7 | defect 4, infra 1, proof 1, reversal 1 | 3 | 85% | 4.6 | 304 |
| #9664 | fede | 58 | 5 | 4 | defect 3, ci-red 1 | 2 | 71% | 1.3 | 3398 |
| #11115 | fede | 57 | 16 | 10 | defect 8, process 2 | 2 | 100% | 6.6 | 2429 |
| #9705 | fede | 57 | 7 | 3 | defect 2, stale 1 | 0 | 70% | 1.9 | 764 |
| #8670 | fede | 57 | 6 | 5 | defect 4, proof 1 | 2 | 89% | 10.3 | 848 |
| #10769 | fede | 56 | 10 | 5 | defect 1, process 1, reversal 1, proof 1, stale 1 | 1 | 93% | 8.4 | 667 |
| #9928 | fede | 56 | 7 | 6 | process 4, defect 2 | 5 | 91% | 1.4 | 804 |
| #9961 | fede | 54 | 9 | 9 | defect 7, process 1, rule 1 | 2 | 81% | closed | 2404 |
| #9553 | fede | 53 | 10 | 4 | defect 3, reversal 1 | 1 | 96% | 6.3 | 251 |
| #10015 | fede | 53 | 5 | 3 | defect 2, proof 1 | 2 | 83% | 1.4 | 1713 |
| #9234 | fede | 52 | 8 | 2 | process 2 | 0 | 98% | 4.5 | 1567 |
| #9511 | fede | 52 | 9 | 5 | defect 5 | 3 | 90% | 7.5 | 208 |
| #9492 | fede | 51 | 10 | 7 | defect 6, process 1 | 2 | 86% | 3.3 | 1574 |
| #10309 | fede | 50 | 11 | 4 | defect 3, process 1 | 1 | 84% | 6.0 | 954 |
| #9053 | gera | 50 | 11 | 2 | stale 1, proof 1 | 0 | 88% | closed | 794 |
| #13036 | fede | 50 | 11 | 8 | defect 7, reversal 1 | 3 | 86% | open | 1449 |
| #11872 | fede | 50 | 6 | 5 | defect 5 | 2 | 100% | 5.2 | 3144 |
| #9013 | fede | 50 | 7 | 0 | - | 0 | 100% | 8.4 | 528 |
| #9070 | gera | 50 | 13 | 0 | - | 0 | 98% | 3.3 | 742 |
| #9658 | fede | 49 | 9 | 7 | process 7 | 4 | 98% | 3.2 | 1398 |
| #12856 | fede | 49 | 11 | 9 | defect 6, process 3 | 4 | 94% | 6.4 | 3471 |
| #12008 | gera | 49 | 11 | 6 | defect 3, proof 2, reversal 1 | 0 | 94% | 4.9 | 2293 |
| #8165 | gera | 49 | 8 | 3 | ? 2, proof 1 | 1 | 71% | 113.3 | 1056 |
| #10836 | gera | 48 | 11 | 7 | defect 3, rule 2, ci-red 2 | 4 | 73% | 3.3 | 2898 |
| #9848 | gera | 48 | 11 | 1 | defect 1 | 0 | 92% | 11.5 | 1634 |
| #9720 | fede | 48 | 6 | 4 | defect 4 | 3 | 96% | 2.2 | 3022 |
| #12307 | fede | 48 | 9 | 8 | defect 7, proof 1 | 0 | 83% | 50.2 | 1330 |
| #8166 | gera | 48 | 8 | 0 | - | 0 | 83% | 90.8 | 1102 |
| #9622 | gera | 47 | 11 | 6 | defect 4, proof 2 | 1 | 79% | 14.3 | 1093 |
| #8978 | fede | 47 | 6 | 2 | defect 2 | 0 | 98% | 1.4 | 926 |
| #10049 | fede | 47 | 9 | 7 | process 3, defect 2, proof 2 | 1 | 98% | 4.7 | 974 |
| #9081 | gera | 46 | 7 | 6 | defect 5, process 1 | 0 | 78% | 34.1 | 1667 |
| #10604 | fede | 45 | 7 | 5 | defect 5 | 0 | 87% | 6.8 | 994 |
| #10008 | fede | 45 | 5 | 3 | process 3 | 3 | 93% | 1.9 | 746 |
| #8986 | fede | 45 | 6 | 3 | defect 1, process 1, reversal 1 | 2 | 93% | 13.6 | 683 |
| #7942 | gera | 45 | 8 | 0 | - | 0 | 64% | 97.4 | 791 |
| #8945 | gera | 45 | 6 | 2 | process 1, infra 1 | 1 | 80% | 2.0 | 1320 |
| #9023 | fede | 44 | 10 | 1 | defect 1 | 0 | 91% | 13.6 | 666 |
| #9244 | fede | 44 | 9 | 4 | defect 4 | 0 | 86% | 2.1 | 172 |
| #9948 | fede | 44 | 5 | 3 | defect 2, process 1 | 1 | 89% | 1.4 | 2683 |
| #8977 | fede | 44 | 7 | 3 | defect 2, proof 1 | 2 | 89% | 12.0 | 276 |
| #9756 | gera | 44 | 6 | 2 | process 2 | 1 | 98% | 2.0 | 1858 |
| #9452 | fede | 43 | 9 | 2 | ci-red 2 | 0 | 91% | 11.9 | 278 |
| #8893 | fede | 43 | 6 | 3 | defect 3 | 0 | 86% | 2.7 | 1229 |
| #9039 | fede | 43 | 10 | 7 | defect 6, process 1 | 3 | 100% | 14.6 | 1072 |
| #8813 | gera | 43 | 6 | 3 | ? 1, defect 1, process 1 | 0 | 79% | 4.3 | 1300 |
| #9750 | fede | 43 | 6 | 1 | process 1 | 0 | 84% | 3.4 | 883 |
| #12286 | fede | 43 | 10 | 7 | defect 3, process 2, proof 2 | 2 | 100% | 4.6 | 1367 |
| #12305 | fede | 43 | 6 | 3 | defect 1, proof 1, reversal 1 | 1 | 100% | 6.3 | 1471 |
| #9477 | fede | 43 | 6 | 4 | process 2, defect 1, proof 1 | 2 | 81% | 4.9 | 118 |
| #11414 | fede | 43 | 11 | 8 | process 5, defect 1, infra 1, stale 1 | 6 | 98% | 12.8 | 4308 |
| #10201 | fede | 43 | 8 | 4 | defect 4 | 0 | 88% | 2.1 | 1072 |
| #10241 | gera | 43 | 1 | 0 | - | 0 | 100% | 5.5 | 22 |
| #9402 | gera | 42 | 13 | 3 | proof 2, defect 1 | 1 | 95% | 18.7 | 1795 |
| #9487 | fede | 42 | 7 | 5 | process 3, proof 2 | 3 | 90% | 1.9 | 550 |
| #9576 | gera | 42 | 7 | 5 | defect 5 | 3 | 95% | closed | 2030 |
| #9509 | gera | 42 | 8 | 0 | - | 0 | 98% | 14.3 | 557 |
| #12863 | fede | 42 | 9 | 5 | ci-red 2, defect 2, stale 1 | 0 | 83% | open | 1246 |
| #10157 | fede | 42 | 8 | 0 | - | 0 | 95% | 7.2 | 1635 |
| #12149 | fede | 42 | 6 | 2 | defect 1, ci-red 1 | 1 | 81% | closed | 997 |
| #8674 | fede | 42 | 6 | 3 | defect 2, stale 1 | 0 | 86% | 8.7 | 827 |
| #11985 | fede | 42 | 8 | 4 | proof 2, defect 2 | 2 | 76% | 2.4 | 1348 |
| #9543 | fede | 41 | 8 | 4 | defect 3, proof 1 | 2 | 100% | 6.5 | 675 |
| #12022 | fede | 41 | 5 | 4 | defect 2, proof 2 | 3 | 76% | 1.5 | 964 |
| #12076 | gera | 41 | 8 | 3 | defect 3 | 1 | 90% | 5.5 | 1295 |
| #8937 | gera | 41 | 7 | 1 | proof 1 | 0 | 85% | 2.4 | 736 |
| #9167 | gera | 41 | 7 | 4 | defect 4 | 3 | 90% | 6.3 | 1149 |
| #9979 | gera | 41 | 6 | 2 | defect 1, process 1 | 2 | 66% | 3.4 | 806 |
| #11765 | fede | 41 | 7 | 3 | proof 2, defect 1 | 2 | 80% | 3.3 | 1594 |
| #11292 | fede | 41 | 8 | 8 | defect 6, proof 2 | 4 | 95% | closed | 3702 |
| #9860 | fede | 41 | 7 | 3 | defect 3 | 2 | 88% | 3.0 | 821 |
| #9771 | fede | 41 | 5 | 1 | defect 1 | 1 | 83% | 11.0 | 902 |
| #10835 | fede | 40 | 8 | 4 | defect 3, stale 1 | 2 | 88% | 4.8 | 998 |
| #8888 | fede | 40 | 4 | 3 | defect 3 | 1 | 92% | 3.1 | 590 |
| #10064 | fede | 40 | 8 | 3 | defect 3 | 0 | 98% | 19.2 | 1271 |
| #8844 | fede | 40 | 6 | 2 | defect 2 | 1 | 80% | 2.3 | 435 |
| #10560 | fede | 40 | 9 | 3 | defect 3 | 1 | 80% | 5.7 | 93 |
| #10567 | fede | 40 | 5 | 3 | defect 2, process 1 | 1 | 78% | 2.6 | 1634 |
| #10016 | fede | 40 | 4 | 3 | defect 3 | 1 | 100% | 3.9 | 1258 |
| #9180 | gera | 40 | 9 | 0 | - | 0 | 88% | 4.8 | 1283 |
| #9753 | gera | 40 | 7 | 1 | process 1 | 1 | 78% | 7.4 | 1444 |
| #10316 | fede | 39 | 8 | 5 | defect 4, rule 1 | 2 | 100% | 3.5 | 1858 |
| #9455 | fede | 39 | 7 | 5 | defect 3, proof 2 | 2 | 87% | 4.4 | 406 |
| #10822 | fede | 39 | 8 | 6 | proof 3, process 2, ci-red 1 | 4 | 92% | 21.0 | 1936 |
| #10877 | fede | 39 | 6 | 5 | defect 4, rule 1 | 1 | 54% | 2.6 | 1164 |
| #8782 | gera | 39 | 7 | 0 | - | 0 | 82% | 3.5 | 1272 |
| #9779 | fede | 39 | 5 | 2 | defect 2 | 1 | 85% | 8.6 | 474 |
| #9885 | fede | 39 | 7 | 5 | defect 2, proof 2, ci-red 1 | 3 | 82% | 2.5 | 1201 |
| #10534 | fede | 39 | 5 | 3 | defect 1, reversal 1, process 1 | 0 | 85% | 1.2 | 1094 |
| #9089 | gera | 39 | 7 | 1 | process 1 | 0 | 100% | 1.9 | 158 |
| #9109 | gera | 39 | 7 | 0 | - | 0 | 100% | 4.0 | 42 |
| #8669 | fede | 39 | 6 | 4 | defect 3, process 1 | 1 | 90% | closed | 864 |
| #9304 | gera | 39 | 8 | 7 | defect 3, process 2, proof 2 | 4 | 77% | 2.0 | 731 |
| #10397 | gera | 38 | 8 | 1 | reversal 1 | 1 | 82% | 3.0 | 743 |
| #10694 | fede | 38 | 5 | 2 | defect 1, reversal 1 | 0 | 92% | 3.1 | 1696 |
| #9030 | gera | 38 | 7 | 0 | - | 0 | 74% | 17.9 | 1374 |
| #8852 | fede | 38 | 7 | 3 | stale 1, process 1, proof 1 | 1 | 89% | 2.8 | 862 |
| #10010 | fede | 38 | 7 | 4 | defect 4 | 2 | 92% | 13.0 | 2479 |
| #10166 | gera | 38 | 4 | 0 | - | 0 | 95% | 3.3 | 12 |
| #9737 | fede | 38 | 6 | 3 | defect 3 | 0 | 79% | 1.9 | 322 |
| #9282 | fede | 38 | 6 | 4 | defect 4 | 1 | 89% | 2.2 | 194 |
| #10904 | fede | 38 | 7 | 6 | defect 5, process 1 | 1 | 84% | 2.3 | 1341 |
| #8780 | gera | 38 | 5 | 1 | defect 1 | 0 | 66% | 4.0 | 446 |
| #8999 | fede | 38 | 5 | 1 | defect 1 | 0 | 84% | 1.1 | 556 |
| #9784 | fede | 38 | 7 | 3 | defect 2, reversal 1 | 2 | 87% | 8.6 | 1534 |
| #10388 | fede | 37 | 7 | 4 | defect 3, reversal 1 | 0 | 92% | 2.5 | 1296 |
| #10440 | gera | 37 | 12 | 7 | proof 3, process 2, defect 2 | 4 | 76% | 8.9 | 1286 |
| #9479 | fede | 37 | 5 | 1 | process 1 | 0 | 78% | 6.4 | 312 |
| #9962 | fede | 37 | 7 | 3 | defect 3 | 0 | 95% | 13.4 | 2267 |
| #13185 | fede | 37 | 8 | 2 | proof 2 | 1 | 100% | open | 1239 |
| #8944 | gera | 37 | 6 | 2 | defect 2 | 0 | 84% | 0.8 | 650 |
| #10141 | fede | 37 | 7 | 6 | defect 3, proof 2, rule 1 | 0 | 89% | 2.5 | 1617 |
| #11901 | fede | 37 | 10 | 7 | defect 3, ci-red 3, stale 1 | 2 | 100% | 2.2 | 1992 |
| #10882 | fede | 37 | 8 | 4 | defect 4 | 2 | 92% | 4.1 | 1814 |
| #10418 | gera | 36 | 8 | 5 | process 3, defect 2 | 2 | 94% | 91.6 | 1563 |
| #8864 | gera | 36 | 6 | 4 | defect 2, stale 2 | 1 | 78% | 1.1 | 154 |
| #9062 | gera | 36 | 9 | 1 | reversal 1 | 0 | 89% | 14.5 | 1091 |
| #9125 | gera | 36 | 8 | 6 | defect 5, infra 1 | 4 | 92% | 1.8 | 665 |
| #8309 | gera | 36 | 4 | 1 | defect 1 | 0 | 86% | 52.2 | 987 |
| #11790 | fede | 36 | 12 | 4 | process 2, ci-red 1, proof 1 | 2 | 97% | 7.8 | 982 |
| #8702 | gera | 36 | 3 | 1 | defect 1 | 0 | 97% | 0.6 | 602 |
| #9459 | fede | 36 | 6 | 2 | defect 2 | 0 | 86% | 5.4 | 579 |
| #9475 | fede | 36 | 6 | 5 | proof 5 | 2 | 78% | 6.2 | 428 |
| #9874 | fede | 36 | 6 | 4 | process 3, stale 1 | 1 | 92% | 4.0 | 5441 |
| #9308 | gera | 36 | 4 | 3 | defect 3 | 0 | 75% | 1.2 | 507 |
| #9758 | gera | 36 | 10 | 0 | - | 0 | 94% | 3.4 | 1535 |
| #12679 | fede | 35 | 7 | 5 | defect 4, proof 1 | 4 | 100% | 14.7 | 2126 |
| #11913 | fede | 35 | 7 | 6 | defect 5, rule 1 | 1 | 100% | 3.5 | 2153 |
| #9236 | fede | 35 | 8 | 5 | defect 4, proof 1 | 2 | 100% | 2.2 | 2797 |
| #8796 | gera | 35 | 5 | 1 | process 1 | 0 | 89% | 2.5 | 799 |
| #9890 | fede | 35 | 4 | 2 | defect 2 | 0 | 97% | 1.8 | 752 |
| #8736 | gera | 35 | 7 | 1 | proof 1 | 0 | 94% | 60.3 | 2135 |
| #12289 | fede | 35 | 10 | 6 | defect 4, process 2 | 2 | 74% | 3.0 | 264 |
| #10025 | fede | 35 | 5 | 3 | defect 3 | 2 | 97% | 3.1 | 1043 |
| #9884 | fede | 35 | 4 | 2 | defect 1, ci-red 1 | 0 | 91% | 8.9 | 641 |
| #7366 | gera | 35 | 8 | 1 | defect 1 | 0 | 71% | 172.1 | 762 |
| #9657 | fede | 34 | 1 | 1 | defect 1 | 0 | 68% | 0.5 | 1582 |
| #10713 | fede | 34 | 7 | 4 | rule 2, proof 1, defect 1 | 0 | 100% | 9.7 | 1061 |
| #9527 | gera | 34 | 8 | 1 | defect 1 | 0 | 94% | 175.2 | 2081 |
| #9524 | fede | 34 | 6 | 3 | process 2, stale 1 | 0 | 97% | 2.4 | 1256 |
| #9057 | gera | 34 | 8 | 0 | - | 0 | 100% | 2.6 | 1410 |
| #10756 | fede | 34 | 6 | 2 | process 1, defect 1 | 0 | 88% | 5.9 | 2052 |
| #9583 | fede | 34 | 5 | 2 | defect 2 | 0 | 91% | 4.7 | 315 |
| #9457 | fede | 34 | 7 | 3 | defect 3 | 0 | 100% | 3.7 | 502 |
| #8637 | fede | 34 | 7 | 2 | defect 1, stale 1 | 1 | 94% | 29.2 | 845 |
| #11227 | fede | 33 | 6 | 4 | stale 2, process 1, defect 1 | 2 | 85% | 11.0 | 1808 |
| #9204 | fede | 33 | 6 | 4 | process 2, proof 1, defect 1 | 1 | 97% | 1.8 | 556 |
| #9235 | fede | 33 | 6 | 2 | defect 2 | 0 | 91% | closed | 657 |
| #12855 | fede | 33 | 7 | 3 | defect 1, proof 1, ci-red 1 | 1 | 97% | open | 1146 |
| #10706 | fede | 33 | 6 | 4 | defect 4 | 2 | 100% | 9.8 | 1410 |
| #9966 | fede | 33 | 4 | 2 | defect 1, proof 1 | 0 | 94% | 6.5 | 1451 |
| #10012 | fede | 33 | 3 | 2 | defect 2 | 0 | 100% | 3.1 | 841 |
| #9833 | gera | 33 | 6 | 2 | process 2 | 0 | 85% | 1.2 | 1235 |
| #10752 | fede | 33 | 8 | 5 | defect 3, process 2 | 2 | 100% | 1.9 | 404 |
| #10004 | gera | 33 | 6 | 3 | defect 1, process 1, reversal 1 | 0 | 67% | 29.2 | 1190 |
| #8738 | gera | 33 | 3 | 0 | - | 0 | 97% | 3.2 | 313 |
| #12455 | fede | 33 | 9 | 8 | defect 6, proof 2 | 4 | 97% | 2.8 | 1102 |
| #9088 | gera | 33 | 7 | 2 | defect 2 | 1 | 97% | 1.5 | 730 |
| #9106 | fede | 33 | 5 | 3 | process 3 | 2 | 82% | 2.5 | 1179 |
| #8572 | fede | 33 | 7 | 3 | process 1, infra 1, defect 1 | 1 | 79% | 4.9 | 401 |
| #9201 | fede | 33 | 6 | 4 | defect 2, proof 2 | 2 | 88% | 2.4 | 1203 |
| #11075 | fede | 32 | 6 | 4 | defect 4 | 1 | 88% | 22.6 | 322 |
| #10281 | fede | 32 | 7 | 4 | defect 3, infra 1 | 1 | 100% | 4.4 | 913 |
| #9443 | gera | 32 | 5 | 1 | process 1 | 0 | 84% | 2.3 | 1028 |
| #8855 | fede | 32 | 5 | 2 | defect 2 | 0 | 88% | 1.6 | 1673 |
| #12038 | fede | 32 | 7 | 6 | defect 6 | 2 | 100% | 10.0 | 2669 |
| #8853 | fede | 32 | 5 | 1 | defect 1 | 1 | 81% | 1.8 | 911 |
| #12643 | fede | 32 | 7 | 2 | proof 2 | 0 | 88% | 7.8 | 855 |
| #10167 | fede | 32 | 7 | 3 | proof 2, defect 1 | 1 | 97% | 3.2 | 1495 |
| #9168 | gera | 32 | 5 | 2 | defect 2 | 0 | 75% | 2.8 | 1127 |
| #8560 | fede | 32 | 7 | 2 | rule 1, ci-red 1 | 1 | 72% | 6.1 | 1080 |
| #9891 | fede | 32 | 5 | 2 | process 1, defect 1 | 1 | 91% | 2.3 | 699 |
| #10572 | fede | 32 | 5 | 2 | defect 2 | 1 | 94% | 1.9 | 1169 |
| #10031 | fede | 32 | 5 | 4 | defect 4 | 0 | 100% | 2.2 | 1405 |
| #11943 | fede | 32 | 5 | 4 | defect 4 | 1 | 81% | 1.0 | 795 |
| #9291 | gera | 32 | 6 | 4 | defect 4 | 0 | 91% | 1.6 | 798 |
| #9179 | gera | 32 | 9 | 2 | defect 1, ci-red 1 | 0 | 91% | 4.6 | 869 |
| #11160 | fede | 31 | 11 | 7 | defect 6, proof 1 | 3 | 94% | 10.8 | 1139 |
| #9644 | fede | 31 | 6 | 2 | defect 2 | 1 | 97% | 1.4 | 630 |
| #9717 | gera | 31 | 9 | 0 | - | 0 | 65% | 41.8 | 885 |
| #9054 | gera | 31 | 5 | 4 | process 3, defect 1 | 1 | 81% | 14.7 | 382 |
| #9968 | fede | 31 | 6 | 4 | defect 4 | 0 | 97% | 2.1 | 603 |
| #10130 | fede | 31 | 6 | 4 | defect 2, reversal 1, ci-red 1 | 1 | 94% | 1.6 | 963 |
| #8900 | gera | 31 | 6 | 3 | defect 3 | 2 | 87% | 1.2 | 809 |
| #12536 | fede | 31 | 5 | 4 | rule 1, proof 1, defect 1, process 1 | 0 | 87% | 2.3 | 585 |
| #9852 | gera | 31 | 8 | 1 | process 1 | 1 | 94% | 10.2 | 2320 |
| #11896 | fede | 31 | 5 | 2 | defect 2 | 1 | 84% | 1.2 | 1276 |
| #10933 | fede | 31 | 7 | 5 | defect 4, stale 1 | 2 | 94% | 2.6 | 1140 |
| #9579 | fede | 31 | 6 | 3 | process 2, defect 1 | 1 | 100% | 3.4 | 191 |
| #11372 | fede | 31 | 5 | 4 | process 2, defect 2 | 1 | 84% | 3.5 | 889 |
| #10240 | fede | 31 | 4 | 1 | defect 1 | 1 | 84% | 6.7 | 770 |
| #9883 | fede | 31 | 5 | 3 | process 2, defect 1 | 2 | 90% | 1.5 | 1352 |
| #8964 | fede | 31 | 4 | 1 | proof 1 | 0 | 87% | 2.0 | 523 |
| #9226 | fede | 30 | 7 | 2 | stale 2 | 0 | 97% | 1.7 | 540 |
| #10255 | fede | 30 | 5 | 4 | defect 2, proof 2 | 0 | 83% | closed | 972 |
| #10794 | gera | 30 | 4 | 3 | defect 3 | 1 | 83% | 3.2 | 1161 |
| #13192 | fede | 30 | 7 | 1 | defect 1 | 1 | 100% | 2.9 | 564 |
| #13245 | fede | 30 | 4 | 1 | defect 1 | 0 | 100% | open | 1557 |
| #8925 | fede | 30 | 3 | 3 | defect 3 | 0 | 83% | closed | 1209 |
| #12595 | gera | 30 | 10 | 3 | ci-red 3 | 1 | 90% | 4.2 | 1133 |
| #12648 | fede | 30 | 4 | 2 | defect 2 | 1 | 90% | 10.4 | 102 |
| #11941 | fede | 30 | 7 | 3 | defect 3 | 1 | 97% | 6.5 | 1630 |
| #8431 | gera | 30 | 7 | 3 | proof 2, defect 1 | 0 | 80% | 33.6 | 538 |
| #12255 | fede | 30 | 8 | 3 | defect 3 | 2 | 77% | 3.0 | 283 |
| #12268 | fede | 30 | 7 | 3 | defect 2, process 1 | 1 | 73% | 3.2 | 415 |
| #9084 | gera | 30 | 6 | 5 | defect 2, proof 2, process 1 | 2 | 97% | 1.0 | 591 |
| #11283 | fede | 30 | 5 | 5 | defect 4, ci-red 1 | 4 | 93% | closed | 2591 |
| #10253 | fede | 30 | 7 | 3 | defect 3 | 0 | 90% | 6.0 | 963 |
| #9285 | fede | 30 | 5 | 2 | defect 1, process 1 | 1 | 100% | 1.6 | 1182 |
Sources: verbatim accounts from sessions 000, 001, 004, 006, and the orchestrator (003), collected the same morning; the PR timeline pull for 2026-09-28T18:00Z–2026-09-29T14:30Z (100 fede-authored PRs); the orchestrator's overnight log. Full accounts: scratchpad/retro-session-accounts-2026-09-29.md. One data-collection error: the PR-timeline pull reports zero 🔴 findings in the window — the session accounts describe dozens of 🔴 rounds, so review-round and red-main counts below come from the pull, but "zero reds" is not used anywhere in this retro.
Fede's question, verbatim: "every time we say no more work in progress, finish tonight, then I come back and there's dozens of open pull requests and the sessions seem to be asleep. What is going on?" Sessions were awake and working almost the whole night — the accounts show pushes, rebases, and merges into the early morning. The open list built up from four separate mechanisms, not from anyone stopping.
| PR | Age | State | Owner session | Cause |
|---|---|---|---|---|
| #13728 | ~1h | armed, green | 003 | second review round just closed |
| #13714 | ~2h | blocked | 003 | required CI job skipped on head |
| #13613 | ~7h | DIRTY | 000 | sibling PR merged same lines |
| #13611 | ~7h | DIRTY | 000 | six review rounds, still rebasing |
| #13600 | ~8h | 🟡 armed | 001 | blocked 6h on a stale review check-run; fresh head pushed |
| #13583 | ~8h | merged (sweep stale) | 000 | landed before the morning list updated |
| #13577 | ~9h | unarmed | 000 | six rounds, scratchpad file collision |
| #13559 | ~10h | green, unarmed | 000 | waiting on the re-arm sweep |
| #13534 | ~10h | green, unarmed | 000 | waiting on the re-arm sweep |
| #13511 | ~10h | armed | 001 | eleven review rounds, redesign cycles |
| #12855 | ~37h | blocked on Fede | 003 | over the 1,000-line gate, needs admin merge |
| #12871 | stacked | draft, blocked | 003 | waits on #12855 |
| #12879 | stacked | draft, blocked | 003 | waits on #12871 |
| #12892 | stacked | draft, blocked | 003 | waits on #12879 |
| #12910 | stacked | draft, blocked | 003 | waits on #12855 |
Ages are hours-open readings from the PR-timeline pull (collection window ends 14:30Z), so a few merged shortly after Fede's 07:50 look. The chain PRs predate the pull's window; their age is described, not measured.
review=failure check-run from 07:45Z; a later review=success in a different check suite never overrode it, and a review rerun re-stamped success without clearing it. #13714 (session 003): a PR whose affected-test selection exceeded the 200-file cap gets "Unit Tests (decision)" left in progress until review, the required "Unit Tests" verdict posts only on a review run, and the review bot skipped the new head because GitHub had moved an earlier APPROVE forward. Cures today: gh pr update-branch for a fresh head, and dismissing the stale bot approval. Both are handed to Smith on the bridge; the fix is to compare against the original commit when deciding whether a review still stands, and to post one required verdict per head.mds/mdworker processes sat at 200–350% CPU indexing 16 full lane clones (not worktrees), so the guard blocked builders' own test commands and CI became the first run of the tests. Each defect that a two-minute local run would have caught instead cost a full CI-plus-review round: ~1.5h for session 001, ~2h for 006, two refusals logged by 000.--delete-branch auto-closed its stacked child twice — #13448 and #13635 — and a closed PR can't retarget, so each needed a brand-new PR (#13701, #13728) and a fresh review from round one. #13614/#13615 were dropped the same way.gh pr list --author fede-propflow, so eight PRs opened by other sessions aged 6–10 hours unseen. It reported "everything merged except two" at 13:5xZ — wrong, for that reason.CI_RUNS_ON sat at 0 for seven days (09-21–09-28), pushing every run onto GitHub-hosted runners instead of self-hosted; session 004's billing read shows $533 / $260 / $1,026 gross on 09-26/27/28.~/.claude/scripts/load-guard.sh, hook timeout raised to 600s).node_modules: PR #13739 open and armed (before: every local vitest run refused, "CI is the gate"; after: same run passes locally). Accepts only a symlink to another checkout of the same repo with a byte-identical lockfile and identical in-repo packages.| Proposal | Fixes cause # | Owner | Recommendation |
|---|---|---|---|
| (a) Require an up-to-date branch, or a merge queue | 2 | Fede yes → Smith-CI | Adopt. Repo-wide CI behavior change; needs Fede's go before Smith builds it. |
| (b) Ratchet / fence / one-seam tests run on every PR, never affected-only | 2, 3 | Fede yes → Smith-CI | Adopt. Same reasoning as (a) — it's the affected-only path that let red main hide until merge. |
| (c) Red main does not disarm PRs already green at their head | 2 | Smith-CI | Adopt now. Already the 09-17 ruling; the guard just doesn't implement it yet. |
| (d) Owning an unmerged PR ⇒ 20-min REST fallback wake, never "waiting on events" alone; Stop hook refuses to end a turn without a registered timer | 1 | local hook | Adopt now. No customer effect, closes the single biggest loss. |
(e) Orchestrator sweeps gh pr list --author fede-propflow every 20 min | 7 | local hook / orchestrator rule | Adopt now. |
(f) Lanes as worktrees, not clones; Spotlight exclusions applied with sudo | 3 | Fede yes (sudo) | Adopt the worktree change now. The sudo bash ~/spotlight-exclude.sh step needs Fede's go — today mdfind -onlyin ~/agents still returns 10,624 package.json hits, so ~/agents is not excluded yet. |
(g) Refuse gh pr merge --delete-branch on a parent when another open PR bases off it | 5 | local hook | Adopt now. |
| (h) Same-file PR families go on one integration branch | 2, 4 | repo rule | Adopt now. |
| (i) A PR over 1,000 lines is cut, not admin-merged | 6 | repo rule (gate already merged as #13432) | Hold the line: no more admin-bypass exceptions like #12855; split the chain instead of asking for another one. |
(j) CI_RUNS_ON back on self-hosted; alert when it flips to 0 | 8 | Fede yes → Smith-CI | Adopt. Infra/spend call — needs Fede's go. |
Source: PR-timeline pull, 2026-09-28T18:00Z–2026-09-29T14:30Z, 100 fede-authored PRs.
| Metric | Value |
|---|---|
| PRs opened in window | 100 |
| Merged / open / closed unmerged | 86 / 8 / 6 |
| Avg hours open (merged + closed only) | 2.77 |
| Review rounds, total (39 PRs with reviews) | 146 |
| Red main runs in window | 11 |
| Merges to main, all authors (Fede / Gera) | 333 total — Gera 229 (69%) / Fede 104 (31%) |
| Rule-change (CI/chore) PRs merged | 9 |