Repository navigation
Complete the deploy-workflow root cut: delete the authority, not just the file - #8683
Merged
Merged
Conversation
… the file #8676 deleted .github/workflows/deploy.yml under the operator's unclear-ownership ruling. It removed the projection and left the authority that writes it, so the ordinary actuator recreated the file — measured on clean main, 2050 bytes, with the ungated raw-$GITHUB_SHA push intact: gunbc run --entry dag/tools/generated_artifact_gate.dag --function main_wet -> [file] write .github/workflows/deploy.yml (2050 bytes) That is not drift. It is the surviving authority faithfully reversing the deletion, and nothing detects it: DESIGN records the generated-artifact drift gates as UNGUARDED after the floor cut, so neither the re-addition nor the absence is caught. Anyone regenerating would have silently re-added a deleted file, appearing as unrelated churn in their diff. DELETED dag/gunbc/live_deploy_workflow.dag the module that rebuilds it LiveDeployYamlArtifact variant, roster, path, commit policy, eq, emit arms dag/test/claim/live_deploy_workflow_witness_test.dag gunbc_ci_advance_fleet_desired_script + its Scaffold disposition and dissolution trigger the deploy.yml line in generated .gitattributes an orphaned fleet_desired_ref_name import in ci_spec The advance script is not preserved for a future actuator. Its only two consumers were the two deleted files, and gunbc.fleet_desired_admission is the admitted replacement — it advances the ref only behind a modeled decision over a completed floor run, from typed values rather than $GITHUB_SHA. Keeping a function that still renders the raw form would leave the unsafe spelling one call site from returning, which is the same leaf-versus-root error being corrected here. PRESERVED, deliberately: gunbc.live_deploy.{spec,apply,emit,readiness,...} and live_deploy_apply_srv1_wet. Those describe and realize a deployment and could back a future fleet-convergence member. They are not what recreates the workflow. Deleting them would widen an operator decision about one file into retiring the deployment concept. EVIDENCE, on a clean checkout: LiveDeployYamlArtifact / expected_deploy_yml / gunbc.live_deploy_workflow / gunbc_ci_advance_fleet_desired_script 0 live references each .github/workflows/deploy.yml absent after main_wet deploy line in .gitattributes absent second main_wet no diff (idempotent) One new witness gives the deletion executing evidence, which absence alone cannot. the_retired_deploy_workflow_is_not_in_the_committed_artifact_roster goes RED when the path returns to the roster under ANY variant — verified by repointing an unrelated artifact at it — and its companion asserts the roster is populated and still carries witnesses.yml, so the negative is a statement about deploy.yml rather than about an empty read. Not a replacement registry. It retires when the drift gates come back off the re-add queue and enforce roster membership in both directions. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
gunbai-bot Bot
pushed a commit
that referenced
this pull request
Aug 20, 2026
… two annotations #8683 landed the deploy-workflow root cut. Six conflicts, and two were the dangerous kind: modify/delete on live_deploy_workflow.dag and its witness file, where resolving the habitual way — keep my branch's version — would have restored the deleted module and undone the cut. Both take the deletion. RESOLUTIONS live_deploy_workflow.dag deleted (root cut wins) live_deploy_workflow_witness_test deleted (its subject is gone) generated_artifact{,_emit}.dag both intents: LiveDeployYamlArtifact removed, FleetDesiredAdmissionYamlArtifact kept ci_spec.dag two annotations merged into one .gitattributes regenerated, never hand-resolved BOTH SIDES DELETED THE SAME SCRIPT and each wrote its own account of why. Two annotations for one deletion is the duplication §3 forbids, so they are merged rather than stacked — the merged text keeps the admission-gate reasoning, the belt-dispatch consequence, the no-lease create branch, and the two-consumer census. The `data ..._deleted_note: String` row is dropped: a String declaration whose sole purpose is commentary is the misplaced data §4c names, and the annotation already carries it. THE FIFTH INTERVAL DEFECT, and the one that justifies the checklist: this branch's own witness file imported gunbc.live_deploy_workflow and had NO merge conflict, so git reported nothing. It surfaced as an unresolved import at witness time. the_deploy_workflow_no_longer_advances_the_fleet_revision is deleted rather than repointed — its subject no longer exists, and a claim whose subject is gone cannot be kept alive by aiming it elsewhere. The property is subsumed: a workflow that does not exist cannot advance the ref, and the retirement witness asserts the retired path is absent from the roster, which is what stops it being regenerated. VERIFIED ON THE MERGED TREE deploy.yml NOT written by main_wet — the cut holds workflows fleet-converge, fleet-desired, witnesses .gitattributes no deploy line, fleet-desired line present retirement witness (from main) 2/2 PASS against this tree admission witnesses 13/13 PASS dangling references to deleted symbols 0 in code (2 in historical prose) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
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.
The problem this fixes
#8676 deleted
.github/workflows/deploy.ymlunder the operator's unclear-ownership ruling. It removed the projection and left the authority that writes it. Measured on clean main:It comes back, with the ungated
git push origin "$GITHUB_SHA:$DESIRED_REF"intact — no lease on the create branch.That isn't drift. It's the surviving authority faithfully reversing an operator decision, and nothing detects it:
DESIGN.mdrecords the generated-artifact drift gates as unguarded after the floor cut, so neither the re-addition nor the absence is caught. The next person to regenerate would have silently re-added a deleted file, looking like unrelated churn in their diff.Deleted
dag/gunbc/live_deploy_workflow.dagLiveDeployYamlArtifactdag/test/claim/live_deploy_workflow_witness_test.daggunbc_ci_advance_fleet_desired_scriptScaffolddisposition and dissolution triggerdeploy.ymlline in generated.gitattributesfleet_desired_ref_nameimport inci_specThe advance script is not preserved for a future actuator. Its only two consumers were the two deleted files, and
gunbc.fleet_desired_admission(#8643) is the admitted replacement — it advances the ref only behind a modeled decision over a completed floor run, rendering the push from typed values rather than$GITHUB_SHA. Keeping a function that still emits the raw form would leave the unsafe spelling one call site from returning, which is the same leaf-versus-root error this PR corrects.Preserved, deliberately
gunbc.live_deploy.{spec,apply,emit,readiness,…}andlive_deploy_apply_srv1_wetstay. They describe and realize a deployment and could back a future fleet-convergence member; they are not what recreates the workflow. Deleting them would widen an operator decision about one file into retiring the deployment concept itself.Evidence, on a clean checkout
The retirement witness, and its control
Absence cannot be evidence of itself — that is exactly how the first deletion failed. One witness makes it executable:
..._is_not_in_the_committed_artifact_rosterthe_roster_is_populated_and_still_carries_the_surviving_workflowThe red arm was produced by repointing an unrelated artifact at the retired path, so the claim triggers on the path returning under any variant, not on a particular variant name. The companion claim asserts the roster is populated and still carries
witnesses.yml, so the negative is a statement aboutdeploy.ymlrather than about an empty read — an empty list satisfies every "does not contain" assertion.Worth noting what the first red attempt found instead: adding a new variant refuses at compile time with
non-exhaustive match: missing variant(s). The substrate already walls incomplete row additions; what it does not wall is an existing row silently pointing at a retired path.This is not a replacement registry or a substitute authority. It retires when the drift gates come back off the re-add queue and enforce roster membership in both directions.