CVN-N001-EK-S01 — Architecture: the tradability decision protocol¶
Story artifact required by ADR-0101 (Invariant 1). S01 is a governance/process Story, so "architecture" here is the process and system-interaction architecture of the protocol (Invariant 3), not source code. Companions: the Epic overview, the plan dossier (
plan_reviewPASSED, Meeting #269), the decision tree.
Executive summary¶
This architecture defines the governance / control plane for tradability decisions. It separates
durable rules (the ADR) from instance-specific values (the charter). It enforces tuple
registration, a killed-tuple check, FDR accounting, holdout discipline, and a risk-owner
veto, in a strict Phase 2→6 gate order. It produces a defensible verdict — PROMOTE, KILL, or
INFEASIBLE — and makes downstream optimisation before upstream proof structurally impossible. It does not
authorize trading or deployment. It is realised across Stories S01–S08 (S05+ only if upstream
PROMOTE).
1. Decision boundary¶
This architecture governs decisions about a strategy; it is not a trading system. It authorises no filtering, sizing, execution, or deployment before its gates are cleared. Charter lock (S03) and any run (S04) confer no trading authority. A switch to a different hypothesis family (e.g. cross-sectional / market-neutral) is a separate Epic with its own architecture, not an extension of this one.
2. What this architecture is¶
The protocol is a governance machine: it takes a named program thesis and produces a defensible verdict
while bounding the search by budget and forbidding any backward optimisation. The durable rules are the ADR
(adr/0102, a D1 deliverable, status Accepted); the instance values are the charter (D1, placeholders →
locked S03). This document is the control architecture that binds them: components, data contracts,
the state machine, enforcement points, violation policies, and the Story build-map.
3. Components¶
flowchart TB
subgraph GOV["Governance layer (durable)"]
ADR["ADR 0102 — durable rules
(Accepted; instance-free)"]
end
subgraph INST["Instance layer (per program)"]
CH["Charter
(placeholders → locked S03)"]
end
subgraph ENG["Decision engine"]
PIPE["Gate pipeline
Phase 2 → 3 → 4 → 5 → 6"]
VE["Verdict engine
PROMOTE / ONE-ITERATION /
KILL (tuple→family→thesis) / INFEASIBLE"]
end
subgraph STATE["Ledgers / registries (state)"]
RT["Registered tuples"]
KT["Killed-tuple register
(blocking gate)"]
FDR["FDR / multiple-testing ledger"]
HO["Final-holdout access log"]
BUD["Budgets
(families · ONE-ITERATION slots · FDR)"]
end
subgraph ROLES["Authority & gates"]
OP["Operator"]
ME["Methodology reviewer"]
RO["Risk owner
(blocking veto)"]
end
ADR -- "constrains" --> CH
ADR -- "defines rules of" --> PIPE
ADR -- "defines" --> VE
CH -- "supplies values to" --> PIPE
CH -- "names" --> RT
PIPE -- "emits" --> VE
VE -- "writes" --> KT
VE -- "decrements" --> BUD
PIPE -- "consults / appends" --> FDR
PIPE -- "reads once at verdict" --> HO
RT -- "checked against" --> KT
OP --- CH
ME --- CH
RO -- "joint sign-off + veto (S03)" --> CH
RO -- "veto blocks" --> PIPE
| Component | Role | Owns / produces |
|---|---|---|
ADR adr/0102 |
durable, instance-free rules (the "constitution") | the invariants; status Accepted |
| Charter | this program's instance: values + named thesis | placeholders (S02) → locked values (S03) |
| Gate pipeline | Phase 2→6, strict order | per-tuple stage outcomes |
| Verdict engine | maps stage outcomes to a terminal verdict | PROMOTE/ONE-ITERATION/KILL/INFEASIBLE |
| Registered-tuple register | every tuple under test (§4.1 schema) | tuple records + prior rationale |
| Killed-tuple register | anti-resurrection blocking gate (§4.2) | rejects materially-equivalent re-registrations |
| FDR ledger | multiple-testing accounting (§4.3 contract) | running FDR / family budget spend |
| Final-holdout access log | one-touch-per-tuple discipline (§4.4) | dated access entries |
| Budgets | bound the search | family / ONE-ITERATION / FDR allowances |
| Roles & gates | authority separation | joint sign-off; risk-owner blocking veto (§7) |
4. Data contracts (state)¶
These contracts are defined here (architecture) even though the values are filled in S02 and the storage is implemented in S03/S04. A named ledger without a contract is not an architecture.
4.1 Registered tuple (the unit of governance)¶
A registered tuple MUST carry:
| Field | Notes |
|---|---|
tuple_id, program_thesis, family_id |
identity + family for budgeting |
universe / asset set · horizon |
scope |
label_definition · feature_family · model_class |
structural coordinates (§6) |
action_policy_search_space · selection_metric |
pre-registered before any OOS (§6) |
split_policy · purge_embargo_policy · null_gate_ref |
leakage-free evaluation |
E_pred_min_ref · E_econ_min_ref |
the two distinct thresholds (§4.5) |
fdr_family_id · holdout_id |
ledger linkage |
prior_rationale |
recorded before registration (anti-snooping) |
kill_relationship |
reopen/kill link if materially similar to a killed tuple (§4.2) |
4.2 Killed-tuple register + material equivalence¶
Every KILL writes here; every new registration reads here first (blocking).
Material equivalence. A new tuple is materially equivalent to a killed tuple if it preserves the same
program_thesis,label_family,feature_family,model_class, and economic action intent — regardless of cosmetic changes to horizon, threshold, feature suffix, hyperparameter family, universe subset, or action policy. A materially-equivalent tuple is rejected unless the reopening condition recorded in the register is explicitly met. Disputes are resolved by the methodology reviewer + risk owner before registration (not by the proposer).
4.3 FDR ledger (contract)¶
Appended at each test; the running spend gates further tests. Each row:
tuple_id · family_id · hypothesis_id · stage · test_type · criterion (p-value / CI / posterior) ·
alpha_or_fdr_allocation · consumes_tuple_budget (bool) · consumes_one_iteration_budget (bool) ·
cumulative_spend · decision.
4.4 Final-holdout access log + violation policy¶
One dated entry per tuple verdict; any second touch is a violation.
Violation consequence. A holdout violation invalidates the tuple verdict: the tuple cannot
PROMOTE; it must beKILLed or re-registered with a new, untouched holdout under committee approval.
4.5 E_econ_min vs E_pred_min¶
E_econ_min = economic break-even from conservative P90 cost + target capacity. E_pred_min = the minimum
predictive effect that meets E_econ_min through the documented predictive-to-economic mapping. The pipeline
tests against E_pred_min at Phase 2 and against E_econ_min at Phase 4. They are never
conflated (an f1/AUC lift is not an economic edge).
5. Control flow — verdict state machine¶
Operational view: the decision tree. The architecture-level state machine:
| Current state | Event | Next state | Ledger writes | Allowed next action |
|---|---|---|---|---|
| (new) | register | Registered | registered-tuple; killed-tuple check | proceed to Phase 2 |
| Registered | killed-equivalent | Rejected | — | revise to a genuinely new tuple |
| Registered | Phase 2 beats E_pred_min (FDR) |
Phase 3 | FDR append | gross-expectancy test |
| Registered | Phase 2 fail (under-power) | INFEASIBLE |
FDR append | substrate expansion / charter revision / stop (§6) |
| Registered | Phase 2 fail (real, prepaid + 1 cause) | ONE-ITERATION |
FDR + budget (slot consumed) | one bounded correction, then re-test |
ONE-ITERATION |
re-test beats E_pred_min |
Phase 3 | FDR append | advance (slot already spent — no further slot) |
ONE-ITERATION |
re-test fails | KILL tuple |
killed-tuple; budget | new tuple from theory, or family budget check |
| Registered | Phase 2 fail (real, no slot) | KILL tuple |
killed-tuple; budget | new tuple from theory, or family budget check |
| Phase 3 | gross expectancy > 0 | Phase 4 | — | net-expectancy test |
| Phase 3 | fail (action-policy cause) | Phase 3 (same tuple) | FDR + budget | prepaid action-policy correction (§6) |
| Phase 3 | fail (label mis-spec) | KILL tuple → new tuple |
killed-tuple; budget | new tuple (label change = structural) |
| Phase 4 | net > 0 at P90/capacity | Phase 5 | — | filtering (if any) |
| Phase 4 | fail | KILL tuple |
killed-tuple; budget | (re-tuning to survive cost = post-hoc, forbidden) |
| any | family budget exhausted, no PROMOTE | KILL program thesis |
budget | abandon thesis / separate Epic |
| any | holdout second-touch | verdict invalidated | holdout log | kill or re-register (§4.4) |
INFEASIBLE ≠ KILL. INFEASIBLE is not evidence against the signal (it is an under-power / substrate
verdict); KILL is evidence against the registered tuple/family under the locked protocol.
INFEASIBLE allows only: substrate expansion · charter revision before any run · program stop for
cost/practicality. It allows no feature tinkering, threshold tuning, meta-labeling, or downstream work.
Any charter revision triggered by INFEASIBLE must re-enter the S03 lock process (full
re-validation + joint re-sign-off, §7) before a new run — it is not an in-place
edit of a locked charter.
6. Action-policy correction (same-tuple, bounded)¶
A same-tuple correction is legal only when pre-registered and budgeted. It:
- cannot touch the final holdout;
- cannot change label, feature family, model class, universe, null-gate, or cost model (those are structural → new tuple);
- has exactly one allowed attempt if prepaid (
ONE-ITERATION); - writes to the FDR / budget ledger.
Anything outside this is a new tuple that consumes tuple + multiple-testing budget.
7. Risk-owner veto — scope¶
The risk owner does not validate the science. Their blocking veto fires on any of:
- deployment-authority ambiguity, or protocol wording implying trading authorization;
- cost/capacity assumptions not explicit;
- risk limits absent;
- holdout discipline violated;
- downstream work attempted before its gate;
- charter lock without evidence of
E_econ_min/E_pred_minderivation.
A risk-owner objection cannot be overridden by methodology approval alone — only by addressing it or by an explicit, recorded waiver from the accountable owner. Without the risk-owner signature, S03 cannot lock and S04 cannot run.
8. Phase entry conditions¶
| Phase | Entry condition |
|---|---|
| 2 — predictivity | tuple registered + killed-tuple check passed; null-gate + budgets locked (S03) |
| 3 — gross expectancy | Phase 2 PROMOTE; action policy frozen in nested validation |
| 4 — cost survival | Phase 3 gross expectancy > 0 |
| 5 — filtering / meta-label | Phase 2 PROMOTE and Phase 3 gross > 0 and Phase 4 net > 0 at P90/capacity and no holdout violation and FDR budget not exhausted |
| 6 — sizing / execution | Phase 5 passed or explicitly skipped-with-justification; net edge survives cost; risk owner confirms sizing/execution remains non-deployment until separate approval |
9. Invariant enforcement points¶
Invariant (ADR adr/0102) |
Enforced at | Mechanism |
|---|---|---|
| No downstream optimisation before upstream proof | gate pipeline | strict Phase 2→6 order |
| Action-policy tuning is not a free retry | registration / Phase 3 | §6 — in-budget only if pre-registered before OOS |
| Structural change = new tuple | registration | closed list of structural coordinates (charter) |
| Final-holdout one-touch | verdict step | holdout log + violation policy (§4.4) |
| Anti-resurrection | new-tuple registration | killed-tuple blocking gate + material equivalence (§4.2) |
| Multiple-testing control | every test | FDR ledger (§4.3) |
| No deployment authority from this protocol | S03/S04 gates | risk-owner blocking veto (§7); role separation (locker ≠ launcher) |
10. Failure modes¶
Prevented by this architecture:
- optimising thresholds on the final holdout (§4.4);
- re-testing a killed tuple under a new name (§4.2);
- promoting after beating only a diagnostic null (locked null-gate, S03);
- using meta-labeling to manufacture alpha (Phase 5 entry gate, §8);
- launching Phase 2 without a locked
E_pred_min(§7 veto); - interpreting S01/S03 as deployment approval (§1, §7).
Still possible (residual — owned downstream):
- bad cost measurement (S02 must instrument P90 at target capacity);
- under-specified material equivalence (S01 ADR wording + §4.2 dispute resolution mitigate);
- poor null-gate implementation (S02/S04);
- governance bypass outside the documented pipeline (process/audit risk, not architectural).
11. Story → component mapping (conditional activation)¶
| Component | Built / locked / operated by |
|---|---|
ADR adr/0102 (durable rules) |
S01 (this Story) — Accepted |
| Charter template (placeholders) | S01 drafts; S02 fills; S03 locks |
Null-gate, E_econ_min/E_pred_min, MDE, budgets, Sortino (R1) |
S02 |
| Charter lock + joint sign-off + immutability | S03 |
| First Phase-2 run | S04 |
| Phase 3 / 4 | S05 / S06 — created or activated only if Phase 2 PROMOTE |
| Phase 5 / 6 | S07 / S08 — created or activated only if Phase 4 establishes a net edge |
| Registry automation, kill-switch, observability, sizing guardrails | downstream / runtime Epic |
The roadmap is not pre-committed: S05–S08 may never open. A clean
KILL/INFEASIBLEis a success, and the protocol explicitly authorizes stopping.
12. Methodological basis¶
The invariants are grounded (full citations in the plan dossier §4 / References): purged & embargoed cross-validation · multiple-testing / FDR control · pre-registration / design of experiments · probability of backtest overfitting (PBO/CSCV) · final-holdout discipline.
13. Committee review outcome & recommendations¶
plan_review PASSED — strong consensus, 5/5 experts (9.0–9.5), session 717127f5,
OP Meeting #270. The state machine, data contracts, and
violation policies were assessed "exhaustive, internally consistent, and effectively designed to prevent
common governance and methodological pitfalls."
Folded into this revision (r3): explicit ONE-ITERATION exit transitions (§5); INFEASIBLE-triggered
charter revision must re-enter the S03 lock (§5).
Non-blocking recommendations routed to owner stories:
| Recommendation | Owner story |
|---|---|
| Documented material-equivalence guidelines + worked examples | S01 ADR |
| Automated holdout-access logging + second-touch alerting | S04 / runtime |
Standardise FDR-ledger test_type / criterion (enum in charter) + validation |
S02 / S04 |
Signed, versioned E_econ_min / E_pred_min derivation (notebook / MLflow run) before S03 lock |
S02 / S03 |
| Observability of state-machine transitions + ledger access (dashboards, alert thresholds) | runtime Epic |
| Name the committee that approves re-registration after a holdout violation (align with OP roles) | S03 |
| Define the Phase 6 "skipped-with-justification" approval process (who + documentation) | S03 / S08 |
Add a structured economic_action_intent field (controlled vocabulary) to the tuple schema |
S02 (charter) |