Repository navigation
hermetic mock fidelity: name the seed capability as the trigger, and record the class as structural - #10549
Merged
Conversation
…record the class as structural The three rows in this authority read as a closed class. They are one service, repaired. The unconditionality they describe is corpus-wide and survives, and it is structural rather than a population accident: eval_mock_response evaluates a mock arm in an EMPTY environment, so no arm can refer to its operation's declared inputs. An input-varying arm is not unwritten, it is unwritable in this seed. That makes two of the three next-rung triggers unsatisfiable as they stood. ExitStatus and CapturedOutput named "a mock_response whose value varies with the operation's declared input" -- a state of the world no author could reach, so the rows could never be retired by anyone doing the work the trigger named. Both now name the SEED CAPABILITY and what it must be sufficient for. TransportReachability is untouched: its refusal-not-a-better-mock answer was already right, and for a reason the other two are not. This file's own trigger is likewise named as a missing capability rather than left as unbuilt work: hermetic_mock_fabricating_count is zero by construction while it folds a hand list, and counting the corpus instead is BLOCKED -- no channel exposes an operation's mock_response property to a .dag lens. v2.lens.extdeps_shape_transport_policy is named as the neighbour and ExtdepsOperationInputFact / ExtdepsTransportArgvFact as the precedent, so the seed budget holder can size it. Deliberately not taken here: this subtree is model-side. No rows are added. A row per arm would mint one dissolution obligation per observation of a single cause -- net concepts growing by re-invention -- and every one unretirable until the seed changes. The population is derivable, so it is named by its derivation and no counts are transcribed. MEASURED, not read. One witness, one binary, one tree, four runs: witness_os_id_uid_realizes_hermetically asserts r.value == "1000" against an arm answering "1000". Perturbing the arm literal reds hermetically and stays green wet; perturbing the realization argv from id -u to id -G -- the operation now asks for the group list and calls the answer a uid -- stays GREEN hermetically and reds wet. The arm perturbation is the positive control proving the harness was live for that green. The witness is fixture-determined in the mode CI runs and realization-determined in the mode nobody runs. The sudo grant-list row is the neighbouring shape and behaves differently under the same treatment: its fixture conjunct reds on the arm perturbation AND its discriminating conjunct survives to red independently on a production perturbation. Not vacuous, over-specified. The remedies differ, so the two are recorded separately. A methodology note lands with them, because two of its three hazards fail toward false confidence: the CLI exit code is not the verdict (a Bool witness is refused with the same status whether it returned true or false), the mode must be stated beside every verdict (without --dry-run the run is wet and inverts both answers), and the receipt is local-only today (a runner with no cgroup memory limit refuses with HostBudgetUnreadable before reaching any witness). The four existing witnesses over this authority stay green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01TX3LxjxyNjcAoS9bq5tMbU
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 this is
A census lane's landing. The brief asked for the population of hermetic witnesses made vacuous
because a mock's success does not depend on the request. The census found the population is
small, and that the class points the opposite way from the hypothesis it was dispatched on.
This PR records the mechanism; it adds no rows and repairs no witnesses.
The census, in one line each
PublishedMockCaseis an enrolment roster, not a response. The response is themock_responseproperty on the operation. The two populations overlap only in part, andreading one as an answer to the other mis-sizes the class in either direction.
eval_mock_responseevaluates a mock arm in anempty environment, so an arm cannot refer to its operation's declared inputs at all. An
input-varying arm is not unwritten in this corpus — it is unwritable in this seed.
candidate decides its refusal before any mocked operation is consulted. The one known live
instance is already enrolled in
v2.workflow.floor_expected_red— held red and visible.a mock constant back to itself.
The finding, measured rather than read
One witness, one binary, one tree, four runs.
witness_os_id_uid_realizes_hermeticallyassertsr.value == "1000"against an arm answering"1000".--dry-run)--dry-run)The realization perturbation is not subtle:
argv: ["id","-u"]becameargv: ["id","-G"], sothe operation asks for the group list and calls the answer a uid. Hermetically the witness
cannot see it. The arm perturbation is the positive control proving the harness was live for
that green.
So the witness is fixture-determined in the mode CI runs, and realization-determined in the mode
nobody runs. Its name, "realizes hermetically", is true only of the column that carries no
information about the operation.
The
sudogrant-list row is the neighbouring shape and behaves differently under the sametreatment — its fixture conjunct reds on the arm perturbation and its discriminating
conjunct survives to red independently on a production perturbation. Not vacuous; over-specified.
Different remedy, so it is recorded separately.
What changed
ExitStatusandCapturedOutputnamed a state of theworld ("a mock_response whose value varies with the operation's declared input") that no
author could reach. §4b(3) retires a row by its trigger and by nothing else, so both now name
the seed capability and state what it must be sufficient for.
TransportReachabilityisuntouched — its refusal-not-a-better-mock answer was already right, and for a reason the other
two are not.
work.
hermetic_mock_fabricating_countis zero by construction while it folds a hand list, andcounting the corpus is blocked: no channel exposes an operation's
mock_responseproperty toa
.daglens.v2.lens.extdeps_shape_transport_policyis named as the neighbour andExtdepsOperationInputFact/ExtdepsTransportArgvFactas the precedent, so whoever holds theseed budget can size it without re-deriving it.
is not a decoration — it has an authorable red — but it establishes enrolment, never
behaviour. The names invite the wrong reading, which is the actionable part.
than toward a visible error:
gunbc runrefuses a Bool witness at the CLI boundary(
returned true, not ProcessExit) with the same status whether it returned true or false.The printed value is the readout. A wrapper scoring arms by exit status —
echo $?,especially after a pipe — reports success for every arm and publishes the opposite of the
truth with no error shown. This is the one a reader cannot rediscover by reasoning: a wrong
mode announces itself as a strange result, an identical exit code announces nothing.
--dry-runthe run is wet and reallyexecutes, inverting both perturbation answers. Grep the trace for
[hermetic:mock] <op>.gunbcrefuse withHostBudgetUnreadablebefore reaching any witness — every arm returns one identical refusaland zero verdicts.
What deliberately did not happen
gunbc.recurring_failure_mode.transport_mock_success_independent_of_request(Remove the raw-script arm from HostEffect and preserve typed gate witnesses #10509) is the single authority for the class. One class, one row.
times. Enumerating them would mint one dissolution obligation per observation — net concepts
growing by re-invention — each unretirable until the seed changes, and stale on the next arm
with nothing going red.
is named by its derivation.
the seed budget holder.
Evidence
Four existing witnesses over this authority stay green under
--dry-run:hermetic_mock_live_roster_is_diagnosed,hermetic_mock_undiagnosed_fabricating_row_is_rejected,hermetic_mock_honest_row_needs_no_fabrication_list,hermetic_mock_reachability_trigger_is_distinct.Comment-only change to one
.dagmodule plus two trigger strings; no type, function signature,or row changes.
🤖 Generated with Claude Code
https://claude.ai/code/session_01TX3LxjxyNjcAoS9bq5tMbU