Build Log
Temper Phase Contract
July 26, 2026
Harvest is the first job inside Temper, not a separate 8th phase — Alloy's Temper page rebuilt from a two-form shell into 8 real panels with a genuine candidate/disposition harvest model.
Timeline
What shipped
temper_decisions and temper_interventions tables — real candidate/accepted/rejected/merged/superseded lifecycle, matching learnings' own discipline
Arc Episode, Continuity Packet, and Workpiece-recommendation columns on arcs, with real check constraints
buildTemperSnapshot — one server-derived read model, following buildQuenchSnapshot's established convention
deriveTemperReadiness — deterministic readiness with no percentages, 26 passing unit tests
All 8 required Temper panels: Phase Header, Arc Episode, Decisions & Interventions, Session Dynamics, Learnings, Open Items & Return Conditions, Continuity Packet, Temper Summary
Right rail: Temper Readiness, Source Coverage, Arc Snapshot, collapsible Temper Workshop (honest not-yet-wired stub)
Real create-forms for Learnings and Open Items — captureLearning/addOpenItem actions existed but had zero UI callers anywhere in the app before this session
A real atomic Temper -> Bank phase transition (completeTemper), replacing a bare navigation Link that wrote no phase transition at all
returnTemperToQuench — the 'evidence is insufficient' escape hatch
Bank page rewired to read real Decisions/Learnings/Open Items/Continuity Packet data instead of the legacy learning_captured/next_item_captured events
14 real Playwright e2e tests driving the actual browser against the live dev DB, covering the spec's full acceptance list
“Quench decides what holds. Temper decides what matters. Bank makes it durable.”