Skip to content

docs(rfcs): make each execution-ledger entry its own file - #4691

Merged
huangruiteng merged 5 commits into
loopx-project:mainfrom
songoow:codex/rfc-ledger-entries-as-files
Sep 18, 2026
Merged

huangruiteng merged 5 commits into
loopx-project:mainfrom
songoow:codex/rfc-ledger-entries-as-files

Conversation

@songoow

@songoow songoow commented Sep 18, 2026

Copy link
Copy Markdown
Collaborator

RFC Appendix A was a single append cluster. During the #4447 repair round four branches each added an entry and every pair conflicted at the same position — eight resolutions in one afternoon, all of the form "the two sides are disjoint additions, keep both".

The cost is not the resolving

It is that a conflict always resolved the same way stops being read. The resolution that drops an entry looks exactly like the seven that did not, and nothing downstream notices: no code parses Appendix A, so a lost record surfaces only when someone goes looking for it and finds it gone.

What changes

New entries live in docs/architecture/rfcs/ledger/ as YYYY-MM-DD-slug.md with a Chinese mirror beside them. Two branches adding entries on the same day now touch two different files and merge with no resolution at all.

Nothing enumerates them. An index line in the RFC would be a smaller instance of the same problem — the dated filename already sorts, and the directory listing is the index.

The convention is checked, not described

check_rfc_ledger_entries requires the dated name, a Chinese mirror per entry, and non-empty content, so this cannot quietly rot back into prose. Verified by mutation:

badname.md                  -> ledger entry must be named YYYY-MM-DD-slug.md
2026-09-18-probe.md (alone) -> ledger entry missing required Chinese mirror

Both fail the smoke; the clean tree passes.

What was deliberately not done

The fifteen entries already in Appendix A stay where they are. They are append-only history nobody edits, so they were never what conflicted — the eight conflicts were all between new entries. Migrating them would have produced a large mechanical diff, forced rework on the one open #4447 branch, and fixed nothing.

It also does not add ledger entries to the hosted-docs navigation: the nav check requires a file for every nav entry, not a nav entry for every file.

Verification

docs-governance-smoke ok · semantic-vocabulary-drift-smoke ok · pytest tests/architecture/ 535 passed · canary premerge --from-git-diff 0 failures across all four sections.

The first entry in the new directory records this change itself.

Refs #4447

🤖 Generated with Claude Code

RFC Appendix A was a single append cluster. During the loopx-project#4447 repair round four
branches each added an entry and every pair conflicted at the same position:
eight resolutions in one afternoon, all of the form "the two sides are disjoint
additions, keep both".

The cost is not the resolving. It is that a conflict always resolved the same
way stops being read, and the resolution that drops an entry looks exactly like
the seven that did not. Nothing parses Appendix A, so a lost record surfaces
only when someone goes looking for it.

New entries now live in `docs/architecture/rfcs/ledger/` as
`YYYY-MM-DD-slug.md` with a Chinese mirror, so two branches adding entries on
the same day touch different files. Nothing enumerates them: an index line in
the RFC would be a smaller instance of the same problem, and the dated filename
already sorts.

`check_rfc_ledger_entries` checks the naming, the mirror pairing and non-empty
content, so the convention cannot quietly rot back into prose. Verified by
mutation: a file named `badname.md` and an entry with no mirror each fail the
smoke.

The fifteen entries already in Appendix A stay where they are. They are
append-only history nobody edits, so they were never what conflicted; migrating
them would have produced a large mechanical diff and forced rework on the one
open loopx-project#4447 branch while fixing nothing.

Refs loopx-project#4447

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: song <22676124+songoow@users.noreply.github.com>
huangruiteng
huangruiteng previously approved these changes Sep 18, 2026

@huangruiteng huangruiteng left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

评审 head:74aa65b381e2105a75cba344a64ff1993cbf8ca3;base:main(PR base 06ff92084)。

交付判定(policy 6):goal_achieved。内容上无阻塞项;但这个 head 还不能合并,原因与 diff 无关,见"对主干的风险"。

动机

缺口是被实测出来的:RFC 附录 A 是一个追加簇。在 #4447 那一轮修复里,四个分支各自追加条目,两两都在同一位置冲突——作者记录一个下午解了八次,形式全都是"两侧是不相交的新增,保留双方"。

真正的代价不在"解"这个动作,而在于:一个每次都用同样方式解决的冲突,就不再有人真的去读。那次丢掉条目的解决,看起来和没丢的另外七次一模一样,而下游毫无反应——没有任何代码解析附录 A,所以条目丢失只有在某人回头找一条已经不存在的记录时才会浮现。对只追加的历史来说,这是最坏的发现时机。

改完后的行为对比清楚:每条新条目是 docs/architecture/rfcs/ledger/YYYY-MM-DD-slug.md 加一份中文镜像。同一天新增条目的两个分支碰的是两个不同文件,无需任何解决即可合并。

作者否掉的两个更小/更重的方案我都认可:在 RFC 里放索引只是同一类问题的缩小版(仍然是一行共享追加点);迁移附录 A 里已有的十五条只会产出庞大机械 diff、迫使唯一开着的 #4447 分支返工,而且那些条目本来就没人编辑过,从来不是冲突源。

改动思路

入口是 examples/docs-governance-smoke.py 里新增的 check_rfc_ledger_entries(canary premerge 与 docs CI 都会跑)。权威输入就是 ledger 目录本身:文件名是否 YYYY-MM-DD-slug、每条是否配中文镜像、内容是否非空;README 要求配 .zh-CN.md;只存在镜像而没有英文原文也会被拒。

这里有个我认为是对的取舍:没有索引。文件名自带日期可排序,目录列表就是索引;作者明确写了"放一份索引会变成一行的追加簇"。也就是说,这个 PR 没有把共享行从一个地方搬到另一个地方。

RFC 两份镜像各加了一小段指针([ledger/](ledger/README.md)),并说明"已有条目原地保留"。因为是指针而不是枚举,删除目录会先被既有的本地链接检查抓住——这也补上了 checks 里 if not ledger.is_dir(): return 的那点软性。

具体改动

7 个文件、+178/-0:4 个新文档(约定 README 中英各一、首条条目中英各一)、两份 RFC 镜像的指针段、以及 35 行 check 代码。没有生产代码、没有生成物、没有机械搬移。

关键内容讲解

一、check_rfc_ledger_entries 是这次唯一可执行的部分,也是"约定被校验而不是被描述"的落点。我做了两次独立的突变验证,而不是只信作者的说明:

  • 把条目与它的镜像一起改名为 badname.md / badname.zh-CN.md → smoke 失败:ledger entry must be named YYYY-MM-DD-slug.md, got: badname.md;
  • 移除条目的 .zh-CN.md → smoke 失败:ledger entry missing required Chinese mirror: ...。

(顺带发现一个中间形态:只改英文名而留镜像,会以 has a Chinese mirror with no English original 失败——三条分支都能真的失败,不是恒真断言。)两次突变后我都恢复了文件并确认工作树干净、smoke 重新 ok。

二、首条条目就是这个改动本身(2026-09-18-ledger-entries-become-files.md),中英各一份,写法与 README 的约定一致,等于自带一个可用样例。

三、ledger/README.md 把约定写成三条可核对的规则(日期是"测量日"而不是合并日、每条配中文镜像、目录列表即索引),没有引入第二份清单。

对主干的风险

内容侧最强回归是"约定腐烂":有人又把条目当 section 追加、或者悄悄漏掉镜像。两条都在 smoke 里被拒绝(我实测过),所以风险是可观测且失败闭合的。

但这个 head 现在不能合并,而且不是这个 diff 的错:merge_state=DIRTY(与当前 main 在两个 RFC 镜像上冲突——恰好是它要消除的那类追加簇,这次由 #4651、#4686 在分支切出后合入造成),CI 有 4 项失败且可以完整解释:kernel-static-checks 是被取消的,于是聚合 job checks 以 KERNEL_RESULT=cancelled 失败,pytest 报 ValueError: checks must be success,merge-gate 同样倒在 checks must be success。取消原因是那个 job 的 15 分钟上限——正是 #4686 在 07:17 合入 main 时把 kernel-static-checks 提到 30 分钟要解决的问题;PR base 06ff92084 上失败的是同样这几个名字,而当前 main 是绿的。

所以正确路径是:作者把 main 同步进来(同时消掉冲突与超时级联),然后在新 head 上重跑评审与 pr-review --check-merge-readiness。我不会在 DIRTY + 检查未绿的 head 上给出"可合并"的结论;本评审判断的是内容。

P3(非阻塞):LEDGER_ENTRY_NAME 只匹配 \d{4}-\d{2}-\d{2},2026-99-99-x 会通过;另外"同一天 + 同一个 slug"仍会在同一路径相撞(虽然那是真正的重复而不是并发追加)。建议可选地校验日期是真实日历日,并在 README 里写明同日同名应合并为一条而不是当成冲突解决。

我的整体评价

baseline(附录 A 单一追加簇、并发条目必然冲突、丢条目的解决与其他七次无法区分)与 head(一条一个文件、命名与镜像由 smoke 校验、目录列表即索引、旧条目原地保留)对比:这是用很小的体量移除一个已被实测的协作成本,而且它诚实地划出了边界(不把账本条目变成可评审证据、不进导航、不迁移旧条目)。突变验证显示规则真的会拦人,不是散文。

结论 APPROVE(内容无阻塞)。合并前请先让作者同步 main 并让检查在新 head 上转绿——同步后我会在这个 PR 上重跑 exact-head 评审。

English verdict: APPROVE - exact head 74aa65b; the change moves each new execution-ledger entry into its own dated file with a Chinese mirror under docs/architecture/rfcs/ledger/, removing the append cluster in the RFC where four concurrent branches had to be hand-resolved eight times, and it enforces the convention instead of describing it - I reproduced both mutations the author claims: renaming an entry to badname.md fails with 'ledger entry must be named YYYY-MM-DD-slug.md' and removing its mirror fails with 'ledger entry missing required Chinese mirror', while docs-governance-smoke passes on the clean tree. It adds no index (the directory listing is the index), extends the existing smoke rather than adding a new one, leaves the fifteen existing appendix entries in place, and its only executable surface has a real caller in canary premerge. This head is nevertheless not merge-ready for reasons outside the diff: it conflicts with current main in the two RFC mirrors (the same append cluster) and its four failing checks all cascade from kernel-static-checks being cancelled at the old 15-minute cap that #4686 has since raised to 30 minutes on main. The author should sync main first; the review and merge-readiness must then be re-run on the new head. One non-blocking P3: the name pattern accepts an impossible date and identical date+slug from two branches still collides.

Both mirrors conflicted in Appendix A — the append cluster this branch exists
to remove, which is the ninth instance of the conflict it is fixing.

This branch replaces the section's intro with the rule that new entries are
files, and deliberately leaves pre-existing entries inline. Main's entry
predates the rule and arrived at the same anchor, so it is kept inline below
the new intro rather than migrated: migrating it here would rewrite a record
this branch does not own, and the rule is forward-looking by design.

Both mirrors keep 16 inline entries and the new intro; docs governance ok.

Signed-off-by: song <22676124+songoow@users.noreply.github.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: song <22676124+songoow@users.noreply.github.com>

@huangruiteng huangruiteng left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

账本最好体现和rfc的关联吧,看是以命名的方式还是路径的方式

@huangruiteng huangruiteng left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

评审 head:2a15744198282763d639cb8cd967921f8ff5e8f4;base:main(PR base 06ff9208,当前 main 已前进,分支再次 BEHIND)。

本次按本 head 上的维护者评审框(review 5245617529)执行:"账本最好体现和 RFC 的关联吧,看是以命名的方式还是路径的方式"。按这条框逐行核对后,该行在本 head 仍未满足,因此结论为 request changes;其余机制部分已验证通过。

动机

动机是实测出来的,不是风格偏好。semantic-vocabulary-convergence-v0.md 的附录 A 过去是一个共享追加簇:在 #4447 的修复轮里,四个分支各自新增账本条目,两两都在同一位置冲突,一个下午手工解了八次,解法全是"两侧不相交、保留双方"。

代价不在于解冲突本身,而在于丢失是静默的:一次丢掉条目的解决,与另外七次看起来完全一样,而下游没有任何代码解析附录 A,所以只有等人回头找一条已不存在的记录时才会浮现。PR 用一个文件一条目来消除这行共享,是正确的最小机制;我早前在 74aa65b3 的通过已随 head 前移被 dismiss,本 head 需要重新给结论。

改动思路

新条目落在 docs/architecture/rfcs/ledger/,命名 YYYY-MM-DD-slug.md,每条配一份 .zh-CN.md 镜像;目录列表即索引,不新增索引行(避免把原问题缩小一号后重演)。附录 A 保留历史条目原地不动,只加一段指向 ledger/README.md 的说明;约定不靠描述,由 examples/docs-governance-smoke.py 的 check_rfc_ledger_entries 校验命名、镜像配对与非空内容。

这个分工是对的:非规范记录留在文档层,唯一的机器约束放在仓库既有的 docs 门禁里,没有引入新的 register、生成物或运行时投影。锚点检查(同目录 README、RFC 指针、smoke)互相一致,docs-governance-smoke 在本 head 通过。

具体改动

7 个文件、+178/-0,全部是文档加 35 行 smoke 断言,无运行时代码改动。

  • docs/architecture/rfcs/ledger/2026-09-18-ledger-entries-become-files.md 与 .zh-CN.md:新条目本体,说明问题、失败模式、约定与"不做什么"。
  • docs/architecture/rfcs/ledger/README.md 与 README.zh-CN.md:目录约定(命名、镜像、目录即索引、只追加、更正方式)。
  • docs/architecture/rfcs/semantic-vocabulary-convergence-v0.md 与 .zh-CN.md:附录 A 说明新条目位置与原因,旧条目保留。
  • examples/docs-governance-smoke.py:新增 check_rfc_ledger_entries。

关键内容讲解

  1. docs/architecture/rfcs/ledger/README.md 的 "Convention":YYYY-MM-DD-slug.md(日期是测量当天)、同 stem 的中文镜像、目录列表即索引、只追加并以后续条目更正。这是全 PR 的规范面,后续所有条目都要落在这套规则里。
  2. examples/docs-governance-smoke.py 的 check_rfc_ledger_entries(第 208-236 行):对 ledger/*.md 逐个断言——.zh-CN.md 必须有英文原件、README.md 必须有中文镜像、条目 stem 必须匹配 LEDGER_ENTRY_NAME、双语内容非空。约定因此是"被校验的"而不是"被描述的"。
  3. 附录 A 的指针段落(semantic-vocabulary-convergence-v0.md):把新条目位置与原因写在读者原本会去找的地方,并明确旧条目为什么原地保留。

对主干的风险

阻塞项(对应维护者框的那一行,未满足):约定只记录了日期与镜像,没有任何地方表达条目属于哪个 RFC。这不是假想问题:仓库里已有六个 RFC 带 Appendix A: Execution ledger(semantic-vocabulary-convergence-v0、goal-direction-baseline-v0、single-owner-local-daemon-v0、frontier-science-research-program-v0、agent-session-execution-modes-v0、TEMPLATE.md),而新约定是一个共享目录。也就是说,为其中另外五个 RFC 写的条目,可以完全满足现有全部断言却不带归属信息,读者仍无法判断它在补哪一份附录。触发这个状态的正是本 PR 自己引入的共享目录 + 无归属命名。

最小修复(任选其一,并同步 README 双语与 smoke):路径形式 ledger/<rfc-slug>/YYYY-MM-DD-slug.md;或命名形式 YYYY-MM-DD-<rfc-slug>-slug.md;或约定一条必需字段(如 RFC: <rfc-slug>),并在 check_rfc_ledger_entries 中断言被引用的 RFC 文件存在。配套负例:一个指向不存在 RFC 的条目必须让 smoke 失败——现有 badname.md 突变就是同一手法。

非阻塞项 P3:新条目称"附录 A 里已有的十五条",但在本 head 与 PR base 上,附录 A 实际有 16 条带日期的 ### 2026- 条目。建议改为无需计数的表述("附录 A 里已有的条目"),或在合并前按 merge base 校正数字,中英镜像同步。一个以"静默不准确"为论据的记录,自身的数字应当准确。

验证与状态:examples/docs-governance-smoke.py 在 head 通过;我另外放入 ledger/badname.md 复现了命名断言失败(ledger entry must be named YYYY-MM-DD-slug.md, got: badname.md),随后移除探针并复跑通过;镜像缺失走同一函数中的相邻断言(读码确认,未做突变)。合并门:24/24 检查通过,但 check-merge-readiness 4691@2a157441... 返回 ready=false,阻塞原因是 merge_state_requires_update(分支再次落后 main)与 current_head_review_missing_or_invalid(本 head 上 08:07 的 CHANGES_REQUESTED 评审没有可验证的双语正文),因此修好归属行后需在不变 head 上重新取得通过结论并更新 base。

我的整体评价

机制层 approve:把共享追加簇拆成一条一个文件,并用 smoke 把命名与镜像固化,直接消除了一个已被实测的静默丢失冲突类;不自造索引、不迁移历史、不夸大账本为"可评审证据",边界描述准确,体量也与问题相称。

但维护者在本 head 提出的 RFC 归属行尚未满足,且该缺口对另外五个带执行账本的 RFC 同样成立,属于交付前必须补齐的契约行,故结论为 request changes。补齐归属(路径或命名任一种)并加一条对应负例、顺手校正 P3 的计数后,在不变 head 上重跑 docs 门禁与 --check-merge-readiness 即可复审。

English verdict: REQUEST_CHANGES - 4691@2a15744198282763d639cb8cd967921f8ff5e8f4; the per-file ledger mechanism and its smoke are verified (docs governance smoke passes; a badname.md probe fails the naming assertion), but the maintainer frame row on this head is unmet: the convention carries no RFC association although six RFCs have execution-ledger appendices, so a path or name rule plus a matching assertion is required; P3: the entry says fifteen Appendix A entries while there are 16 at this head; merge also needs a base update and a fresh ready conclusion on the unchanged head.

songoow and others added 3 commits September 18, 2026 06:25
Six RFCs carry an `Appendix A: Execution ledger`, and this convention puts
their entries in one shared directory. With only a date and a mirror recorded,
an entry written for any of the other five satisfies every existing assertion
and still leaves a reader unable to tell which appendix it extends.

The association is the directory: `<rfc-slug>/YYYY-MM-DD-slug.md`, where the
slug is the RFC file's own name. Path rather than a filename segment or a
frontmatter field, because the point of this ledger is that the listing is the
index — `ls ledger/<rfc-slug>/` gives one RFC's entries directly, while a
name-encoded slug can only be filtered by something that already knows the
format, and a field would be a claim the naming cannot check.

The assertion follows the same reasoning: the directory must name a real RFC
file that actually carries an execution-ledger appendix. A directory claiming
an RFC that does not exist fails, which is the negative case, and it fails
structurally rather than by parsing a name.

Also replaced "the fifteen entries already in Appendix A" with phrasing that
does not carry a number. It was measured at fifteen and the merge brought it to
sixteen; an entry arguing that silent inaccuracy is the real cost should not
carry a figure that drifts.

Both READMEs and both mirrors updated. Docs governance smoke ok; a
`no-such-rfc-v0/` probe fails as intended.

Signed-off-by: song <22676124+songoow@users.noreply.github.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: song <22676124+songoow@users.noreply.github.com>
Signed-off-by: song <22676124+songoow@users.noreply.github.com>
The Appendix A prose still described the flat form the previous commit
replaced. Both mirrors now name the per-RFC directory, so a reader of the RFC
does not have to open the ledger README to learn where an entry goes.

Signed-off-by: song <22676124+songoow@users.noreply.github.com>
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: song <22676124+songoow@users.noreply.github.com>
@songoow

songoow commented Sep 18, 2026

Copy link
Copy Markdown
Collaborator Author

归属已按路径形式补齐 — 4fec73ef0

这条我接受。它揭示的是这个 PR 自己制造的问题:把六份 RFC 的账本合进一个共享目录,却只规定了日期与镜像,于是为另外五份写的条目能满足现有全部断言,读者仍无从判断它补的是哪一份附录。

选了路径形式,理由是 PR 自己的论点

<rfc-slug>/YYYY-MM-DD-slug.md。

这个目录存在的意义就是「没有任何地方枚举它们,目录列表就是索引」。按 RFC 分子目录保住了这个性质——ls ledger/<rfc-slug>/ 就是那份 RFC 的索引;而名字里带 slug 只能靠 ls | grep 筛,得先知道 slug 格式,索引性更弱,且归属要从文件名解析,断言更脆。必需字段(RFC: <slug>)则引入一个命名无法校验的声明,还得再加一条断言去管它。

断言与负例

目录必须命名一个真实存在、且确实带 Appendix A: Execution ledger 的 RFC 文件。探针已验证:

ledger directory no-such-rfc-v0/ does not name an RFC:
  docs/architecture/rfcs/no-such-rfc-v0.md does not exist

移除探针后复跑通过。这比解析名字更结构化,同一手法也覆盖了「指向存在但不带账本附录的 RFC」那种情况。

P3

按建议处理,但不是把 15 改成 16,而是改成不携带数字的表述。数字会漂移(这次就是合并 main 带进来的第 16 条),而这条记录的论点正是「静默不准确才是真正的代价」——它自己不该自带一个会漂的数字。

其余

按你指出的 merge_state_requires_update 已合并 main(无冲突)。README 双语、两份镜像、以及 RFC 正文里对账本路径的描述都已同步,读者不必打开 ledger README 才知道条目该放哪。

本 head 验证:docs-governance-smoke ok · drift smoke ok · canary premerge --from-git-diff ok:true(direct 4/4、catalog 0 失败)。

关于 current_head_review_missing_or_invalid:这条我确认,也认同复审需要落在不变的 head 上。当前 head 已包含归属修复、P3、main 合并与文档同步,请在此基础上复核。

🤖 Generated with Claude Code

@huangruiteng huangruiteng left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

评审 head:4fec73ef0c80b03ccc052683179ea1455b69981c(base main,作者 songoow)。本次是响应我上一轮 request changes 的复审:上轮我指出"账本条目没有体现它属于哪份 RFC,而仓库有六份 RFC 带执行账本附录"。该缺口已修复,且修复方式是被机器校验的。

动机

原问题仍然是实测的:附录 A 是共享追加簇,#4447 的修复轮里四个分支两两在同一位置冲突。上轮我要求在命名或路径上体现 RFC 归属,是因为共享目录下 YYYY-MM-DD-slug.md 无法说明条目补的是哪一份 RFC——而执行账本附录在六份 RFC 上存在(semantic-vocabulary-convergence-v0、goal-direction-baseline-v0、single-owner-local-daemon-v0、frontier-science-research-program-v0、agent-session-execution-modes-v0、TEMPLATE.md),读者与后续作者都没有依据。

本 head 判定 goal_achieved:归属以路径形式落地,并进入同一份 smoke 的断言,而不是停留在描述里。

改动思路

约定改为"每份 RFC 一个目录、目录名与其 RFC 文件名完全一致":条目位于 docs/architecture/rfcs/ledger/<rfc-slug>/YYYY-MM-DD-slug.md,中文镜像同名同目录。目录本身即该 RFC 的索引,跨 RFC 不设枚举——这保住了"消除共享追加行"的初衷,同时让归属成为结构事实。

校验也随之升级:check_rfc_ledger_entries 先枚举 ledger 下的子目录,逐个断言 <slug>.md 真实存在、且该 RFC 文件里确实含 Appendix A: Execution ledger,然后才在该作用域内检查日期命名、中文镜像与非空内容。这样"给不存在的 RFC 建目录""给没有执行账本附录的 RFC 建目录"都会失败。

具体改动

相对我上轮评审的 head,本 PR 自身新增两个提交:把条目文件移入 ledger/semantic-vocabulary-convergence-v0/、并在 RFC 与 smoke 中陈述该路径规则;其余差异来自 main 的既有合并。

  • docs/architecture/rfcs/ledger/README.md / README.zh-CN.md:约定改为 <rfc-slug>/YYYY-MM-DD-slug.md,并说明"六份 RFC 带执行账本附录,所以条目必须写明补哪一份"。
  • 条目文件(含中文镜像)移入 ledger/semantic-vocabulary-convergence-v0/。
  • docs/architecture/rfcs/semantic-vocabulary-convergence-v0.md:附录 A 指针改为 ledger/<rfc-slug>/。
  • examples/docs-governance-smoke.py:check_rfc_ledger_entries 增加 RFC 目录归属断言。

关键内容讲解

  1. examples/docs-governance-smoke.py 的 check_rfc_ledger_entries:新增的 scopes 循环要求每个子目录名对应真实 RFC 文件,且该文件必须含执行账本附录——这是把上轮的评审意见变成机器不变量,而不是把它写进文档规矩。
  2. 两份 ledger/README:把"目录名与 RFC 文件名一致"写成第一条约定,读者据此能直接定位归属。
  3. 移动后的条目本体:内容保持只追加历史的口径;上一轮我提到的"十五条"这类计数表述已不再出现(改为无需计数的说法)。

对主干的风险

本 head 的机制风险很低:改动是文档路径 + 一条 smoke 断言,回滚成本是还原两个路径与一段检查。我做了正反两向验证:

  • 正向:examples/docs-governance-smoke.py 通过(docs-governance-smoke ok)。
  • 反向:新建 ledger/not-a-real-rfc/2026-09-18-mutation-probe.md 后,smoke 以精确信息失败——ledger directory not-a-real-rfc/ does not name an RFC: docs/architecture/rfcs/not-a-real-rfc.md does not exist;移除探针目录后 smoke 恢复通过,git status 干净。

CI 需要说明:本 head 的 8 个失败检查(kernel-static-checks、node-forward-compatibility、windows-powershell、stage2c (mutants 0) 及级联的 stage2c-correctness-e2e / pytest / checks / merge-gate)是 main 侧既有漂移导致的过期运行;该漂移已由 #4688 修复并随 f5c95ff0 于 11:06 合并进 main,而本分支 head 早于该合并。因此合并前需要同步 main 或重跑一次 CI,并让 pr-review --check-merge-readiness 4691@4fec73ef… 在不变 head 上返回 ready。

我的整体评价

approve。作者没有用"改名规避计数"这类捷径,而是把归属变成路径约定,并把它写进与命名/镜像同一处的 smoke 断言;这正是我上轮要求的形态(命名或路径任选其一,且被校验)。附带的上轮 P3(条目里的计数表述)也已消除。文档层改动内聚、可回滚,正反两个方向都有本地证据。

剩余事项只有一条与代码无关:同步 main 或重跑 CI 后再走合并门。我未复核 main 侧合并进来的其它改动(那些不属于本 PR 的评审范围)。

English verdict: APPROVE - 4691@4fec73ef0c80b03ccc052683179ea1455b69981c; the requested RFC association is delivered as the documented <rfc-slug>/YYYY-MM-DD-slug.md path and, more importantly, enforced by check_rfc_ledger_entries (a ledger directory must name an existing RFC carrying an execution-ledger appendix). Verified positively (docs-governance-smoke ok) and negatively (a not-a-real-rfc/ probe fails with the exact message; probe removed, tree clean), and the previous count-wording nit is gone. The head's eight failing checks are stale pre-repair runs caused by main-side drift that #4688 fixed and merged as f5c95ff at 11:06, so merge waits for a sync or re-run plus a ready check-merge-readiness on the unchanged head.

@huangruiteng
huangruiteng merged commit 8755d8b into loopx-project:main Sep 18, 2026
16 of 24 checks passed
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.

2 participants