1.7 KiB
1.7 KiB
04. Resumable run-state persistence
meta: id: pygienium-04 feature: pygienium priority: P1 depends_on: [pygienium-01] tags: [infrastructure, state]
objective:
- Build
src/hygiene-state.ts: a resumable state file (pygienium/run-state.json) tracking one run per invocation with per-check phase status, so interrupted runs can resume and/pygienium-statuscan report progress.
deliverables:
src/hygiene-state.tsexportinginitRun,latestRun,latestResumableRun,readRunState,applyPhaseStatus,markRunStatus,tallyPhases- State schema:
{ runs: [{ run_id, mode, status, checks: { <check>: { status, attempt, last_error, artifacts, ... } } }] } - Idempotent writes (read-modify-write with safe merge); file absent / unparseable handled gracefully
steps:
- Port piolium's
audit-state.tsread/write helpers, renaming audit→run, phase→check - Implement
initRun(cwd, { mode })returning a fresh run state record applyPhaseStatus(cwd, run, checkName, patch)merges per-check statuslatestResumableRunreturns a run whose status is in_progress or failed (not complete)
tests:
- Unit: init -> apply phase complete -> markRunStatus complete reads back correctly
- Unit: unparseable file returns
parseErrorwithout throwing
acceptance_criteria:
readRunState(cwd)returns{ exists, parseError?, state? }- applyPhaseStatus persists and is readable by a subsequent read
- Resumable selection picks in_progress > failed, ignores complete
validation:
- Run a check, kill mid-flight, inspect
pygienium/run-state.json
notes:
- Keep schema forward-compatible-by-addition only within this build; no legacy migrations
- This file is the source of truth for
/pygienium-statusand/pygienium-resume