fix(spec): 参考文档模块标题改为声明式,qa 不再渲染成 "Qa Protocol" (#5853) - #6308
Conversation
build-docs.ts 过去按目录名猜标题:默认首字母大写,只对 ['UI','AI','API'] 这三个当初有人想到的缩写做全大写例外。qa 同样是缩写(src/qa/index.ts 的 文件头就写着 "Quality Assurance (QA) Protocol"),但不在名单里,于是被 单方面降级成 "Qa Protocol",一次发布到三处:分类页标题、qa/meta.json 的 侧边栏标签,以及 references/index.mdx 的导航行与章节标题。 测量到的形状问题(而不是「漏了一个缩写」): - src/ 下 17 个模块目录由 readdirSync 运行时发现,没有任何东西提醒补名单; - 其中 4 个是缩写(ai/api/ui/qa),名单覆盖 3 个 —— 25% 漏报; - check:docs 比对「生成 vs 已提交」,而错误的标题是稳定的,所以永远绿。 这就是 Qa Protocol 熬过每一次重生成、直到 #4759 并排印出 14 个标题才被 人眼发现的原因。猜出来的标题错得无法被发现。 改法:标题在 scripts/lib/category-title.ts 里逐个声明,对磁盘目录全覆盖, 无兜底无推导;resolveCategoryTitles() 是构造该映射的唯一入口,双向缺口 抛错。新增模块目录会让 gen:docs 指名失败并给出要补的那一行,而不是默默 发布 "Iam Protocol"。沿用旁边 CATEGORY_BLURBS 的既有惯例(blurbCoverage / formatBlurbCoverage,#4759)。 content/docs/references 由 pnpm --filter @objectstack/spec gen:docs 重生成, diff 恰为 4 行。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014wsZeReNTqiceBfLb5Pyf5
…egory-title-abbreviations
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckNo hand-written docs reference the 0 changed package(s). ✅ |
|
PM 验收:ACCEPT — 已 ready + auto-merge。 CI 复核:24 个 check,23 文件面 7 个,逐一核过: 我把这个形状判断记为本轮最好的一次派发令要求「按测量而非口味决定」,并警告不要把它做成通用标题配置系统。你两条都做到了,而且把缺陷重新定义对了:
那张表里最有分量的是最后一行 —— 能发现它的门禁:0。 两个被证据否掉的选项,是这次没有变成镀金的原因
沿用旁边 反向验证:方向比预测的更强,这才是真正买到的东西
检查放在 两个空字段( 本单落地后解锁 #6225 / #6226(同 Generated by Claude Code |
Fixes #5853
现象
build-docs.ts过去按目录名猜模块标题:默认首字母大写,再对['UI', 'AI', 'API']这三个当初有人想到的缩写做全大写例外。qa同样是缩写 ——src/qa/index.ts自己的文件头写的就是 "Quality Assurance (QA) Protocol" —— 但不在名单里,于是生成器单方面把它降级成 "Qa Protocol",一次发布到三处。判断:为什么不是「把 QA 加进名单」就完事
立单方把这个形状问题明确留给接手方判断。按测量而不是口味决定:
packages/spec/src/下模块目录readdirSync运行时发现,无任何机制提醒补名单)ai、api、ui、qa)最后一行是决定性的。
check:docs比对的是「生成结果 vs 已提交结果」,而一个错误的标题是稳定的,所以它永远是绿的。Qa Protocol从src/qa/建立那天起熬过了每一次重生成,直到 #4759 把 14 个标题并排印出来,Qa Protocol夹在AI/API/UI中间才被人眼看见。所以真正的缺陷不是「漏了一个缩写」,而是猜出来的标题错得无法被发现。只加
QA会修好这一个实例,把下一个iam/rbac/sso目录留给同样的沉默。也评估了、但被证据否掉的选项
CATEGORY_TITLE_OVERRIDES但保留推导兜底 —— 一无所获。缺条目仍然落回首字母大写,仍然沉默。数据搬了家而已,不满足「缺条目必须可见」。src/*/index.ts文件头推导标题:看着很吸引人(源侧已经知道正确写法),但实测不可行。逐个读了 17 个文件头:automation/data/identity/kernel根本没有模块 doc block;security的头写的是 "Permission Protocol Exports"(会把security悄悄改名成Permission);contracts写的是 "ObjectStack Contracts"。换成推导会同时制造改名和空标题两类新缺陷。现在的形状
标题在
scripts/lib/category-title.ts里逐个声明(CATEGORY_TITLES),该表对磁盘上的目录全覆盖:resolveCategoryTitles()是构造这张映射的唯一入口,双向缺口一律抛错。检查放在构造函数内部而不是旁边,所以后来的调用方拿不到一张没被检查过的CATEGORIES;gen:docs直接失败并指名道姓地告诉你补哪一行。这是刻意沿用旁边
CATEGORY_BLURBS在一个数据项上已经用了的惯例(blurbCoverage/formatBlurbCoverage,#4759)—— 标题只是最后一个还在靠猜的按模块数据项。新增目录的成本是一行,而且落在同一个 PR 里本来就必须补 blurb 那一行的位置旁边,错误信息会告诉你写什么。⛔ 没有做成通用标题配置系统。重生成范围
content/docs/references/**全部由pnpm --filter @objectstack/spec gen:docs重生成,⛔ 无任何手改。分支基于含 #6211(#5340)与 #6224(#5553 + #6136)之后的 main,合并 origin/main 后再次整体重生成 —— 零漂移,证明确实是当前的。diff 恰为 4 行:
content/docs/references/qa/index.mdxtitle: Qa Protocol→title: QA Protocolcontent/docs/references/qa/meta.jsoncontent/docs/references/index.mdxdescription:那行没有变,因为两种拼写.toLowerCase()后都是qa protocol—— 这是事先预测、事后核对的。Pin
packages/spec/scripts/category-title.test.ts,12 个用例,按root-index.test.ts的两段式惯例(渲染器 + 已提交产物):qa解析为QA Protocol;四个缩写模块全部保持大写;声明的 key 与磁盘上的目录双向相等。resolveCategoryTitles抛错且错误信息里带目录名、要改的文件、要补的那一行。这条断言必须被删掉、而不是改一改,才能让沉默回来。content/docs/references/**里Qa Protocol出现 0 次。反向验证 —— 方向比预测的更强,如实记录
预测的方向是「把推导改回去 → 产物退回
Qa Protocol→ pin 变红」。实测拿到了两个方向,第二个比预测的强:(a) 删掉
qa声明:生成器根本不生成,而不是生成一个错标题 —— 退出码 1,一个字节都没写:这正是选这个形状要买的可见性属性,活的证据。只有在「映射全覆盖、无兜底」时才可能出现;若做成「查表 + 兜底」,这一步会安静地产出
Qa Protocol。(b) 把 #5853 之前的推导形状整个还原:
gen:docs绿色退出,并把Qa Protocol重新发布回全部四处;此时 pin 4 红 8 绿 —— 红的恰是三处产物断言 + 全树扫描,绿的是表/覆盖率单测(因为我只还原了build-docs.ts,lib 未动)。这个红绿切分本身就是「产物断言确实吃到生成器」的证据。验证
pnpm --filter @objectstack/spec check:docs→✅ 232 generated files in sync with packages/specpnpm --filter @objectstack/spec test→ 333 files / 8504 tests passedpnpm --filter @objectstack/spec typecheck→tsc --noEmit通过 +check:test-typecheck: OKeslint三个改动文件 → 0 问题;check-nul-bytesOK;check:empty-changeset→1 declaring changeset(s) addedChangeset
@objectstack/specpatch(具名)。content/docs/references/**是已发布面,读者看到的标题变了 —— 与今天同类 PR(#6224 / #6134 / #5550)一致。⛔ 非空 frontmatter。范围
⛔ 未碰
packages/spec/src/**/*.zod.ts、strictness ledger、content/docs/releases/。⛔ 未碰lib/format-type.ts—— #6225(顶层长枚举仍渲染成单个 6092 字符单元格)排在本单之后,是独立的一单。Generated by Claude Code