SniperGold_ML/docs/P3_S25_1D_VERIFICATION_DRIVER_HARDENING.md

97 lines
4.8 KiB
Markdown

# P3-S25.1D — VERIFICATION DRIVER HARDENING
```text
Document type : PHASE REPORT / GOVERNANCE-ADJACENT (verification evidence)
Date : 2026-08-28
Phase : P3-S25.1D — Verification Driver Hardening & Bounded Multi-Chunk Turn Benchmark
Scope : VERIFICATION / EXECUTION-EFFICIENCY ONLY. No real-source ingestion.
Status : (see multichunk_benchmark_manifest.json — authoritative)
```
## Purpose
Harden the disposable verification driver against the recurring
carry / state-recording defects that produced false or misleading evidence in
earlier sessions, and establish immutable input/output state fingerprints for
each atomic 24 MiB chunk.
## Hardening requirements enforced (per P3-S25.1D section 6)
The driver implements the following invariant workflow per atomic chunk:
```
A. input_carry = deepcopy(current_carry) BEFORE any aggregation
B. recorded input_carry is IMMUTABLE for the remainder of verification
C. canonical (production) ordering (stable, by integer timestamp)
D. output_carry = deepcopy(current_carry) AFTER aggregation (separate state)
E. canonical serialisation (deterministic, key-sorted JSON)
F. independent input_state_hash / output_state_hash (sha256 over canonical form)
G. fail-closed assertions -> PASS only if all hold, else VERIFIER_ERROR
```
Any failure returns `VERIFIER_ERROR` (never a forced PASS). The driver also
enforces **byte-contiguity**: chunks are read line-safely (a chunk of up to
`ATOMIC` bytes is extended to the next newline) and chained on the *actual
consumed* byte offset, mirroring the production parser (`pos += len(raw)`).
This prevents nominal-boundary drift that otherwise duplicates/skips a record
straddling a chunk edge and silently breaks the single-stream invariant.
## Verifier self-test (section 7) — 8 required defects
A synthetic self-test deliberately reproduces each previously-observed driver
defect and asserts the hardened verifier REJECTS it:
| # | Defect injected | Detection |
|---|--------------------------------------------------------|-----------|
| 1 | capture input carry after aggregation | input captured after aggregation |
| 2 | same mutable carry object into aggregation | same mutable carry object |
| 3 | tuple sorting instead of canonical order | tuple-sorting-used |
| 4 | post-chunk carry used for reproducibility | post-chunk-carry-used |
| 5 | record input carry mutated after capture | input-mutated-after-capture |
| 6 | omit input-state hash | input-state-hash-missing |
| 7 | serialized carry field order altered | serialized-carry-field-order |
| 8 | chunk boundary shifted by one byte | chunk-boundary-shifted |
Result: **8/8 VERIFIER-DEFECTS DETECTED** (machine-readable:
`output/verifier_hardening_results.json`).
## Mutation coverage (section 23) — 12 required classes
| Mutation | Detection |
|----------|-----------|
| 1 wrong chunks-per-turn value | chunks-per-turn-value |
| 2 skipped atomic chunk | chunk-skipped-or-duplicated |
| 3 duplicated atomic chunk | chunk-skipped-or-duplicated |
| 4 byte offset shifted | byte-continuity |
| 5 wrong source identity | source-identity|
| 6 wrong input carry | wrong-input-carry |
| 7 input carry captured post-agg | input-carry-post-aggregation |
| 8 output carry used as input | output-carry-used-as-input |
| 9 canonical ordering replaced | canonical-ordering-replaced |
|10 output row deletion | row-deleted |
|11 output row duplication | row-duplicated |
|12 semantic output mutation | semantic-output-mutated |
Result: **12/12 DETECTED** (`output/multichunk_mutation_results.json`).
## Boundary-continuity (blocking finding + resolution)
The first integration of the multi-chunk engine exposed a real defect: batch
configs and reference agreed only when chunks were chained on the actual
line-safe consumed byte offset. When chained on fixed 24 MB multiples, the
semantic produced `N_BATCH = N_REF - 5` rows (a record straddling each nominal
edge was processed inconsistently). The test harness correctly returned
CHUNK-BATCH INVARIANCE FAILURE (fail-closed). After the driver was hardened to
chain on actual consumed offsets, `rows / M15 / M30 / hashes / final carry`
became byte-identical across reference and batch 1/2/4/6
(`words_match = True`, `semantic_invariant = True`).
## Evidence files
- `output/verifier_hardening_results.json`
- `output/multichunk_mutation_results.json`
- `output/multichunk_invariance.json`
- `output/multichunk_interruption.json`
- `output/multichunk_benchmark.json`
- `output/multichunk_benchmark_manifest.json`
All under `ml/p3/p3_s251_external_ingest/multichunk_benchmark/`.