fix(gate): lead-review hold 30min -> 10min, and the re-nag exclusion sized to it (DIVE-4420) - #928
Merged
Merged
Conversation
…sized to it (DIVE-4420) lodar, 2026-09-13: "30 minutes seems way to long tho". The hold buys the lead ONE dispatch to look at a human-bound gate before the phone rings; a non-fresh seat is re-dispatched every 15 minutes, so the second and third windows bought re-reads of a row already read, paid for by the person waiting. _GATE_LEAD_REVIEW_HOLD_SECS 1800 -> 600, and the sweep's DIVE-4365 exclusion tightened '-31 minutes' -> '-11 minutes' (hold + the same 60s margin the 840-not-900 sizing takes): a gate whose hold child died with its box is now re-nagged at the sweep's normal 15 minutes instead of 31. At 600s the exclusion is slack — the 15-minute never-pinged clock already clears the hold by 300s — and it is kept because it is the only thing that re-orders the two contacts if the hold is ever raised back. At 1800 the lead-review ceiling was the LONGEST of the three windows; at 600 it is the shortest, so a manual/secret tier-2 gate's withdraw-before-ping window narrows from 840s to 600s. Deliberate — the ask is a shorter wait, and the withdrawal window cannot outlast the wait it sits inside. Both comment blocks that asserted "longer than either type window" and "30 minutes" are corrected. Graded: gate_lead_review_routing_unit part 2 keeps its structural grep in step with the tightened literal, gains an arm reading the sweep's own never-pinged clock out of the source (the relation that is actually load-bearing at 600), and gains a bare pin at 600 so a raise reds rather than slides. Green: gate_lead_review_routing_unit 27/27, heartbeat_gate_renag_unit 21/21, gate_undo_window_unit 49/49, gate_notify_log_observable_unit 6/6, heartbeat_gate_escalate_unit 11/11. DIVE-4365 is unshipped, so its changelog fragment is amended in place rather than contradicted by a second bullet describing the same behaviour. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
github-merge-queue
Bot
removed this pull request from the merge queue due to failed status checks
Sep 13, 2026
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.
DIVE-4420 — the lead-review hold is 10 minutes, not 30
lodar, Telegram 2026-09-13 08:05Z, on DIVE-4365's hold: "30 minutes seems way to long tho".
What changed
_GATE_LEAD_REVIEW_HOLD_SECS1800 → 600 (src/task/notify.sh).'-31 minutes'→'-11 minutes'(src/cmd_heartbeat.sh) — the hold plus the same 60s margin the 840-not-900 sizing takes one layer down.changelog.d/DIVE-4365.mdamended in place (unshipped) rather than contradicted by a second bullet about the same behaviour.Why 10, and why the exclusion moved with it
The hold buys the lead one dispatch to look at the row. A non-fresh seat is re-dispatched every 15 minutes; the second and third windows bought re-reads of a row already read, paid for by the person waiting. Tightening the exclusion is what makes a gate whose hold child died with its box re-nag at the sweep's normal 15 minutes instead of 31 — the net sits just past the hold, not three windows past it.
At 600s the exclusion is slack: the sweep's own 15-minute never-pinged clock already clears the hold by 300s, so that is what keeps the buttoned ping ahead of the re-nag today. The clause is kept, and kept in step, because it is the only thing that re-orders the two contacts if the hold is ever raised back — and it is graded structurally, so a raise on one side reds.
The one behaviour narrowing, taken deliberately
At 1800 this ceiling was the longest of the three windows and replaced them. At 600 it is the shortest, so a manual/secret tier-2 gate's withdraw-before-ping window is now 600s, not 840s. The ask was a shorter wait before the phone rings, and a withdrawal window cannot outlast the wait it sits inside.
gate_undo_window_unit's manual/secret arms are tier-1 fixtures by design (DIVE-4365 note at the top of that file), so they still grade the 840 type ceiling and are unaffected. The two urgency skips are unchanged; nothing here can stop a gate.Grading
gate_lead_review_routing_unitpart 2 keeps its structural grep in step with the tightened literal, and gains two arms: one reading the sweep's never-pinged clock out of the source and assertinghold + 60 <= that(the relation that is actually load-bearing at this size), and a bare pin at 600 so a later raise reds rather than slides — every other arm is a relation and stays green at 1800.Local, on this branch's tree:
gate_lead_review_routing_unitheartbeat_gate_renag_unitgate_undo_window_unitgate_notify_log_observable_unitheartbeat_gate_escalate_unitheartbeat_gate_renag_unit's early-gate fixture (DIVE-10,-30 minutesage) hasgate_pinged_atSET, so the never-pinged exclusion never applied to it at either size — checked, not assumed.Ship: this is unshipped DIVE-4365 code. If it lands before today's hotfix-lane cut it rides with it; otherwise the next patch. Do not hold the cut for it.
🤖 Generated with Claude Code