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

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