SniperGold_ML/docs/P3_S16_SETUP_DATASET_CONTRACT_v1.md

16 KiB

P3-S.16 SETUP-LEVEL DATASET CONTRACT v1 — SNIPERGOLD_ML

Status   : AUTHORITATIVE CONTRACT FOR THE LITERATURE-LEVEL TRAINING OBSERVATION.
Scope    : Defines the canonical ML observation unit (ONE Candidate Setup) and
           its deterministic transformation into ONE training observation, with
           the separation of (i) immutable setup identity, (ii) derived training
           features, and (iii) outcome labels. This contract is the ORACLE for
           the P3-S.16 test suite and dataset generator (ml/p3/setup_dataset/).
Session  : P3-S.16 — Setup-Level Dataset / Label Contract Implementation.
Date     : 2026-08-23
Status tag: CONTRACT v1 (P3-S.16). Numeric research parameters are explicitly
           OPEN where noted; they must NOT be selected by AUC/PF (session §29).
Provenance: P3-S.15 decision docs/P3_S15_ML_PATH_ARCHITECTURE_DECISION.md
           P3-S.15 docs/P3_S15_SETUP_LEVEL_TRAINING_CONTRACT_PROPOSAL.md
           frozen P3-S.10 docs/SNIPERGOLD_CANONICAL_SETUP_CONTRACT_v1.md (§E/§F)
           P3-S.13 docs/P3_S13_CANDIDATE_SETUP_REPAIR.md (AFCandidateSetup F3)
           P3.2/P3.2.2 forensic (docs/P3_2_LABEL_FORENSIC.md,
           docs/P3_2_2_DEOVERLAP_SURVIVAL.md)
Human verification : REMAINS CANCELLED (historical only).

A. OBJECTIVE

How do we turn ONE verified Candidate Setup into ONE reproducible training observation with a causally valid setup-outcome label, WITHOUT reintroducing the overlap, redundancy, and look-ahead problems of the old bar-level ML pipeline?

This contract answers that question at the CONTRACT level. It fixes the observation unit, its immutable identity, the separation boundaries, the feature snapshot discipline, and the dataset mechanics — so that the generator (ml/p3/setup_dataset/) can build a deterministic, auditable dataset and the label computation can be validated against this contract as ORACLE.


B. OBSERVATION UNIT — ONE CANDIDATE SETUP

ONE TRAINING OBSERVATION = the occurrence of ONE CANDIDATE_SETUP
(entity AFCandidateSetup, frozen P3-S.13 §C), captured at the moment its chain
completes and (optionally) at the deterministic ENTRY timestamp (§D below).

The Candidate Setup is the ONLY valid training unit because:
  - it is the runtime decision granularity (P3-S.15 §6.3),
  - its identity is CAUSAL and DETERMINISTIC (P3-S.13 §J),
  - its lifecycle is fully specified (P3-S.13 §D),
  - the bar-level unit FAILED unit-validity (P3.2.2 §K: 97-99% redundant,
    1.5% retention) — the setup unit removes per-bar redundancy.
IMMUTABLE SETUP IDENTITY (the observation key — immutable, never derived):
  setup_id                 : monotonic integer at CANDIDATE_SETUP.
  direction                : +1 bullish / -1 bearish (chain direction).
  creation_timestamp       : M15 creation_bar open time (CANDIDATE_SETUP bar).
  creation_bar_index       : absolute M15 bar index (monotonic, repo-defined).
  setup_state              : CANDIDATE_SETUP (or M3_CONFIRMED) at capture.
  sweep_onset              : Liquidity EVENT onset bar index + sweep_direction.
  choch_onset              : CHoCH/MSS EVENT onset bar index + choch_direction.
  zone_type                : OB | FVG.
  zone_formation_timestamp : zone formation bar open time.
  zone_bounds              : {lower_bound, upper_bound} at creation (F2 contract).
  zone_mit_at_creation     : F2 mitigation state when the chain consumed it.
  m15_entry_condition_ts   : the M15 decision bar when the M15 entry condition
                             held (bar that advanced chaim to ENTRY_ARMED; the
                             creation bar for the CANDIDATE_SETUP completion).
  m3_confirmation_ts       : nullable — M3 bar timestamp if M3_CONFIRMED, else null.
  provenance               : contract version + generator version + source
                             dataset hash (see §K).
  source_timeframe_set     : {H4, M30, M15, M3} with as-of timestamps per TF.

UNIQUENESS: two setups are the same observation iff their CAUSAL key matches:
  (direction, sweep_onset, choch_onset, zone_formation_timestamp,
   creation_timestamp). (P3-S.10 §K, P3-S.13 §J.)
SEPARATION OF THREE STORES (this contract — NEVER mixed):

  STORE 1 — IMMUTABLE IDENTITY  (§B): fixed at creation; part of the key;
                                     never derived, never a label, never a
                                     learning feature that encodes the outcome.
  STORE 2 — DERIVED TRAINING FEATURES (§G / proposal): functions of causally
                                     available SMC state as-of the ENTRY
                                     timestamp. Respects FEATURE_CONTRACT.md
                                     (not modified).
  STORE 3 — OUTCOME LABEL (§ label contract): the TP-before-SL outcome
                                     measured from ENTRY forward. NEVER a
                                     feature of STORE 2.

C. SETUP IDENTITY vs FEATURE vs LABEL — SEPARATION RULE

The three stores must remain DISTINCT in the dataset schema:
  - a field that is part of the CAUSAL IDENTITY is not a learning feature;
  - a LEARNING FEATURE must be causally available at ENTRY (no future data);
  - the LABEL is a function of FUTURE price after ENTRY and must never appear
    in the feature store.
The dataset row therefore has three explicit namespaces:
  identity_*  : immutable key + provenance (Store 1)
  feature_*   : causally-available SMC features at entry (Store 2)
  label_*     : outcome class + horizons + levels (Store 3)

D. ENTRY TIMESTAMP (MANDATORY — §10 of the brief)

DECISION: the deterministic ENTRY timestamp for outcome measurement is

    entry_timestamp := CLOSE of the CANDIDATE_SETUP creation bar
                       (= M15 creation_bar close time),
    at timeframe M15.

Justification (causality, NOT profitability):
  - The Candidate Setup COMPLETES at creation_bar (chain whole, direction
    fixed, M15 entry condition already satisfied within the chain). The first
    closed bar at/after completion is the earliest causally-available
    executable point.
  - M3 confirmation is OPTIONAL and occurs AFTER creation; it is a
    confirmation, not a validity gate (§M canonical: absence does not
    invalidate; contrary reduces only micro-score). Therefore it CANNOT be the
    entry timestamp without breaking the "optional" semantics.
  - M15 entry-condition (ENENTRY_ARMED) and zone membership are already
    satisfied at creation_bar by construction; no separate entry re-trigger.
  - This matches the P3.2/P3.2.2 entry semantics (A = close of decision bar,
    robustness B = next-bar open, |A-B| ~ 0.008 ATR, P3.2 §6).

ENTRY CONTRACT:
  entry_timestamp      : creation_bar CLOSE (M15), computed as open_time + 900s.
  entry_price_source   : close of the creation_bar.
  price_convention     : bid for long / ask for short is a FUTURE EXECUTION
                         detail; for the LABEL CONTRACT (research, not trade)
                         a single mid/reference price is used per symbol, with
                         execution spread/slippage OUT of scope (see §H below).
  price_reference      : the creation_bar close (mid, contract-defined).
  spread handling      : NOT applied in the research label (would require an
                         execution model). Documented; applied only in a later
                         execution-aware phase, never in P3-S.16.
  timeframe            : M15 (fixed by the setup carrier).

If entry could not be fixed deterministically the project would STOP as
BLOCKED. It is fixed; no blocker.

E. DATA CONTRACT FIELDS (canonical training observation row)

---- identity_* (Store 1) ----
  identity_setup_id
  identity_direction
  identity_creation_timestamp
  identity_creation_bar_index
  identity_setup_state
  identity_sweep_onset_index
  identity_sweep_direction
  identity_choch_onset_index
  identity_choch_direction
  identity_zone_type
  identity_zone_formation_timestamp
  identity_zone_lower
  identity_zone_upper
  identity_zone_mit_at_creation
  identity_m15_entry_condition_ts
  identity_m3_confirmation_ts        (nullable)
  identity_provenance_*
  identity_source_timeframes

---- feature_* (Store 2) — PROPOSAL, see §G / P3-S.15 §8 ----
  feature_h4_context                (gate direction as-of entry)
  feature_m30_context               (gate direction as-of entry)
  feature_sweep_age_bars
  feature_choch_age_bars
  feature_choch_latency_after_sweep
  feature_zone_age_bars
  feature_zone_width_atr
  feature_price_in_zone_offset_atr
  feature_m15_distance_to_zone_atr
  feature_displacement_at_creation
  feature_m15_entry_condition
  feature_m3_present
  feature_m3_direction
  feature_sweep_size_atr
  feature_atr_at_entry

---- label_* (Store 3) — see label contract ----
  label_outcome            (WIN | LOSS | UNRESOLVED | AMBIGUOUS)
  label_tp_level
  label_sl_level
  label_horizon_bars
  label_tp_hit_bar          (nullable)
  label_sl_hit_bar          (nullable)
  label_timeout             (bool)
  label_invalidated_early   (secondary; observation may be resolved by
                             lifecycle invalidation — recorded, see label contract)
  label_contract_version

F. SETUP RELATIONSHIP / DE-OVERLAP (§18 — independence of observations)

The training unit is now the Candidate Setup. Two DISTINCT setups may still overlap in TIME (their outcome windows can share bars). For ML label independence (P3.2.2 §J: serial dependence must be ~0), define causally:

SAME SETUP        : identical identity key — same observation (never duplicated).
FOLLOW-ON SETUP   : a new distinct setup formed while the PREVIOUS setup's
                    outcome window is STILL OPEN (creation_timestamp is within
                    [prev.entry, prev.entry+horizon]). Its outcome window
                    overlaps the previous one -> NOT an independent sample.
INDEPENDENT SETUP : a distinct setup whose ENTRY occurs AFTER the previous
                    setup's outcome window has CLOSED (gap-separated by the
                    setup-level purge; see below).
OVERLAPPING SETUP : generic term for a setup sharing outcome-window bars with
                    another distinct setup.

DE-OVERLAP RULE (setup-level, analogous to P3.2.2 §B adapted to setups):
  define an EPISODE as a maximal run of distinct setups where successive
  entries are within the outcome horizon of the previous entry.
  LEAD SETUP (kept)   : the FIRST setup of each episode.
  FOLLOW-ON (reported): all later setups of the episode (excluded from the
                        primary independent dataset, but preserved & reported,
                        NOT deleted).
  VERIFY: for the de-overlapped stream, next_lead_entry - lead_entry > horizon.

PURPOSE: independent training observations. NOT a means to reduce samples for
better metrics; not driven by AUC.

G. FEATURE SNAPSHOT CONTRACT (PROPOSAL — Store 2)

Every feature is causally available at entry_timestamp. This section is a PROPOSAL from P3-S.15 §8 / §20, repeated here as the contract must bind them. It does NOT modify docs/FEATURE_CONTRACT.md (which remains unchanged and bar-level; the setup-level feature namespace is NEW and lives only in this contract proposal).

FEATURE-TIMESTAMP DISCIPLINE (per feature):
  feature          source         TF      as-of rule                       avail at entry?  leakage?
  h4_context       narrative state H4     newest closed H4 bar close_time <= entry        YES          NO
  m30_context      context state  M30    newest closed M30 bar close_time <= entry        YES          NO
  sweep_age_bars   liquidity event M15   entry_bar - sweep_onset                          YES          NO
  choch_age_bars   structure event M15   entry_bar - choch_onset                          YES          NO
  choch_latency    structure changeM15   (choch_onset - sweep_onset)                      YES          NO
  zone_age_bars    zone formation  M15   entry_bar - zone_formation                       YES          NO
  zone_width_atr   zone           M15   (upper-lower)/ATR(entry)                          YES          NO
  price_in_zone    zone/price     M15   (entry_close - zone)/width, etc.                  YES          NO
  dist_to_zone_atr zone/price     M15   distance(entry_close, zone)/ATR                   YES          NO
  displacement_at_creation attribute M15 value at creation_bar (closed)                   YES          NO
  m15_entry_condition condition   M15   boolean at creation_bar                           YES          NO
  m3_present / dir  micro confirmation M3 m3_bar <= W_m3 after creation (causal)          YES          NO
  sweep_size_atr    event         M15   sweep move / ATR(entry)                           YES          NO
  atr_at_entry      ATR           M15   ATR(14) over closed bars ending at entry          YES          NO

  RULE: if feature availability is uncertain at ENTRY, the generator must
        BLOCK/fail that row (do not infer). (§21.)

H. PRICE / SPREAD / EXECUTION (label-basis)

The research label uses a single REFERENCE PRICE (mid = (bid+ask)/2, or a
single close series) at the entry bar. TP/SL are computed as price offsets in
ATR units from that reference. Spread/slippage/commission are NOT applied in
P3-S.16 (an execution model is a later, separate phase). The contract records
this limitation explicitly so the research label is never misread as an
execution P&L.

I. DATA SPLIT / REPRODUCIBILITY (§23, §24) — FUTURE REQUIREMENT (defined, not run)

SPLIT (future, not executed in P3-S.16):
  - temporal split by entry_timestamp (chronological; no shuffle across time).
  - purge gap == outcome horizon between train/validation/test label windows.
  - NO overlap between label windows across split boundaries.
  - NO future information across any boundary.
  - exact split percentages = FUTURE RESEARCH PARAMETERS (OPEN; not optimized).

REPRODUCIBILITY (every future dataset generation must record):
  - source-data hash (per symbol/TF feed),
  - setup-dataset hash (deterministic over the generator),
  - contract version (this doc + label contract),
  - feature version, label version,
  - seed where applicable (deterministic generator may be seed-free),
  - generation timestamp.
  The dataset must be reproducible from the same source + contract alone.

J. LEGACY COMPATIBILITY (§25)

The new setup-level dataset is SEVERED from the legacy bar-level pipeline:
  LEGACY_L1_BAR_DRIFT  : 19 features, 24-bar direction drift, per M15 bar, MLP.
  FUTURE_L3_SETUP_OUTCOME : one Candidate Setup -> setup outcome (this contract).

The two are NEVER mixed. The legacy FEATURE_CONTRACT.md and the legacy model
remain reference-only and are NOT reused for the setup-outcome target.

K. PROVENANCE (future observation provenance — §22)

Every observation row must preserve:
  setup_id, symbol, timeframe, creation_timestamp, entry_timestamp,
  source-data provenance (dataset/hash), contract version, feature-contract
  version, label-contract version.
The dataset must not depend on undocumented external state.

L. CONTRACT VERDICT / BOUNDARY

This contract settles the SEMANTICS (unit, identity, entry, label family,
de-overlap, sampling, feature discipline, reproducibility). The following are
carried as OPEN numeric/parameter requirements (documented; NOT optimized):
  - TP/SL constants (ATR multiples)                 -> label contract OPEN
  - outcome horizon bars (semantic basis fixed)     -> label contract OPEN
  - split percentages / purge gap=numeric           -> §I OPEN
  - W_m3 (M3 confirmation lookback)                 -> frozen F3 placeholder
  - exact feature numeric lookbacks                 -> future feature contract
These OPEN parameters do NOT invalidate the CONTRACT semantics; they are the
"OPEN PARAMETERS" recorded per the session §33 classification intent, pending
authorized determination WITHOUT AUC/PF.

M. EXPLICITLY UNCHANGED / NOT MODIFIED

Candidate Setup runtime, F1, F2, F4 runtime MTF, FEATURE_CONTRACT.md,
SniperGold_ML.mqh, production .mq5/.mqh, legacy model: NONE changed by this
contract. No training, no model export, no deployment.

End of P3-S.16 setup-level dataset contract v1.