I read this as execution of the complete Phase2 postfreeze qualification for the immutable v32 bundle - I’ll inspect its sealed command inputs, validate prerequisites, run the prescribed destructive/runtime checks exactly once, and return only a verified PASS receipt or nested fail-closed evidence.


The sealed Phase2 machinery is understood: v32 intentionally keeps the prefreeze root untouched, so qualification will use a byte-identical disposable copy with its required postfreeze seal. I’m now performing the full pre-removal cryptographic projection checks and capturing the original runtime before destructive cleanup.


All pre-removal gates passed, the 396-file snapshot is fixed, and the exact original runtime has been removed. I’m starting the hostile isolated verifier and independent bare-bootstrap executions against the sealed disposable copy; any nested failure will be preserved byte-for-byte and terminate fail-closed.


The mandatory independent verifier failed closed. Its nested installed final-state v7 check found a reproducibility defect: sealed Ty raw diagnostics expected `f4a226...e86a`, while hostile sealed-wheel rehydration produced `5ac266...bb4`. I’m preserving that exact nested diagnostic and completing the remaining bootstrap, explicit rehydration characterization, tamper rejection, wheelhouse identity, and terminal cleanup proofs before sealing the FAIL-CLOSED receipt.


The remaining checks are complete: canonical direct_url provenance matched both exact sealed wheel hashes, raw absolute-path hashes differed and were explicitly recorded as non-equal, wheelhouse bytes stayed identical, and disposable seal tampering was rejected. The candidate still cannot qualify because the sealed Ty diagnostic hash is non-reproducible; I’ve cleaned every runtime and am authenticating the immutable fail-closed receipt root.


I read this as the completed Phase2 qualification - return the exact sealed fail-closed result.

**FAIL-CLOSED**

- Candidate: `7997f03e8eb5d439ed3eec672a22237999e513cf8b98b48c4b5656b075ec7c99`
- Failed gate: `portable_ty_raw_diagnostics_reproducibility`
- Required: `TASK26_INDEPENDENT_CANDIDATE_PASS`
- Actual: `TASK26_INDEPENDENT_VERIFY_FAIL`
- Nested failure:
  - Status: `TASK26_REHYDRATION_FAIL`
  - Path: `hermetic_ty_attestation.raw_diagnostics_sha256`
  - Expected: `f4a2265141525dc8005430e8afdf61145ff88c24a7fc00aad2d7609b3f2ce86a`
  - Actual: `5ac266487fea8355d15ad3499874d5c30570a4910b158cea32db9ee8a7954bb4`

Immutable receipt root:

`/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-direct-url-portable-v32-postfreeze-receipts-st_01a01946`

- `FAIL-CLOSED.json` SHA-256: `3ba700733ec87810e63b150c25600a80ba68b596c8f48390488db4ff1ddd2e8f`
- `SEAL.json` SHA-256: `417f5f93778b7be9fce47d6b88d881066a6c7865157742fb629567f66c5dc071`
- Seal document SHA-256: `20f23bbf4909575791839655c995ad2095019f35a17ea2a42176cab6b0a3d83a`

Prefreeze bytes remained unchanged. Wheelhouse identity, canonical direct_url wheel hashes, explicit raw-path/hash inequality, tamper rejection, and terminal cleanup passed. All original, rehydrated, hostile, tamper, watcher/socket, and authority runtime residue is absent.


I read this as a read-only forensic reproduction of the v32 Ty mismatch - I’ll rehydrate only in `/tmp`, execute the sealed runner with its sealed toolchain under the prescribed scrubbed environment, structurally test H1-H3, preserve no new evidence, and remove the disposable runtime.


The sealed runner contract is clear: it copies the installed Hermes source into a private relative path, installs the exact corrected Ty wheel into its own isolated venv, emits raw GitLab JSON, then applies the sealed capability gate. I’m reproducing that contract now and will compare both byte order and canonical semantic projections rather than relying on the prior failure receipt.


The structural result is decisive for H1-H3. One remaining causal detail is now testable from the sealed binary itself: Ty documents that an unspecified target version may be inferred or fall back, and the runner does not pass `--python-version`; I’m mapping the sealed expected hash against explicit 3.12/3.13/3.14 targets before giving the correction.


I read this as completed read-only Ty forensics - report the reproduced mismatch, tested hypotheses, root cause, and minimal correction.

## Verdict

- **H1 path-only differences: FALSE**
- **H2 ordering-only differences: FALSE**
- **H3 semantic differences: TRUE**

Exactly **21 of 810 diagnostics changed**, exclusively in the message text. Rule, severity, location/range, path, fingerprint, ordering, and counts were unchanged.

## Root cause

The sealed runner invokes Ty without `--python-version`. Ty therefore inferred/fell back to Python **3.14 semantics** during rehydration, while the sealed expected artifact was generated with Python **3.12/3.13 semantics**.

Explicit sealed-binary tests proved:

| Ty target | Raw SHA-256 | Count |
|---|---|---:|
| `--python-version 3.12` | `f4a2265141525dc8005430e8afdf61145ff88c24a7fc00aad2d7609b3f2ce86a` | 810 |
| `--python-version 3.13` | `f4a2265141525dc8005430e8afdf61145ff88c24a7fc00aad2d7609b3f2ce86a` | 810 |
| `--python-version 3.14` | `5ac266487fea8355d15ad3499874d5c30570a4910b158cea32db9ee8a7954bb4` | 810 |
| `--python-version 3.15` | `5ac266487fea8355d15ad3499874d5c30570a4910b158cea32db9ee8a7954bb4` | 810 |

The 21 changed messages remove `SupportsTrunc`:

```text
Expected: Expected `str | Buffer | SupportsInt | SupportsIndex | SupportsTrunc`, found `object`
Actual:   Expected `str | Buffer | SupportsInt | SupportsIndex`, found `object`
```

## Structural differences

First 20 canonical leaf differences, all `.description`:

```text
$[129], $[148], $[152], $[199], $[200],
$[201], $[202], $[240], $[242], $[244],
$[246], $[260], $[263], $[265], $[267],
$[637], $[644], $[648], $[654], $[657]
```

Mismatch counts:

```text
message:      21
rule/code:     0
severity:      0
range:         0
path:          0
fingerprint:   0
count:         0
```

## Hash comparisons

| Projection | Expected | Actual |
|---|---|---|
| Raw bytes | `f4a226...e86a` | `5ac266...bb4` |
| Canonical emitted JSON | `3336f4bd...aaae` | `20f20c40...0b59` |
| Stable-sort canonical | `4b24118c...da61` | `5c0781c9...60ca` |
| Root-canonicalized | `3336f4bd...aaae` | `20f20c40...0b59` |
| Root-canonicalized stable sort | `4b24118c...da61` | `5c0781c9...60ca` |
| Paths erased + stable sort | `dbc80547...5ba` | `34ca17ea...ee9` |

Thus neither path canonicalization nor stable sorting removes the mismatch.

Expected artifact:

`/home/cube/projects/richard/traning coach/.omo/evidence/task26/task26-direct-url-portable-prefreeze-st_01a01574-v32/receipts/hermetic-ty/ty-diagnostics.gitlab.json`

Actual disposable artifact was:

`/tmp/task26-v32-ty-forensic-p0xgUG/out/ty-diagnostics.gitlab.json`

That disposable root was removed.

## Capability surface

| | Expected | Actual |
|---|---:|---:|
| Total diagnostics | 810 | 810 |
| Capability diagnostics | 0 | 0 |
| Outside-surface diagnostics | 810 | 810 |
| Outside fingerprint | `4b24118c...da61` | `5c0781c9...60ca` |
| Receipt | `6c1cef49...0933` | `de0dfa1a...beb3` |

Both capability gates returned `PASS_CHANGED_SURFACE_WITH_PREEXISTING_OUTSIDE_SCOPE_DIAGNOSTICS`.

## Execution bindings

- Runner: `771e8322ee0a411cffc70218bacb0c9b1b10d2911df19d146d483c27b6dc478d`
- Gate: `42f29260ecb16308a8ffae875b917aa0c2b231ff5285f4adb13e31eef509b8a3`
- Ty wheel: `932d4552233cfbaa325ddc3db5982150a37f437cf94a332eb3869052148bfe4c`
- Ty executable: `a7c67f977d2684af6eb4c0ecc011e6e8e3227180353fd9be46bc7371a2f88d16`
- Installed Ty RECORD: `b7c753f28fe3a1df3bf6f29a9934928a49630acba34a4cf5001c19d83a7c7502`
- Hermes wheel: `39192a239a450fecb1336876fd79e4bfc3d4188fedce9ff92e302cee0e9be79c`
- Profile wheel: `62c508d3548ed5f5fe28c1a137bbc1b6af286d48419dc9e66fa4c7c8422b4121`
- Source: `cd64b9ae1f8bbef56fe38f2203ad4ac3233c6226f4cbb7b54c71a43683291a05`

Environment was scrubbed to `HOME`, `TMPDIR`, `/usr/bin:/bin`, `PYTHONNOUSERSITE=1`, `PIP_NO_INDEX=1`, `PIP_CONFIG_FILE=/dev/null`, and `PIP_DISABLE_PIP_VERSION_CHECK=1`; the runner additionally set `LC_ALL=C`, `LANG=C`, and `/bin:/usr/bin`.

## Minimal correction

Pass `--python-version 3.12` in the sealed Ty invocation, matching the sealed runtime interpreter. Regenerate and reseal the expected diagnostics under that explicit target, then require a second clean rehydration to reproduce both raw and stable-sort hashes.

Do not weaken comparison by ignoring message fields. No sealed files or evidence were modified; all disposable runtimes were removed.