Persona: spec-reviewer. Why: independently CONFIRM that the bounded post-round-12 correction to OBPI-0.35.0-04 is correct and that its refreshed evidence is real. This is CORRECTION VERIFICATION against an accepted baseline, not a new protocol investigation. Read-only: do not edit source, tests, brief, ledger, locks or markers; do not launch pipelines or delegate implementation.

ACCEPTED BASELINE (do not re-litigate): round 12 at commit f8952033 returned not-refuted from two reviews (Codex receipt arb-step-codexadversary-1e432720be4046cfaee3197e27a82a1a; Claude receipt arb-step-claudeacceptance-3eae42a1cd9845d2900a25e28b595617). Its findings were one medium, two low, one cosmetic. The operator accepted the bounded correction as the direction. The malformed-metadata low is DISCLOSED by ruling and stays out of scope; ledger exceptions #952/#953 are unchanged and out of scope; the brief's Threat Model boundary stands.

SUBJECT: the single correction commit d2280608 (git diff f8952033..d2280608). Acceptance identities now: unown.py 0128624028d2f5f7cce805b17c26a07f1a5b739bf18d035803b6a3a82d2328e1 (unchanged); test_content_unown.py 28176d3795861007ff28a8581043b1256acbc4a7feadedd662546d4be01c13c7 (unchanged); ownership.py d9561d7f0df0ef195767f379f424be2ab1f10ca9a793dda5b781940edff4c091; test_ownership.py 0eae3cbd04fcb9f7a95719e28dce61db0e7580cbfa9cc7ba03ac4260680e2be1. Verify these against the working tree first.

WHAT THE CORRECTION CLAIMS: (1) medium fixed — _windows_directory_error in src/gzkit/content/ownership.py now reads ctypes.get_last_error() when no explicit code is passed, because kernel32 is bound with use_last_error=True and a bare WinError() reads the live pre-call GetLastError; a stale/zero code maps to EINVAL which is in BARRIER_UNSUPPORTED_ERRNOS and would misroute a transient fault to the "unsupported" remedy. Preservation and exit-2 non-success were never affected. (2) tests/content/test_ownership.py: the shared mocked boundary _native_fault_boundary now parks code 32 in a patched ctypes.get_last_error and records WinError calls; test_native_failures_report_the_callee_error_code_not_a_stale_read asserts all three failure arms hand WinError 32, never None. A deterministic NATIVE test test_native_open_failure_reports_the_callee_error_code (skipUnless nt) forces the live slot to 0 via SetLastError then opens a missing nested directory and asserts winerror 3 / errno ENOENT / not in BARRIER_UNSUPPORTED_ERRNOS. (3) docs/user/manpages/content.md exit table: the fresh-path foreign-snapshot refusal is exit 1 (journal_retained=False, _refuse_foreign_declaration_snapshot), the three recovery-side snapshots are exit 2. (4) comment above _OWNERSHIP_EVENT_TYPES names the roster instead of a count.

REFRESHED EVIDENCE TO AUDIT, NOT TRUST (all under docs/design/adr/pre-release/ADR-0.35.0-canon-entry-corpus-landing/appendices/obpi-04-recovery-2026-09-05/final/): summary-v5.json and postfix-mutation-evidence.zip (44-case sweep at source_commit d2280608: the 43 round-12 cases rebound to the new hashes by rebind_manifest44.py with no edit or selector changed, plus ONE new mocked control W08 that deletes the saved-last-error read; check the manifest diff, per-case provenance, W08 mutant stderr, exact restoration); postfix-ci-result.json and postfix-ci-windows.log (GitHub Actions run 33981617383 on ubuntu-latest and windows-latest at d2280608; confirm the head SHA and both conclusions, and whether the Windows log evidences the native test class ran rather than skipped); round12-fix-mutation-witness.log (the RED/GREEN deletion witness). Distinguish what you reran from what you audited.

WHAT TO DO: verify the four hashes; read the diff f8952033..d2280608 in full; run the scoped modules with ./.venv/bin/python -B -m unittest tests.content.test_ownership tests.commands.test_content_unown (uv run cannot initialise its cache in the sandbox; a writable-tempdir refusal is a limitation, not a defect); trace ctypes semantics for use_last_error/get_last_error/WinError from the stdlib in .venv and confirm the fix is the correct API, including that the RtlNtStatusToDosError arm still passes an explicit code; confirm the mocked boundary change cannot mask a regression (it patches get_last_error, so a production that ignores it must fail the new test — show the mutant evidence in the zip); check the manpage rows agree with the exit_code = 2 if journal_retained else 1 contract and the per-site test pins; confirm nothing else in the diff changed behaviour.

RETURN: CORROBORATED | CORROBORATED-WITH-CAVEATS | NOT-CORROBORATED plus the enum not-refuted | refuted. Pass requires the correction positively demonstrated and no in-scope critical/high defect in the correction. Every finding must cite severity, file:line and a concrete reproduction; do not report speculation as an observed failure, and do not reopen the accepted baseline, the disclosed malformed-metadata low, or the ledger exceptions. Include what could NOT be confirmed and a Weakest point section. Show observed command output.
