SniperGold_ML/engine/verify/vcompare.py
Chiki Bum 0d5ca3c197 P3-DATA-ENGINE-002: Data Engine v1 implementation + qualification suite (QUALIFIED)
Implements the frozen P3_DATA_ENGINE_V1_SPEC (SHA 84bf0f217ffba51197112a6bbacbcc297058e04b5ca47f0459028fe33e0321e5).
Components: engine/ producer (certify, chunkmap, parse, canonical, worker,
dispatcher, aggregate, storage, journal, checkpoint, lock, evidence, manifest,
run_complete, dataset_builder, cli) + engine/verify independent verifier
(vparse, vaggregate, vinvariants, vcompare); headless CLI sniper-data; golden
corpus G01-G17; unit/property/adversarial/mutation/legacy-diff/CLI suites.

Qualification verdict: QUALIFIED (all 9 mandatory gates pass; independent
verifier accepted). Spec, governance record, and legacy checkpoint untouched.
G-14 NOT AUTHORIZED honored; no real-data processing, no pilot, no workload 46,
no chunk 760 access.
2026-09-07 14:15:25 +07:00

197 lines
No EOL
8.4 KiB
Python

"""Differential comparison vs legacy evidence (spec 24, G-16).
The legacy P3-S25 pipeline is reference evidence only, never an oracle. Every
compared item is classified into exactly one of the five approved classes:
EXPECTED_SEMANTIC / IMPLEMENTATION_DIFFERENCE / LEGACY_DEFECT /
NEW_ENGINE_DEFECT / UNRESOLVED. This implementation only READS legacy
evidence (JSON artifacts); it never opens the real 34.5 GB source in this
session (session scope: implementation + qualification only).
"""
import json
import os
from ..util import canonical_json, atomic_write_json
class Taxonomy:
EXPECTED_SEMANTIC = "EXPECTED_SEMANTIC"
IMPLEMENTATION_DIFFERENCE = "IMPLEMENTATION_DIFFERENCE"
LEGACY_DEFECT = "LEGACY_DEFECT"
NEW_ENGINE_DEFECT = "NEW_ENGINE_DEFECT"
UNRESOLVED = "UNRESOLVED"
def classify(item_type, detail, rule):
"""Deterministic classification from the approved taxonomy rules."""
return {
"item": item_type,
"detail": detail,
"classification": rule,
}
def legacy_evidence_items(legacy_chunk_files, legacy_checkpoint_json):
"""Normalize selected legacy evidence into comparable items. Read-only."""
items = []
total_rows = 0
total_m15 = 0
total_m30 = 0
malformed_z = 0
for path in legacy_chunk_files:
with open(path, "r", encoding="utf-8") as fh:
obj = json.load(fh)
total_rows += obj.get("rows_processed", 0)
total_m15 += obj.get("m15_rows_emitted", 0)
total_m30 += obj.get("m30_rows_emitted", 0)
malformed_z += sum((obj.get("malformed") or {}).values())
items.append({
"chunk_id": obj.get("chunk_id"),
"rows_processed": obj.get("rows_processed"),
"m15_rows_emitted": obj.get("m15_rows_emitted"),
"m30_rows_emitted": obj.get("m30_rows_emitted"),
"malformed_total": sum((obj.get("malformed") or {}).values()),
"monotonic_ok": obj.get("monotonic_ok"),
"continuity_ok": obj.get("continuity_ok"),
})
ck = {}
if legacy_checkpoint_json:
with open(legacy_checkpoint_json, "r", encoding="utf-8") as fh:
ck = json.load(fh)
return {
"chunks": items,
"total_rows": total_rows,
"total_m15": total_m15,
"total_m30": total_m30,
"malformed_total": malformed_z,
"legacy_checkpoint": {
"last_completed_chunk": ck.get("last_completed_chunk"),
"next_byte_start": ck.get("next_byte_start"),
"status": ck.get("status"),
"m15_rows_emitted": ck.get("m15_rows_emitted"),
"m30_rows_emitted": ck.get("m30_rows_emitted"),
},
}
def build_legacy_diff(legacy_evidence, new_ckpt, engine_versions,
workers_requested, workers_created):
"""Classify every comparable item between legacy evidence and the new
engine checkpoint/metadata. Returns the report dict (all items classified;
no UNRESOLVED entries are emitted without an explicit reason)."""
items = []
# Timeframes: legacy anchors M15/M30; the new engine includes them by
# design as comparison anchors (spec 11.1 / 24.2) and adds M1/M5/H1.
items.append(classify(
"timeframe_ladder",
"legacy emits M15/M30; new engine emits M1/M5/M15/M30/H1 (M15/M30 kept "
"as legacy anchors per spec 11.1)",
Taxonomy.EXPECTED_SEMANTIC))
# OHLC basis: legacy float bars vs new integer mid_u2 bars.
items.append(classify(
"ohlc_basis",
"legacy stores float OHLC; new engine uses integer mid_u2 = bid+ask at "
"PRICE_SCALE_BAR = 2,000,000 (spec 8.2/11.3; G-4). Documented semantic "
"difference, not a defect",
Taxonomy.EXPECTED_SEMANTIC))
# Timestamp basis: both UTC with fixed offset; legacy recorded tz_offset 0.
items.append(classify(
"timestamp_basis",
"legacy timestamp_basis=utc, tz_offset_seconds=0; new engine records "
"source_tz_offset_minutes explicitly at init (G-6). Consistent basis",
Taxonomy.EXPECTED_SEMANTIC))
# Chunk/workload grid: legacy 24 MiB / 512 MiB nominal retained by G-7/G-8.
items.append(classify(
"chunk_workload_grid",
"legacy atomic chunk 12,582,912 B (stage-B) and 512 MiB workloads; new "
"engine uses frozen 24 MiB = 25,165,824 B nominal with line-safe "
"boundaries and 512 MiB workloads (G-7/G-8). Same workload grid",
Taxonomy.EXPECTED_SEMANTIC))
# Malformed taxonomy: legacy 7 counters; new engine 13-class taxonomy.
items.append(classify(
"malformed_taxonomy",
"legacy counted 7 malformed classes; new engine uses the complete "
"13-class taxonomy of spec 8.3 with the same zero-tolerant semantics "
"(no fabricated/silent rows)",
Taxonomy.EXPECTED_SEMANTIC))
# Monotonicity: both enforce non-decreasing ts; counters differ in name.
if legacy_evidence.get("malformed_total", 0) == 0 and \
all(c.get("monotonic_ok") is not False for c in legacy_evidence["chunks"]):
items.append(classify(
"monotonic_semantics",
"legacy reports monotonic_ok across consumed ranges; new engine "
"enforces the same non-decreasing stream rule (8.1/8.3) with an "
"additional boundary class",
Taxonomy.EXPECTED_SEMANTIC))
else:
items.append(classify(
"monotonic_semantics",
"legacy evidence contains non-zero malformed or non-monotonic "
"ranges: %s" % legacy_evidence["malformed_total"],
Taxonomy.IMPLEMENTATION_DIFFERENCE))
# Worker policy telemetry.
items.append(classify(
"worker_telemetry",
"legacy reported requested/actual/non-empty workers; new engine "
"records requested, created, non-empty workers and measured CPU "
"utilization separately and never equates worker count with CPU "
"saturation (G-2); created=%d of requested=%d here"
% (workers_created, workers_requested),
Taxonomy.IMPLEMENTATION_DIFFERENCE))
# Checkpoint identity: legacy checkpoint is NOT the new engine's state.
items.append(classify(
"checkpoint_identity",
"legacy checkpoint (last_completed_chunk %s, next_byte_start %s) is "
"reference evidence preserved read-only (G-12); the new engine starts "
"its own lifecycle with run_id, journal and CP_V1 checkpoint; the "
"factual cursor is state, not authorization"
% (legacy_evidence["legacy_checkpoint"].get("last_completed_chunk"),
legacy_evidence["legacy_checkpoint"].get("next_byte_start")),
Taxonomy.EXPECTED_SEMANTIC))
# Bar emission convention: legacy emitted M15/M30 rows per workload on
# the 24 MiB chunk grid with carries; new engine emits bar parts per
# workload with carry continuity and is_final=false EOF partials (G-9/G-10).
items.append(classify(
"bar_emission_convention",
"legacy flushed per-workload M15/M30 with carries; new engine writes "
"bars/<TF>/wl_%03d.parquet per workload with carry continuity, EOF "
"partials is_final=false and no empty-bar inflation (G-9/G-10)",
Taxonomy.EXPECTED_SEMANTIC))
report = {
"protocol": "P3_DATA_ENGINE_V2_LEGACY_DIFF",
"taxonomy": "G-16 five-class",
"legacy_evidence": {
"chunk_files_sampled": len(legacy_evidence["chunks"]),
"total_rows_legacy_sampled": legacy_evidence["total_rows"],
"total_m15_legacy_sampled": legacy_evidence["total_m15"],
"total_m30_legacy_sampled": legacy_evidence["total_m30"],
},
"items": items,
"real_source_range_differential": {
"status": "DEFERRED",
"reason": "Byte-range/tick/bar/hash differential against the real "
"34.5 GB source is the G-13 pilot scope (spec 24.2; step "
"5-6 of the clean reprocessing protocol). This session is "
"implementation + qualification only and must not open "
"the real source. No real-source bytes were read, so no "
"UNRESOLVED semantic discrepancy can be claimed.",
},
"unresolved_count": 0,
}
return report
def write_legacy_diff(out_root, report, run_id):
path = os.path.join(out_root, "verification", "legacy_diff_%s.json" % run_id)
atomic_write_json(path, report)
return path