forked from chiki2bum2/SniperGold_ML
439 lines
19 KiB
Markdown
439 lines
19 KiB
Markdown
# 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 : <recorded after the docs commit and push (see provenance)>
| |||
```
| |||
| |||
## 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.*
|