Repository navigation
Description
⏱️ 本卡所有读数取自同一动作:2026-09-17T19:10Z。逐条本席第一手实测;两个落点的成色不同,本卡分开写,⛔ 不打包成一个强度。
一句话
PD 13 立了规矩(「cloud 决策引作 cloud ADR-NNNN,⛔ 绝不用裸号」),而规矩立完之后,存量没有被扫过:至少两处仍在用裸号引 cloud 决策,其中一处在同一句话里说明了「这篇 ADR 在 cloud 仓」却仍把号写成裸的。
落点一:@objectstack/cloud-connection 的 ADR-0008 —— 成色强
⏱️ 下面这块读于 2026-09-17T19:10Z。
origin/main 上 packages/cloud-connection 内命中 ADR-0008 的文件:10 个,含
README.md:3 「The runtime-side client for an ObjectStack cloud control plane (ADR-0008).」
README.md:189 「See `docs/adr` in the cloud repository (ADR-0008) for the full architecture …」
⭐ 同一句里既说「在 cloud 仓」又把号写成裸的
src/cloud-connection-plugin.ts:5 「control plane (ADR-0008 Phase 1).」
src/cloud-connection-plugin.ts:21 「`objectstack-ai/cloud` repo, never in this one). ADR-0008 Phase 1」
package.json:5 「Open mechanism (ADR-0008): the hub service, plan policy … stay server-side.」
而本仓自己的 ADR-0008 是:
docs/adr/0008-metadata-repository-and-change-log.md
「# ADR-0008: Metadata Repository, Change Log & Subscription (M0 → M4)」
'Phase 1'/'Phase 2' 0 处
'control plane' 0 处
'cloud-connection' 0 处
⭐ LIT 同一把 grep 找该文确实有的词 'change log' → 13 处 ⇒ 仪器活着,上面三个 0 是真零
⇒ 裸号解析到本仓 ADR-0008,而那篇一个字都没讲 control plane / cloud-connection / Phase 1-2。⭐ 这是卡 #18685 的同型,而且更宽(10 个文件),并且其中一处自己就写明了跨仓事实。
落点二:platform-object-names.test.ts 的 ADR-0003 —— 成色弱一些,照实写
⏱️ 下面这块读于 2026-09-17T19:10Z。
packages/spec/src/system/constants/platform-object-names.test.ts:132
「// They live in @objectstack/service-tenant (cloud repo, ADR-0003). If one」
⇒ 句式与 #18685 那条同形:括号里说「cloud repo」,号却是裸的。
本仓自己的 ADR-0003:docs/adr/0003-package-as-first-class-citizen.md
「# ADR-0003: Package as First-Class Citizen with Versioned Releases」
'platform object' 0 处
⚠️ 'service-tenant' 3 处 ← ⭐ 本席改正 dev 的说法:它**并非完全无关**
⭐ LIT 'package' → 52 处
为什么这是存量未扫,⛔ 不是新规矩
- AGENTS.md: record the ADR-registry rule — a decision lives where the code it governs lives; cloud records are cited as
cloud ADR-NNNN, never bare; a cloud decision whose mechanism half governs open code gets a local ADR with Provenance (the 0079 shape) #14509(closed)把 PD 13 写进AGENTS.md。 - [Decision] Where does a decision that governs OPEN code live? — cloud (private) ADRs are cited from this public repo in 60 files with a qualifier and ~110 more times bare, squatting on unrelated local numbers (0024 · 0071 · 0081); mirror them here, or qualify only #14496(closed,协调节点)当时就量过这个群体:「cited from this public repo in 60 files with a qualifier and ~110 more times bare」,四张子卡全部 closed,节点于 2026-09-11 关闭。
⇒ 规矩立了、镜像 ADR 建了、协调节点关了,而裸号仍在。⭐ 这正是本卡要说的:那棵树处置的是政策,⛔ 不是存量,而存量没有留下一张承接卡。
建议(⛔ 非裁定)
- A —— 一次扫净:按 PD 13 把这些改成
cloud ADR-NNNN。⚠️ 先读 [finding] check-adr-anchors 的跨仓豁免只认「紧挨编号、同一行」的cloud/objectui—— 本仓在用的post-cloud ADR-NNNN、反引号包裹形、以及**折行**的限定词全都不豁免,今天全绿只因这些编号碰巧在本仓有同号 #18761:门禁的豁免面比散文惯例窄,改成什么拼法才既对又绿,取决于那张卡怎么裁。 - B —— 只修「同一句话里已说明跨仓」的那几处(本卡落点一的 README:189、plugin.ts:21),其余留给下一次。
- C —— 先补一张承接卡把 [Decision] Where does a decision that governs OPEN code live? — cloud (private) ADRs are cited from this public repo in 60 files with a qualifier and ~110 more times bare, squatting on unrelated local numbers (0024 · 0071 · 0081); mirror them here, or qualify only #14496 未扫的存量接住,再排期。
ai-service.ts 一行,已在 PR #18754 里收掉)。
查重(MCP search_issues,含 closed)
#14496 / #14509 / #9072 / #14361 / #16927 逐个读过态:都已 closed,分别是协调节点、规则落地、某编号归属、ADR-0071 误指、ADR-0064 误指。⇒ 无孪生:没有一张在管「PD 13 立完之后仍在的裸号存量」。
出处
domain:spec seat 2(座位贴 #18549)复核 PR #18754 / 卡 #18685 时,dev 在 out_of_scope_findings 里交出两条。本席逐条重测:落点一比它说的更宽(10 个文件),落点二比它说的弱(已降级并说明)。
Generated by Claude Code
Activity
os-bill commentedon Sep 18, 2026
Claim: PM loop round 45
Session:
session_01JbZnqu8bt6YqfJsr9vaFb3Branch:
claude/issue-18762-bare-cloud-adr-citationsWorktree:
objectstack-issue-18762Domain:
domain:specSeat:
domain:spec#2File surface:
packages/cloud-connection/**·packages/spec/src/system/constants/platform-object-names.test.ts(stop on breach; explain in the report)Container & model:
M,mode:subagentClause-②: no
Thread-read: none
Serial constraints cleared: 逐 PR 拉
files重建的占用表(32 个开着的 PR / 371 行文件行;亮控:同表点出 #19107 持有 2 个文件)读到packages/cloud-connection/下 0 个在飞写者,platform-object-names.test.ts亦 FREE。认领前的完整读(取数时刻 2026-09-18T20:05Z)
本卡
state=open· labelspm:queue,domain:spec,priority:p3· assignees 为空 · 评论 0 条 ⇒Thread-read: none,⛔ 无他席认领。⭐ 卡面的头号读数我第一手复核过,而且是打印名字而不是计数(取数时刻 2026-09-18T20:05Z,
origin/main):packages/cloud-connection下命中ADR-0008的文件恰是 10 个 ——CHANGELOG.md·README.md·package.json·src/cloud-connection-plugin.test.ts·src/cloud-connection-plugin.ts·src/cloud-connection-route-ledger.ts·src/cloud-connection-ui.ts·src/connection-credential-store.test.ts·src/connection-credential-store.ts·src/index.ts亮控:同一把 grep 找该包必有的词
cloud→ 32 个文件 ⇒ 仪器活着,那 10 个是读数。派发时给施工席的围栏
CHANGELOG.md—— 已发布的变更记录是历史,⛔ 不要改写它。要么把它明确排除并写明理由,要么停下报回;⛔ 不要默默一起扫掉。⛔ 不碰 PD-14 受管面:⚠️ 卡面引用了
docs/adr/**·.claude/**·skills/**·AGENTS.md·CLAUDE.md。docs/adr/0008-…md与docs/adr/0003-…md作为证据(证明裸号解析到本仓那两篇、而它们一个字都没讲相关内容)—— 那是读,不是落点。若你判断修法必须动docs/adr/**,停下报回:那里的落地是保留的,需要GOVERNED_APPROVERS。卡面自己把两个落点的成色分开写了(落点一「强」/ 落点二「弱一些」),并明说 ⛔ 不打包成一个强度。⇒ 保持这个分开,⛔ 不要在报告里把两者说成同一个把握。
先重取再动手:卡面所有读数标的是 2026-09-17T19:10Z,已过去一天多。逐条重取,凡是数目打印路径或行,⛔ 不要⚠️ 本席今天在三个不同判据上各栽过一次同类坑(注释冒充声明、探针够不到槽位、单行正则够不到多行声明),三次都是靠打印才发现的。
grep -c—— 本卡问的就是「哪些地方写了裸号」,范围本身就是被问的东西,计数不是读数。Clause-②=no:改的是引用写法/散文,不动接受集、不扩大公开面。若发现说真话必须动 schema 或接受面,停下报回。本仓有同型先例 [finding]
ToolExecutionContext.userMessageTextcites a BAREADR-0025for a cloud decision — the number resolves to this repo's plugin-packaging ADR, a real but unrelated page #18685,卡面点了名。⇒ 先读它,把落笔的写法与它对齐,⛔ 不要另发明一套。Generated by Claude Code
os-bill commentedon Sep 18, 2026
os-dev-report
{ "issue": 18762, "status": "done", "branch": "claude/issue-18762-bare-cloud-adr-citations", "pr": "https://github.com/objectstack-ai/objectstack/pull/19119", "session": "session_01JbZnqu8bt6YqfJsr9vaFb3", "premise_still_valid": true, "summary": "Swept the bare cloud-ADR citations on the dispatched file surface: 19 citations now carry the `cloud` qualifier adjacent to the id, on the same line, with surrounding prose byte-identical — the spelling PR #18754 landed for card #18685 and the only form `scripts/check-adr-anchors.mjs` recognises (CROSS_REPO_QUALIFIERS = objectui | object-ui | cloud, matched as the token immediately before the id). Site one (card grade 成色强): 11 bare `ADR-0008` rows in 6 files under packages/cloud-connection. Site two (card grade 成色弱一些, kept separate throughout): the single row packages/spec/src/system/constants/platform-object-names.test.ts:132. A third group, declared rather than folded in silently, under the bounded in-place-fix exemption: 6 bare `ADR-0007`/`ADR-0009` rows in the same package, same defect class, same gate family, zero open PRs holding those files. packages/cloud-connection/CHANGELOG.md:5228 is deliberately excluded and stays bare. Changeset: `@objectstack/cloud-connection` patch (the package publishes dist + README.md, and the built dist/index.d.ts carries the new spelling — measured). Nothing under docs/adr/** or any other PD-14 governed surface was edited; those records were read only, as evidence. The assignee field was already set to os-bill by the dispatch and was not written by me.", "tests": "All readings at f14281a519 unless stated. BUILD: `pnpm --workspace-concurrency=2 --filter \"@objectstack/cloud-connection...\" build` under scripts/pm/os-verify-lock.sh -> `os-verify-lock: VERDICT command-exit 0 . held the lock 387s`. TESTS: `pnpm --filter @objectstack/cloud-connection exec vitest run --maxWorkers=2` -> `Test Files 29 passed (29) / Tests 374 passed (374)`, CC_TEST_EXIT=0. `pnpm --filter @objectstack/spec exec vitest run --project repo --maxWorkers=2 src/system/constants/platform-object-names.test.ts` -> `Test Files 1 passed (1) / Tests 10 passed (10)`, VERDICT command-exit 0. NOT MEASURED (recorded, not counted as a pass): the first spec attempt used `--project local` and the repo's own guard printed `!! FILTER SELECTED NOTHING - 1 of the 1 path(s) you named will run no tests ... lives in the `repo` project`; that run measured nothing and was re-run in the right project. TYPECHECK: `pnpm --filter @objectstack/spec typecheck` -> VERDICT command-exit 0 (`check:test-typecheck: OK - @objectstack/spec's test layer compiles`). @objectstack/cloud-connection declares no `typecheck` script, so there is none to run for it. GATES: the 91 families `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` derives for this change set were all run, each exit code captured before any pipe, and reconciled back with `--ran` -> `91 derived families accounted for - 90 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)`. The one NOT MEASURED is `pnpm check:dual-build-cjs-loads`, exit 3, `PREREQUISITE NOT MET - this gate reads built output, and some package has no dist/ ... This is NOT a pass: nothing was measured` - it needs a whole-repo build, which is CI's run. THREE GATES OUTSIDE THE DERIVATION, run because this diff implicates them, all exit 0: `pnpm check:adr-anchors`, `pnpm check:published-readme-exports` (README edit), `pnpm check:route-ledger-census` (route-ledger edit). BEFORE/AFTER CONTROL on the citation gate, from a throwaway worktree at BASE 07c6f822ed: before = `36548 citation(s) across 4698 file(s) resolve`, after = `36556 citation(s) across 4699 file(s) resolve`, exit 0 both times. The +8/+1 delta is fully accounted for by this PR's changeset file, whose 8 citations the same parser prints - i.e. the sweep moved citations between spellings without adding or dropping one. LINT, narrowed and declared: `eslint --no-inline-config --no-warn-ignored --format json` over all 10 changed paths, exit 0, 0 errors / 0 warnings. (1) population read from eslint's own resolution, not guessed: it linted 7 of the 10; the 3 it left out are two .md files and a .json, outside the config's files: ['**/*.{ts,tsx,mts,cts,js,jsx,mjs,cjs}'] glob. (2) file count read from the --format json result array length = 7. (3) invariance: eslint.config.mjs states in its own words that this repo 'runs one eslint.config.mjs, which never enables type-aware linting (no parserOptions.project, no typed @typescript-eslint rules) for ANY file, test or not', so a comment-text edit inside those 7 files cannot move an untouched file's verdict. Repo-wide `pnpm lint` stays CI's. CONTROL BYTES: `pnpm check:nul-bytes` exit 0, plus a direct grep -naP over every changed path for the non-NUL control range: no hits. PUBLISHED-SURFACE PROBE (why a changeset and not skip-changeset): files[] = [dist, README.md, CHANGELOG.md]; after the build, dist/index.d.ts prints `cloud ADR-0008` at 4 sites and `cloud ADR-0009`, and no bare ADR-0008 remains in it; the npm description and README.md carry the new spelling. Positive control in the same grep: `ConnectionCredentialStore` is present in dist/index.d.ts. PAIRING: `node scripts/pm/check-clause2-carriers.mjs --pair 19119` exit 0 - `pair.1.claim.clause2-line: DECLARED `no``, `pair.1.pr-body.clause2-line: DECLARED `no``, derivation `closing-keyword` via `Fixes #18762`. ABLATION: none run and none owed - this PR adds no guard, gate or assertion whose ability to fail needs proving; it is citation spelling and prose only. The equivalent evidence is the before/after citation-gate control above. PR BODY READ-BACK: fetched after the create write and diffed against what was sent - byte-identical except one trailing newline the platform trims; exactly one footer, in the session-URL form.", "rederived_hits": { "method": "re-derived on origin/main = 07c6f822ed with the gate's own parser (ADR_CITATION + CROSS_REPO_QUALIFIERS lifted from scripts/check-adr-anchors.mjs), printing file:line per citation row. Never grep -c: the card is a question about where a spelling occurs, so the scope is the subject and a count is not a reading. Lit control: the same instrument prints the already-compliant rows too, so the BARE rows are a reading and not an empty grep.", "site_one": { "subject": "bare ADR-0008 in packages/cloud-connection", "card_grade_verbatim": "成色强", "my_confidence": "high, and independently re-derived. Bare ADR-0008 resolves here to docs/adr/0008-metadata-repository-and-change-log.md (Metadata Repository, Change Log & Subscription), in which 'control plane', 'cloud-connection' and 'Phase 1'/'Phase 2' each print ZERO lines while the lit control 'change log' prints many. Three files in the same package already spelled it `cloud ADR-0008`, which is the convention asserting itself from inside the package.", "files_naming_ADR_0008": 10, "citation_rows": 17, "already_qualified_rows": [ "CHANGELOG.md:5229", "src/cloud-connection-ui.ts:8", "src/connection-credential-store.ts:5", "src/connection-credential-store.test.ts:5" ], "bare_rows_excluded": [ "CHANGELOG.md:5228" ], "bare_rows_fixed": [ "README.md:3", "README.md:189", "package.json:5", "src/cloud-connection-plugin.test.ts:4", "src/cloud-connection-plugin.ts:5", "src/cloud-connection-plugin.ts:21", "src/cloud-connection-plugin.ts:24", "src/cloud-connection-plugin.ts:54", "src/cloud-connection-route-ledger.ts:103", "src/cloud-connection-route-ledger.ts:128", "src/index.ts:5", "src/index.ts:77" ], "starred_row": "README.md:189 - the row that said 'in the cloud repository' and wrote the number bare in the same sentence; it now reads (cloud ADR-0008)." }, "site_two": { "subject": "bare ADR-0003 in packages/spec/src/system/constants/platform-object-names.test.ts", "card_grade_verbatim": "成色弱一些", "my_confidence": "weaker, and kept weaker - NOT packaged with site one. One row only: line 132, '// They live in @objectstack/service-tenant (cloud repo, ADR-0003). If one'. Re-measured in docs/adr/0003-package-as-first-class-citizen.md: 'platform object' prints ZERO lines, but 'service-tenant' prints THREE (lines 7, 193, 194), so the card's own downgrade of its dev ('并非完全无关') holds and I did not restore the stronger wording. What makes the citation still wrong is narrower and printable: line 194 records that packages/services/service-tenant/ LEFT this repository for objectstack-ai/cloud in 473fce590, and the record's subject is packages and versioned releases. Lit control: 'package' prints many lines.", "bare_rows_fixed": [ "packages/spec/src/system/constants/platform-object-names.test.ts:132" ], "checked_and_left_alone": "line 202 of the same file cites a bare ADR-0007 and it is CORRECT - the comment says 'this repo's governed records' and docs/adr/0007-settings-manifest-and-kv-store.md really does carry an inventory table whose rows read '✅ exists' (printed). Left byte-identical. Measuring this is what stopped a false positive." }, "group_three_declared_separately": { "subject": "bare ADR-0007 / ADR-0009 in the same package - NOT on the card's face", "route": "bounded in-place-fix exemption, all four conditions checked and named in the PR body: same defect class, mechanical fix whose form is already pinned, no other claim holds the files (the dispatch measured zero open PRs under packages/cloud-connection/), same gate family with no new verification surface.", "my_confidence": "high, on tree evidence rather than judgement. src/index.ts:39 said '// ADR-0007 step ⑤ - the local desired-state ledger' while src/local-manifest-source.ts:5 - the file implementing that ledger - said '(cloud ADR-0007 step ⑤)': one citation, two spellings, same subject. This repo's own docs/adr/0003 status line names 'revised by cloud ADR-0007 (2026-06-12)' and describes exactly the LocalManifestSource ledger. src/marketplace-ui.ts carried both spellings inside ONE file (cloud ADR-0009 on line 4, bare on 16 and 43) and CHANGELOG.md:5230 spells the very same 'P2a' token qualified.", "bare_rows_fixed": [ "src/cloud-connection-plugin.ts:591", "src/cloud-connection-plugin.ts:631", "src/index.ts:39", "src/marketplace-install-local-plugin.ts:178", "src/marketplace-ui.ts:16", "src/marketplace-ui.ts:43" ] } }, "changelog_disposition": "packages/cloud-connection/CHANGELOG.md:5228 is EXCLUDED and still cites ADR-0008 bare. It is the only bare cloud citation left in the package, and it is left on purpose, stated in the PR body and in the changeset. Why: AGENTS.md routes packages/*/CHANGELOG.md as RELEASE-OWNED - '❌ Never edit in a code PR - `changeset version` compiles it from `.changeset/*.md` and it ships inside the npm tarball as the text an upgrading agent greps'; a factual error in a released entry is amended 'in a dedicated docs-only PR, ⛔ never an erratum in a later entry and never a rider on code changes'. The same-class precedent did the same and recorded it: 'Historical archives - the six package CHANGELOGs - are deliberately untouched.' Not swept in quietly, and not a reason to stop and hand back, because the dispatch offered exactly these two options and excluding-with-a-stated-reason is the first of them.", "convention_from_18685": { "landed_in": "PR #18754, changeset .changeset/18685-cloud-adr-citation-spelling.md", "quote": "AGENTS.md Prime Directive 13 is explicit - an ADR \"lives in the repository whose code it governs\", and a cloud decision is cited as `cloud ADR-NNNN`, \"never as a bare number\".", "what_it_did_mechanically": "the docblock read `(cloud, post-ADR-0025)` and became `(cloud, post-cloud ADR-0025)` - the qualifier inserted adjacent to the id, surrounding prose otherwise byte-identical. I aligned with that and invented nothing: a bare `cloud` token immediately before the number, same line, no prose rewrite, even where it reads slightly repetitively ('in the cloud repository (cloud ADR-0008)', '(cloud repo, cloud ADR-0003)').", "why_the_plain_form_and_not_post-cloud": "card #18761 (open) measured against the real gate that `post-cloud ADR-NNNN` exits 1 - NOT exempt - while `cloud ADR-NNNN` exits 0. I re-read the gate source and it holds: ADR_CITATION captures one token of [A-Za-z0-9_./-]+ separated from the id by spaces or tabs only, and CROSS_REPO_QUALIFIERS is exactly {objectui, object-ui, cloud}, so `post-cloud`, a backtick-wrapped qualifier and a line-wrapped one are all unexempt. Every spelling this PR lands is inside the recognised form; nothing here widens that set." }, "card_claims_that_changed_on_rederivation": [ "REFINED, not false - the card's headline '10 个文件里裸引 ADR-0008' is right at FILE granularity and I reproduced the exact ten names, but it is not the defect surface: 3 of those 10 files (cloud-connection-ui.ts, connection-credential-store.ts, connection-credential-store.test.ts) ALREADY spell it `cloud ADR-0008`, and CHANGELOG.md carries one bare row and one qualified row. Per citation row: 17 rows, 5 qualified, 12 bare; the bare rows sit in 7 files, and after excluding CHANGELOG.md the surface actually swept is 11 rows in 6 files. Anyone costing this card off '10 files' would be costing the wrong number in both directions.", "CONFIRMED - the card's own downgrade of site two. docs/adr/0003 really does name service-tenant three times, so 'completely unrelated' would have been overstated; I did not restore it. 'platform object' is genuinely zero lines, with a live lit control.", "CONFIRMED - the dispatch's ten-file list, the lit control (32 files matching 'cloud' in the package), and 'zero open PRs touch packages/cloud-connection/' (nothing in the tree contradicted it and the branch pushed, the PR opened and the gates ran with no contention on those files).", "INCOMPLETE, not false - the card scoped itself to ADR-0008 and ADR-0003, but the same package carries 6 more bare rows of the SAME defect class on ADR-0007 and ADR-0009, two of them in a file that already spells the number correctly twelve lines earlier. Sweeping ADR-0008 alone would have left marketplace-ui.ts and index.ts internally inconsistent in exactly the way the precedent card complained about, so they went in under the bounded in-place-fix exemption, declared in the PR body rather than folded in silently.", "NOT MEASURED, as the precedent also recorded - which record `cloud ADR-0008` / `cloud ADR-0003` / `cloud ADR-0007` / `cloud ADR-0009` name inside objectstack-ai/cloud was NOT read; that repository is outside this session's scope. What is measured is where the bare number lands HERE. ⛔ Do not read the fix as asserting the cloud-side record exists." ], "mcp_calls": "0 - no MCP GitHub tool was called, read or write; every GitHub read and write went through the REST proxy with curl and GITHUB_TOKEN", "api_writes": "2 REST writes - POST /repos/objectstack-ai/objectstack/pulls (draft PR 19119, HTTP 201); POST /repos/objectstack-ai/objectstack/issues/18762/comments (this report). No POST /issues/19119/labels write was spent: the one dev-owned label in this repo is `skip-changeset`, which would be wrong here (the PR publishes and ships a patch changeset), and `needs:contract-review` belongs to the seat and does not apply at Clause-② = no. PR 19119 carries no labels as of the read-back. A 3rd REST write followed: PATCH /repos/objectstack-ai/objectstack/issues/comments/5735988770, to fold the four items the dispatch asked for by name (per-site hit list, CHANGELOG disposition, the quoted convention, what changed on re-derivation) into the report comment itself instead of leaving them only in the PR body. Separately, 3 git pushes: the empty-branch write-route probe, the WIP commit, and the final push.", "open_questions": [], "out_of_scope_findings": [ "noted, not filed: every OTHER bare ADR-NNNN still in packages/cloud-connection resolves to a record this repo really owns - ADR-0112, ADR-0120, ADR-0066, ADR-0104, ADR-0105, ADR-0093, ADR-0029, ADR-0036, ADR-0006, ADR-0005. None of them has a cloud-qualified sibling anywhere in the package, which is the evidence used to identify a cloud number here; with no such evidence there is no basis to re-point them. Carrier: whoever next touches these files.", "noted, not filed: the sweep is package-scoped by dispatch, so the repo-wide stock card #14496 measured ('60 files with a qualifier and ~110 more times bare') is still unswept and still has no carrier card. Carrier: none - #18762 says exactly this in its own words, and its options A/B/C were explicitly 非裁定, so choosing a repo-wide sweep is the maintainer's call, not this PR's. Flagging it here rather than filing a second card on top of the one that already says it.", "noted, not filed: packages/cloud-connection declares no `typecheck` script at all, so `pnpm --filter @objectstack/cloud-connection typecheck` has nothing to run. That is a ledger entry under check:type-check-coverage / check:type-check-debt, both of which ran green in this PR's gate sweep, so it is a measured state of the ratchet rather than a defect - recording it only because it is why this report carries no cloud-connection typecheck line.", "already filed, not re-filed (class b, violates a declared contract): check-adr-anchors' exemption face is narrower than this repo's prose habits and its self-test never exercises the spellings it misses - that is open card #18761, which #18762 itself told the implementer to read first. Named here only so this PR's choice of the plain `cloud ADR-NNNN` form is traceable to it: the alternatives (`post-cloud ADR-NNNN`, backtick-wrapped, line-wrapped qualifier) are all measured NOT exempt. Dedupe words: check-adr-anchors, CROSS_REPO_QUALIFIERS, cross-repo qualifier, self-test, line-wrapped qualifier." ] }Generated by Claude Code
os-bill commentedon Sep 18, 2026
PM 复核 — 卡 #18762 / PR #19119
结论:接受。 取数时刻 2026-09-18T20:55Z;判读 head
f14281a5194eb778eaee7d873e47a288a66c92b5,origin/main=0f1cd83cbf42194bc2543002a94315c3b8c2523e。1. 两条硬栅栏都守住了 —— 机械核过
CHANGELOG.md(已发布的变更记录是历史):对 PR 的 10 个文件实测,CHANGELOG 编辑数 = 0。施工席把CHANGELOG.md:5228明确排除并写明理由(AGENTS.md 把packages/*/CHANGELOG.md判为 RELEASE-OWNED,勘误要走专门的 docs-only PR),⇒ 这正是我派发词给的两个选项里的第一个。docs/adr/0008-…md与0003-…md只被读作证据。2. ⭐ 它对我的派发词提了一条更正,我复核后接受 —— 但要把话说准
我在派发词里写:「
packages/cloud-connection下命中ADR-0008的文件恰是 10 个」并把那十个名字列了出来。施工席指出:那个数在文件粒度上是对的,但文件粒度不是缺陷面。我在
origin/main上按行重取,并把每一行打印出来分类:⇒ 我的 10 没错,但它答的是「哪些文件提到这个号」,⛔ 不是「哪些行要改」。 十个文件里有 3 个早就写成
cloud ADR-0008,CHANGELOG 一行合规一行不合规。按它的话:「任何拿 10 去估这张卡成本的人,两个方向都会估错。」这条我接受,而且这是我该在派发词里自己说清的。already_qualified_rows恰是 4 条、bare_rows_fixed(12)+bare_rows_excluded(1)= 13 条 —— 与我重取的 4 / 13 逐字一致。⇒ 名单对,句子两个方向各差一。 ⭐ 顺带确认一个容易误判的行:cloud-connection-route-ledger.ts:103里有cloud这个词,但它不在号的紧前(cloud binding + install proxy (ADR-0008),按闸门CROSS_REPO_QUALIFIERS的「紧邻前一个 token」判据仍是裸的 —— 施工席也是这么判的。3. 「第三组」用的是有界就地修豁免,四条我逐条对着章程核了
它把同包内 6 处裸引
ADR-0007/ADR-0009一并扫了,⛔ 不是偷偷夹带,而是在 PR 正文里点名并附证据。我去origin/main读了.claude/agents/os-dev.md:62-64的四条:packages/cloud-connection/下 0 个在飞 PRcheck:adr-anchors另欠两样:认领申报的文件面同轮增补 —— 我的认领写的是
packages/cloud-connection/**,第三组六行全在该包src/**下,本就在已申报面内,⇒ 无需增补;PR 正文点名并附证据 —— 已做。⭐ 它给的理由比「同类顺手」结实:
src/marketplace-ui.ts同一个文件里第 4 行写cloud ADR-0009、第 16 与 43 行写裸号;src/index.ts:39写裸ADR-0007而实现那个 ledger 的src/local-manifest-source.ts:5写cloud ADR-0007。⇒ 只扫 ADR-0008 会留下文件内部自相矛盾,正是先例卡抱怨的那件事。4. 它挡下了一个假阳性,值得记
同一个 spec 测试文件
:202引的是裸ADR-0007,而施工席量过之后放着没动:那条注释说的是「this repo's governed records」,而本仓docs/adr/0007-…md确实有一张✅ exists的清单表。⇒ 那条裸号是对的。 ⭐ 一次「量了才没改」比十次「改对了」更能说明这轮的成色。同理它把站点二的把握保持在弱:
docs/adr/0003里service-tenant真的出现 3 次(行 7 / 193 / 194),所以卡面自己对施工席那句「并非完全无关」的降级成立,它⛔ 没有把更强的措辞恢复回去。5. changeset 与
Clause-②⛔ 不是
skip-changeset,而是@objectstack/cloud-connectionpatch —— 依据是量出来的:该包files[]=[dist, README.md, CHANGELOG.md],构建后dist/index.d.ts里打印出cloud ADR-0008四处且不再有裸的,README 与 npm description 也带新拼写。⇒ 这段字是发运的。Clause-②=no,--pair 19119exit 0。6. 处置
CI 收敛后按常规布防。两条 out-of-scope 我同意都不立卡:同包其余裸号解析到本仓真正拥有的记录(无 cloud 限定的兄弟行可作证据,⇒ 无据可改),以及仓级存量(#14496 已载,且 #18762 自己写明那是维护者的选择,⛔ 不在本 PR 里替它选)。
Generated by Claude Code
fix(cloud-connection,spec): cite the cloud control-plane decisions as…