SniperGold_ML/docs/P3_S17R_RUNTIME_RESEARCH_PARITY.md

397 lines
No EOL
16 KiB
Markdown

# P3-S.17R RUNTIME ↔ RESEARCH CANDIDATE SETUP PARITY
```text
Date : 2026-08-23
Session : P3-S.17R — Runtime <-> Research Candidate Setup Parity
Baseline : P3-S.17 checkpoint ed01af24644fbac26fec9fe6ff6a3179920a61d6
VERIFIED (origin = forge.mql5.io/chiki2bum2/SniperGold_ML.git,
branch main, working tree CLEAN).
Scope : XAUUSD M15 2017-01-01..2026-08-21 (Files/AlgoForge/Data); the
P3-S.17 authorized scope = 194,985 bars (2017-01-03..2026-07-21).
Human verif: REMAINS CANCELLED (historical only). NO AUC/PF/backtest/opt.
Verdict : PARITY BLOCKED (see §V). A trust-worthy full-population parity
could not be concluded because the F1 sweep primitive and the
H4/M30/M15 gate series are not yet faithfully reproducibly
wired on the real-data scope. The frozen F3 SETUP-LAYER semantics
IS reproduced (PAR-T01..T18 green); the DETECTOR/gate primitives
that feed it are the unresolved divergence.
```
---
## A. Objective (single question)
> Does the research-side Candidate Setup reconstruction reproduce the FROZEN
> MQL5 Candidate Setup decisions on the SAME historical input, stage by stage,
> WITHOUT changing runtime semantics?
Answer so far: **partial** — the frozen F3 setup-layer lifecycle/identity/
gate logic is reproduced exactly (17/17 PAR-T on the frozen oracle), and Stage 1
data identity passes, but the real-data **F1 sweep primitive** and the
consumed **H4/M30/M15 gate series** are NOT yet shown faithful, so the full
Candidate Setup population cannot yet be concluded with a trustworthy verdict.
---
## B. Source-of-truth hierarchy used
```text
1. Frozen spec contracts : SNIPERGOLD_CANONICAL_SETUP_CONTRACT_v1,
SMC_LIQUIDITY_SWEEP_SPEC_v1, SMC_CHOCH_MSS_SPEC_v1,
SMC_ORDER_BLOCK_SPEC_v1, SMC_FVG_SPEC_v1,
P3_S11_EVENT_CONTRACT_REPAIR, P3_S12_ZONE_CONTRACT_REPAIR.
2. Frozen MQL5 runtime : AF_Engine2_Setup.mqh (F3 layer)
AF_Engine2_Agents.mqh (F1/F2 detectors)
AF_Defines.mqh (constants: W_sweep/W_choch=40)
3. Verified regression : P3-S.16 (20/20), P3-S.13 F3 (25/25), P3-S.4 FVG (20/20).
4. Existing F3 oracle : ml/p3/smc_semantic/spec_tests_candidate_setup_runtime.py
canonical_oracle + F3SetupEngine.
5. Research extractor : P3-S.17 proxy (NOT merged) + this session's faithful
research ports.
6. New assumptions : avoided (per §35 STOP conditions).
```
The research extractor is NOT authoritative. Where research differs from frozen
runtime, research is repaired — never the runtime.
---
## C. Checkpoint & workspace
```text
Workspace : ...\Shared Projects\SniperGold_ML_authoritative (authoritative clone)
origin : https://forge.mql5.io/chiki2bum2/SniperGold_ML.git
branch : main
local HEAD: ed01af24644fbac26fec9fe6ff6a3179920a61d6
remote HEAD: ed01af24644fbac26fec9fe6ff6a3179920a61d6
working tree: CLEAN before parity work
```
---
## D. Latest SESSION_HANDOVER used
`docs/SESSION_HANDOVER_2026-08-23_P3_S17_DATASET_AUDIT.md` (read at session
start). It records DATASET BLOCKED, 0 raw setups, next gate = runtime↔research
reconciliation (P3-S.17R).
---
## E. Data source
```text
Symbol : XAUUSD
Timeframe : M15 (entry/setup carrier); H4 (gate); M30 (gate); H1/D1 (context)
Source : Files/AlgoForge/Data (XAUUSD_M15.npz, H1/H4/D1) — SAME source as
the P3-S.17 runtime-parity baseline.
Scope : 2017-01-01..2026-08-21 npz (197,032 bars after 2017 filter);
P3-S.17 authorized scope (194,985 bars, 2017-01-03..2026-07-21)
reproduced exactly in the Stage-1 identity check.
Feed quality: download_report 0 dup / 0 bad OHLC / 0 anomaly gaps (P3-S.17 §E).
No Tickstory / Dukascopy used as the baseline (deferred study, §Q).
```
---
## F. Stage 1 — data / timestamp identity (PAR-T01)
```text
n_bars_total : 197032 (M15, 2017+ npz)
n_bars_in_scope : 194985 (2017-01-03 .. 2026-07-21) == P3-S.17 recorded
timestamps_monotonic: True
t_start 2017-01-03 00:00Z t_end 2026-07-21 23:45Z
h4_bars 16234 / h1_bars ~frames / d1_bars available
=> Stage 1 PASS. The research pipeline reads the identical M15 OHLC/timestamps
used for the P3-S.17 runtime-parity baseline.
```
---
## G. Stage-by-stage parity matrix (real-data 2000-bar deterministic subset)
Golden-trace subset = the first 2000 closed M15 bars (2017), a MANAGEABLE
deterministic window (prompt §15/§13). Full-scope detection requires vectorized
detector kernels (documented as a future step; not a parity gate itself).
| Stage | Runtime (frozen) | Research port | Match | Notes / first divergence |
|---|---|---|---|---|
| H4 gate | (consumed context STATE) | gate input | ✓ (F3) | F3 layer consumes h4; PAR-T02 green |
| M30 gate | (consumed) | gate input | ✓ (F3) | PAR-T03 green |
| Sweep event | P3-S.2/P3-S.11 `DetectLiquidityGrabs`+W=40 | faithful port (this session) | ✗ vs legacy proxy | **FIRST DIVERGENCE** (see §H) |
| CHoCH event | P3-S.3/P3-S.11 | faithful port | ✓ (subset) | PAR-T06/T07 green; choch=289/2000 |
| OB zone | P3-S.5/P3-S.12 canonical | faithful port | ✓ (synthetic) | PAR-T08/T09; ob_active=1981/2000 |
| FVG zone | P3-S.4/SMC_FVG v1 | faithful port | ✓ (synthetic) | PAR-T10/T11; namespace boundary OK |
| M15 entry | (consumed E-rule) | gate input | ✓ (F3) | PAR-T12 green |
| Candidate Setup | F3 `AF_Engine2_Setup` | F3 oracle `canonical_oracle` | ✓ (setup layer) | PAR-T13..T18 green; 17/17 |
On the deterministic subset with NEUTRAL gates (all-zero H4/M30/M15), the F3
chain cannot form (context gate requires non-zero direction-compatible H4/M30),
so **runtime_created == research_created == 0**. That specific 0 is behavioural
(with neutral gates) and is NOT yet the faithful full-scope population — it is
reported honestly and the real population requires the runtime's actual gated
inputs (§M).
---
## H. FIRST DIVERGENCE — Stage 4 (Sweep event primitive)
Measured on the identical 2000-bar deterministic M15 subset:
```text
frozen_policy_sweep onsets (this port, P3-S.2 semantics, critical-bar):
58 occurrences / 2000 bars (= 2.9% onset rate)
legacy proxy `smc_semantic_common.sweep_state` active-bars:
1896 / 2000 bars (= 94.8% of bars marked "sweep bar >=0")
first divergence bar : 22 (frozen=-1, legacy=0)
bars frozen-only-active: 723
bars legacy-only-active : 0
```
Interpretation (P3-S.17R §16 classification):
```text
CLASS : FIRST-DIVERGENCE / STATE-CONVENTION
ROOT CAUSE : the P3-S.17 extractor's proxy sweep used the persistent
`smc_semantic_common.sweep_state` whose `sweep_bar[]` is a
persistent last-onset latch that once set stays set for the
REST of the window (94.8% of bars active). A faithful P3-S.2
EVENT interpretation marks only 2.9% of bars as carrying an
active sweep EVENT (fresh onset within W_sweep=40). The two
disagree from bar 22 onward. The P3-S.17 audit's "sweep_event_
onsets = 84" is itself a THIRD counting: distinct onset events
over 194,985 bars (the last-write onset), not active bars and
not this port's onset rate.
```
Consequences for the reference population:
```text
- ALL THREE interpretations diverge from one another:
84 events (P3-S.17 audit, 194,985 bars) [~0.04% / bar]
1,896 active bars (legacy proxy latch, 2,000 bars) [94.8%]
58 events (faithful P3-S.2 port, 2,000 bars) [2.9%]
- This is exactly the "detection fidelity gap" flagged as P3-S.17 BLOCKER 1.
- The research side has NOT yet reproduced the frozen runtime's sweep semantics
on the real-data scope because the exact detector + EVENT-convention has not
been byte-locked on the runtime's emission. This is the earliest unresolved
divergence that prevents a trustworthy full-population verdict.
```
Resolution path (NOT done this session — see §V): fix and byte-lock the
research sweep EVENT port to the frozen runtime emission (DetectLiquidityGrabs
+ EVENT valid-until W_sweep=40) and match onset bar, direction, valid-until,
and supersession on real data before re-running the chain.
---
## I. Sweep parity
The frozen semantics (P3-S.2/P3-S.11) are implemented as a faithful research
port in `ml/p3/setup_dataset/spec_tests_runtime_research_parity.py`
(`sweep_internal_pivots` + `sweep_events`). It uses:
- internal swing pivot (fractal len=5, closed bars)
- wick penetration + same-bar close-back (GRAB_WINDOW=8)
- W_sweep = 40 validity
- direction (+1 sell-side swept / -1 buy-side swept)
- M15, closed-bar
No simplified proxy is used in the port. However the FIRST DIVERGENCE is at
this stage — the pre-existing research side (P3-S.17) had a persistent-latch
sweep state that is not a faithful EVENT. This is the blocking divergence (§H).
The runtime detector is NOT modified.
---
## J. CHoCH parity
A faithful port (`choch_events`, swing fractal len=50 + close-confirmed break
of the newest swing pivot) is implemented. At the synthetic level the F3 chain
accepts CHoCH-after-sweep within the chain bound (PAR-T06/T07 green). On the
subset it produced 289 CHoCH bars. No external MSS/displacement theory beyond
the frozen spec was introduced.
---
## K. OB parity (P3-S.5/P3-S.12 canonical)
```text
Formation : opposite-color candle B before strong move |body(M)|>=1.5x avg(20)
Zone : full range [Low(B), High(B)]
Mitigation: close-through full fill (active skip)
```
Implemented (`ob_formation_at`) and asserted at synthetic level (PAR-T08/T09).
On the subset: 1,981 active-zone bars / 2,000. Not restored to legacy BOS/CHoCH
OB. Runtime unchanged.
---
## L. FVG parity (P3-S.4 / SMC_FVG SPEC v1) + namespace resolution
```text
Formation : 3-candle wick geometry; newest eligible C3 (no 1-bar lag)
Mitigation: wick full-fill (bull Low<=bot / bear High>=top); partial stays active
```
Implemented (`fvg_formation_at`), asserted (PAR-T10/T11). On the subset:
2,000 active-zone bars / 2,000 (FVG zones rarely fully filled — consistent with
the persistent-zone semantics S-8/S-9).
NAMESPACE/parity-absence (P3-S.17 BLOCKER 2) resolution in THIS session:
```text
- The F3 Candidate Setup layer legitimately supports zone_type == FVG
(AF_Engine2_Setup.mqh AF_SETUP_ZONE_FVG; SNIPERGOLD_CANONICAL §C/§D).
- This is SETUP-LEVEL research metadata, DISTINCT from the legacy 19-feature
ML contract (FEATURE_CONTRACT.md f0-f18 is FVG-free by design —
docs/SMC_FVG_SPEC_v1.md §13).
- The P3-S.4 parity-absence guard (scan_parity_absence in
ml/p3/smc_semantic/spec_tests_fvg.py) skips files named spec_tests_*.py.
The new parity file spec_tests_runtime_research_parity.py is such a file,
so referencing FVG there does NOT flip P3-S.4 FVG-T20.
- VERIFIED: P3-S.4 re-run = 20/20 (FVG-T20 "N/A by absence" still green).
```
Thus the constraint "FVG absent from FEATURE_CONTRACT" is preserved, while FVG
is permitted as a setup-level zone-type in the research/spec-test namespace.
FEATURE_CONTRACT.md was NOT modified.
---
## M. M15 entry parity & full-population status
The M15 entry condition is a consumed input (E-rule / premium-discount /
displacement boost per frozen Candidate Setup semantics). The F3 layer asserts
M15-direction parity (PAR-T12). On the deterministic subset the neutral-gate
default (no direction) means the chain correctly does not form.
Honest full-population note: a faithful Candidate Setup population over the
authorized scope requires the runtime's ACTUAL consumed inputs — the H4/M30
context STATE series and the M15 entry-condition series, both as-of closed bars
(time-aligned by the MTF as-of contract §L). Those gate/entry series were NOT
deterministically wired from a runtime dump in this pass, so the final setup
count cannot yet be truthfully reported. This is the remaining work (VERDICT).
---
## N. Real-data parity result (subset, deterministic)
```text
runtime_created (subset, neutral gates) : 0
research_created (subset, neutral gates): 0
identity match : n/a (empty) — both 0 on neutral gates
parity_tests : 17/17 PASS (PAR-T02..T18)
Stage 1 data identity : PASS (194,985 bars == P3-S.17)
Primitive counts on 2000-bar subset : sweep=58, choch=289,
ob_active=1981, fvg_active=2000
```
---
## O. Regression (after research-only changes)
```text
P3-S.16 setup_dataset : 20/20 PASS (re-run; historical expectations unchanged)
P3-S.13 F3 runtime : 25/25 PASS (re-run)
P3-S.4 FVG : 20/20 PASS (FVG-T20 still green — namespace boundary OK)
(Historical outputs restored; only new P3-S.17R artifacts added. No historical
suite weakened or modified.)
```
---
## P. Research-only files changed / added
```text
ADDED ml/p3/setup_dataset/spec_tests_runtime_research_parity.py
ADDED ml/p3/setup_dataset/output/p3_s17r_runtime_research_parity.json
ADDED ml/p3/setup_dataset/output/p3_s17r_stage_counts.json
GEN ml/p3/setup_dataset/output/p3_s17r_setup_diff.csv (gitignored *.csv)
ADDED docs/P3_S17R_RUNTIME_RESEARCH_PARITY.md (this file)
ADDED docs/SESSION_HANDOVER_<date>_P3_S17R_RUNTIME_RESEARCH_PARITY.md
```
## Q. Production files unchanged
```text
MQL5 production detectors, AF_Engine2_Setup.mqh, F1/F2/F3/F4 runtime,
FEATURE_CONTRACT.md, SniperGold_ML.mqh/, weights, legacy MLP, model artifacts:
NONE modified. Runtime is the PARITY REFERENCE, never altered.
```
## R. Tickstory / Dukascopy deferred study
Not used as the baseline. Documented as a future independent data-source
robustness study:
```text
Dukascopy/Tickstory raw ticks -> canonical M3/M15/M30/H4 -> independent
Candidate Setup reconstruction -> compare against HFM/MT5 runtime reference.
```
This is a future validation phase, not the current parity baseline.
---
## S. First divergence — staging table (per §16)
| # | Stage | Classification | Status |
|---|-------|----------------|--------|
| 1 | Data identity | TIMESTAMP | PARITY (PASS) |
| 2 | H4 gate | STATE | PARITY (PASS, F3) |
| 3 | M30 gate | STATE | PARITY (PASS, F3) |
| 4 | Sweep | **STATE/EVENT-CONVENTION** | **DIVERGENCE (blocking)** |
| 5 | CHoCH | EVENT | PARTIAL (synthetic OK; real-data not byte-locked) |
| 6 | OB | ZONE | PARTIAL (synthetic OK) |
| 7 | FVG | ZONE/NAMESPACE | PARTIAL (synthetic OK; namespace resolved) |
| 8 | M15 entry | ENTRY/CONDITION | PARTIAL (input not time-aligned) |
| 9 | Candidate Setup | SETUP | PARTIAL (empty with neutral gates; not yet faithful full scope) |
## T. Forge commits
```text
TBD (logical commits; see handover)
```
## U. Final Forge HEAD
```text
TBD after commit/push
```
## V. Final parity verdict
```text
PARITY BLOCKED
```
Rationale (matches prompt §33 definition):
```text
- The frozen F3 SETUP-LAYER semantics (lifecycle, identity, gates, dedup,
mutation-lock, zero-population consistency) ARE reproduced deterministically:
PAR-T01..T18 all pass against the canonical oracle (spec_oracle).
- Stage 1 (data identity) equals the P3-S.17 baseline.
- BUT the real-data Candidate Setup FULL POPULATION could not yet be
reconstructed faithfully because two DIFFERENT and inconsistent sweep
conventions remain (P3-S.17 proxy latch ≈ 95% active vs faithful P3-S.2
EVENT ≈ 2.9% vs audit 84 events) — the earliest unresolved divergence —
and the H4/M30/M15 gate series that the F3 layer consumes were not
time-aligned from a runtime dump in this pass.
- A divergence at the FIRST primitive stage is unresolved => a trustworthy
conclusion on runtime==research (zero OR non-zero) is not yet possible.
```
This is NOT ZERO POPULATION CONFIRMED (the 0 observed here is with neutral
gates, not the faithful full-scope population), and NOT PARITY ACHIEVED.
## W. P3-S.18 readiness
```text
NOT READY. No training may begin. Before any P3-S.18 baseline, a follow-on phase
must:
1. Byte-lock the research F1 sweep/CHoCH EVENT ports to the frozen MQL5
runtime emission (onset, dir, valid_until, supersession) on the authorized
scope (fixing the §H first divergence).
2. Wire the runtime's H4/M30/M15 consumed gate series, time-aligned per the
MTF as-of contract (§L), so the F3 chain can be run to a faithful
non-empty population (or proven genuinely zero).
3. Re-run this parity suite + the P3-S.17 audit on the reconciled population.
```
Training and parameter optimization remain OUT OF SCOPE (frozen policy).
---
*End P3-S.17R runtime↔research parity report. Verdict: PARITY BLOCKED.*