feat(conformance): migrate the default-workspace-mount unit, and find a compose defect#366
Open
pofallon wants to merge 2 commits into
Open
feat(conformance): migrate the default-workspace-mount unit, and find a compose defect#366pofallon wants to merge 2 commits into
pofallon wants to merge 2 commits into
Conversation
… a compose defect Migrates `parity_state_diff::default-workspace-mount-target-parity` into two declarative cases, and records the spec violation that measurement surfaced while attempting the two compose units. The migrated unit needed TWO cases, not one, because it asserted two distinct claims through one reported outcome (research D2's inverse defect): - `case-state-default-mount` (live-differential) — the two CLIs agree. - `case-state-default-mount-target` (spec-expectation) — the ABSOLUTE claim that NEITHER CLI mounts the workspace at `workspaceFolder` and BOTH mount it at the spec default `/workspaces/<basename>` (#273). A differential cannot carry this: it would pass if both sides regressed together. The absolute claim needed no new assertion predicate. `workspaceBindTargets` is already a DERIVED observer field, so the quantified `∄ /workspace ∧ ∃ /workspaces/*` claim becomes plain equality against a one-element list. The legacy unit wrote no report fragment at all — its `assert_parity` call was absent — so this is a coverage GAIN, not a transfer. `bhv-state-default-workspace-mount-target` is a new behavior, and the frozen denominator guard fired on it, correctly. It is NEWLY NAMED rather than newly observed: the baseline unit genuinely asserted the claim while the registry described only the agreement half. Refusing it would mean migrating the unit at reduced fidelity — losing a claim to preserve a number, which is the exact under-count 023 exists to fix. `POST_BRANCH_BEHAVIORS` now distinguishes the two categories explicitly rather than stretching one. The two compose units are NOT migrated, and the reason is a deacon defect (T117). The spec says `overrideCommand` "Defaults to `true` for when using an image Dockerfile and `false` when referencing a Docker Compose file", because "the default command must run for the container to function properly". `compose.rs:1323` reads `unwrap_or(true)` on a compose-only path, under a comment asserting the opposite. Measured against pinned oracle 0.87.0 with a service whose command touches a marker then sleeps: the marker exists under the reference and not under deacon. deacon puts its keep-alive in `Cmd` and discards the service's command; the reference puts it in `Entrypoint` ending in `exec "$@"` and keeps `Cmd`, so the declared command runs. Any compose service whose command matters — a server, a bootstrap, a worker — silently does not start under deacon. It is invisible for the common `command: ["sleep","infinity"]` idiom, which is why every existing compose fixture passed. Migrating those units now would mean tolerating the divergence, i.e. recording a spec violation as intentional. They stay residual under `res-state-diff-compose-command-override`, whose text says the blocker is a defect and not a missing capability, and T117 carries the fix with its acceptance criteria. One guard fired on this change's own data and was obeyed, not loosened: the conservation report's no-absolute-paths check rejected a `/tmp/`-shaped path in a rationale string, so the rationale was rephrased. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017UCGzJEFZd85HJqz1Wx2kE
pofallon
force-pushed
the
feat/step5b-migrate-state-diff
branch
from
July 26, 2026 01:21
438e853 to
f7b3e13
Compare
…T118) `case-state-appport` is green locally and RED in the `live-certification` lane. Found by reading the lane's failure list rather than trusting the local run: it reports `divergingPaths: ["chan-container-state"]` — the channel ROOT, not a field — with all six of its scoped tolerances STALE. That combination is the signature of one side having no container at all. The cause is the fixture: `"appPort": [3000]` is a FIXED host port. 024 Phase 3's D-3 fix made the two sides sequential so they cannot collide with each other, but nothing makes port 3000 free on a shared runner. When it is taken, that side's `up` fails and the differential compares an object against an absence. It matters beyond one red case: the lane is already red on the T113 families, so an environment-dependent case hides inside a list of known-red ones, and the published-ports half of `bhv-state-diff-parity` quietly stops being proven. Pre-existing on main; recorded rather than papered over. No tolerance was authored — a whole-channel divergence caused by a missing container is not a characterized difference, and tolerating it would make "the container was never created" report `allowed-difference`, the exact silent green pass D-2 exists to prevent. 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.
What
Migrates
parity_state_diff::default-workspace-mount-target-parityinto declarative cases, and records the spec violation that measurement surfaced while attempting the two compose units.The unit needed two cases, not one
It asserted two distinct claims through one reported outcome — research D2's inverse defect:
case-state-default-mountlive-differentialcase-state-default-mount-targetspec-expectationworkspaceFolder, BOTH mount it at the spec default/workspaces/<basename>(#273)A differential structurally cannot carry the second: it would pass if deacon and the reference regressed together. This is the T072 twin-case pattern.
No new assertion predicate was needed.
workspaceBindTargetsis already a DERIVED observer field, so the quantified∄ /workspace ∧ ∃ /workspaces/*claim becomes plain equality against a one-element list — the design commitment ("when an assertion needs a search, add a derived field to the observer") paying off rather than being restated.The legacy unit wrote no report fragment at all (its
assert_paritycall was absent), so this is a coverage gain, not a transfer.The frozen-denominator guard fired, and was right to
bhv-state-default-workspace-mount-targetpushed the behavior count past the allowance. It is newly named, not newly observed: the baseline unit genuinely asserted the claim while the registry described only the agreement half (bhv-state-diff-parity). Refusing it would migrate the unit at reduced fidelity — losing a claim to preserve a number, which is the precise under-count 023 exists to fix, reintroduced by the guard meant to catch it.POST_BRANCH_BEHAVIORSnow distinguishes its two categories explicitly (newly observed / newly named) instead of one being stretched to cover both, and the new entry argues its own case.The two compose units are held back — deacon has a defect (T117)
The spec is explicit:
crates/core/src/compose.rs:1323readsself.override_command.unwrap_or(true)— on a code path reached only for compose — under a comment asserting the opposite of the spec.test_generate_injection_override_command_default_onpins the wrong default and cites "Spec default" while doing it.Measured, not inferred (pinned oracle 0.87.0). A compose service with
command: ["sh","-c","touch <marker>; sleep infinity"]:docker inspectshows the mechanism: the reference puts its keep-alive inEntrypointending inexec "$@"and leavesCmdas the compose command, so the declared command runs and the keep-alive loop is reached only when there is none. deacon puts its keep-alive inCmdand leavesEntrypointempty, discarding the command outright.Consequence: any compose service whose command matters — a server, a database bootstrap, a queue worker — silently does not start under deacon. It is invisible for the common
command: ["sleep","infinity"]idiom, which is why every existing compose fixture passed.Migrating the two units now would require a scoped tolerance, i.e. recording a spec violation as intentional — the one move this model exists to prevent. They stay residual under
res-state-diff-compose-command-override, whose text states the blocker is a defect, not a missing capability, and T117 carries the fix with acceptance criteria.parity_state_difftherefore stays for now; deleting it is the PR after the fix.A guard fired on this change's own data and was obeyed
The conservation report's no-absolute-paths check rejected a
/tmp/-shaped path inside a rationale string. The rationale was rephrased; the guard was not touched.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 stalecargo nextest run --profile parity -E 'binary(=parity_conformance_runner)'case-state-*agrees, including both new casesThe parity lane remains red on the 51
chan-structured-outputT113 cases, untouched here.🤖 Generated with Claude Code
https://claude.ai/code/session_017UCGzJEFZd85HJqz1Wx2kE