# P3-S18A LABEL CONTRACT REVIEW — SETUP-OUTCOME SEMANTIC AUDIT ```text Date : 2026-08-23 Session : P3-S.18A — OPTION A: LABEL CONTRACT REVIEW Status : COMPLETE Verdict : PRIMARY LABEL CONTRACT = APPROVED AS V1 (with documented, additive v2 enrichment recommendations — NOT semantic corrections of a defect) Scope : RESEARCH / CONTRACT REVIEW ONLY. No ML training, no AUC/PF, no parameter optimization, no production/MQL5/Candidate Setup/ FEATURE_CONTRACT changes, no Tickstory/Dukascopy. Human verif: REMAINS CANCELLED (historical only). No performance experiment. Contract : docs/P3_S16_LABEL_CONTRACT.md (v1, immutable) Baseline : P3-S.17R.2 close ae81f15b18f3e8952e183353357ba02281b6f9e6 VERIFIED (local == origin/main, branch main, working tree CLEAN). ``` --- ## A. Latest SESSION_HANDOVER used ```text docs/SESSION_HANDOVER_2026-08-23_P3_S17R2_VECTORIZE.md (committed at HEAD ae81f15 — the NEWEST authoritative handover by commit ancestry; read completely before any work.) It records: P3-S.17R.2 = COMPLETE, verdict = FULL PARITY ACHIEVED, CHoCH/OB/FVG vectorized == frozen reference (197,032/197,032 each), Candidate Setup runtime==research 694==694 (identity 694/694, runtime-only 0, research-only 0, per-bar mismatch 0), in-scope population 686 (594 leads / 92 follow-ons / 0 duplicates), P3-S.17 re-audit completed, label distribution WIN 167 / LOSS 404 / UNRESOLVED 18 / AMBIGUOUS 5 (leads), production unchanged, ML NOT TOUCHED, P3-S.18 NOT STARTED, next = NEW DECISION SESSION (OPTION A/B/C). Verified against Git at session start (local HEAD == remote HEAD == ae81f15, branch main, working tree CLEAN). ``` ## B. Checkpoint ```text Starting checkpoint (verified): ae81f15b18f3e8952e183353357ba02281b6f9e6 local HEAD == origin/main == ae81f15 branch = main working tree = CLEAN origin = https://forge.mql5.io/chiki2bum2/SniperGold_ML.git P3-S.17R.2 parity-close : ff3202c8be59d9f1073b2f286e219c54f96eb44a ``` ## C. Verified Candidate Setup population ```text Full runtime/research computable population : 694 P3-S.17 authorized in-scope population : 686 De-overlap (lead-per-episode, horizon 16) : 594 leads / 92 follow-ons Duplicate setup_ids rejected : 0 De-overlap separation verified : TRUE LEAD LABEL DISTRIBUTION (open params k_tp=1.5, k_sl=0.75, H=16): WIN : 167 (28.1%) LOSS : 404 (68.0%) UNRESOLVED : 18 (3.0%) AMBIGUOUS : 5 (0.8%) ALL (before de-overlap): WIN 190 / LOSS 469 / UNRESOLVED 22 / AMBIGUOUS 5. ``` ## D. Current label contract (under review) ```text P3_S16_LABEL_CONTRACT v1 (immutable): UNIT : ONE Candidate Setup (identity + lifecycle, F3-frozen). ENTRY : CLOSE of the CANDIDATE_SETUP creation bar (M15). PRICE : creation-bar close (mid reference; spread/slippage out of scope). ATR : rolling 14-bar M15 ATR ending at the entry bar (reference at entry, causally available). TP : entry + direction * k_tp * ATR (k_tp = 1.5 candidate) SL : entry - direction * k_sl * ATR (k_sl = 0.75 candidate) HORIZON : H = 16 M15 bars (robustness H = 8; lifetime-based, not tuned). CLASSES : WIN (TP before SL) / LOSS (SL before TP) / UNRESOLVED (neither within H or insufficient data or gap — true censoring, never forced to LOSS) / AMBIGUOUS (same-bar TP+SL — no OHLC-ordering assumption). DE-OVERLAP : setup-level lead-per-episode (follow-ons reported, excluded from the primary independent set). ``` ## E. Entry semantics review ```text Question : does entry = CLOSE of the creation bar represent "the moment the setup becomes actionable"? Findings: - The chain COMPLETES at creation_bar (CANDIDATE_SETUP); direction fixed; the M15 entry condition is already satisfied by construction at that bar. - The first causally-available executable point after completion is the creation-bar close (P3.2 §6 A: |A-B| ~ 0.008 ATR vs next-bar open — not material). This is a CLOSED-bar, no-look-ahead choice. - M3 is OPTIONAL and occurs AFTER creation; it does not define entry and cannot precede entry without breaking its optional/no-veto semantics (canonical §F/OD-4). No semantic contradiction: M3_CONFIRMED upgrades the same setup AFTER entry; entry is unchanged. VERDICT : ENTRY SEMANTICS = SEMANTICALLY APPROPRIATE. ``` ## F. TP/SL review ```text Question : does TP = +k_tp*ATR, SL = -k_sl*ATR measure setup VALIDATION (did the expected outcome occur before the invalidation boundary) rather than mere price excursion? Findings: - TP/SL are anchored at ATR(entry) in the setup direction — the level whose first hit decides WIN/LOSS — i.e., an outcome-resolver with a 2:1 semantic ratio candidate (1.5/0.75), not a drift measure (L1 is severed, P3.2 B). - The constants are OPEN parameters recorded by contract §D, explicitly NOT AUC/PF/profit/win-rate selected. - The LOSS-heavy (68.0%) distribution under these open parameters is a contract/data observation, not a defect and not an optimization input (§18 of the brief prohibits changing TP/SL because the WIN rate looks low). VERDICT : TP/SL SEMANTICS = SEMANTICALLY APPROPRIATE (constants remain OPEN). ``` ## G. Horizon review ```text Question : does H=16 mean "setup remains valid for 16 bars" or merely "the label observes price for 16 bars"? Are these conflated? Findings: - P3.2/P3.2.2 lifetime evidence: outcomes mostly occur within 1-8 M15 bars; ~90% <= 8; >98% <= 16. H=16 is the LABEL OBSERVATION WINDOW, chosen on lifetime evidence, NOT a runtime validity claim. - The runtime Candidate Setup validity (W_setup placeholder 40) is a SEPARATE, still-OPEN parameter and is NOT the label horizon. The label contract does not claim the setup "remains valid for 16 bars" — it observes the price path for 16 bars after entry to resolve TP/SL. - Censoring at H=16 is low (3.0% of leads UNRESOLVED), consistent with P3.2.2 (§G). VERDICT : HORIZON = SEMANTICALLY APPROPRIATE (label window; distinct from runtime validity; not conflated). H stays OPEN at 16 (robustness 8). ``` ## H. WIN/LOSS review ```text Question : is binary TP-before-SL sufficient as the PRIMARY label? Findings: - P3.2 scorecard: L3 (TP-before-SL) is the ONLY family meeting the meta-labeling requirements (causal, SMC-aligned, event/setup-specific, low ambiguity 1-3%, low censoring at H16+, binary, economically interpretable). - A setup can reach meaningful favorable excursion without TP, remain structurally valid, become invalidated/consumed, or time out — all of these are captured as LOSS (SL first), UNRESOLVED (censored), or are secondary diagnostics; they do NOT need extra primary classes at v1. - L2 (MFE/MAE) and L4 (time-to-outcome) remain DESCRIPTIVE complements, not primary classification targets (§16). VERDICT : WIN/LOSS = SEMANTICALLY APPROPRIATE AS THE PRIMARY LABEL. ``` ## I. UNRESOLVED review ```text Question : are the UNRESOLVED sub-cases equivalent, and should the primary target preserve one class or a granular reason code? Findings: - Diagnostic on the real population: ALL 22 UNRESOLVED (all-population) carry reason "timeout" — zero "insufficient_future_data" in the authorized scope (the 686 in-scope setups all have 16 future bars available within the feed). The implementation already distinguishes internally (timeout vs insufficient_future_data vs gap) even though the primary field is a single UNRESOLVED class. - These sub-cases are NOT numerically merged into a single semantic at v1; the reason is preserved in the resolver and can be surfaced as a secondary code. VERDICT : UNRESOLVED = SEMANTICALLY APPROPRIATE as a single primary class, with an internal reason (recommended: expose as a secondary field in v2 — additive, not a defect correction). ``` ## J. AMBIGUOUS review ```text Question : is same-bar TP+SL = AMBIGUOUS correct, and should tick-level chronology stay out of the primary contract? Findings: - From OHLC, a same-bar TP AND SL cannot be causally ordered (which touched first is undecidable without tick chronology). Classifying AMBIGUOUS deterministically (never WIN/LOSS) is the honest contract (§F). - Tick-level/lower-timeframe reconstruction remains a SEPARATE, authorized future revision; Tickstory/Dukascopy is NOT introduced (§26). - Real population: 5 AMBIGUOUS leads (0.8%) — low, intrinsic class. VERDICT : AMBIGUOUS = SEMANTICALLY APPROPRIATE as an intrinsic label class. ``` ## K. De-overlap review ```text Question : is lead-setup-per-episode exclusion conceptually appropriate? Findings: - Follow-on setups share the previous setup's outcome window (creation within [prev.entry, prev.entry+H]) -> NOT independent samples. Keeping the first of each episode (lead) and reporting the rest is the P3.2.2 setup-level adaptation; verified separation > H (TRUE). - 594 leads / 92 follow-ons / 0 duplicates; serial-dependence evidence from P3.2.2 (§J: ac1 0.5 -> ~0 after de-overlap on the old event units). - Same-zone reuse / repeated direction / overlapping lifecycles are recognized as possible future refinements (episode weighting) but are not a v1 defect: the rule guarantees independent training observations. VERDICT : DE-OVERLAP = CORRECT (neither too aggressive nor too weak for v1; possible episode-level refinements recorded for future design). ``` ## L. Lifecycle vs label lifetime ```text Question : can a setup expire/invalidate/consume before TP/SL, and should that affect the label? Findings (runtime truth — canonical §F, P3.2.2 §I): - A setup CAN be lifecycle-terminated (EXPIRED after W_setup, INVALIDATED by zone mitigation / contrary CHoCH / context break, CONSUMED by entry) INDEPENDENTLY of TP/SL. - P3.2.2 §I: on the setup/event lifetime, SL (price) is the DE-FACTO invalidator — opposite-structure invalidation is much slower (median ~22-24 bars) than the outcome (1-3 bars). So TP/SL-first remains the authoritative primary resolution. - FINDING (implementation gap, not a contract defect): the current dataset rows carry label_invalidated_early=False uniformly. The F3 registry keeps creation-time snapshots (state=CANDIDATE_SETUP, m3_bar=None), so the canonical terminal state (EXPIRED/INVALIDATED/CONSUMED), its cause and timing, and M3 confirmation are NOT yet wired into the population rows. This is a SECONDARY-diagnostic wiring gap — it does not change the primary label, but it means lifecycle information is currently NOT preserved in rows for future design. VERDICT : PRIMARY LABEL UNAFFECTED (price-first-hit authoritative). SECONARY LIFECYCLE WIRING = REVIEW REQUIRED -> recommended v2 enrichment (terminal cause + timing + M3 presence as secondary fields). This is additive and evidence-based, NOT a correction of the primary TP-before-SL semantics. ``` ## M. Label family recommendation ```text Preserve, in future rows (information preservation — §16/§19): PRIMARY L3 : TP-before-SL (WIN/LOSS/UNRESOLVED/AMBIGUOUS) — keep as the classification target. SECONDARY (descriptive, NOT classification targets): - L4 time-to-TP / time-to-SL (survival-compatible), - L2 MFE/MAE descriptors, - invalidation cause + timing (EXPIRED / INVALIDATED / CONSUMED), - UNRESOLVED reason code (timeout / insufficient_future_data / gap). Design intent: never destroy useful outcome information in the dataset even when only L3 is used for training. Recommended v2 = single file v2 with the secondary fields added; v1 remains immutable (§23). ``` ## N. Feature/label separation (leakage audit) ```text Audited against the contract and the implementation: - entry = creation-bar close -> features are causally available at entry; - labels scan ONLY bars AFTER entry within H (first-hit); - no feature references post-entry movement, future mitigation, future CHoCH, future zone state, or MFE/MAE; - the immutable identity (Store 1) never encodes the outcome; the label (Store 3) never enters the feature store (Store 2); - closed-bar/as-of lock verified by DS-T06/T14/T15 + VEC-T04. VERDICT : FEATURE/LABEL SEPARATION = PASS (no leakage). ``` ## O. Label distribution observations (diagnostic only) ```text From the verified 686 in-scope population (leads = 594), descriptive only, NO parameter or filter change derived from these: ALL : WIN 190 | LOSS 469 | UNRESOLVED 22 | AMBIGUOUS 5 LEAD : WIN 167 | LOSS 404 | UNRESOLVED 18 | AMBIGUOUS 5 Direction (leads) : -1 (short): WIN 90 / LOSS 198 / U 7 / A 4 (n=299) +1 (long) : WIN 77 / LOSS 206 / U 11 / A 1 (n=295) Zone type (leads) : OB: n=594 (ALL leads are OB — no FVG-based lead in the in-scope population under the current chain inputs; FVG remains a valid alternative per contract §C, and the OB-only outcome is a population composition observation, not a defect) Year (leads) : 2017:4, 2018:50, 2019:64, 2020:70, 2021:82, 2022:75, 2023:68, 2024:67, 2025:83, 2026:31 — LOSS-heavy in every year. H4/M30 gates : equal to setup direction by construction (hard gates); no independent gate-vs-direction split exists in this population. Time-to-event (leads): median TP hit = 3 bars, median SL hit = 2 bars (bars after entry) — SL resolves faster, consistent with P3.2.2 §G (SL ~2:1 faster than TP). UNRESOLVED reason : all in-scope UNRESOLVED = timeout (no insufficient- data case inside the authorized window). These are diagnostics; NO conclusion about strategy profitability/model validity shall be drawn from them (§6, §10, §18). ``` ## P. Final contract decision ```text DECISION : APPROVED AS V1 The primary P3-S.16 setup-outcome label contract is SEMANTICALLY APPROPRIATE for the verified Candidate Setup population: entry (creation-bar close) : APPROPRIATE TP/SL (ATR-anchored, 2:1 candidate): APPROPRIATE (constants OPEN) horizon (H=16 label window) : APPROPRIATE (distinct from runtime W) WIN/LOSS primary : APPROPRIATE (meta-labeling-suitable) UNRESOLVED single class : APPROPRIATE (reason preserved) AMBIGUOUS intrinsic class : APPROPRIATE de-overlap lead-per-episode : CORRECT feature/label separation : PASS (no leakage) Rationale for NOT revising: - The LOSS-heavy distribution (68%) is a CONTRACT/DATA observation under OPEN parameters; revising because the WIN rate looks low is explicitly prohibited (§18) and would be hidden optimization. - The only gap found (secondary lifecycle wiring: invalidation cause, terminal state, M3 presence, UNRESOLVED reason, L2/L4 descriptors not yet surfaced in rows) is ADDITIVE and does not invalidate the primary TP-before-SL semantics; it is RECOMMENDED as v2 enrichment, not required as a correction. Recommended (non-blocking, separately-authorizable): P3-S18B = implement P3_S16_LABEL_CONTRACT_v2 (add secondary fields: invalidation cause/timing, terminal state, M3 presence, UNRESOLVED reason, time-to-event, MFE/MAE) while keeping v1 immutable and the primary L3 target unchanged. ``` ## Q. Versioning ```text P3_S16_LABEL_CONTRACT v1 : REMAINS IMMUTABLE (this review does NOT edit it). P3_S16_SETUP_DATASET_CONTRACT v1 : REMAINS IMMUTABLE. If the recommended enrichment is authorized -> create docs/P3_S16_LABEL_CONTRACT_v2.md (and/or dataset contract v2) as NEW files in a separate phase (P3-S18B). No silent rewrite. ``` ## R. Production files unchanged ```text NO MQL5 CHANGES. Unchanged: MQL5/** production files, AF_Engine2_Setup.mqh, AF_Engine2_Agents.mqh, AF_Defines.mqh, F1/F2/F3/F4 runtime semantics, FEATURE_CONTRACT.md, SniperGold_ML.mqh, model weights, legacy v4.x semantics, the frozen P3-S.16 v1 contract, and every historical spec suite. ``` ## S. ML status ```text NOT TOUCHED. No MLP / LSTM / Informer / regime / calibration / retraining / model comparison / AUC / PF / profit / win-rate selection performed or started by this review. Legacy MLP remains FROZEN LEGACY / REFERENCE. ``` ## T. Forge commits ```text 1. research: review P3-S18A setup-outcome label contract (OPTION A) (script + label-distribution CSV + review JSON) [P3_S18A_FINAL_SHA head] 2. docs: record P3-S18A label contract review (this document) ``` ## U. Final Forge HEAD ```text P3_S18A_FINAL_SHA : ``` ## V. Working tree ```text local HEAD == remote HEAD, branch main, working tree CLEAN (verified after push). Regression suites re-run green during the session: P3-S16 20/20, VEC 15/15, full-scope reference==vectorized zero mismatch, chain parity 694==694 — no historical suite modified or weakened. ``` ## W. P3-S.18 readiness ```text P3-S.18 (setup-level baseline ML) is NOT started by this session. With the label contract APPROVED AS V1, P3-S.18 may be authorized SEPARATELY by the owner (baseline hierarchy: linear/logistic -> simple tree -> small MLP; no LSTM/Informer/regime first). If the owner prefers the v2 secondary-field enrichment first, that is P3-S18B (separate authorization). Both require an explicit owner decision; parity/review does NOT auto-select either. ``` --- ## Provenance / evidence ```text Script : ml/p3/setup_dataset/spec_tests_s18a_label_review.py (reuses the byte-locked R.2 chain — identical inputs, gate cache, sweep port, vectorized kernels; writes NEW artifacts) Outputs : ml/p3/setup_dataset/output/p3_s18a_label_distribution.csv ml/p3/setup_dataset/output/p3_s18a_label_review.json Reference : docs/P3_S16_LABEL_CONTRACT.md, P3_S16_SETUP_DATASET_CONTRACT_v1.md, P3_2_LABEL_FORENSIC.md, P3_2_2_DEOVERLAP_SURVIVAL.md, SNIPERGOLD_CANONICAL_SETUP_CONTRACT_v1.md, P3_S17R2_VECTORIZE_CH0CH_OB_FVG.md Regression : P3-S16 20/20 (re-run), VEC 15/15 (re-run, FULL PARITY ACHIEVED), note: re-running the committed output JSONs rewrote only generated_utc/elapsed fields — those committed artifacts were restored byte-identical (no historical suite weakened). ``` *End of P3-S18A label contract review. Decision: APPROVED AS V1 (primary semantics appropriate for the verified Candidate Setup population), with recommended additive v2 secondary-field enrichment pending separate owner authorization. No ML, no optimization, no production change.*