Parking repricer — Phase B rollout

claude-sonnet-4-6 xhp-job-server claude/8d2b59f6 active
Today
S
You

Ship the sales-signal rollout for the parking repricer. Start with the guardrail so a bad signal can't reprice below floor, then wire the canary at 10%.

Claudeclaude-sonnet-4-6

On it. The rollout config already has a guardrails block — I'll extend it rather than bolt on a new path, so the kill-switch and the floor check share one evaluation.

Thought for 12s
The floor check belongs after fee computation, not before — otherwise the guardrail compares pre-fee numbers and can trip early. Canary weight lives in the rollout table; 10% is a row update, no deploy needed.
$
Bash
npm run typecheck — clean, 0 errors
done
Grep
rolloutGuard — 14 matches across 6 files
done
Read
backend/src/rollout.ts
done
Edit
rollout.ts — adding sales-signal guardrail
running

Guardrail is in. The canary gate now evaluates:

if (signal.adjustedPrice < quote.floor + FEES) {
  // never reprice below floor — hold and flag
  hold(quote, 'floor-guard');
} else {
  applySignal(signal, { weight: canary.weight });
}

Typecheck is clean. Next: the 10% canary row, then a dry-run against last week's sales to show what would have repriced.

S
You

Good. Use this rollout plan for the canary stages.

rollout-plan.md4.2 KB
Claude

Reading the plan — staging the canary as 10% → 25% → 100% with a 30-minute bake between steps

Reading rollout-plan.md…