Skip to content

The workflow mode wire vocabulary has one authority, and every generated selector derives its spelling from it - #10732

Merged
briansrls merged 1 commit into
mainfrom
deploy-scope
Sep 7, 2026
Merged

briansrls merged 1 commit into
mainfrom
deploy-scope

Conversation

@briansrls

@briansrls briansrls commented Sep 7, 2026 •

Copy link
Copy Markdown
Contributor

Claim

The workflow mode wire vocabulary has one authority. Every GitHub-expression, option, disjunction, and receipt condition derives its mode spelling from that authority. Dashboard deployment remains explicitly outside the fleet-scope projection pending an observed, candidate-bound deployment request.

The duplication removed

Mode names were bare Strings in two independent places: fleet_converge_mode_options, and seventeen hand-written rows of "github.event.inputs.mode == '<name>'". Both halves ordinary Strings, so a rename could land in one and not the other with nothing to notice — §3's second-naming account in the shape no lens can see, because there is no type to disagree with.

FleetConvergeWorkflowMode is a closed fifteen-member vocabulary with one wire function; the options list, all fifteen step_if expressions, both disjunctions and the receipt-if derive from it.

Verified by the artifact itself

fleet-converge.yml is a registered generated artifact emitted from this module, so the derivation had to reproduce the committed bytes exactly. A silent spelling change in a workflow if: disables a job rather than failing loudly — byte agreement is the property that matters, and the witnesses settle it.

No wildcard

fleet_converge_mode_scope names all fifteen modes explicitly. _ => none would read the same today and undo the totality: a sixteenth mode would silently inherit "no scope" rather than forcing the projection to decide.

What none does not say

Optional carries one absence, and two facts land on it: modes inherently outside fleet convergence (spark, micro-VM, guest-image select other subjects), and a mode that belongs but whose observation contract is unbuilt — DashboardDeploy alone.

That distinction is declared in the annotation. It is not encoded in the result. A carrier separating them would be a different return type, and minting one here to record a gap would be vocabulary ahead of its consumer.

The "no second literal" claim, narrowed by the census

Each of the fifteen names still occurs twice in the module; the second occurrence is a step id. Those are a separate namespace, not a second spelling of one fact — evidence in the corpus: mode rlm_launch_deployment_receipt runs step id rlm_receipt. If ids derived from modes, that pair would have to match. Forcing a derivation would rename a step id (changing workflow output for a naming cleanup) or assert a relation that does not hold.

So: no second production literal for a mode's dispatch spelling.

Explicitly not claimed

  • No FleetConvergeScope member added for dashboard deployment.
  • No FleetConvergeRequest member added for dashboard deployment.
  • Deploy does not use the ordinary plan/apply spine.

Adding the scope member compiles; the FleetConvergeRequest variant it obliges lights up nine match sites deriving a plan's baseline text, axis lines and refusal counters — and those modules are explicit that an absent row is itself a claim about the host. A deployment request carrying only a host renders a baseline of scope-and-host that apply re-observes and compares against nothing: a gate that cannot fail, worse than an absent one because it would be cited as the admission the deployment gained.

Evidence

workflow_dispatch_input_witness 12/12, including four new rows:

  • fifteen members with fifteen distinct wire values — count alone would admit two members sharing a spelling, offering one option twice and making one mode unselectable;
  • every dispatch option is a wire value of the vocabulary;
  • a step condition is the wire value of the mode it selects, with a discriminator a constant projection fails;
  • DashboardDeploy names no fleet scope while the three plan modes do, so a projection answering none for everything cannot pass.

Note: required-witnesses-floor on this branch inherits main's 7 CITED-DECLARATION-ABSENT findings in src/v2/lens/* and outside_modeled_guarantee_witness_test — none are this branch's files. The operator is repairing main separately.

🤖 Generated with Claude Code

https://claude.ai/code/session_019iXPtAqzPaNBZbaaM5rxrY

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

…ted selector derives its spelling from it

The fleet-converge dispatch carried its mode names as bare Strings in two independent places: once in
`fleet_converge_mode_options`, and again inside seventeen hand-written rows of the form
`"github.event.inputs.mode == '<name>'"`. Both halves were ordinary Strings, so a rename could land in
one and not the other and nothing would notice -- the section 3 second-naming account in the shape no
lens can see, because there is no type to disagree with.

FleetConvergeWorkflowMode is now a closed fifteen-member vocabulary with one wire function. The
dispatch options list, all fifteen single-mode step_if expressions, both disjunctions (any_plan,
guest_image_any) and the app-control-plane receipt_if all derive from it.

VERIFIED BY THE ARTIFACT ITSELF. .github/workflows/fleet-converge.yml is a registered generated
artifact (gunbc.generated_artifact FleetConvergeYamlArtifact) emitted from this module, so the
derivation had to reproduce the committed bytes exactly -- same option order, every `if:` expression
character-identical. A silent spelling change in a workflow `if:` disables a job rather than failing
loudly, so byte agreement is the property that matters, and the witnesses settle it rather than this
message asserting it.

NO WILDCARD IN THE SCOPE PROJECTION. fleet_converge_mode_scope names all fifteen modes explicitly. A
`_ => none` would read the same today and undo the totality this vocabulary exists for: the sixteenth
mode would silently inherit "no scope" instead of forcing the projection to decide what it means.

WHAT `none` DOES NOT SAY, and this is a correction to an earlier revision of this message. Optional
carries ONE absence, and two different facts land on it: a mode inherently outside fleet convergence
(the spark, micro-VM and guest-image modes select other subjects), and a mode that belongs in this
projection but whose observation contract is not built. That second case is DashboardDeploy alone.
The distinction is DECLARED in the annotation; it is NOT encoded in the result. A carrier separating
them would be a different return type, and minting one here to record a gap would be vocabulary ahead
of its consumer.

THE "NO SECOND LITERAL" CLAIM IS NARROWER THAN IT FIRST APPEARED, and the census is why. Each of the
fifteen names still occurs twice in this module; the second occurrence is a STEP ID. Those are a
separate namespace rather than a second spelling of one fact, and the evidence is in the corpus: mode
`rlm_launch_deployment_receipt` runs step id `rlm_receipt`. If ids were derived from modes that pair
would have to match. Forcing a derivation would either rename a step id -- changing workflow output
for a naming cleanup -- or assert a relation that does not hold. So the claim is: no second
production literal for a mode's DISPATCH spelling.

DASHBOARD DEPLOYMENT REMAINS EXPLICITLY OUTSIDE THE FLEET-SCOPE PROJECTION, pending an observed,
candidate-bound deployment request. Adding the scope member compiles; adding the FleetConvergeRequest
variant it obliges lights up nine match sites deriving a plan's baseline text, axis lines and refusal
counters, and those modules are explicit that an absent row is itself a claim about the host. A
deployment request carrying only a host would render a baseline of scope-and-host which apply
re-observes and compares against nothing -- a gate that cannot fail, worse than an absent one because
it would be cited as the admission the deployment gained. This PR adds no FleetConvergeScope or
FleetConvergeRequest member for the deployment and does not claim deploy uses the ordinary plan/apply
spine.

EVIDENCE: test.claim.workflow_dispatch_input_witness 12/12, including four new rows -- fifteen members
with fifteen DISTINCT wire values (count alone would admit two members sharing a spelling, which would
offer one option twice and make one mode unselectable), every dispatch option is a wire value of the
vocabulary, a step condition is the wire value of the mode it selects (with a discriminator that a
constant projection fails), and DashboardDeploy names no fleet scope WHILE the three plan modes do,
so a projection answering `none` for everything cannot pass.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019iXPtAqzPaNBZbaaM5rxrY
@briansrls briansrls changed the title Fifteen workflow modes were each spelled at least twice; now the name exists once and every selector is derived The workflow mode wire vocabulary has one authority, and every generated selector derives its spelling from it Sep 7, 2026
@briansrls

Copy link
Copy Markdown
Contributor Author

Post-amend evidence, on the final head 21640ae3f

The earlier 12/12 was taken before the amend and is superseded — pre-amend diagnostic evidence only. Rerun on the exact pushed head, working tree verified identical to origin/deploy-scope:

check result
workflow_dispatch_input_witness (12) 12/12 PASS
fleet_converge_workflow closure typecheck zero diagnostics
generated-workflow fixed point covered by the 8 pre-existing witnesses in that module, which pin the emitted fleet-converge.yml
dispatch-spelling census below

The census, and it proves the namespace separation better than the argument did

Every mode has exactly one wire arm. Fourteen of fifteen carry a second literal — the step id:

plan                          wire_arm=1  total_literals=2
launch_environment_plan       wire_arm=1  total_literals=2
...
dashboard_deploy              wire_arm=1  total_literals=2
rlm_launch_deployment_receipt wire_arm=1  total_literals=1   <-- no second literal

rlm_launch_deployment_receipt is the one mode whose step id differs (rlm_receipt, line 955), and it is the one mode with no second literal.

If step ids were derived from mode names, all fifteen would show two. The mode whose id diverges is exactly the one that drops to one — so the second occurrence is the id namespace coinciding, not the dispatch spelling being duplicated. That is the evidence for the narrowed claim:

Every workflow mode's dispatch spelling has one modeled authority, and every generated workflow use derives from that authority.

It deliberately does not claim there are no legitimate appearances of those words in receipts, prose, data, or unrelated domains.

Still explicitly not claimed

  • No FleetConvergeScope or FleetConvergeRequest member for dashboard deployment.
  • Deploy does not use the ordinary plan/apply spine.
  • The DashboardDeploy => none arm is explicit (no wildcard), and its annotation declares the missing ordinary-convergence scope rather than encoding it in none.

#6 remains open. Its next half needs a candidate-bound total member-decision baseline — not scope-and-host, and not effect_labels, which are a receipt projection: two different wrong unit documents both render write-unit <unit>, and two different stale revisions both render restart <unit>. MemberDecision preserves from and to, so Replace { from: A } and Replace { from: B } display identically while remaining distinct baselines — which is what lets apply refuse a stale plan.

@briansrls
briansrls merged commit 1e51ea9 into main Sep 7, 2026
2 of 4 checks passed
@briansrls
briansrls deleted the deploy-scope branch September 7, 2026 09:32
briansrls added a commit that referenced this pull request Sep 7, 2026
…ted selector derives its spelling from it (#10732)

The fleet-converge dispatch carried its mode names as bare Strings in two independent places: once in
`fleet_converge_mode_options`, and again inside seventeen hand-written rows of the form
`"github.event.inputs.mode == '<name>'"`. Both halves were ordinary Strings, so a rename could land in
one and not the other and nothing would notice -- the section 3 second-naming account in the shape no
lens can see, because there is no type to disagree with.

FleetConvergeWorkflowMode is now a closed fifteen-member vocabulary with one wire function. The
dispatch options list, all fifteen single-mode step_if expressions, both disjunctions (any_plan,
guest_image_any) and the app-control-plane receipt_if all derive from it.

VERIFIED BY THE ARTIFACT ITSELF. .github/workflows/fleet-converge.yml is a registered generated
artifact (gunbc.generated_artifact FleetConvergeYamlArtifact) emitted from this module, so the
derivation had to reproduce the committed bytes exactly -- same option order, every `if:` expression
character-identical. A silent spelling change in a workflow `if:` disables a job rather than failing
loudly, so byte agreement is the property that matters, and the witnesses settle it rather than this
message asserting it.

NO WILDCARD IN THE SCOPE PROJECTION. fleet_converge_mode_scope names all fifteen modes explicitly. A
`_ => none` would read the same today and undo the totality this vocabulary exists for: the sixteenth
mode would silently inherit "no scope" instead of forcing the projection to decide what it means.

WHAT `none` DOES NOT SAY, and this is a correction to an earlier revision of this message. Optional
carries ONE absence, and two different facts land on it: a mode inherently outside fleet convergence
(the spark, micro-VM and guest-image modes select other subjects), and a mode that belongs in this
projection but whose observation contract is not built. That second case is DashboardDeploy alone.
The distinction is DECLARED in the annotation; it is NOT encoded in the result. A carrier separating
them would be a different return type, and minting one here to record a gap would be vocabulary ahead
of its consumer.

THE "NO SECOND LITERAL" CLAIM IS NARROWER THAN IT FIRST APPEARED, and the census is why. Each of the
fifteen names still occurs twice in this module; the second occurrence is a STEP ID. Those are a
separate namespace rather than a second spelling of one fact, and the evidence is in the corpus: mode
`rlm_launch_deployment_receipt` runs step id `rlm_receipt`. If ids were derived from modes that pair
would have to match. Forcing a derivation would either rename a step id -- changing workflow output
for a naming cleanup -- or assert a relation that does not hold. So the claim is: no second
production literal for a mode's DISPATCH spelling.

DASHBOARD DEPLOYMENT REMAINS EXPLICITLY OUTSIDE THE FLEET-SCOPE PROJECTION, pending an observed,
candidate-bound deployment request. Adding the scope member compiles; adding the FleetConvergeRequest
variant it obliges lights up nine match sites deriving a plan's baseline text, axis lines and refusal
counters, and those modules are explicit that an absent row is itself a claim about the host. A
deployment request carrying only a host would render a baseline of scope-and-host which apply
re-observes and compares against nothing -- a gate that cannot fail, worse than an absent one because
it would be cited as the admission the deployment gained. This PR adds no FleetConvergeScope or
FleetConvergeRequest member for the deployment and does not claim deploy uses the ordinary plan/apply
spine.

EVIDENCE: test.claim.workflow_dispatch_input_witness 12/12, including four new rows -- fifteen members
with fifteen DISTINCT wire values (count alone would admit two members sharing a spelling, which would
offer one option twice and make one mode unselectable), every dispatch option is a wire value of the
vocabulary, a step condition is the wire value of the mode it selects (with a discriminator that a
constant projection fails), and DashboardDeploy names no fleet scope WHILE the three plan modes do,
so a projection answering `none` for everything cannot pass.


Claude-Session: https://claude.ai/code/session_019iXPtAqzPaNBZbaaM5rxrY

Co-authored-by: gunbc-ci-auto-heal <gunbc-ci-auto-heal@users.noreply.github.com>
Co-authored-by: Claude Opus 5 <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