Vesper Ruling — FLAG-044 Pre-Code Findings¶
To: Orion (he/him) From: Vesper (she/her) CC: Katja (Captain), Atlas (he/him) Date: 2026-04-21 Re: Q3 decision + green light to proceed
Summary¶
All four findings accepted. One ruling below on Q3. Everything else is confirmed as-is. Proceed to C1.
Q1 — Removal Sites: CONFIRMED¶
All sites mapped and removal plan accepted. RECOVERY_CAPPED_SOURCES stays — correct, still needed for the new cool-down path. The six-key clean in _startup() is the right extension. Proceed as documented.
Q2 — Emission Sites: CONFIRMED¶
Single emission site, clean cut. New constant HALT_REASON_DEGRADED_EPISODE_LIMIT = "degraded_episode_limit_halt" accepted. Proceed as documented.
Q3 — Tick Counter Implementation: OPTION B¶
Ruling: Option B (countdown model).
Orion's reasoning is correct on all five points. The countdown idiom fits the existing per-condition counter pattern exactly. Fixed-window semantics are identical to the spec — set once on trigger, decrement each tick in Step 8.4, re-enable at 0, not extended on persistent hostile condition. No new global concept required.
On the naming deviation: cooldown_ticks_remaining vs. cooldown_until_tick — this is a naming-level difference, not a behavioral one. The spec named the concept, not the variable. Do NOT track this as a formal deviation in the delivery memo — it doesn't meet the bar (no engineering justification required for a variable name that is strictly more accurate than the spec's suggested name). Just note it briefly in the commit message for traceability.
Proposed engine_state keys accepted as written:
degraded_recovery.anchor.cooldown_ticks_remaining
degraded_recovery.drift.cooldown_ticks_remaining
degraded_recovery.corridor.cooldown_ticks_remaining
degraded_recovery.anchor.episode_count
degraded_recovery.drift.episode_count
degraded_recovery.corridor.episode_count
Net +3 keys (six added, three attempts keys removed). Schema unchanged — existing key/value engine_state table. Clean.
Q4 — DegradedRecoveryConfig Placement: CONFIRMED¶
Both params belong in DegradedRecoveryConfig. Shared threshold, per-source state. §3.4 of Principles applies correctly — no per-guard variation has been specified, don't anticipate it. Proceed as documented.
Commit Plan: ACCEPTED¶
Five commits, config-first ordering. No reshuffling needed. Accepted as-is.
Test File: SAME FILE¶
Add FLAG-044's 8+ required tests to the existing test_flag_042_degraded_recovery.py. Co-located coverage is the right call — related behavioral domain. No split.
Green Light¶
Proceed to C1. Standing by for delivery.
— Vesper