Files
sentiment-engine/prod/exec_unified/_constants.py
Codex 670b739a83 exec(unified): drive loop §7 — PINK _handle_expired_working ported + audit build items
drive_loop.py transcribes pink_direct.py:1089 (the 10-step expiry sequence) warts-and-all
against injected ports (ExecPort seam: clock+kernel+venue), so no ambient state (C1). Carries
the scar tissue: pump-before-cancel, re-classify-after-cancel (fill races cancel), EXIT never
strands→MARKET, slot-busy double-entry guard, fail-safe venue-truth requote gate. SEAM
learnings preserved as referenced comments (zero-silent-suppression rule). Decimal sizes (H1).

- working.py: WorkingRegistry + WorkingOrder, injected clock, rejected→expire_now (one shared
  path). contract.py: client_order_id_core(attempt) — unique per attempt (audit H4/FIX).
- _constants.py: REQUOTE_HOT_WINDOW_S=5.0 (prov: 2026-06-10 double-entry).
- inventory §6: audit build items BI-1..5 folded in.
- test_drive_loop.py: 15 scar-tissue tests. Mutation-verified RED under exit-no-escalate
  (kills 3) and no-hot-window (kills double-entry guard). Full exec_unified suite: 77 green.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-14 23:51:04 +02:00

37 lines
1.9 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Policy constants — from data, never vibes (spec §6 closing note).
Every constant cites its provenance. Where a number is not yet backed by an L8/L10
characterization row it is marked PROVISIONAL and must be calibrated before the smart
path arms with real capital — a provisional constant is a known-unknown, not a vibe.
Cadence is NEVER hardcoded here (no literal 1 s): the drive loop takes its clock
injected (spec §7, C1). These are policy magnitudes, not periods.
"""
from __future__ import annotations
from decimal import Decimal
# PROTECT: "maker at touch, one reprice, ≤2 s total, then cross" (spec §6).
PROTECT_REPRICE_LIMIT: int = 1
PROTECT_MAX_MS: int = 2_000
# HARVEST: "maker at target ± offset, chase ≤ N; give up when regression eats X%
# of unrealized → cross" (spec §6). N and X are PROVISIONAL — no characterization
# row fixes them yet (§17 open question: chase bounds from bookDepth replay).
HARVEST_MAX_CHASES: int = 3 # PROVISIONAL — calibrate vs L8 fill_sim
HARVEST_GIVEUP_REGRESSION_FRAC: Decimal = Decimal("0.25") # PROVISIONAL — 25% of unrealized
# ACQUIRE: "patient maker inside spread; abandon, never chase" (spec §6, §4-1:
# a missed entry is free, a chased entry is not). No chase budget by construction.
ACQUIRE_MAX_CHASES: int = 0
# Dead-man's stop default multiple of software SL distance (spec §10, §17 open
# question: 2× vs ATR-scaled). PROVISIONAL default.
PROTECTIVE_STOP_MULT_DEFAULT: Decimal = Decimal("2.0")
# Requote hot-window: after an OWN fill, refuse to re-quote for this long because the
# REST venue reconcile lags the WS fill by seconds — re-quoting inside it double-enters.
# Provenance: live double-entry, pink_direct.py:1055 / :1323 (2026-06-10). Measured in
# injected-clock seconds; the loop reads it, never a hardcoded literal in the branch.
REQUOTE_HOT_WINDOW_S: float = 5.0