Skip to content

Complete the deploy-workflow root cut: delete the authority, not just the file - #8683

Merged
briansrls merged 1 commit into
mainfrom
cut/deploy-workflow-authority
Aug 20, 2026
Merged

briansrls merged 1 commit into
mainfrom
cut/deploy-workflow-authority

Conversation

@gunbai-bot

@gunbai-bot gunbai-bot Bot commented Aug 20, 2026

Copy link
Copy Markdown
Contributor

The problem this fixes

#8676 deleted .github/workflows/deploy.yml under the operator's unclear-ownership ruling. It removed the projection and left the authority that writes it. Measured on clean main:

gunbc run --entry dag/tools/generated_artifact_gate.dag --function main_wet
  -> [file] write .github/workflows/deploy.yml (2050 bytes)

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.md records 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.dag the module that rebuilds it
LiveDeployYamlArtifact variant, roster, path, commit policy, eq, emit arms
dag/test/claim/live_deploy_workflow_witness_test.dag witnesses for a deleted workflow
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 (#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,…} and live_deploy_apply_srv1_wet stay. 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

LiveDeployYamlArtifact                     0 live references
expected_deploy_yml                        0 live references
gunbc.live_deploy_workflow                 0 live references
gunbc_ci_advance_fleet_desired_script      0 live references
.github/workflows/deploy.yml               absent after main_wet
deploy line in .gitattributes              absent
second main_wet                            no diff (idempotent)

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:

roster as committed path re-added
..._is_not_in_the_committed_artifact_roster PASS FAIL
the_roster_is_populated_and_still_carries_the_surviving_workflow PASS PASS

The 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 about deploy.yml rather 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.

… 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>
@briansrls
briansrls merged commit 4ef06e7 into main Aug 20, 2026
1 check passed
@briansrls
briansrls deleted the cut/deploy-workflow-authority branch August 20, 2026 20:05
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant