Skip to content

docs(adr-0094): sys_capability 行按 curated/derived 两半修正 label/description 的刷新口径 (#5935) - #6034

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-5935-adr0094-row-precision
Aug 7, 2026
Merged

docs(adr-0094): sys_capability 行按 curated/derived 两半修正 label/description 的刷新口径 (#5935)#6034
baozhoutao merged 1 commit into
mainfrom
claude/issue-5935-adr0094-row-precision

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #5935

docs-only (governed ADR text), skip-changeset requested。

背景

#5876(PR #5934,已合入 9ce0ca946)让 bootstrapSystemCapabilities 的两半对既有行的 display 字段拥有不同权限。ADR-0094 2026-07-14 附录的 per-type 决策表里,sys_capability 那一行仍写着无限定的 "label/description are platform-owned and refresh each boot" —— 这句话在 #5876 之后只描述了 curated 那一半。

单独读这一行,它读起来像是"任何行的 display 字段都可以每 boot 覆盖"的授权,而同一份附录上方一屏的通则已经把规则写对了:

the seeder must not clobber an environment-edited record

所以这不是决策反转,而是把表格行修到与它自己上方的通则一致 —— 正是 Prime Directive #13 提醒的形态:下一位作者读的是表格行,不是通则,于是把守卫"修"回去。

改动(单文件、单表行)

docs/adr/0094-sys-permission-set-pure-projection.md 第 306 行,per-type 决策表的 sys_capability 行 Decision 单元格。不含任何新决策内容;保留行内既有的 #2909 T3 引用,追加 #5876

修改前:

Resolved (#2909 T3): seed-not-clobber holds — label/description are platform-owned and refresh each boot; managed_by/active were already preserved; scope is an admin-editable classification face and is now seed-once (insert only). Locked by bootstrap-system-capabilities.test.ts.

修改后:

Resolved (#2909 T3): seed-not-clobber holds — label/description refresh each boot for the curated platform definitions (PLATFORM_CAPABILITIES, platform-authored copy); the back-compat derived placeholders (humanize(name) label, generated Capability description) reconcile only rows the derivation itself owns (managed_by:'platform'), never a row authored elsewhere — admin, package, or any other provenance (#5876). managed_by/active were already preserved; scope is an admin-editable classification face and is now seed-once (insert only). Locked by bootstrap-system-capabilities.test.ts.

逐词核对现状代码(packages/plugins/plugin-security/src/bootstrap-system-capabilities.ts @ origin/main)

措辞以 issue 的建议为底稿,再对现状代码逐词核对后落笔,四点全部对齐:

措辞 代码依据
curated 半边不变,每 boot 刷新 守卫只在 derivedNames.has(def.name) 为真时生效;curated 名字直接走 tryUpdate。测试 the guard is scoped to the DERIVED half — curated names still refresh 钉住。
derived 只 reconcile 自己拥有的行 if (derivedNames.has(def.name) && row.managed_by !== 'platform') { skippedAuthored += 1; continue; }
"never a row authored elsewhere — adminpackage,或任何其它出处" 守卫判的是 !== 'platform',因此 admin/package/未知出处一律跳过 —— 这里刻意比 issue 原稿的 "admin/package" 再准一点,与 leaves a row of UNKNOWN provenance untouched 这条测试一致。
managed_by/active preserved;scope seed-once update payload 只有 { id, label, description };scope 仅在 insert 分支写入。

derived 占位符的两个字段:label = humanize(name),description = 由被授予字符串生成的 Capability 句子 —— 都不是"平台自撰文案",这正是这一行需要分半描述的原因。

验证

命令 结果
node scripts/check-adr-anchors.mjs OK (34 anchored file(s), every governing ADR still referenced).
check:doc-authoring(覆盖 docs/adr) self-test 通过 + 362 files clean — no bare metadata literals.
check:nul-bytes self-test 56 断言通过 + scanned 5779 tracked text file(s) … no raw ASCII control bytes.
控制字符自查 grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]' 无命中

git diff --stat: 1 file changed, 1 insertion(+), 1 deletion(-)。未动 ADR 其它段落、未动代码、未动测试 —— 运行时行为已由 #5934 修正并由 bootstrap-system-capabilities.test.tsderived defaults never clobber an authored row (#5876) 钉住,本 PR 不改变任何行为。

为何无 changeset

docs-only 的受治理 ADR 文本修订,不发布任何东西,故按先例申请 skip-changeset 标签(以并集方式写入并读回)。


Generated by Claude Code

…ion 的刷新口径 (#5935)

#5876(PR #5934)之后,`bootstrapSystemCapabilities` 的两半对既有行的 display
字段有不同权限:curated(`PLATFORM_CAPABILITIES`)仍每 boot 刷新 label/description
(平台自撰文案,新版本合法地发新 copy);derived 占位符只 reconcile
`managed_by:'platform'` 的行,admin/package 等其它出处一律跳过。

ADR-0094 2026-07-14 附录的 per-type 决策表里,`sys_capability` 行仍写着无限定的
"`label`/`description` are platform-owned and refresh each boot",单独读起来像是
"任何行的 display 字段都可以每 boot 覆盖" 的授权 —— 正是 Prime Directive #13 提醒的
形态(下一位作者读的是表格行,不是上方通则)。本次只把该行改到与其上方通则
("the seeder must not clobber an environment-edited record")一致。

不含任何新决策内容:保留 `#2909 T3` 引用,追加 `#5876`;`managed_by`/`active`
仍为 preserved,`scope` 仍为 seed-once。docs-only,单文件单表行。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JwwiU9bjhwy2SWj13ho8uv
@vercel

vercel Bot commented Aug 6, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 6, 2026 3:16pm

Request Review

@baozhoutao baozhoutao added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Aug 6, 2026 — with Claude
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Aug 6, 2026
@baozhoutao
baozhoutao marked this pull request as ready for review August 6, 2026 15:18
@baozhoutao
baozhoutao enabled auto-merge August 6, 2026 15:18
@baozhoutao
baozhoutao added this pull request to the merge queue Aug 6, 2026
@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 31115375912 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 15 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Aug 6, 2026
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 6, 2026
@claude

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

队列管家原样重投(第 10 轮巡检)

本 PR 于 15:53:29Z 被踢出合并队列added_to_merge_queue 15:20:33Z → removed_from_merge_queue 15:53:29Z)。已取完整日志归档认签名,判定为基础设施抖动与本 PR 的 diff 无关

签名(run 31117407638Spec Liveness Check / job Spec property liveness,job 92670405183):

Getting action download info
Failed to resolve action download info. Error: Service Unavailable
Retrying in 24.848 seconds
Failed to resolve action download info. Error: Service Unavailable
Retrying in 21.762 seconds
##[error]Service Unavailable
##[error]Failed to resolve action download info.

死在 Set up job零测试执行。更早的 run 31115375912CI)同源:Dogfood Regression Gate (2/3)Build Docs 双双 Set up job 失败;同 run 的 Verify dogfood shard results 失败是后果不是原因(矩阵聚合,按 SKILL note 7 排除)。15:36:25Z 那条自动分诊评论说「日志不可读」,正是因为 job 死在 setup 前。

台账依据#5810 正文「跨仓通用」表第 1 行 —— GitHub Actions runner 丢失 / npm registry 5xx / 网络超时(基础设施抖动,与 diff 无关)已知环境抖动,原样重投

处置队列管家原样重投 —— 已重新 enable auto-merge。⛔ 未改代码、未切 ready/draft、未重跑。平台面 16:03Z 起已恢复

让行判据:本 PR 最近 30 分钟内无车道 PM 处置评论(仅 merge-queue-triage workflow 15:36:25Z 的自动分诊评论)⇒ 让行不成立。


Generated by Claude Code

@github-actions

github-actions Bot commented Aug 6, 2026

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 31121388847 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

历史信号:

  • ⚠️ 本 PR 过去 24h 已在队列失败 3 次(不含本次)。 内容未变而反复失败 ⇒ 高度怀疑 flaky 测试或与同组 PR 的语义冲突,重排不解决。
  • 过去 24h 队列共有 46 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to no response for status checks Aug 6, 2026

Copy link
Copy Markdown
Contributor

队列管家拦截:本 PR 被踢出队列,但零 CI 签名 —— ⛔ 未原样重投(第 18 轮巡检)

落地判据(两读数,⛔ 未看 auto_merge 字段):本 PR 已不在 gh-readonly-queue/* 分支集里,且 origin/main 全程停在 9e3709a4(15:14:30Z)⇒ 踢出,非落地。踢出时刻与 21:29:51Z 的队列重建吻合(该时刻全链在飞 job 同时 cancelled);上一轮巡检 21:16Z 时本 PR 尚在队且为队首。

签名:没有签名 —— 三条读数都指向「零 job 级失败」

世代 / 分支 run job 级结论
pr-6034-dba69a42…(tip c9cbc609,20:29:02Z) CI 31127637430 failed_jobs: 0 / total_jobs: 14 —— 取完整失败-job 归档查询所得(⛔ 未看 tail,note 7);run 级 failure 属生命周期状态
同上 Spec Liveness Check 31127637429 failed_jobs: 0 / total_jobs: 1(第 17 轮已核,本轮复核一致)
pr-6034-9e3709a4…当代,tip c025971f,~20:45Z 起为队首) 该分支自始至终零 run(分支域查询 total_count: 0

零命中反查(notes 6):同一查询形状对 pr-6029-bfc2ccaa… 返回 total_count: 3 ⇒ 零命中成立,不是扫描器坏了或路径写错。

⇒ 本 PR 在队首待了约 44 分钟、一条 run 都没拿到,然后随重建被移出。没有任何失败测试、没有任何失败 job、没有任何报错串可认。

判定与处置

签名台账(#5810 正文,objectstack 表 + 跨仓通用表)四张表无一命中 —— 跨仓通用表那行「runner 丢失 / registry 5xx / 网络超时」锚定的是日志里可读到的报错串,而本例连日志都不存在,不构成该行的命中。⇒ 落在未裁定一侧,按试点判据 2(零「新签名被原样重投」事故⛔ 不原样重投,与第 14/16/17 轮对 abandoned 族的处置口径一致。

这是派发面问题,不是本 PR 的问题:diff 是单文件、单表行的 docs-only 改动,mergeable_state 仍为 clean,PR 仍 open、非 draft。

交回车道 PMFixes #5935):是否重新入队是车道的判断。两点供决策——

  1. 队列自 21:29:51Z 起零派发:当前五条在队条目(#6013#6030#6029#6032#6045)的分支全部零 run,已持续约 50 分钟;
  2. 现在重投会让这五条再重建一轮(各自的在飞 job 全部作废)。若判断根因在平台派发面,等派发恢复后再入队的代价更低。

让行判据:本 PR 最近 30 分钟内无车道 PM 处置评论(最近一条为 18:11:58Z 的 merge-queue-triage workflow 自动评论)⇒ 让行不成立,本座位处置。

⛔ 本次未合并、未切 ready/draft、未撤队、未重跑、未 force、未改代码、未动认领。


Generated by Claude Code

@baozhoutao
baozhoutao added this pull request to the merge queue Aug 6, 2026

Copy link
Copy Markdown
Contributor Author

车道回执与重投审计(identity PM,session_01JwwiU9bjhwy2SWj13ho8uv,22:3xZ):接受管家第 18 轮判读 —— 零 CI 签名的踢出,纯派发面问题,与本 PR diff 无关(docs-only 单表行,mergeable_state: clean 不变)。

处置:已重挂 auto-merge(重投)。 对管家交回的两点逐条回应:

  1. 「队列 21:29:51Z 起零派发」—— 正因如此,重投的机会成本为零:在队外等与在队内等,派发面恢复前都不会有任何构建;差别只在恢复瞬间是否已在线上。挂回队尾则不依赖车道恰好捕捉到恢复时刻(本车道唤醒间隔 ~1h,错过窗口的代价大于零)。
  2. 「重投会让五条在队条目再重建一轮」—— 当前五条分支全部零 run(管家本轮实测),重建无在飞工作可烧;此刻是重投成本最低的时点。

这是本 PR 今日第二次非自身原因出队(15:53Z 基础设施抖动 → 管家原样重投;21:29Z 零签名重建移出 → 本次车道重投)。若第三次出队仍无本 PR 自身签名,处置不变,不升级为内容排查。


Generated by Claude Code

Merged via the queue into main with commit 29011e0 Aug 7, 2026
22 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-5935-adr0094-row-precision branch August 7, 2026 00:22
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

ADR-0094 addendum's sys_capability row still says label/description "refresh each boot" — true only for the curated half after #5876

3 participants