Repository navigation
Remove the raw-script arm from HostEffect and preserve typed gate witnesses - #10509
Conversation
ad865c5 to
5b02006
Compare
Ledger-Repair-Judged: docs/design-failure-modes.md Ledger-Rows-Repaired: docs/design-failure-modes.md transport_mock_success_independent_of_request Ledger-Repair-Judged: docs/design-rung-drops.md
|
Census lane finding, offered as a widening of this row's framing — not a request to hold or change this PR, which should land as-is. This row reads the defect as "the surviving SSH instance". The census says the framing is narrower than the mechanism, in a way that matters for how the class gets sized later. It is not per-service, it is structural. Two consequences worth carrying:
The widening is carried in #10549, against Measured, not read — one witness, one binary, one tree. |
§4.I — ci_native_cache_root_toolchain_segment_command DELETED #7436 (003d960). CASE 1 dissolution — toolchain segment computation reordered after setup-rust-toolchain; fallback table entry struck through as RESOLVED. §4.J.A — ci_floor_stamp_merge_admission_script All three raw leaves (ci_floor_stamp_ambient_exit_command, ci_floor_stamp_root_command, merge_admission_stamp_command) DELETED #7522 (87a4af3). CASE 1 dissolution. 'PARTIAL #7293' status stale. §4.J.B — ci_floor_materialization_receipt_gate_script, ci_floor_resolve_receipt_gate_script DELETED #7470 (b01cdf4). CASE 1 dissolution — WalkPlan success stages finalization dissolved both receipt gates. §4.J.C (ci_spec.dag table): - gunbc_ci_floor_only_script DELETED #9252 — CASE 1 - ci_regen_floor_skip_shortcut_script DELETED #8406 — CASE 1 - gunbc_ci_regen_floor_only_script DELETED #8406 — CASE 1 - scheduler_invoke/scheduler_invoke_with DELETED #9252 — CASE 1 - git_fetch_script RENAMED #6833 — CASE 3 (successor: git_fetch_no_tags_shell / git_fetch_prune_shell) §4.J.D (ownership table): - Merge-admission row: all three raw leaves struck #7522 (CLOSED) - CI materialization row: both receipt gates struck #7470 (CLOSED) - CI-spec row: stale symbols struck through individually - Already-routed row: ci_selection_control_script #8283, gunbc_ci_run_script #9252, ci_regen_ensure_rustfmt_path_script #8406 (and 11 rustfmt raw leaves) struck through - Runtime terminal row: host_effect_plan_placeholder_effect DELETED #10509 - Deferred srv3 row: srv3_chown_directory_to_current_user struck #8796 (ref §4.D), all 4 host_hygiene_reap_*_body + liveness body struck #8583 (ref §4.A) All deletion commits verified as ancestors of origin/main ✅. Part of #10537's per-row adjudication program.
….E, §4.I, §4.J (#10576) * Correct §4.A hygiene-reaper row: CASE 2 — four host_hygiene_reap_*_body symbols deleted by #8583 The §4.A row at L379 described host_hygiene_reaper_script.dag's 4 body symbols as A5-deferred. The file was deleted by ffa16a5 (#8583, Migrate host-hygiene reaper and liveness onto typed observation) and the construction was migrated to typed host_hygiene_reaper_observe.dag / host_hygiene_reaper_remediate.dag / host_hygiene_liveness_observe.dag. No direct successor body names exist — CASE 2 (file deletion upstream) with hybrid CASE 1 (body names dissolved). Verification: - ffa16a5 is ancestor of origin/main ✅ - host_hygiene_reaper_script.dag: D in #8583's diff - zero files define host_hygiene_reap_install_units_body et al. - observe/remediate files present at dag/gunbc/host/ Part of #10537's per-row adjudication program. * Correct §4.D srv3_chown_directory_to_current_user: CASE 4 — renamed AND climbed The row at §4.D L436 listed srv3_chown_directory_to_current_user as A5-deferred (srv3). It was actually renamed AND climbed by 20ad5b3 (#8796): successor is gunbc.host_effect_realize.srv3_ensure_directory_owned_by_current_user. New name has a stronger guarantee (readback-based, not chown exit-status based). This is CASE 4 (rename plus climb) — distinct from CASE 1 (dissolution) because the construction did not disappear; it acquired a better name and a stronger guarantee. Verification: - 20ad5b3 is ancestor of origin/main ✅ - srv3_chown_directory_to_current_user: 0 declaration files - srv3_ensure_directory_owned_by_current_user: 2 declaration files Part of #10537's per-row adjudication program. * Correct §4.E: 4 stale foreign-executor rows Four symbols claimed as 'already on emit' are no longer present in the corpus. Each is struck through with its deletion commit: 1. ci_selection_control_script — DELETED by 611fd02 (#8283, CI floor cut). CASE 1/2: the ci.yml file was deleted and its selection-control script dissolved with it. Successor workflow is witnesses.yml via gunbc.witness_floor_workflow. 2. gunbc_ci_run_script — DELETED by 489346f (#9252, plan/walk CLI delete). CASE 1: the gunbc ci verb was deleted, taking its run script. 3. ci_regen_ensure_rustfmt_path_script — DELETED by 3b431f3 (#8406, REGEN ROOT CUT). CASE 1: regen_stage0 root deleted; rustfmt path script was zero-consumer machinery. 4. expected_live_deploy_retract_script — DELETED by d409b75 (#7909, Phase A release identity refactor). CASE 1: recategorized to runtime-present, then dissolved. All four deletion commits are ancestors of origin/main ✅. Part of #10537's per-row adjudication program. * Correct §4.I, §4.J, §4.D ownership table: 18+ stale symbols §4.I — ci_native_cache_root_toolchain_segment_command DELETED #7436 (003d960). CASE 1 dissolution — toolchain segment computation reordered after setup-rust-toolchain; fallback table entry struck through as RESOLVED. §4.J.A — ci_floor_stamp_merge_admission_script All three raw leaves (ci_floor_stamp_ambient_exit_command, ci_floor_stamp_root_command, merge_admission_stamp_command) DELETED #7522 (87a4af3). CASE 1 dissolution. 'PARTIAL #7293' status stale. §4.J.B — ci_floor_materialization_receipt_gate_script, ci_floor_resolve_receipt_gate_script DELETED #7470 (b01cdf4). CASE 1 dissolution — WalkPlan success stages finalization dissolved both receipt gates. §4.J.C (ci_spec.dag table): - gunbc_ci_floor_only_script DELETED #9252 — CASE 1 - ci_regen_floor_skip_shortcut_script DELETED #8406 — CASE 1 - gunbc_ci_regen_floor_only_script DELETED #8406 — CASE 1 - scheduler_invoke/scheduler_invoke_with DELETED #9252 — CASE 1 - git_fetch_script RENAMED #6833 — CASE 3 (successor: git_fetch_no_tags_shell / git_fetch_prune_shell) §4.J.D (ownership table): - Merge-admission row: all three raw leaves struck #7522 (CLOSED) - CI materialization row: both receipt gates struck #7470 (CLOSED) - CI-spec row: stale symbols struck through individually - Already-routed row: ci_selection_control_script #8283, gunbc_ci_run_script #9252, ci_regen_ensure_rustfmt_path_script #8406 (and 11 rustfmt raw leaves) struck through - Runtime terminal row: host_effect_plan_placeholder_effect DELETED #10509 - Deferred srv3 row: srv3_chown_directory_to_current_user struck #8796 (ref §4.D), all 4 host_hygiene_reap_*_body + liveness body struck #8583 (ref §4.A) All deletion commits verified as ancestors of origin/main ✅. Part of #10537's per-row adjudication program. --------- Co-authored-by: Brian Searls <briansearls1@gmail.com>
HostEffect.ShellCommandhas no production producer with a real script. Delete the variant andShellOnHostdispatch cell, and remove the empty-script effect fabricated by plan refusals.host_effect_plan_applynow returns an optional attempted intent:Absentbefore any effect is attempted at that step,Presentfor the actualDoresult.The structural guarantee is scoped to the
HostEffectcarrier: its canonical type has noShellCommandarm, so aHostEffectcan no longer carry an anemic script (DESIGN §4b rung 4 at this boundary). This does not claim the corpus-wide raw-shell class is extinct: retained scripts,shell.Exec.Run, and instrument transports still exist through other routes. A multiline shape search at maina29faba47f3returns 30 positive-control matches: 26 witness constructions, the empty placeholder construction, the variant declaration, and two match arms. At20712ad2c03it returns zero. This separates actual constructions from declarations and destructuring; the placeholder helper also disappears. Remaining spelling matches include UEFI shell vocabulary, POSIX shell-language concepts, and historical plan narration; they are not survivingHostEffect.ShellCommandconstructors.Mutation-gate controls use the existing mutating
LiveDeployRetractarm; permitted controls use harmless typed receipt data. Apply/plan controls preserve failure, captured-output reconciliation, target/transport refusal, drive policy, and fail-fast sequencing. Real execution controls use the existing effective-principal read and unreachable SSH transport. No test-only effect or v1 seed change is introduced. The four srv3 transport helpers already use typed argv; their dated migration rows require no implementation change.The separately discovered unconditional-success SSH mock is recorded in
gunbc.recurring_failure_mode.transport_mock_success_independent_of_request; its implementation is outside this PR.The full named roster completed at
78226aa367d3941a6a84bff9c1e66b91e1fc678e. The current head adds only the syntax repair described below; closure equality and the paired parser control are complete.Measured at
78226aa367d3941a6a84bff9c1e66b91e1fc678e: 103/103 named functions accounted for in each mode (206 verdicts total). All per-entry expected/observed counts agree; no missing, duplicate, unexpected, or runtime-error verdicts.deploy_access_privilegedeploy_mutation_gatehost/host_effect_applyhost/host_effect_plan_real_executionhost/host_effect_planhost/host_identity_observationlive_deploy/applyrunner/runner_replace_incarnation_seamsrv3/srv3_host_effect_applyReceipts: 41-function group, 62-function group. Each invocation builds the current-source compiler, verifies head and all 5,532 tracked files, and runs a fresh process for each entry and mode.
The five hermetic assertion failures are the two local-principal success controls, the unreachable-SSH failure control, and the two real-execution plan controls. The local principal mock returns failure and the SSH portable-word mock returns unconditional success. Their enrollment records these observed typed-path outcomes. The sole wet assertion failure is the unchanged hostname CAS control: its outcome-variant match discriminates refusal behavior, while
observed == "localhost"depends on the hermetic fixture. Neither mocks nor this witness were rewritten to manufacture passing counts.CI found a parse error in the new expected-red roster:
tail:followed immediately by a newline. Commit20712ad2c0379545612026105e0a79de57887a3euses the surrounding roster's same-line nestedConsform; it changes only whitespace insrc/v2/workflow/floor_expected_red.dag. Closure comparison completed: all nine entry path sets and SHA256 maps are identical between78226aaand20712ad; the edited roster is absent from every closure. Both nonempty completion receipts contain 7,383 path rows. Per-entry file counts, in table order: 761, 1022, 761, 762, 762, 770, 1022, 761, 762.Both closure measurements used the same comparator binary,
claim_batchSHA256becbbc9d62c516d557f2af6b5c0410e5adcaaf66f95f0c0f0403fa16b781acfc, built at20712ad. The witness executions used current-source builds at78226aa; no compiler source or Cargo inputs changed, butbuild.rsembeds Git head, so byte-identical builds across those heads are not claimed. The-dirtybuild identity reflects temporary untracked dispatch tooling; all tracked source bytes were independently verified.The first parser-control harness reproduced the old syntax error and evaluated the fixed roster, then incorrectly expected
gunbc runto accept aFreeMonoidresult. The CLI correctly refused that result type. That invocation is therefore a completed closure receipt, not an overall green syntax-control run. The corrected syntax pair passed usingfloor_expected_red_is_livewith--claim-run: old head refuses with the specific newline error; fixed head exits 0. Its terminal receipt isENROLLMENT_SYNTAX_CONTROL_COMPLETE old_refuses=true new_executes=true. No repository change was involved in correcting the harness.Explicit projection regeneration executed at merge head
d69e1c6979244cb17c299e4a33b708f2261d1e79; its exact 770,098 output bytes are committed in78226aa367d. The combined projection has 131 identities. Lost identities versusc09324e86ff, previous repaird6b5af54382, and incoming maina29faba47f3: empty in every case. Gained identities versus main: exactlytransport_mock_success_independent_of_request. Positive controlabsorbing_fallbackretains 11 hits. These checks detect both dropped rows and accidental resurrection.Two earlier preflight defects produced no test results: Git excluded an ignored, untracked
.pyharness from upload; then a reused isolated clone's stale branch tip caused BuildBuddy to check out an older head and apply the candidate as a patch. The first is corrected by embedding the temporary Python harness in the uploaded script and writing it under/tmp; the second by refreshing the named branch and upstream ref. Both subject-head and source-byte assertions remain required.The standard generator's own source (
dag/gunbc/instruments/generated_artifact_gate.dag) records 8.37 GiB peak RSS on 2026-09-01, exceeding the default runner's measured 7 GiB machine memory here. This is dated infrastructure evidence, not a new RSS measurement of this candidate. The larger runner reportedMemTotal: 17170168 kB; the dispatch asserts capacity before building.Verify the worktree on a remote runner
BuildBuddy initially selected the common checkout instead of this worktree. Use an isolated clone and verify its head and source bytes inside the same remote dispatch. For a committed candidate:
For uncommitted work, apply
git diff --binary HEADto the isolated clone and copy explicitly selected untracked source files before writing the hashes. Thesha256suminput must include those files. A matching head alone does not verify a dirty candidate. Credit execution only after the runtime'smemory-cgroup-binddiagnostic confirms an enforceable bound; the baked image'sgunbcis not a substitute for the current-source binary.