Skip to content

feat(conformance): add the ${CONTAINER_ID} argv token and retire two parity carriers#368

Open
pofallon wants to merge 2 commits into
mainfrom
feat/step6-container-id-token
Open

feat(conformance): add the ${CONTAINER_ID} argv token and retire two parity carriers#368
pofallon wants to merge 2 commits into
mainfrom
feat/step6-container-id-token

Conversation

@pofallon

Copy link
Copy Markdown
Contributor

Deletes parity_exec and parity_up_exec. Both were held by records that turned out to be answerable rather than pending.

res-exec-per-side-argv was obsolete, not outstanding

It claimed a declarative operation needed per-side argument vectors, because deacon took --env where the reference takes --remote-env. But cli.rs:534 already declares:

#[arg(long = "remote-env", action = clap::ArgAction::Append, alias = "env")]

--remote-env is the primary flag; --env is a hidden legacy alias. So one shared argv runs on both CLIs and the comparison is a true differential. case-exec-decl-env-propagation landed and the residual is deleted.

Per-side argv was deliberately not built: it would let a case compare two different commands and call the result parity.

${CONTAINER_ID}, for the behavior that genuinely had no evidence

parity_up_exec was the sole evidence for bhv-exec-container-id-metadata (T110), which needs a case able to address the container a previous operation created. runner::substitute_argv now resolves ${CONTAINER_ID} to the most recent successful up/exec op's container — the op loop already tracked it, so threading it in was the whole change.

Per the design commitments:

  • No new Operation field. It is a string inside the existing argv, so the operation model is unchanged and every existing caseHash is byte-identical — no snapshot needed re-recording.
  • Fails loud when the token appears with no preceding successful up, matching the ${WORKSPACE}-without-a-fixture discipline. Handing the literal ${CONTAINER_ID} to the CLI would make the op fail for an unrelated reason and read as a real divergence.

case-exec-decl-container-id-metadata runs up, then exec --container-id ${CONTAINER_ID} printing $REMOTE_ONLY — a value the fixture declares in devcontainer.json and nowhere else, so a byte-identical result on both sides proves each CLI recovered it from the label it stamped rather than from a workspace it re-read.

Both new cases verified agree on the live differential against pinned oracle 0.87.0.

equivalence-report --carrier is now repeatable

Deleting two carriers in one change needs both judged in one ledger, because the ledger file is rewritten per run — and judging every carrier instead drags in ones legitimately red for unrelated reasons, which can never clear anything.

A --carrier naming a non-carrier is now a fail-loud error rather than an empty result. Otherwise a deletion could be authorized by a ledger that never looked at the carrier it was authorizing.

Ledger: 5 units, all equivalent. migration report --ledger then listed both in deletableCarriers.

Three guards fired, and were obeyed rather than loosened

Guard What happened
the_surviving_set_is_mutually_consistent count 6 → 4; documented to drop as carriers retire, lowered to the actual set with the reason recorded
no_parity_source_uses_ignore_or_legacy_skip_idioms file floor 9 → 7; same, and it is explicitly "not a coverage claim"
check_nextest_profiles_flags_leaked_live_binary the interesting one — it probed with the literal name parity_exec. Retiring that carrier would have made the guard pass by selecting a binary that no longer exists, so it would have stopped detecting leaks silently. The probe name is now derived from the registry, so the guard cannot outlive its subject.

Deletion completeness

crates/deacon/tests/parity_{exec,up_exec}.rs deleted, plus: .config/nextest.toml (all filters), fixtures/parity-corpus/registry.json, the case-exec-parity / case-up-exec-parity legacy pointers, mapping.json, residuals.json, CLAUDE.md, and the T107/T110 deferral entries. conformance/migration/baseline.json is deliberately untouched — it is retained as evidence, never rewritten, and its V25 drift gate was retired in T099 for exactly this reason.

Verification

Gate Result
cargo fmt --all -- --check pass
cargo clippy --all-targets --all-features -- -D warnings pass (0)
cargo nextest run --profile dev-fast --no-fail-fast 3588 passed
validate / certify pass; 0 blocking
migration check 118 units — migrated 75, residual 43, unaccounted 0; 0 violations
snapshot check 1 fresh, 0 stale
parity_registry_check 10/10 pass
cargo nextest run --profile parity -E 'binary(=parity_conformance_runner)' both new exec cases agree

The three case-state-* cases diverge on this branch because it is cut from main, which does not carry the T115 metadata fix (#365) — they agree once that lands. The 51 chan-structured-output T113 cases remain red as documented.

🤖 Generated with Claude Code

https://claude.ai/code/session_017UCGzJEFZd85HJqz1Wx2kE

…parity carriers

Deletes `parity_exec` and `parity_up_exec`, the last two carriers whose units were
already declarative or trivially made so. Both were held by records that turned
out to be answerable rather than pending.

`res-exec-per-side-argv` was OBSOLETE, not outstanding. It claimed a declarative
operation needed per-side argument vectors because deacon took `--env` where the
reference takes `--remote-env`. `cli.rs:534` already declares `--remote-env` as the
primary flag with `alias = "env"` for the legacy spelling, so one shared argv runs
on both CLIs and the comparison is a true differential. Per-side argv was
deliberately NOT built: it would let a case compare two different commands and
call the result parity.

`parity_up_exec` was the sole evidence for `bhv-exec-container-id-metadata`, which
needed a case able to address the container a PREVIOUS operation created. Hence
`${CONTAINER_ID}` in `runner::substitute_argv`, resolving to the most recent
successful `up`/`exec` op's container — the op loop already tracked it.

It is a string inside the existing `argv`, so `Operation` gains no field and every
existing `caseHash` is byte-identical; no snapshot needed re-recording. A token
with no preceding successful `up` fails LOUD, the same discipline
`${WORKSPACE}`-without-a-fixture has: handing the literal token to the CLI would
make the op fail for an unrelated reason and read as a real divergence.

`case-exec-decl-container-id-metadata` runs `up` then `exec --container-id
${CONTAINER_ID}` printing `$REMOTE_ONLY` — a value the fixture declares in
devcontainer.json and NOWHERE else, so a byte-identical result on both sides
proves each CLI recovered it from the label it stamped rather than from a
workspace it re-read. Both new cases verified `agree` on the live differential
against pinned oracle 0.87.0.

`equivalence-report --carrier` is now REPEATABLE. Deleting two carriers in one
change needs both judged in one ledger, because the file is rewritten per run, and
judging every carrier instead drags in ones legitimately red for unrelated reasons
that can never clear anything. A `--carrier` naming a non-carrier is now a
fail-loud error rather than an empty result — otherwise a deletion could be
authorized by a ledger that never looked at the carrier. Ledger: 5 units, all
`equivalent`; `migration report` then listed both in `deletableCarriers`.

Three guards fired on this change and were obeyed, not loosened:

- `parity_registry_check::the_surviving_set_is_mutually_consistent` and the
  `no_parity_source_uses_ignore_or_legacy_skip_idioms` file floor both carry counts
  that are documented to drop as carriers retire; both were lowered to the actual
  surviving set with the reason recorded.
- `registry::check_nextest_profiles_flags_leaked_live_binary` probed with the
  literal name `parity_exec`. Retiring that carrier would have made the guard pass
  by selecting a binary that no longer exists — it would have stopped detecting
  leaks SILENTLY. The probe name is now derived from the registry, so the guard
  cannot outlive its subject.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UCGzJEFZd85HJqz1Wx2kE
@github-actions github-actions Bot added the feature New feature (alias) label Jul 26, 2026
…be judged

`equivalence-report`'s module doc said the Docker scenario carriers assert through
bespoke orchestration and so "this bin records NO verdict for them". That was true
of an earlier design and false of this one: the bin runs each carrier's OWN test
binary and reads the `ReportFragment` it already writes, which is exactly why it
re-implements no comparison.

024 Phase 6 judged `parity_exec` (4 units) and `parity_up_exec` (1 unit) for real,
all `equivalent`, and deleted both on that evidence — while the doc above said it
could not.

Corrected rather than left standing, because "this tool cannot judge X" is exactly
the kind of statement that stops anyone from trying.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017UCGzJEFZd85HJqz1Wx2kE
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

feature New feature (alias)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant