# P3-S.11 EVENT CONTRACT REPAIR — SNIPERGOLD_ML (F1) ```text Date : 2026-08-22 Session : P3-S.11 — F1 EVENT CONTRACT REPAIR (first implementation phase of the frozen canonical architecture, P3-S.10). Status : IMPLEMENTED — tests first, contract enforced, consumers audited, regression green. No F2/F3/F4/F5/ML changes. Baseline : P3_S10_CHECKPOINT_SHA 64160bd91bf1c223f931405bbe416206d0de747e Contract : docs/SNIPERGOLD_CANONICAL_SETUP_CONTRACT_v1.md (frozen) Adjudication: docs/P3_S10_OWNER_ADJUDICATION.md (OD-3 validity, OD-4 conflict) Test report: ml/p3/smc_semantic/output/p3_s11_event_contract_report.json Human verification : CANCELLED. No AUC/PF/profit/backtest used. ``` --- ## A. Architecture contract (implemented) ```text Canonical EVENT (frozen §K/§M + OD-3): EVENT { ts, dir, valid_until, superseded, source } Liquidity Sweep : EVENT; W_sweep = 40 M15 bars (justified, InpSeqWindow). CHoCH/MSS : EVENT; W_choch = 40 M15 bars (justified, legacy gate). active : onset <= r <= onset + W (EXPIRED at age W+1). superseded : a newer onset of the same type replaced it (permanent; the older event never reactivates). chain : sweep onset <= CHoCH onset <= sweep onset + W_sweep, both fresh at the decision bar r, directions equal. Implemented in the ML-path EA (AlgoForge_Backtest_Baseline.mq5): - AFEventSweep / AFEventChoch structs (ts, dir, valid_until, superseded, source) synced from the UNCHANGED detector state at each closed M15 bar. - AFBT_SweepActive / AFBT_ChochActive / AFBT_ChainValid helpers. - f9 (choch_confirms) and the f18 event-sensitive confluence legs now consume EVENTS with validity + supersession + chain bound. ``` --- ## B. Bugs addressed ```text BUG-P3S2-001 Liquidity Sweep stale consumer: f9/f18 read g_swpDir/g_swpBar (persistent state) WITHOUT an age bound; a sweep hundreds of bars old still added confluence. BUG-P3S3-001 CHoCH stale consumer: f9 read g_chochDir/g_chochBar without expiry (34.7% stale in f9, 58.0% stale in the f18 +15 leg per P3-S.3 audit). D-12 no freshness window in Engine 2 / feature path for sweep/CHoCH event consumers (repaired at the FEATURE level in F1; the Engine-2 agent path is stateless by construction, P3-S.7 S-ST, and is F3 scope). ``` --- ## C. Before behavior ```text EA ComputeMLFeatures (before F1): f7 = (g_swpBar>=0 && (tc-1-g_swpBar)<=SEQ_WINDOW) ? g_swpDir : 0 (P3-S.0, kept) f8 = g_chochDir (STATE, kept) f9 = (g_chochDir!=0 && g_chochBar>=g_swpBar && g_chochDir==g_swpDir) ? 1 : 0 ^ NO validity window on sweep or CHoCH; NO upper chain bound (BUG-P3S2-001 / BUG-P3S3-001) f18: if(g_swpDir!=0) cb+=15; // stale sweep adds +15 if(g_chochDir!=0 && g_chochDir==g_swpDir) cb+=15; // stale chain adds +15 if((g_swpDir==1&&g_bias>0)||(g_swpDir==-1&&g_bias<0)) cb+=15; // stale ``` --- ## D. New event contract (implemented in the EA) ```text struct AFEventSweep { int bar; int dir; int valid_until; bool superseded; string source; } // source = "DetectLiquidityGrabs" struct AFEventChoch { int bar; int dir; int valid_until; bool superseded; string source; } // source = "ProcessStructure(internal)" bool AFBT_SweepActive(decisionBar) : bar>=0 && (decisionBar-bar) <= W_sweep bool AFBT_ChochActive(decisionBar) : bar>=0 && (decisionBar-bar) <= W_choch bool AFBT_ChainValid(decisionBar) : sweep.dir!=0 && choch.dir!=0 && AFBT_SweepActive(decisionBar) && AFBT_ChochActive(decisionBar) && choch.bar >= sweep.bar (CHoCH after sweep) && (choch.bar - sweep.bar) <= W_sweep (within sweep chain) && choch.dir == sweep.dir (directions equal) Supersession : the stored latest onset IS the active (non-superseded) event; older onsets are replaced by construction (DetectLiquidityGrabs b>g_swpBar; ProcessStructure overwrites on each qualifying break). Deterministic. ``` --- ## E. Liquidity Sweep repair ```text Detection (DetectLiquidityGrabs) : UNCHANGED - internal swing reference (len=5), grab window 8, wick penetration + same-bar close-back, direction by taken side, closed-bar, M15. Consumers repaired: - f9 sweep leg: the chain predicate requires AFBT_SweepActive (age <= 40). - f18 +15 sweep legs: gated by swpValid. - f7: formula UNCHANGED (P3-S.0 parity baseline; it already applies the 40-bar validity with the legacy tc-1 frame — see §L known issues). - f8: unaffected (STATE feature by contract). Validity: W_sweep = 40, NOT optimized. Expired at age 41 -> consumer gets NO VALID SWEEP EVENT (F1-T03). ``` --- ## F. CHoCH repair ```text Detection (ProcessStructure internal) : UNCHANGED - fractal 5/5 internal pivots, close-confirmed break, prior-trend precondition, swing confluence gate, M15. Consumers repaired: - f9 choch_confirms: 1 ONLY IF AFBT_ChainValid(decisionBar) — latest active sweep AND latest active CHoCH (age <= 40), CHoCH after the sweep and within the sweep validity chain (chochBar-swpBar <= 40), directions equal. A CHoCH outside the valid sweep chain is INVALID for the canonical setup chain (F1-T06); a stale CHoCH no longer confirms (F1-T07). - f18 +15 chain leg: gated by chochOK (the same chain predicate). Validity: W_choch = 40, NOT optimized. ``` --- ## G. Consumer audit ```text EA (AlgoForge_Backtest_Baseline.mq5) — all consumers of g_swpDir/g_swpBar/ g_chochDir/g_chochBar audited: f7 (sweep_dir) : has its own 40-bar validity; UNCHANGED (P3-S.0). f8 (choch_dir) : intentionally a STATE ("last CHoCH") per SMC_CHOCH_MSS_SPEC_v1 S-9; UNCHANGED. f9 (choch_confirms) : REPAIRED -> canonical chain (validity+order+bound+dir). f18 (confluence) : REPAIRED -> event legs validity-aware. no other consumer reads the raw sweep/CHoCH state in the EA. Engine 2 (AF_Engine2_Agents.mqh / AF_Engine2_Display.mqh): AF_DetectSweep / AF_DetectChoch are per-bar STATELESS functions recomputed from closed Engine-1 bars every bar; no persistent event state exists to go stale (P3-S.7 S-ST). Not F1 scope (belongs to F3 setup layer). Python training mirror (train_model.build_features choch_conf): STILL the legacy stale semantics — DOCUMENTED (B14), NOT modified in F1. The future dataset rebuild (Phase VI) will regenerate features with the canonical event semantics. Conclusion: no secondary consumer bypasses the event contract. ``` --- ## H. Regression tests ```text New F1 suite: ml/p3/smc_semantic/spec_tests_event_contract.py F1-T01 single sweep event (1 EVENT, valid_until, source) F1-T02 expiration boundary (valid at +40, EXPIRED at +41) F1-T03 sweep consumer expiration (age 43 -> NO VALID SWEEP EVENT) F1-T04 new sweep supersedes old (deterministic supersession, no fallback) F1-T05 CHoCH inside valid sweep window -> chain VALID (f9=1) F1-T06 CHoCH outside sweep validity chain -> INVALID (f9=0; legacy 1) F1-T07 CHoCH consumer expiration (age > W_choch -> f9=0) F1-T08 no look-ahead (future mutation does not alter past event state) F1-T09 persistent condition -> ONE event (no duplicate emission) F1-T10 existing P3-S.2 (17/17) + P3-S.3 (20/20) suites PASS (detection semantics unchanged) Result: 8/8 contract cases PASS + regression PASS (report json attached). ``` --- ## I. Historical before/after ```text Evidence (P3-S.3 audit, historical): Sweep stale persistence : previously ~hundreds of bars (f7 lifecycle fixed in P3-S.0; f9/f18 consumers still stale). CHoCH stale usage : 34.7% of f9 bars stale; 58.0% of the f18 +15 leg stale (BUG-P3S3-001). After F1 (synthetic case set in the F1 report): valid event usage : f9 = 1 only when sweep AND choch fresh and the chain bound holds (F1-T05). expired event usage : consumers receive NO VALID EVENT at age > 40 (F1-T03/F1-T07); stale-usage cases eliminated (legacy f9=1 on 4 stale cases -> contract f9=0). superseded event usage : only the latest onset is active; older events permanently superseded (F1-T04). No profitability metrics used. ``` --- ## J. Evidence preservation ```text - P3-S.2..P3-S.10 documents untouched (immutable historical evidence). - Existing P3-S.2/P3-S.3 spec tests unchanged and PASS (F1-T10). - The frozen contract (SNIPERGOLD_CANONICAL_SETUP_CONTRACT_v1.md) is the authority; this repair implements it, it does not redefine it. - Prior checkpoints preserved (P3-S.6 533c8c6, P3-S.10 64160bd). ``` --- ## K. Explicitly unchanged semantics ```text Detection formulas: - DetectLiquidityGrabs (reference/penetration/close-back/direction/closed-bar) - ProcessStructure internal (pivot 5/5, close break, prior trend, swing gate) - f7 sweep_dir formula (P3-S.0 parity baseline) - f8 choch_dir STATE semantics (contract S-9) Constants: - W_sweep = 40, W_choch = 40 (AF_BT_SEQ_WINDOW) — NOT optimized - GRAB_WINDOW=8, INTERNAL_LEN=5, thresholds, ATR, weights, scores — untouched NOT touched (later phases): - F2 Zone Contract (FVG/OB mitigation), F3 Candidate Setup layer, F4 MTF/training alignment, F5 Display, ML pipeline, FEATURE_CONTRACT.md. ``` --- ## L. Remaining known issues ```text 1. f7 boundary frame : the P3-S.0 f7 formula uses the legacy frame ((tc-1-g_swpBar)<=40, i.e. age<=41), while the F1 helpers use the frozen contract frame (age<=40). f7 is UNCHANGED (parity baseline); f9/f18 follow the contract. At age 41 a sweep may still show in f7 while f9's sweep leg is expired — a documented pre-existing boundary detail, NOT introduced by F1. Resolution belongs to the F4/Phase-VI feature alignment. 2. Python training mirror (train_model.build_features choch_conf / f18) still encodes the LEGACY stale semantics; the model was trained on that. F1 does NOT retrain (B14). A future dataset rebuild (Phase VI) must regenerate features with the canonical event semantics and re-validate parity. 3. Engine-2 agents remain per-bar stateless (P3-S.7 S-ST); the setup-layer event consumption is F3 scope (P3-S.12+). ``` *End of P3-S.11 F1 event contract repair record. No F2/F3/F4/F5/ML change.*