Repository navigation
docs(rfc): confirm the C4.3 settlement vocabulary question - #7617
huangruiteng merged 2 commits into
Conversation
Merge ordering: regenerate the status index after #7593 landsThe derived status index counts ledger entries per RFC. This PR and #7593 each I will regenerate it on whichever of the two lands last. The baseline note was also corrected: the entry now reads the facts at Merge ordering: regenerate the status index after #7593 landsThis PR and #7593 each add one ledger entry to the same RFC and each |
20e21d8 to
23f4709
Compare
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>
The entry named 544aa0f as its baseline and said the settlement owners were unchanged since fb331f4, but effect_program.py and effect_program.ts changed between those two commits. The owners have been unchanged since the entry's own baseline, so the note now says that, and the baseline moves to the current main the facts were re-read at. The base branch also moved under the entry. The C4.3 settlement obligation comparison entry is now on it, so the entry links it instead of naming it in prose, and the relationship is stated in the direction both mirrors already agreed on: the comparison is the preceding entry and this one settles its first candidate slice. The entry also names the slice that closes the gap it leaves open, so the open work has an owner. Every claim in the entry was re-checked against 0a9a3a3: the TurnProviderStepKind exclusion, the provider-step rejection, the goal_mode_mcp.py call path into settle_host_todo_completion, the settlement vocabulary's registered values, the completion phases the governed capability execution passes, and the unchanged step-kind owners. Signed-off-by: xiaoan17 <anbc1224@gmail.com>
23f4709 to
591ec63
Compare
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; OpenAI gpt-6.1-sol; reasoning effort max; runtime_reported.
APPROVE:词汇结论与当前调用路径一致,没有 blocking finding;保留一个已验证的 P3 中文章节跳转问题。审查完整 head 591ec63050da58c9cf4c7acf5a83e128c8fa47d1,并按实际 PR base 的 merge-base 9dcdc0bacd455a8cf6f6146f052ffc4df0f5d04a 判断全量四文件差异。
动机 / Motivation
受影响的是准备合并结算适配层的维护者:他们必须先分清 Host 入口步骤与已提交的结算阶段。
此前把三套步骤标签视为重复,可能把入口校验再执行一次,或在删除适配器时漏掉已有义务;本条目先核对调用方,撤回没有等价依据的三标签统一方案。
可验证的增量是确认同一个已交付调用方怎样使用两套不同标签,并把真正未覆盖的 Host 步骤登记问题单独留在原有后续提案。
本 PR 不删除解释器、不新增执行入口、不改持久回执、额度或默认行为,也不宣称完整 C4.3 收敛已经完成。
仍缺完整删除前提、所有失败与恢复路径的等价证据以及端到端成本比较;Host 步骤登记另由已有 #7619 提案承接。
改动思路 / Approach
这里的 settlement 是一次工作执行后的持久结算。Host adapter 解码 CLI 计划,TypeScript prepare/finalize 决定计划与停止分类;另一条 turn settlement 路径执行已存在的阶段 reducer,再读取 provider 回执。两者共享 identity,并不意味着标签可以互换。直接将三套标签统一的最强反对理由是:validation 在一条路径里已完成,在另一类列表里根本不能执行,合并名字可能改变重放义务。
本条目采用更小的已有 owner 边界:确认事实并撤回三标签统一候选,不加执行框架。实际 loopx/extensions/governed_capability_execution.py 已把 Host admission 和 execute_turn_driver_settlement 连起来;provider step validator 实际拒绝 validation,现有私有 Host step 常量又确实未被 registry inventory 收录。因而下一步 Host 步骤登记与“统一三个 label 集合”是不同问题。前者已有 #7619 提案,后者在本文撤回。这样划界可独立核查与回退,但不证明删除适配器已安全。
具体改动 / Changes
关键内容讲解
全量差异为四个文档路径 +230/-2:EN/ZH confirmation 条目与两个 RFC 索引。A 是 guard、completion、writeback、spend 等 Host 前门步骤;B 是实际执行/读回的 settlement provider phases;C 是 validation 之类已提交阶段。这是对当前职责的解释,没有新增三套 authority。逐项比对真实 owner、实际 caller、inventory 与配对中文,结论相符。
依据预变更的 docs/architecture/rfcs/ledger/controller-executor-unified-contract-v0/2026-10-27-refactor-handoff.md,spec_revision: 9dcdc0bacd455a8cf6f6146f052ffc4df0f5d04a,criterion_id: C4.3。该准则要求先比较 identity、validation、guard/vision、completion、writeback、spend、closeout 与 recovery,再考虑删除解释器,并保留原始 effect ID 与逐阶段持久读回。此处只交付有用的比较/刻画前提;完整等价、调用方采纳与成本资格仍为 deferred,不能从条目数或测试通过推导完成。
本地 PASS:docs governance、RFC index --check、以目标 main 33d9ecd9fd29bce4986da6c9e9a6b758a24f91b3 检查整个已提交 PR 的 bilingual gate,以及主站、英文书、中文书三次实际 mkdocs build --strict。文档依赖来自声明的 docs/requirements-docs.txt 隔离覆盖层。构建保留了非阻断 anchor INFO,不能把 exit 0 说成每个链接都正确。原生 change-quality 和 standard premerge 均 PASS:4 项 direct checks 与 17 项 canary/risk/public-boundary checks 通过,无 skip、timeout、tracked side effect 或人工 hold。通过验证仍不等于 merge 授权。
对主干的风险 / Risks
两个 exact head 的相关十个生产 owner 文件与不可变基线及已验证目标 main 内容一致;没有新的运行时、默认值、权限、启用开关或持久格式。检查没有发现 prose substring 分类、新状态布尔拼装或把强制义务称为建议的问题。CI 按当前策略未查询、未等待;作者关于 CI 或旧集成运行的陈述不作为本次独立证据。
P3:中文新条目第 3 行的 Parent 使用英文 fragment #c43--settlement-adapters-over-existing-primitives,实际生成的中文目标章节 ID 是 c43-adapter。点击会打开目标页但不能定位 C4.3;最小修复是换成 #c43-adapter。这是低影响导航缺陷,正文及核心结论仍可读,不作为 approval blocker。应保留实际 HTML heading/href 检查,不能仅凭 strict build 通过判断锚点有效。
我的整体评价 / Verdict
这是 justified_increment:现在有证据放弃一个错误的收敛候选,且仍把真正的后续与完整删除资格留给原有 owner。long_horizon 为 preserved,减少误导方向的设计理由成立,但实际长程效果与完整成本未测量;user_experience 为 preserved,CLI 使用方式未改,P3 导航缺陷保留。兼容评估不适用:此 PR 未更改 decoder、持久格式或升级边界。局部简化已体现在撤回候选,无需强制新增公共 helper 或发明后续任务。
本次只改 RFC ledger 正文和索引;检查的文档路径没有布局、主题或首屏交互改动。未做整页视觉检查;实际 MkDocs HTML 的锚点检查属于自动验证。完整恢复矩阵、原生 Host 采纳及持续成本收益仍为 UNVERIFIED;这些不是本 PR 声称交付的成果。结论仅适用上述完整 exact head,approval 不表示 merge 授权或完整 C4.3 完成。
English verdict: APPROVE
| @@ -0,0 +1,106 @@ | |||
| # C4.3 结算词汇确认 | |||
|
|
|||
| - 上级:[controller/executor RFC,C4.3](2026-10-27-refactor-handoff.zh-CN.md#c43--settlement-adapters-over-existing-primitives)。 | |||
There was a problem hiding this comment.
[P3] 使用中文目标的实际章节锚点
实际 strict build 的中文目标章节 ID 是 c43-adapter,这里仍使用英文 fragment #c43--settlement-adapters-over-existing-primitives。页面能打开,但不会跳到对应章节。请将 fragment 改为 #c43-adapter,并核对生成 HTML 的 heading 与 href。这是非阻断导航问题。
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
Rebase and re-validation (2026-10-29)
mainat9dcdc0bacd455a8cf6f6146f052ffc4df0f5d04a591ec63050da58c9cf4c7acf5a83e128c8fa47d1Merge order. This entry must land before #7645. The two entries add one ledger file each, so the derived index count moves
2 entries→3 entrieshere and3 entries→4 entriesthere. The branch of #7645 is now based on this head, so merging them in this order keepsdocs/architecture/rfcs/STATUS.mdand its Chinese mirror accurate at every step; merging them in the other order leaves the derived index stale andscripts/generate_rfc_status_index.py --checkfails.All nine pull requests in this set were rebased onto the then-current
main(this one onto9dcdc0bacd455a8cf6f6146f052ffc4df0f5d04a) and merged together in a local worktree. The merged state passestests/architecture/,tests/canary/,tests/test_manager_context_roundtrip.py,tests/test_lark_native_reply_context.py,tests/control_plane/test_host_adapter_settlement_step_vocabulary.pyandtests/control_plane/test_host_adapter_settlement_partial_steps.py— 1805 passed, 0 failed.python scripts/generate_rfc_status_index.py --checkis clean.Merge sequence (2026-10-29)
mainto green. Each one fixes only its own share of the six places wheremainis currently red, so until all five land every one of them still shows the others' red tests in itspytest/test-shardlanes. test(semantics): point the stale turn_route fixtures at their current owners #7621 was merged the same way, with a known base-red. Merge them in any order; each merge removes one share.