DISMISSED — DSP-2 — PR #193's named cause for the VRP dispatch stall is falsified by its own table
status: dismissed as an OPEN ROW by panel run 31 (2026-09-30) · kept as a
correction of record, because the note it corrects self-merges unreviewed ·
sibling to dsp-1-dispatch-liveness-attested-on-send.md, which it EXTENDS with
new evidence rather than relitigating
Why this is a dismissal and not a row
The defects below are real, reproduced, and were each verified twice this run (change-review lens, then the chair). They are nonetheless not queue work:
- Wrong latency class.
research/**.mdis on theauto-merge-records.ymlfast path, so PR #193 self-merges with no human review the moment Actions returns (~2026-10-01, when the allowance resets). A row inopen/waits weeks. A file indismissed/merges at the same latency as the note itself. - Wrong shape. This is a one-file prose edit (~0.4 person-days in total), not an experiment with a mechanism, a data plan and a kill criterion.
- The queue is over its cap. True post-merge count is 13 items against a cap of 12 (main 12, minus FIN-4 via #190, plus LAB-1 via #188, plus FRZ-1 via #192). The eviction nominee is RWG-1, whose leg 3 is that a drawdown-kill-switch liquidation of the meanrev book would be blocked by the runaway guard as armed. Trading a live-path safety row for a markdown proofread is indefensible.
Recorded here so that the note's own closing instruction — "so the next session does not re-derive either" — does not stop future routines investigating a cause that is dead.
What #193 gets right, and it is the part that matters
The measurement is sound. Every workflow_dispatch timestamp in the note's
table reproduces to the second against the Actions API. The realised cost is
real: data/state/vrp/order_log.jsonl carries a manage:close on a live SPY
put credit spread on 2026-09-18, roughly two hours down the tape from where
the schedule intends. The phenomenon is not in question. Only the cause, the
counts, and the claimed detector coverage are.
Correction 1 — the "one structural difference" is not a difference
The note (:50-64) says: "VRP is the only one of the three workflows whose
workflow_dispatch: carries an inputs: block… paper-trading.yml,
paper-trading-meanrev.yml and skew-snapshot.yml all declare a bare
workflow_dispatch: with no inputs."
grep -rn "inputs:" .github/workflows/ returns three hits: _alert.yml:29,
paper-trading-vrp.yml:29, and paper-trading-meanrev.yml:31. meanrev
carries an identical inputs: dry_run: {type: boolean, default: false} block.
The note's own table is the negative control. Its meanrev column shows meanrev dispatched within 2–4 seconds of momentum on 09-16, 09-17, 09-18, 09-23, 09-24, 09-25 and 09-29 — every one a day it bolds VRP as late, including the largest lag in the whole table (09-17, +301 min). The workflow carrying the claimed cause is never late. A stdin-block mechanism would also have to bite meanrev first: it is second in the dispatcher's argv loop, VRP third.
Stated precisely, because the bound matters. The meanrev block landed
2026-09-14 (fbdf0dd; its parent has zero dry_run hits), so the control
covers 7 of the 9 bolded days — 09-16 onward — including two of the three
material stalls (09-17 and 09-18) but not 09-11 (+99), which predates it.
Seven consecutive dispatch days of a workflow with the identical block and no
lateness is sufficient to falsify the lead; claiming it covers all nine, or all
three stalls, would be the same overclaim this file exists to correct.
The offered fourth data point does not hold either. The note cites
skew-snapshot.yml as a no-inputs control, "punctual on all 14 of its
dispatch days". On 09-14, 09-15, 09-21 and 09-23 that workflow received no
workflow_dispatch at all (only the late schedule run). A no-inputs
workflow, dispatched alone, silently got zero dispatch on at least four
weekdays in the same window — so "no inputs ⇒ dispatched reliably" is false,
and the note's own denominator (14 of 19) already concedes five missing days
while the prose reads as a clean control.
A third mechanism the note does not rule out is already in this directory.
dsp-1:69-70 records that the 09-16 17:22:59Z re-dispatch was vrp-only, not
the agent's three-workflow batch — a targeted human action. That is the exact
timestamp #193 tables as VRP's morning dispatch arriving 166 min late. If those
late events are vrp-only make-up dispatches, the failure is "the batch
dispatched no VRP at all" — identical to the four skew misses and to 09-14 —
and the lag column is measuring human repair latency, not a hung call. The
note's confound section asserts only two explanations exist.
Consequence if uncorrected. The note asks the owner — the only person who
may touch scripts/dispatch_workflows.sh — to add -f dry_run=false at
VRP's call site only, an asymmetric change against a non-difference, and it
demotes the argv-reorder experiment to "if the log is inconclusive" when that
is now the only surviving hypothesis in its own hypothesis space.
Correction 2 — it resurrects a gate number a merged record retired
The note (:48) says the 09-18 close happened "49 trading days into its
126-day forward gate."
The pinned evaluator disagrees. thales --sleeve vrp forward-gate prints
min_live_trading_days | 38 | >= 126, "clean clock since 2026-07-27".
data/state/vrp/equity_history.jsonl has exactly 49 lines, first date
2026-07-13 — so 49 is the raw row count from activation, ignoring the
pre-registered once-only clock reset whose entire purpose is that the
pre-amendment days must not count.
That exact wrong number was retired eleven days earlier by a merged record on
main: research/2026-09-18_two_forward_gate_numbers_were_wrong.md (PR #178,
commit a325c3c) pins marks_since_activation 49 / marks_since_clean 39 / returns_since_clean 38. #193's own PR body says 38/126, so the note
contradicts both main and itself.
Consequence if uncorrected. The next reader — the daily audit, which declares itself a standing re-reader of this PR, and the ~Jan-2027 forward-gate read — inherits a maturity figure 11 trading days ahead of the gate, on the one live sleeve whose activation that gate decides. The identical error already misled the 09-17 daily audit into printing "48/126"; #177 is open about it.
Correction 3 — incidence and detector coverage are both overstated
- The prose says VRP was late on "7 of the 18 dispatch days". The table bolds 9: 09-04 +7, 09-11 +99, 09-16 +166, 09-17 +301, 09-18 +119, 09-23 +115, 09-24 +16, 09-25 +161, 09-29 +116. The PR body compounds it by listing 8 lag values against 9 dates.
- The prose says open PR #174 "would have raised all seven of these days".
#174's
scripts/detect_dispatch_gap.pysetsLATE_AFTER_MINUTES = 90and putsfailureinNON_DECISIVE_CONCLUSIONS. So 09-04 (+7) and 09-24 (+16) are under the bar, and 09-23 / 09-25 / 09-29 sit inside the billing refusal where every run concludedfailureand is non-decisive by design. #174 raises 4 of the 9 — 09-11, 09-16, 09-17, 09-18. - The table holds 18 rows; 2026-09-03 → 09-29 holds 19 weekdays. The
missing row is 09-14, the one day the dispatcher created no VRP dispatch
at all (
dsp-1:20). The reliability denominator silently excludes its worst day.
Correction 4 — four of the nine "late" days moved no decision at all
Not caught by the lens; found at review. Every sleeve's state stops at
2026-09-18 — data/state/vrp/equity_history.jsonl,
data/processed/equity_history.jsonl and data/state/meanrev/equity_history.jsonl
all end there, because Actions has refused every job since 09-21. So the
table's rows for 09-23 (+115), 09-24 (+16), 09-25 (+161) and 09-29 (+116) are
dispatch events for runs that never executed; they cost nothing. Netting
this against corrections 1 and 3, the live-regime truth is 12 dispatch days,
5 lates, 3 material stalls (09-11 +99, 09-17 +301, 09-18 +119) — with 09-16's
+166 attributable to a human re-dispatch per dsp-1. Not "7 of 18". The note's
numerator and denominator are both wrong, in opposite directions.
What should replace the lead
The argv-position hypothesis is now the only survivor in the note's own
hypothesis space, and the cheapest resolution is unchanged and owner-side: read
logs/dispatch.log on the Mac for the affected mornings and establish whether
the call hung, failed, or was never made. That distinguishes a stalled loop
from a batch that dispatched no VRP — which is the fork corrections 1 and 4
open, and no repo-side evidence can close it. Note also that the proposed
</dev/null remedy cannot be fixing a blocking stdin read under launchd:
neither dispatch plist sets StandardInPath, whose documented launchd default
is already /dev/null, and a stdin block has no natural 99 / 119 / 301-minute
timeout followed by success.
Reopens if
- (a) the owner (or any session) reads
logs/dispatch.logand the evidence supports a stdin/inputs block after all — in which case correction 1 is wrong and this file must be retracted, not quietly left standing; - (b) a
paper-trading-meanrev.ymldispatch is ever observed late by90 min while VRP's is on time, which would break the negative control this file rests on;
- (c) #193 merges and the daily audit or any later memo quotes "49 trading
days", "7 of 18", or "#174 covers all seven" as established fact — the
correction has then failed to land and belongs in
open/as a row; - (d) the
inputs:block is removed frompaper-trading-vrp.ymlon the strength of #193's lead and the lateness persists, which is the note's own experiment run backwards and settles it; - (e)
dsp-1's clause (a) fires — a session trades after the 16:00 ET close with the dispatch layer having failed silently. It has not: the worst live-regime lag, 09-17 at 19:49:11Z, is 15:49 ET, inside the session.
Panel-Item: run 31 change-review lens (corrections 1–3) + adversarial review (correction 4); three candidates folded into one file by the reviewer's ruling that they are one edit to one unmerged document.
2026-10-01 append — THE CORRECTION LANDED, and the symptom got worse
Dated append rather than an edit above the line, so the sequence stays readable.
All four corrections are in #193, by its author's own hand. Commit
d31afd0 on audit/vrp-dispatch-stall-2026-09-29 (2026-09-30 ~22:10Z)
retracts the named cause and credits this panel run: "The mechanism proposed
on 09-29 … is false. paper-trading-meanrev.yml:30-35 carries an identical
dry_run inputs block … Found by research panel run 31 (PR #194);
re-verified here by reading both workflow files." The PR title now carries the
retraction too. Corrections 2 and 3 are folded in verbatim (38 not 49, late-day
count 9 not 7, #174 covers 4 of 9 at its 90-minute bar), and the proposed
remedy is narrowed to timeout 60 plus </dev/null, dropping the
-f dry_run=false ask that rested on the dead hypothesis.
So reopen clause (c) is now moot in the good direction — the correction did not fail to land, and no row is owed. Clause (c) stays on the books only for the case where a later memo re-quotes the retired figures.
One correction of my own, for the record. #193's retraction says meanrev
"has been punctual 18 of 18 days". That is one day longer than its inputs:
block has existed — the block landed 2026-09-14 in fbdf0dd, whose parent has
zero dry_run hits. The control is 7 of the 9 bolded late days, as stated
above, not 18 of 18. The conclusion is unaffected and this is not worth a
further round; recorded so the 2027 reader is not told the control is wider
than it is.
The symptom has escalated, and it landed on the side of the fork this file
named. #193's append records that on 2026-09-30 momentum and meanrev
dispatched 2 s apart (14:42:13Z / 14:42:15Z) and VRP was NEVER dispatched —
no workflow_dispatch run exists for it that day, checked at 22:05Z. That is
no longer lateness; it is absence, and it is the third mechanism this file
named above: "the failure is 'the batch dispatched no VRP at all' — identical
to the four skew misses and to 09-14 — and the lag column is measuring human
repair latency, not a hung call." Two instances of total absence (09-14,
09-30) now sit alongside the lateness. The logs/dispatch.log read is
correspondingly more valuable, not less: it is the only thing that separates a
hung call from a call never made, and loop position (VRP third and last in the
plist argv) remains the standing correlate.
Nothing traded on 09-30 regardless — Actions refused every job that day too — so the absence cost nothing this time. It would have cost something on a working day.
Status of this PR, and a NOT-RUN. #194 is still unmerged at 2026-10-01
01:20Z. Its auto-merge check failed on 25c53f3 as a 5-second no-log runner
refusal (the repo-wide billing outage; the guard allows this path — see the
standing-down comment on the PR). I cannot spend the one re-run the
drive-to-green rules allow: POST /actions/runs/36725279536/rerun returns
403 Resource not accessible by integration, so re-running is outside this
routine's token scope. Recorded as a NOT-RUN rather than as a re-run spent.
Whether the 2026-10-01 allowance reset has taken effect is still untested: no workflow run has been created since 2026-10-01T00:00Z, and the last evidence either way is a Heartbeat Monitor run at 2026-09-30T23:23:21Z that failed in 9 s. The next natural signal is the ~14:35–14:45Z dispatch batch.
Also still open: #185 and #186 (the Actions-minute trims) were not merged before the new month's allowance began burning — the 09-30 daily audit called them "due tonight". They need a manual merge; auto-merge is itself an Actions workflow and cannot land its own fix. Each day they wait spends roughly one of the ~14 trading days #191 forecasts for October.