feat(conformance): add the ${CONTAINER_ID} argv token and retire two parity carriers#368
Open
pofallon wants to merge 2 commits into
Open
feat(conformance): add the ${CONTAINER_ID} argv token and retire two parity carriers#368pofallon wants to merge 2 commits into
pofallon wants to merge 2 commits into
Conversation
…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
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Deletes
parity_execandparity_up_exec. Both were held by records that turned out to be answerable rather than pending.res-exec-per-side-argvwas obsolete, not outstandingIt claimed a declarative operation needed per-side argument vectors, because deacon took
--envwhere the reference takes--remote-env. Butcli.rs:534already declares:#[arg(long = "remote-env", action = clap::ArgAction::Append, alias = "env")]--remote-envis the primary flag;--envis a hidden legacy alias. So one shared argv runs on both CLIs and the comparison is a true differential.case-exec-decl-env-propagationlanded 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 evidenceparity_up_execwas the sole evidence forbhv-exec-container-id-metadata(T110), which needs a case able to address the container a previous operation created.runner::substitute_argvnow resolves${CONTAINER_ID}to the most recent successfulup/execop's container — the op loop already tracked it, so threading it in was the whole change.Per the design commitments:
Operationfield. It is a string inside the existingargv, so the operation model is unchanged and every existingcaseHashis byte-identical — no snapshot needed re-recording.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-metadatarunsup, thenexec --container-id ${CONTAINER_ID}printing$REMOTE_ONLY— a value the fixture declares indevcontainer.jsonand 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
agreeon the live differential against pinned oracle 0.87.0.equivalence-report --carrieris now repeatableDeleting 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
--carriernaming 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 --ledgerthen listed both indeletableCarriers.Three guards fired, and were obeyed rather than loosened
the_surviving_set_is_mutually_consistentno_parity_source_uses_ignore_or_legacy_skip_idiomscheck_nextest_profiles_flags_leaked_live_binaryparity_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}.rsdeleted, plus:.config/nextest.toml(all filters),fixtures/parity-corpus/registry.json, thecase-exec-parity/case-up-exec-paritylegacy pointers,mapping.json,residuals.json,CLAUDE.md, and the T107/T110 deferral entries.conformance/migration/baseline.jsonis deliberately untouched — it is retained as evidence, never rewritten, and its V25 drift gate was retired in T099 for exactly this reason.Verification
cargo fmt --all -- --checkcargo clippy --all-targets --all-features -- -D warningscargo nextest run --profile dev-fast --no-fail-fastvalidate/certify0 blockingmigration check118 units — migrated 75, residual 43, unaccounted 0; 0 violationssnapshot check1 fresh, 0 staleparity_registry_checkcargo nextest run --profile parity -E 'binary(=parity_conformance_runner)'The three
case-state-*cases diverge on this branch because it is cut frommain, which does not carry the T115 metadata fix (#365) — they agree once that lands. The 51chan-structured-outputT113 cases remain red as documented.🤖 Generated with Claude Code
https://claude.ai/code/session_017UCGzJEFZd85HJqz1Wx2kE