Skip to content

Consume the schema-8 families instead of merely checking them out - #43

Merged
ivanopcode merged 1 commit into
mainfrom
task/TASK-260824-31y75t-schema8-consumption
Aug 24, 2026
Merged

Consume the schema-8 families instead of merely checking them out#43
ivanopcode merged 1 commit into
mainfrom
task/TASK-260824-31y75t-schema8-consumption

Conversation

@ivanopcode

Copy link
Copy Markdown
Owner

Closes the false green the schema-8 impact analysis measured, on the Python side.
Mirrors curator PR 37 (relux-works/curator#37) for this implementation.

The hole

The declared candidate suite was 432eb2ee, whose conformance/v1/manifest.json
is byte-identical to the released pin 0c81c1f8 (sha256:12e58b82… on both).
Two immutable revisions, one conformance suite: every candidate run so far
measured exactly the corpus the default protocol lanes already measure, and no
assertion could have noticed. Identity authentication proves you read the right
bytes; it never proves the bytes differ from the pin, or that anything read them.

Schema 8 then landed (#40) with its corpora unread: IN_SCOPE_SCHEMA_NAMES in
tests/test_protocol_conformance.py is rc.6-era, and that module is pinned to
the released manifest anyway. agent-skill-v8, csk-skill-v8,
install-marker-v4, vectors/module-roots.json and
vectors/script-host-execution-policy.json were all checked out and never opened.

What changes

Presence and consumption are two different claims, so they get two ledgers.

Presence.github/ci/candidate-artifacts.tsv declares the root-relative
artefacts each consumer's unguarded reads require. The partition is derived from
the root, never from the lane: a root publishing the surface serves the
consumer, a root publishing none of it defers it and names what was absent
(this is what the released-pin lanes do). The candidate lane runs
candidate_consumption.py require and exports
CSK_REQUIRE_FULL_CANDIDATE_ROOT=1, so a partly published surface fails rather
than running quieter.

Consumption.github/ci/candidate-cases.tsv names the 11 tests the
candidate lane must observe passing on every runner, enforced by
candidate_consumption.py gate against that run's own --junitxml stream. A row
covers every parameterization of its test.

New consumertests/test_schema8_candidate_conformance.py authenticates
every byte against the candidate manifest and then decides real behaviour:

  • 132 agent-skill-v8 + csk-skill-v8 cases through skillspec.load_skill_spec
    on a materialized snapshot;
  • 27 install-marker-v4 cases through install_marker.read_install_marker, with
    a byte-exact to_json() round-trip;
  • 10 module-roots vectors through the real go_v1 seams, asserting the
    diagnostic and the phase (go-list vs go-build), plus the published
    evaluation_order;
  • the whole script-worker family: section classification in both directions, the
    closed policy identity and interpreter set against the suite's own bytes, every
    opt-in case's enforced/declared-only classification, and a refusal reaching the
    single shim publication point.

audit_label_cases is classified as a declared gap with its owner, not as
unreachable: this manager emits no script-command-declared-only /
script-command-unfiltered-declared-network label. Every other worker-side
section is refused before reached, and
test_a_refusal_precedes_every_worker_surface is the assertion those rest on.

Candidate.github/ci/candidate-suite.json now declares 6001dc3
(sha256:803918bf…b44403, tree sha256:d2c9d3df…ed2656, 1.0.0-rc.9). The
released pin is unchanged in value and still read back to reject impersonation.

Marker substitution — consuming install-marker-v4 settles the four cases
#40's review logged as inherited schema-7 semantics. They are reader bugs:
common.schema.json admits revision, tag and branch identically on both
pins, so branch was never a schema-8 addition, and Core 4.2 binds a
local-path substitution to effective identity kind operator-local-git, a
network-git substitution to network-git, and a structured revision to the
effective object format. install_marker now decides all three:
install-marker-v4 goes to 27/27 and install-marker-v3 from 23/27 to 27/27
against the released pin.

Evidence

Removing any of the five schema-8 families from the candidate root fails the
suite, in both removal modes:

family removed files gone from the checkout family unpublished from the manifest
schema-cases/agent-skill-v8 pytest exit 1, 66 failed require exit 1, named
schema-cases/csk-skill-v8 pytest exit 1, 66 failed require exit 1, named
schema-cases/install-marker-v4 pytest exit 1, 27 failed require exit 1, named
vectors/module-roots.json pytest exit 2, collection error require exit 1, named
vectors/script-host-execution-policy.json pytest exit 2, collection error require exit 1, named

A run that stops executing a declared case is green to pytest and red to the gate:
--deselect ...::test_module_root_case exits 0 with 173 passed, and
candidate_consumption.py gate --platform linux exits 1 naming the missing case.

Reverting only src/csk/install_marker.py turns
tests/test_install_marker_substitution.py 7-red and the consumer 4-red on
exactly the four cases the review named.

Local gates, all exit 0: consumer 183 passed against the rc.9 root; gate green
for linux/darwin/windows; tests/test_candidate_consumption.py 28 passed;
tests/test_install_marker_substitution.py 16 passed; tests/test_ci_workflow.py
13 passed; ordinary suite 1858 passed / 63 skipped; full
tests/test_protocol_conformance.py against the released pin 1044 passed / 1
skipped; Go E2E native selection against the rc.9 candidate; python -m mypy
75 files; actionlint.

The declared candidate suite was 432eb2ee, whose conformance/v1/manifest.json
is byte-identical to the released pin 0c81c1f8. Two immutable revisions, one
suite: every candidate run so far measured exactly the corpus the default
protocol lanes already measure. Schema 8 then landed with its corpora unread,
because IN_SCOPE_SCHEMA_NAMES in tests/test_protocol_conformance.py is rc.6-era
and that module is pinned to the released manifest anyway. A schema-8 candidate
could have been checked out, digest-matched and reported green while every
schema-8 case sat unread.

Presence in a root is not consumption, and a green run is not evidence that a
named case still runs. Those are two claims, so they get two ledgers.

Presence -- .github/ci/candidate-artifacts.tsv declares the root-relative
artefacts each consumer's unguarded reads require. The partition is derived from
the root, never from the lane: a root publishing the surface serves the
consumer, a root publishing none of it defers it by name, and the candidate lane
runs candidate_consumption.py require plus CSK_REQUIRE_FULL_CANDIDATE_ROOT=1 so
a partly published surface fails instead of running quieter.

Consumption -- .github/ci/candidate-cases.tsv names the tests the candidate lane
must observe passing on every runner, enforced by candidate_consumption.py gate
against that run's own junit stream. A row covers every parameterization of its
test, so a family that stops generating cases fails as loudly as one that starts
failing them.

The consumer, tests/test_schema8_candidate_conformance.py, authenticates every
byte against the candidate manifest and then decides real behaviour: 132
agent-skill-v8 and csk-skill-v8 cases through skillspec.load_skill_spec, 27
install-marker-v4 cases through install_marker.read_install_marker with a
byte-exact round-trip, 10 module-roots vectors through the go_v1 seams at their
own go-list/go-build failure boundary, and the whole script-worker family:
section classification in both directions, the closed policy and interpreter
identity against the suite's bytes, every opt-in case's enforced/declared-only
classification, and a refusal reaching the single shim publication point.
audit_label_cases is classified as a declared gap with its owner rather than as
unreachable, because this manager emits no script-command audit label.

The candidate declaration moves to 6001dc3 (manifest sha256:803918bf...b44403,
tree sha256:d2c9d3df...ed2656, protocol 1.0.0-rc.9). The released pin is
unchanged in value and still read back to reject impersonation.

Consuming install-marker-v4 also settles the four cases the schema-8 review
logged as inherited schema-7 semantics. They are reader bugs, not semantics:
common.schema.json admits revision, tag and branch identically on both pins, so
branch was never a schema-8 addition, and Core 4.2 binds a local-path
substitution to effective identity kind operator-local-git, a network-git
substitution to network-git, and a structured revision to the effective object
format. install_marker now decides all three, which takes install-marker-v4 to
27/27 and install-marker-v3 from 23/27 to 27/27 against the released pin.
@ivanopcode
ivanopcode merged commit 3ecca1d into main Aug 24, 2026
36 checks passed
@ivanopcode
ivanopcode deleted the task/TASK-260824-31y75t-schema8-consumption branch August 24, 2026 17:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant