You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#422 and #423 first — smallest, fully local, no operator time, no interaction with anything else. They also establish the epic's shape: a test that fails today for a real reason.
#424 before #425 — Story 3 moves gates into CI; Story 4 adds a new gate. Adding the gate after the mechanism exists means it lands in the right place the first time.
#426 late — the only story that changes what happens on every git push. A hook that misfires blocks all work, so it should not be under a half-finished epic.
#427 any time — independent of the rest, and gated on operator availability rather than on code. Start it early if the operator is free; it has real elapsed-time waits.
#434 after #424. They are the same idea at two layers — CI's uv lock --check and the host's tag-vs-HEAD refusal — and having the cheap CI one first makes the production one easier to describe.
#428 last, strictly. It reports outcomes. Written earlier it would report predictions, and the difference between those two is the entire subject of this epic.
Per-story ritual — mandatory, no exceptions
Every story follows this, in order:
Branch from development, implement, open a PR
/code-review medium
/register-risk — address anything it registers
/review-diff
/register-risk — address anything it registers
If either /register-risk registered anything, return to step 1. Maximum 2 iterations.
/ship-it, push, merge to development
No branching off main, no PRs to main — everything through development.
Standing constraints for this epic
WET before DRY. Three stories touch CI workflows and two add shell scripts. Duplicate first; a shared helper is not on this epic's scope. Premature abstraction here would itself be untested shared machinery.
Skip, do not fail, where the environment cannot answer (C-320). Several of these gates cannot run in CI. pytest.skip with a reason that says why, and never a silent pass.
One line per command when the operator runs anything (C-339 — a multi-line paste destroyed a 528 KB production log on 2026-08-03).
No new merge-blocking checks for monitoring. Monitoring failures open issues; they do not redden pull requests.
Definition of done for the epic
The register is accurate — including where it says a concern is only narrowed. Every mechanism this epic touched has been observed doing its job, not merely believed to. #428 records both, and #421 closes.
Execution checklist for #421. One line per issue, in the order they should be done. Tick as each merges to
development.Order
HEARTBEAT_URLoff the curl command line (C-331) — merged as 085ef2a (fix: the heartbeat URL leaves the command line (C-331, #423) #432). Also surfaced C-344 (Tier 2,~/.profileworld-readable, every harvest credential) and C-345 (Tier 2, verification tooling reported a red suite as green)Why this order
#422 and #423 first — smallest, fully local, no operator time, no interaction with anything else. They also establish the epic's shape: a test that fails today for a real reason.
#424 before #425 — Story 3 moves gates into CI; Story 4 adds a new gate. Adding the gate after the mechanism exists means it lands in the right place the first time.
#426 late — the only story that changes what happens on every
git push. A hook that misfires blocks all work, so it should not be under a half-finished epic.#427 any time — independent of the rest, and gated on operator availability rather than on code. Start it early if the operator is free; it has real elapsed-time waits.
#434 after #424. They are the same idea at two layers — CI's
uv lock --checkand the host's tag-vs-HEAD refusal — and having the cheap CI one first makes the production one easier to describe.#428 last, strictly. It reports outcomes. Written earlier it would report predictions, and the difference between those two is the entire subject of this epic.
Per-story ritual — mandatory, no exceptions
Every story follows this, in order:
development, implement, open a PR/code-review medium/register-risk— address anything it registers/review-diff/register-risk— address anything it registers/register-riskregistered anything, return to step 1. Maximum 2 iterations./ship-it, push, merge todevelopmentNo branching off
main, no PRs tomain— everything throughdevelopment.Standing constraints for this epic
pytest.skipwith a reason that says why, and never a silent pass.Definition of done for the epic
The register is accurate — including where it says a concern is only narrowed. Every mechanism this epic touched has been observed doing its job, not merely believed to. #428 records both, and #421 closes.