BCN-1 — the liveness beacon is gated on job SUCCESS in five workflows, so a post-trade reporting failure withholds the "did it run" signal
status: dismissed by PANEL run 24 (2026-09-16), at its own adversarial review, before reaching the queue · class: loudness (G2) / detector coupling · never occupied a row in queue/open/ — filed here so the measurements are not re-derived and the reopen valve is visible to ls
Plain-language summary for an owner reading one paragraph. Every scheduled
job pings healthchecks.io at the end of its run; that ping is the only thing in
the system that proves a job ran at all. In five workflows the ping is gated on
the whole job having succeeded. In the two sleeve workflows the reconcile
step runs after trading is done and state is committed — so a failure in a
post-trade report withholds the liveness signal, and the sleeve reads as
"never ran" when in fact it traded normally. That is what happened to meanrev
from 09-11: a false drift alarm (the defect PR #171 addresses) held
thales-meanrev DOWN for four days. A detector defect disabled a detector.
This is dismissed anyway, because the owner was in fact paged on all three
red days through a channel that does not depend on the beacon, and what is left
is a design question only the owner can answer.
Mechanism — verified at HEAD 7fd0d74
if: ${{ success() }} guards the healthchecks ping at:
| workflow | line |
|---|---|
paper-trading-meanrev.yml | 192 |
paper-trading.yml | 374 |
paper-trading-vrp.yml | 137 |
fleet-digest.yml | 119 |
heartbeat-monitor.yml | 83 |
In the sleeve workflows thales portfolio reconcile runs if: always() after
Persist sleeve state, so the ordering is: trade → persist → commit → report
→ beacon. A red report reaches back past three completed steps and suppresses
the beacon.
Why it is dismissed — the backstop is real, and it fired
paper-trading-meanrev.yml:203-210 runs the shared _alert.yml on
always() && needs.trade.result != 'success' && != 'skipped'. It emails
independently of both the beacon and the fleet digest, and it fired on
2026-09-11, 09-14 and 09-15. Separately,
fleet_digest.digest_exceptions (fleet_digest.py:1171-1172) lists
no_run_sleeves as an exception that forces a same-day email even under the
new weekly cadence. So the owner was never actually un-pushed — which also
corrects the claim in PR #171's memo that "a genuinely missed meanrev run
would have looked identical." It would not: the two states are identical only
on the healthchecks channel, not on the fleet's.
What remains is a genuine design ruling with no defect behind it: should a liveness beacon mean the process ran or the process ran clean? Decoupling them trades the false-red this fixes for a new false-green risk (a job that runs, fails, and still reports alive). That is an owner call, not a bug, and minting a row for it at a 12/12 queue would displace an incumbent that has one.
Reopen condition
Reopen as a row if any of these becomes true:
- a beacon is withheld on a day when the
_alertpath also fails to deliver (the backstop is what carries this dismissal — if it lapses, the dismissal lapses with it); - any sleeve's beacon stays down ≥3 consecutive sessions for a cause outside the reconcile window-edge class that PR #171 addresses;
- the owner rules on the semantics and wants the decoupling implemented — at which point this is a build item, not a question.
Adjacent ground, do not duplicate: DGX-1 (open) holds the digest-gate
blindness, including the missed=None "no readable beacon" leg; FOS-2
(dismissed) holds the per-sleeve streak split.