0022 source revocation (A3a) + 0023 non-revival (A3b) — COUPLED round-__ROUND__ external-review package (__VERSION__)
=====================================================================================
package built:   __TS__ (UTC)
source commit:   __COMMIT__   (PACKAGE_MANIFEST.txt names the same one; the
                 sealer REFUSES if they differ — round 4 shipped two)
__CANDIDATES__
                 0004 is NOT a candidate: APPROVED at round 2, frozen on W1-W8.
                 It ships because the pair depends on it. Re-submitting an
                 approved spec invites re-litigating a closed decision, so it is
                 named here rather than quietly included.

MEASUREMENT CONTEXT — GENERATED, not promised (external round 10, R10-1:
                 the reviewer guide promised the exact command, environment,
                 pytest version and node count; none of them were here):
                 __CONTEXT__

REPRODUCTION — a launcher, and it REFUSES rather than reporting:
  bash specs/evidence/offline/run_offline.sh

  It uses $VERACIUM_PYTHON (or python3), creates a venv, installs the 11
  pinned wheels with --no-index --require-hashes, then asks THIS REPOSITORY
  whether the runtime is qualified — `runtime_supported()`, which specs/0007
  defines as a complete recorded runtime whose identity matches and whose
  recorded constructor manifestations reproduce. If that is not exactly True
  it EXITS 2 without running the suite.

  It does NOT apply a version floor. Round 6's version did, invented the rule
  itself, certified SQLite 3.53.1, and produced 660 failures on a build the
  real predicate rejected — and round 7 found this carrier still DESCRIBING
  that behaviour a round after the code changed. The description is now taken
  from the script that exists.

  LAUNCHER RESULT ON THIS PACKAGE'S FINAL STATE: __LAUNCHER__
  Measured after the archive's test set was frozen, not carried over from a
  previous round — round 7 caught v7 repeating v6's "1656 passed, 8 skipped"
  against a different test set.

measured line:   __MEASURED__ (exit 0)
                 TWO-PHASE, described honestly (external round 8, R8-2): the
                 suite is measured FIRST, in the committed tree at the commit
                 above, and THIS FILE IS BUILT FROM THAT RUN afterwards. So the
                 measured line was NOT produced with this COLLECTED present —
                 earlier rounds claimed "packaged-state" execution, which the
                 sealer's own order contradicts.
                 What IS verified with the file present, RUN FROM THE
                 EXTRACTED ARCHIVE before staging — this list is
                 GENERATED from the sealer's registry and the sealer
                 aborts if it runs anything else (round 9 found this
                 claim naming four verifiers the code never ran):
                 __EXTRACTED__
                 The full -rs output ships as COLLECTED_pytest_rs.txt and the
                 decomposition below is COMPUTED FROM IT.

harnesses:       __HARNESSES__
                 (RUN by the sealer on the tree being sealed, and re-run from
                 the EXTRACTED archive before staging — round 8 found this line
                 typed as 17/17 against an 18/18 executable)

evidence:        __EVIDENCE__

verifiers:       the SAME checks listed above under "RUN FROM THE EXTRACTED
                 ARCHIVE" — this line used to name them a second time, by hand,
                 and drifted the moment the registry changed (round 11 renamed
                 two verifiers to named scripts and this line kept the old
                 labels). One list, generated once — and NO CARDINAL here
                 either: round 13 found this paragraph saying "six" while the
                 generated list above it had grown to seven, in the very
                 sentence explaining that the list must not be maintained
                 twice. A count is a second copy of a list.

WHAT MOVED SINCE round-6 (v6, sha 0cb0bf66…) — your four blockers:
  R6-4  THE LAUNCHER CERTIFIED AN UNQUALIFIED RUNTIME, and that is the worst
        thing we shipped in this review. It invented "SQLite >= 3.35" while
        this repository already implements the real predicate,
        `runtime_supported()` (0007: a complete recorded runtime whose identity
        matches and whose constructor manifestations reproduce). You measured
        it selecting 3.53.1, calling it qualified, and producing 660 FAILED.
        It asks the repository now and REFUSES with exit 2 — proven by forcing
        the predicate False on a scratch copy. Our first fix was itself wrong:
        it asked BEFORE the venv existed, so `import veracium` failed for want
        of pydantic, every candidate was rejected, and `2>/dev/null` hid the
        reason. Build the venv, THEN qualify, and never silence the answer.
  R6-1  the rollback boundary is `BaseException` on BOTH sides now. Your
        KeyboardInterrupt injection is a regression in the harness (18 checks).
  R6-2  the stale "verbatim is withdrawn" paragraph is DELETED — it contradicted
        a block generated from the executable on the same page.
  R6-3  the closure ledger is VALIDATED against reviews.py, not maintained
        beside it: finding ids are EXTRACTED from verdict text and every one
        must have a row with a runnable command. It caught its own next gap
        immediately — recording this round's verdicts failed the gate until the
        round-6 closures were written — and it caught a precision bug in itself,
        counting a cross-spec reference ("0023 F1") as an obligation on 0022.

STILL OPEN:
  - the store-side R19 binding is enforcement-before-implementation, not a
    behavioural test. It becomes behavioural the day the store code exists,
    which needs 0022 accepted.

ENVIRONMENT-CONDITIONAL SKIP INVENTORY — GENERATED from specs/skip_inventory.py:
