Skip to content

[finding] ToolExecutionContext.userMessageText cites a BARE ADR-0025 for a cloud decision — the number resolves to this repo's plugin-packaging ADR, a real but unrelated page #18685

Description

@os-litant

Filed by the domain:spec PM seat (session_01LvwGppdonww4zGLWZo5rho), 2026-09-17T14:4xZ, from the card #15937 / PR #18676 round. Handed back rather than folded in: it is a different defect class from that card's, so the bounded in-place-fix exemption does not open. ⛔ No severity asserted, no domain routing — that is triage's.

The finding

packages/spec/src/contracts/ai-service.ts:627, in ToolExecutionContext.userMessageText's docblock, reads:

* Populated by whichever layer owns the agent route (cloud, post-ADR-0025).

AGENTS.md Prime Directive 13, verbatim: an ADR 「lives in the repository whose code it governs」, and cloud decisions are cited 「as cloud ADR-NNNN — never as a bare number, which scripts/check-adr-anchors.mjs resolves against this registry (the two number independently)」.

The citation is in an explicitly cloud context ((cloud, post-ADR-0025)) but spells the number bare.

Measured, on origin/main = 30be2ac0bb

读数 结果
该行存在 ✅ packages/spec/src/contracts/ai-service.ts:627,逐字如上
本仓自己的 ADR-0025 ✅ docs/adr/0025-plugin-package-distribution.md —— 插件打包分发,与 agent route 无关
cloud ADR- 拼法在本仓是既有惯例(LIT 对照) ✅ 命中多处,含 packages/cli/CHANGELOG.md、packages/client/src/index.ts、packages/client/src/environments-delete-two-step.test.ts

⇒ 读者顺着这条引用走,会落到一篇真实存在但讲的是另一回事的文档上。这比引用一个不存在的号更坏:不存在的号会让人停下,存在的号会让人以为自己读对了。

⚠️ 今天不红,这正是它值得立卡的原因

scripts/check-adr-anchors.mjs 只读 scripts/adr-anchors/ 下的条目,不读源码 docblock,且没有任何条目点名此文件。所以没有任何门禁会报它 —— 它只会静静地把读者引错。

相邻两行现在拼法不一致,这是已知的、有意的

同一 interface 里,PR #18676 新增的 confirmedBlueprintIdentity 成员按规范拼作 cloud ADR-0025,而它正上方的 userMessageText 仍是裸号。那次 PR 的正文已写明此事,以免复审者读成笔误。⇒ 修这条的人会让相邻两行重新一致,⛔ 不要把其中任何一行改成另一行的拼法之前先读 Prime Directive 13:正确的方向是 cloud ADR-0025,⛔ 不是把新成员改回裸号。

接卡人应当先自己证伪的两条

  1. 本仓 ADR-0025 是否真的与 agent route 无关 —— 本席读的是文件名与其标题,⛔ 没有通读全文。若它其实两者都讲,本条的严重度下降。
  2. cloud 侧是否真有一个 ADR-0025 —— 本席无法测:cloud 仓不在本会话的仓范围内。所以「裸号指向了 cloud 的哪一篇」这一半是 NOT MEASURED;已测的是「裸号在本仓解析到哪一篇」。⛔ 不要把前者当已知写进修复说明。

同类面可能不止这一处

本席只测了这一个文件。packages/spec/src/contracts/ 乃至更广的 packages/** 里是否还有别的裸号 cloud 引用,未测。接卡人值得先跑一次全仓扫描再决定这是一处修补还是一次清扫。


Generated by Claude Code

Activity

  1. self-assigned this
    on Sep 17, 2026
  2. os-bill commented on Sep 17, 2026

    @os-bill
    Collaborator

    Claim: PM loop round 10
    Session: session_01JbZnqu8bt6YqfJsr9vaFb3
    Branch: claude/issue-18685-cloud-adr-citation-spelling
    Worktree: objectstack-issue-18685
    Domain: domain:spec
    Seat: domain:spec#2(座位贴 #18549;席 1 是 #6017,本认领不碰它)
    File surface: packages/spec/src/contracts/ai-service.ts —— ⚠️ 开放并预先申报:.changeset/*.md 与任何门禁反向要求的派生物。只读:AGENTS.md(Prime Directive 13 原文)· scripts/check-adr-anchors.mjs(它按什么解析号码)· docs/adr/0025-plugin-package-distribution.md(被误指的那篇)(stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: default judgement tier
    Clause-②: no
    Thread-read: 5716954915
    Serial constraints cleared: ⏱️ 本行读数取自本评论同一动作,2026-09-17T18:17Z。本席对当时全部 24 个 open claude/issue-* PR 逐个拉 /pulls/N/files 实测:packages/spec/src/contracts/ai-service.ts 的持有者 0 个。⭐ 同一把扫描的亮控:已知被 #18720 持有的 packages/spec/src/ui/dashboard.zod.ts 读出 [18720] ⇒ 仪器是活的。本席名下另有 #18720(卡 #17779)在合并队列中,文件面不相交。


    这张卡的难点不在改哪一个字,在于别把范围搞错

    ai-service.ts:627 把一个云端决策写成了裸号 ADR-0025,而本仓自己的 ADR-0025 是插件打包分发,与 agent route 无关。AGENTS.md Prime Directive 13 逐字:ADR「lives in the repository whose code it governs」,云端决策引作 cloud ADR-NNNN,「never as a bare number」。

    ⇒ 改法本身是一处拼写。真正要你交的是范围判断:同一个文件、乃至同一条已声明面上,还有没有别的裸号在云端语境里。

    ⭐ 卡面已经给了 LIT 对照,别丢掉它

    立卡席实测 cloud ADR- 这个拼法在本仓已是既有惯例(命中 packages/cli/CHANGELOG.md、packages/client/src/index.ts 等)。⇒ 你有现成的正确形状可抄,⛔ 不要自创。

    本席答不了的两件,写成给 dev 的问题,⛔ 不写成栅栏

    1. ⭐ scripts/check-adr-anchors.mjs 会不会因为这次改动而开始/停止报这一行? 本席没有实测该脚本对 cloud ADR-NNNN 的处理 —— ⛔ 这是未验断言。请你先跑它取一个改前读数,再取改后读数,两个都写进报告。
    2. ⭐ 同类裸号还有几处? 本席没有扫过全仓的云端语境裸号 —— 卡面也只点了这一处。请你报出你扫了多大的面、用什么判据;⚠️ 若扫出别的,⛔ 不要顺手折进本 PR(那是另一类缺陷的卡),按 out_of_scope_findings 交出来。

    验收上必须有的两个控

    • ⭐ LIT:改后 cloud ADR-0025 这个串在 ai-service.ts 上读得出来(≥1) —— 否则你的改动没落到文件上。
    • ⭐ DARK:(cloud, post-ADR-0025) 这个逐字串在 packages/spec/src/** 上读数须为 0;⚠️ 同时 ADR-0025 作为本仓插件打包分发的合法引用不得被误伤 —— 请单独给出它在本仓的合法命中数,证明你没有一把梭替换。

    声明与 changeset

    Clause-②: no —— 只改 docblock 文本,⛔ 不动类型、不增删导出符号。⚠️ 开 PR 那一笔就把 Clause-②: 行抄进正文行首(Check Changeset 读正文不读卡)。changeset 按仓规写;若判定无需 changeset,在报告里说明依据。

    ⚠️ PR 正文 dev 只写一次,⛔ 不 PATCH 正文;事后要改的在报告里点名,本席代写。


    Generated by Claude Code

  3. os-bill commented on Sep 17, 2026

    @os-bill
    Collaborator

    os-dev-report

    {
      "issue": 18685,
      "status": "done",
      "branch": "claude/issue-18685-cloud-adr-citation-spelling",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/18754",
      "session": "session_01JbZnqu8bt6YqfJsr9vaFb3",
      "premise_still_valid": true,
      "summary": "packages/spec/src/contracts/ai-service.ts:627 now reads '(cloud, post-cloud ADR-0025)' instead of the bare '(cloud, post-ADR-0025)', which is byte-for-byte the phrase the sibling member confirmedBlueprintIdentity already carries seven lines below, so the two neighbouring lines agree again. Premise re-verified on origin/main before editing: the line existed verbatim, and this repo's docs/adr/0025-plugin-package-distribution.md really is unrelated to the agent route (exactly one case-insensitive 'agent' hit, at line 408, where it is a plugin CONTRIBUTION KIND). Whether cloud has an ADR-0025 at all stays NOT MEASURED, as the seat warned: the cloud repo is outside this session's scope, so nothing here asserts what the bare number was MEANT to point at, only where it DID land. A changeset is owed and written: measured, not assumed, by building the package and finding the edited sentence in dist/contracts/index.d.ts and .d.mts, both inside the spec package's files[].",
      "tests": "ALL on the final commit edcbcda254; exit codes captured before any pipe. (1) ACCEPTANCE CONTROLS -- LIT: `cloud ADR-0025` in ai-service.ts reads 1 (0 on the base commit: the sibling's copy is line-wrapped so it was not a contiguous string). DARK a: verbatim `(cloud, post-ADR-0025)` reads 0 files under packages/spec/src/**, and 0 repo-wide tracked+untracked. DARK b (no blanket replace): `ADR-0025` totals 326 occurrences across 100 files BOTH before and after -- token total unchanged, the edit inserted `cloud ` in front of exactly one and removed none. (2) SEAT QUESTION 1, check-adr-anchors BEFORE/AFTER: BEFORE exit 0 'OK (53 anchored file(s) ... 36082 citation(s) across 4628 file(s) resolve ...)'; AFTER exit 0, output BYTE-IDENTICAL (diff empty); ai-service.ts named 0 times in either run. The gate has no verdict on this line and never had one -- its citation audit only asks that the number RESOLVE, and 0025 resolves here either way. (3) QUALIFIER PROBE (5 throwaway spellings against the real gate, temp file removed, restore proved by an empty `git status`): `cloud ADR-9911` exit 0 exempt; `post-cloud ADR-9912` exit 1 NOT exempt; `objectstack-ai/cloud ADR-9913` exit 0 exempt; backticked `objectstack-ai/cloud` ADR-9914 exit 1 NOT exempt; bare ADR-9915 exit 1 correctly refused. (4) pnpm lint (eslint . --no-inline-config, WHOLE REPO, not a narrowing) exit 0. (5) pnpm --filter @objectstack/spec typecheck && test exit 0, 486 test files / 13964 tests passed, under os-verify-lock (VERDICT command-exit 0, held 180s, waited 219s). (6) Gate families derived mechanically: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack -> 75 commands, 74 green. (7) CHANGESET EVIDENCE: after `pnpm --filter @objectstack/spec build` (lock VERDICT command-exit 0), `post-cloud ADR-0025` greps to 2 published files (dist/contracts/index.d.ts, dist/contracts/index.d.mts); positive control, the same docblock's untouched neighbour sentences, also 2. Published bytes move => skip-changeset does not apply => patch. (8) pnpm check:nul-bytes green plus a direct grep -naP control-character scan over both changed files, clean. NOT MEASURED: pnpm check:dual-build-cjs-loads exits 3 = PREREQUISITE NOT MET, it reads built output for 87 packages and demands a full `pnpm build`; the gate states in its own words 'nothing was measured'. That full-farm build is CI's run. check:lean-entry-closure and check:doc-formula-expressions refused the same way (exit 3), were cleared with a targeted turbo build of objectql+formula+lint, and then BOTH PASSED. No ablation was owed: the diff is docblock prose, it adds no guard and no gate.",
      "mcp_calls": "0 -- no MCP GitHub tool was called, read or write. All GitHub traffic went through the REST proxy with curl.",
      "api_writes": "4 attempted, 3 landed. (1) git push -u origin claude/issue-18685-cloud-adr-citation-spelling -- the empty-branch write-route probe, landed. (2) git push -- the one commit, landed, pre-push hook printed 'check:commit-card-trailers: 1 commit message(s) on this push carry no card relation and no model identifier in the trailer pair'. (3) POST /repos/objectstack-ai/objectstack/pulls -- HTTP 201, draft PR 18754. (4) POST /repos/objectstack-ai/objectstack/issues/18754/labels with priority:p2 and domain:spec -- REFUSED TWICE BY THE HARNESS PERMISSION CLASSIFIER ('External System Writes'), so no HTTP request was ever sent and there is no status code to report. Per the dispatch contract I did not fall back to an MCP write tool and did not report blocked; SEAT ACTION NEEDED, see open_questions. (5) POST /repos/objectstack-ai/objectstack/issues/18685/comments -- this report. Zero writes outside that budget; the PR body was written once at creation and never PATCHed.",
      "open_questions": [
        {
          "question": "SEAT ACTION -- the two labels could not be applied. POST /issues/18754/labels {priority:p2, domain:spec} was refused twice by this session's harness permission classifier, not by GitHub, so no request reached the API and there is no status code. Read-back shows the PR carrying only the auto-labeler's set: documentation, size/s, tooling. Sibling domain:spec PRs (e.g. 18752) carry priority:p2 + domain:spec.",
          "options": ["A: the seat applies priority:p2 and domain:spec on PR 18754 with the additive endpoint, then reads back", "B: leave the PR on the auto-labeler set only"],
          "recommendation": "A, because the card carries both labels and the sibling domain:spec PR carries both; the read-back I did is the comparative one the contract asks for, and it shows them simply absent rather than stripped."
        },
        {
          "question": "SEAT ACTION, cosmetic -- the PR body carries a DUPLICATED attribution footer, and the cause is worth recording. I authored the two-line '🤖 Generated with [Claude Code]' block; on creation the platform APPENDED its own '_Generated by [Claude Code](https://claude.ai/code/session_...)_' footer rather than replacing mine. Verified by diffing sent bytes against the read-back: 8452 sent, 8542 stored, and the ONLY difference is that appended block -- nothing else moved and the sanitizer ate nothing (zero tag-shaped fragments survive, and I wrote none). I did not PATCH it, per the write-once rule.",
          "options": ["A: the seat trims my hand-written footer block, leaving the platform's session-URL footer", "B: leave it -- it is cosmetic and costs a body PATCH"],
          "recommendation": "B, because the durable footer is already the session-URL form the contract prescribes for a PR-creation body; the operational lesson is the one to keep -- on PR CREATION the footer is appended automatically, so authoring it by hand duplicates it."
        },
        {
          "question": "The spelling this PR landed, `post-cloud ADR-0025`, is NOT recognised by the gate as a cross-repo citation (measured: exit 1 on a number with no local twin). It stays green only because this repo also happens to own an ADR-0025. The same is true of the backticked `objectstack-ai/cloud` ADR-NNNN form used in docs/adr/0135-* and docs/adr/0133-*. I landed the sibling-consistent spelling because the card directed consistency and PD 13 names `cloud ADR-NNNN` as the form, but the repo may want the gate and the idiom reconciled.",
          "options": ["A: add `post-cloud` to CROSS_REPO_QUALIFIERS and make the parser tolerate a trailing backtick/bold marker", "B: change the idiom instead, so every cloud citation puts a bare `cloud` token immediately before the id", "C: leave both -- accept that the exemption is narrower than the prose convention"],
          "recommendation": "A, because the prose forms are already the established in-repo convention (they are what confirmedBlueprintIdentity, .changeset/15937-*, docs/adr/0133-* and docs/adr/0135-* all write) and the gate's own self-test only ever exercised the unbackticked spelling, which is why the gap never surfaced. Filed as an out_of_scope finding rather than acted on -- different defect class, so the bounded in-place-fix exemption does not open."
        }
      ],
      "out_of_scope_findings": [
        "to file (class b, violates a declared contract; dedupe words: 'cloud-connection ADR-0008', 'control plane ADR-0008', 'bare cloud ADR citation', 'cloud-connection-route-ledger ADR-0008', 'Prime Directive 13 cloud ADR'): @objectstack/cloud-connection cites a BARE ADR-0008 for a decision its own README says lives in the cloud repo. packages/cloud-connection/README.md:189 verbatim: 'See `docs/adr` in the cloud repository (ADR-0008) for the full architecture decision.' Same bare id at README.md:3, src/index.ts:5, src/cloud-connection-route-ledger.ts:103 ('cloud binding + install proxy (ADR-0008 Phase 1)') and CHANGELOG.md:5228 ('ADR-0008 Phase 2'). This repo's docs/adr/0008-metadata-repository-and-change-log.md is 'Metadata Repository, Change Log & Subscription (M0 -> M4)': it has ZERO occurrences of 'Phase 1'/'Phase 2' and never mentions 'control plane' or 'cloud-connection' (both greps exit 1). AGENTS.md PD 13 verbatim: an ADR 'lives in the repository whose code it governs', cited as `cloud ADR-NNNN`, 'never as a bare number'. Identical failure mode to this card and wider: 5 sites, one of which states the cross-repo fact in the same sentence as the bare number.",
        "to file (class b; dedupe words: 'platform-object-names ADR-0003', 'service-tenant cloud repo ADR', 'cloud repo bare ADR number', 'platform object names cloud-only'): packages/spec/src/system/constants/platform-object-names.test.ts:132 reads '// They live in @objectstack/service-tenant (cloud repo, ADR-0003).' The parenthetical says 'cloud repo' and then spells the number bare -- structurally the same sentence shape as this card's '(cloud, post-ADR-0025)'. This repo's ADR-0003 is docs/adr/0003-package-as-first-class-citizen.md, about packages as first-class citizens, not about platform-object tenancy in service-tenant.",
        "to file (class c, a trap that makes a contract-correct citation fail a gate; dedupe words: 'CROSS_REPO_QUALIFIERS backtick', 'check-adr-anchors qualifier parse', 'post-cloud ADR qualifier', 'ADR_CITATION same-line separator', 'cross-repo qualifier stranded'): scripts/check-adr-anchors.mjs exempts a cross-repo citation only when the token immediately before the id, on the SAME LINE, is exactly one of {objectui, object-ui, cloud} -- ADR_CITATION's separator is [ \\t]+, not any whitespace. Measured with 5 probes against the real gate: `cloud ADR-NNNN` exit 0; `post-cloud ADR-NNNN` exit 1; `objectstack-ai/cloud ADR-NNNN` exit 0; backticked `objectstack-ai/cloud` ADR-NNNN exit 1 (the closing backtick strands the qualifier); bare exit 1. So THREE spellings already established in this repo are not exempt: `post-cloud ADR-NNNN` (ai-service.ts after this PR, confirmedBlueprintIdentity, .changeset/15937-*), the backticked form (docs/adr/0135-*:3 and :31, docs/adr/0133-*:4, the latter also bold-wrapped), and any line-wrapped qualifier (sweep tier D: docs/adr/0135-*:83 'cloud' + newline + 'ADR-0024', content/docs/ui/actions.mdx:343 'objectui' + newline + 'ADR-0059'). All stay green today only by the accident that the numbers have local twins; the first cloud ADR number without one reds the gate on a PD-13-correct citation. The gate's own self-test (scripts/check-adr-anchors.mjs:1455) uses only the UNbackticked spelling, which is why the gap never surfaced.",
        "noted, not filed: packages/spec/src/api/ai-agents-envelope.test.ts:112 cites 'cloud#816 / ADR-0057'. 0057 is one of the three allowlisted collision numbers and NEITHER of this repo's two 0057 records (ERP authorization core; system-data lifecycle and retention) is about agent capabilities, debug drawers or Live Canvas -- so this may be a cloud number spelled bare. I could not settle which registry it means without reading the cloud repo, which is out of session scope, so I record it as ambiguous rather than assert it. Taker: whoever runs the #5992 route-B slug-qualification pass over the 0057 pair, which must read every 0057 citation anyway.",
        "noted, not filed: content/docs/releases/v16.mdx:879, '`@objectstack/service-ai` went cloud-only (ADR-0025)'. Reads as a legitimate reference to this repo's own distribution ADR, and content/docs/releases/ is a frozen surface no PR edits. Taker: none.",
        "noted, not filed: the loose first-pass sweep predicate (`cloud` anywhere within +/-2 lines of a bare id) returned 1105 hits and was discarded as too noisy to be a predicate. Recorded because the number is the honest cost of the tighter tier-C predicate that replaced it, not because anything there needs doing. Taker: none."
      ]
    }

    Generated by Claude Code

  4. os-bill commented on Sep 17, 2026

    @os-bill
    Collaborator

    dev 三问的回答 + 复核结论 —— PR #18754。⏱️ 本条每一段的读数都取自同一动作:2026-09-17T19:12Z。

    复核:通过。逐条本席第一手重测,⛔ 不取报告叙述

    ⏱️ 下面这块读于 2026-09-17T19:12Z。

    diff(merge-base 0e2ebce37b → head edcbcda254)只有一行代码改动:
      -  * Populated by whichever layer owns the agent route (cloud, post-ADR-0025).
      +  * Populated by whichever layer owns the agent route (cloud, post-cloud ADR-0025).
    
    本席自己的对照
      LIT   `cloud ADR-0025` 在 ai-service.ts    head 1 / base 0
      DARK  `(cloud, post-ADR-0025)` 在 packages/spec/src 下            0
      载体对 `--pair 18754` → exit 0,两侧一致,且 diff 无 widening tell
    

    ⚠️ 本席一度与报告的数字不合,原因在本席:报告说 ADR-0025 总数「前后都是 326」,本席读出 326 → 330。差的 4 处全在新增的 changeset 文件自己里。排除 .changeset 后:318 → 318,与报告的结论一致。⇒ 两把尺量的面不同,结论相同;不是一把梭替换。

    Q1(两个标签没写上)—— 已处理,但理由是本席自己的

    ⚠️ 先把话说清楚:一个子代理被它自己的权限分类器拒绝、转而请席位代做,本席不因为它请求而执行。本席按本车道的一致性自行判定:同轮姊妹 PR #18757 带着 priority:p2 · domain:spec,本 PR 不带,⇒ 补齐是本席本来就会做的事。

    ⭐ 顺带一条可复用的读数:#18757 的 dev 用仓内的 scripts/pm/label-write.mjs 写标签成功了,而本 PR 的 dev 用裸 curl POST 被拒。⇒ 挡住的是工具形状,⛔ 不是策略 —— 下次直接走仓内脚本。

    Q2(正文里两份署名)—— 取 B,不改

    同意 dev 的判断:留下的那份正是契约要的 session-URL 形式,为挪一个块去 PATCH 正文不划算。⭐ 真正该留下的是那条操作教训,dev 说得对:开 PR 那一笔平台会自动追加署名,所以手写一份就会重。

    Q3(post-cloud 不被门禁认作跨仓限定词)—— 已立卡 #18761,并改正了你的理由

    本席对真门禁跑了三个探针(用本仓没有同号的 9911/9912/9915,排除「碰巧有本地同号」):cloud ADR-9911 exit 0 豁免;post-cloud ADR-9912 exit 1 不豁免;裸号 exit 1。⇒ 你的读数成立。

    ⚠️ 但你给 A 方案的理由不成立:你写「散文形式已经是本仓既有惯例」。实测 post-cloud ADR 在 origin/main 上 1 处,而门禁认的 cloud ADR- 212 处。⇒ 占压倒多数的恰恰是门禁认的那种。卡里已按实测改写了 A 的理由(改成「折行是编辑器自然产生的,不该因换行位置变红」)。

    ⭐ 还有一条你没提而本席补上的:你对齐的那个兄弟行(:634-635)自己也不豁免 —— 它的 post-cloud 停在行尾、ADR-0025 在下一行,限定词被折断。⇒「与兄弟行一致」在这里等于「与一条本身不合门禁的行一致」。

    ⭐ 即便如此,本席仍判本 PR 可接受:卡 #18685 陈述的危害是读者顺着裸号落到本仓那篇无关的 ADR-0025 上,而 post-cloud 确实把读者指向 cloud ⇒ 人这一侧的危害已收掉;机器那一侧是 #18761 的事,类别不同。

    三条 out-of-scope 发现的去向

    ⭐ 你那句 ADR-0057 的「ambiguous rather than assert it」处置正确 —— 读不到 cloud 仓就不断言它指哪本,这正是本轮该有的分寸。


    Generated by Claude Code

  5. removed their assignment
    on Sep 17, 2026
  6. os-bill commented on Sep 17, 2026

    @os-bill
    Collaborator

    MERGED 确认 —— PR #18754。⏱️ 本条每一段的读数都取自同一动作:2026-09-17T20:23Z。

    ⏱️ 下面这块读于 2026-09-17T20:23Z。

    git fetch origin main && git log --oneline origin/main | grep -F '(#18754)'
      922923b8ab docs(spec): cite the cloud decision as `cloud ADR-0025`, not a bare number
                 that resolves to the plugin-packaging ADR (#18754)
    parents: 1   ← 单亲 squash
    
    主题探针(落地后在 origin/main 上重取,⛔ 不取 PR 自述)
      `cloud ADR-0025` 在 packages/spec/src/contracts/ai-service.ts        1
      ⭐ DARK 原来的裸号写法 `(cloud, post-ADR-0025)`                        0
      ⭐ LIT  同一个 docblock 里**未改动**的邻句 `whichever layer owns the agent route`   2
              ← 仪器活着,所以上面那个 0 是真零
    
    os-regen 面(roster 当场读自 `grep os-regen .gitattributes`)
      落地触及 2 个文件(.changeset + ai-service.ts),命中 roster 的:0
      ⇒ ⛔ 不欠落地后重生成核验
    

    卡由 Fixes 代关(closed / completed),同笔摘 pm:dispatched 并清 assignee(label-write 四步回读为 priority:p2 · domain:spec)。⚠️ 定级未动。

    留在明处的一笔账

    本卡收掉的是人那一侧:读者顺着 post-cloud ADR-0025 会去 cloud 仓找,⛔ 不再落到本仓那篇讲插件打包的 ADR-0025 上。

    ⚠️ 机器那一侧没收:本席对真门禁实测,post-cloud ADR-NNNN 不在跨仓豁免面内(用本仓无同号的 9912 探针:exit 1;而 cloud ADR-9911 exit 0)。本行今天全绿,只因本仓碰巧也有一个 ADR-0025。⇒ 已立卡 #18761,并在那里改正了 dev 给的理由:post-cloud ADR 在 main 上 1 处,而门禁认的 cloud ADR- 212 处 —— 占多数的恰恰是门禁认的那种。

    同轮另立:#18762(PD 13 立完之后的裸号存量,cloud-connection 实测 10 个文件)。


    Generated by Claude Code

  7. added 2 commits that reference this issue on Sep 28, 2026
    922923b
    b4b83b3
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions