Repository navigation
Conversation
The C4.3 settlement obligation comparison listed a candidate slice: vocabulary unification. It was conditional on a question that had not been answered: do guard, lifecycle_completion and validation describe one obligation? Guessing it would have produced either a wrong merge or a wrong refusal to merge. The answer is no, so the candidate is withdrawn. - validation is not an executable effect in either runtime. TurnProviderStepKind excludes it, require_turn_provider_step_kind raises "validation is not a provider effect step", the reducer throws "unsupported base settlement step validation" if asked to run it, and the registry's own value note records that it is the one step the dispatcher never executes and carries no command template. - guard and lifecycle_completion are executed steps: the adapter runs them through run_cli with a continue_when that decides whether the rest of the plan runs. - The two value sets differ exactly where the question is asked. guard and lifecycle_completion occur only in A, validation only in B, and the repository advisory does not list them as a merge candidate. - lifecycle_completion has no counterpart in B. - One shipped caller already uses both vocabularies for one admission decision: governed_capability_execution.py classifies the admission snapshot with A's classify_host_guard_snapshot and then hands B a completed_phases that already contains validation. guard and validation name one obligation seen from two positions, so renaming them would hide that asymmetry and break B's "a phase is never executed" invariant. The entry also records what the confirmation leaves open: the vocabulary that does exist has no typed owner, its literal is written twice (an unexported STEP_KINDS and a private _STEP_KINDS), and the repository's inventory sees neither carrier, so the registry's drift smoke cannot cover it. That is a separate slice and must first reconcile loopx-project#3412, loopx-project#5677, loopx-project#7580 and loopx-project#7523. The derived RFC status index is regenerated, because it counts ledger entries per RFC and the new entry makes the checked-in index stale. No code, schema, wire, registry or default change. Validation: mkdocs build --strict for the docs site and both developer books; RFC bilingual check passed; docs-governance smoke passed; loopx canary premerge --from-git-diff green. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
xiaoan17
requested review from
huangruiteng,
loopx-agent and
songoow
as code owners
October 29, 2026 02:42
This branch has not been deployed
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.
Scope
One read-only ledger entry that answers the question the C4.3 settlement
obligation comparison left open, plus the derived RFC status index.
The comparison listed a candidate slice: vocabulary unification (small) — if
any caller adopts both paths, give
guard,lifecycle_completionandvalidationone typed owner instead of three names in two files. Do not unifynames that describe different obligations. It was conditional on a question
that had not been answered. This entry answers it.
Answer
They do not describe one obligation, so the candidate is withdrawn.
validationis never executed.TurnProviderStepKindexcludes it in bothruntimes,
require_turn_provider_step_kindraisesvalidation is not a provider effect step, the reducer throwsunsupported base settlement step validationif asked to run it, and the registry's own value note alreadysays it is "the one step the dispatcher never executes" and "carries no
command template".
guardandlifecycle_completionare executed steps. The adapter decodes anordered_cli_sequenceof four or five steps in a fixed order and callsrun_cli(step.args)for each, with acontinue_whendeciding whether therest of the plan runs.
guardandlifecycle_completionoccur only in A,validationonly in B. Therepository's own advisory does not list them as a merge candidate.
lifecycle_completionhas no counterpart in B.extensions/governed_capability_execution.pyclassifies the caller'sadmission snapshot with A's
classify_host_guard_snapshot, then callsexecute_turn_driver_settlementwithcompleted_phasesthat alreadycontain
validation.guardandvalidationname one obligation seen from two positions — theproducer that runs the admission and the consumer that refuses to run it.
Renaming them would hide that asymmetry and break B's "a phase is never
executed" invariant.
What it leaves open
The vocabulary that does exist has no typed owner and its literal is written
twice: an unexported
STEP_KINDSinturn_driver/host_todo_completion.tsanda private
_STEP_KINDSinhost_adapter_settlement.py, which validates theTypeScript-produced plan order against the Python copy. Neither is exported,
neither is registered in
loopx/semantics/vocabulary_v0.json, and therepository's inventory sees neither carrier — the TypeScript scan matches
export const NAME = [...] as const;and the Python scan matches module-levelUPPER_NAMEassignments — so the registry's drift smoke cannot cover it. Ahand-kept Python mirror of a TypeScript literal can drift, and the failure
would surface at runtime as
TypeScript host provider step order mismatch.That is a separate slice: one shared owner for the ordered host-adapter step
kinds, registered in the vocabulary registry. It must first reconcile the
in-flight settlement work (#3412, #5677, #7580, #7523).
Validation
mkdocs build --strictfor the docs site and both developer booksexamples/docs-governance-smoke.pypassedloopx canary premerge --from-git-diff --git-diff-base origin/maingreen(17 checks, 0 failures)
No code, schema, wire, registry or default change.
Merge ordering
The derived status index counts ledger entries per RFC, so both this PR and
#7593 change the same
STATUS.mdline. Each branch is self-consistent on itsown, but whichever of the two lands last must regenerate the index
(
python3 scripts/generate_rfc_status_index.py --write) so the entry countmatches the directory again.
Signed-off-by: xiaoan17 anbc1224@gmail.com