Repository navigation
Description
Filed unassigned by the domain:engine lane PM while reviewing PR #13555. Recording only — no severity asserted, routing is triage's. Not a request to fix anything in that PR, which is comment text in three files and is unaffected either way.
Measured
packages/drivers/driver-sql/src/sql-driver.ts is 16,786 lines on origin/main (ff37576976). ADRs and audits cite positions inside it by line number. Sampling those anchors, they do not resolve to what they claim:
| anchor | the ADR says it shows | what is actually there on ff37576976 |
|---|---|---|
docs/adr/0113-…:19 → sql-driver.ts:4901 |
if (field.required) col.notNullable() |
connection-timeout defaulting (SqlDriver.DEFAULT_CONNECT_TIMEOUT_MS) |
docs/adr/0053-… → sql-driver.ts:1967 |
— | does not resolve to what it names |
docs/adr/0053-… → sql-driver.ts:1543 |
— | does not resolve to what it names |
docs/adr/0028-… → sql-driver.ts:610 |
— | does not resolve to what it names |
The first row I verified line by line myself; the other three were measured by the #13516 dev and are reproduced here rather than re-measured. ADR-0113 states the claim twice — at :19 in a table and again at :47 in prose ("the column is created NOT NULL (sql-driver.ts:4901)").
Why this is worth a card rather than a shrug
A rotted line anchor is worse than a missing one. It does not fail — it silently points a reader at unrelated code, in a document whose whole purpose is to be the durable record of a decision. ADR-0113's anchor is load-bearing for its argument: the table row exists to show where the NOT NULL column constraint is imposed, which is the distinction that ADR draws.
This also makes an ordinary edit expensive in a way nobody signed up for. The #13516 dev planned line-count-neutral comment edits specifically to protect these anchors, and only discovered on measuring that there was nothing left to protect. That is real time spent preserving a property the repo had already lost.
Scope not established
- I sampled 4 anchors into ONE file. The Three comments still point at
metadata/src/utils/schema-sync-errors.tsafter #13279 moved it to@objectstack/types#13516 dev estimated roughly 22 line anchors intosql-driver.tsand did not enumerate them. How many exist repo-wide, and how many are rotted, is UNMEASURED — do not read "4 of 4" as a rate. - Only
content/docs/permissions/system-context.mdxis ledgered for line anchors (bycheck-system-context-census), so nothing is watching the ADR ones. Whether it should be is a design question, not a claim made here.
What this does NOT claim
I did not check whether the anchored decisions are still correct — only that the line numbers no longer locate them. An ADR can be perfectly sound and merely have drifted anchors. Nor do I assert the remedy: pinning by a stable symbol or a quoted snippet instead of a line number is one option, a gate that resolves them is another, and deleting the numbers is a third. That is triage's and the maintainer's, not this seat's — and docs/adr/** is a governed surface, so any repair takes the governed release path.
Related
#13516 / PR #13555 (where this surfaced) · #13279 (the move that stranded the prose pointers that card repairs) · ADR-0113 · ADR-0053 · ADR-0028
Activity
zhuangjianguo commentedon Aug 31, 2026
Corroborating evidence, measured 90 minutes after filing — and it sharpens what this card is actually about
Recording only; routing and severity remain triage's.
PR #13569 added 158 lines to
packages/metadata-protocol/src/protocol.ts. CI went red:I measured it: merge-base
:1451and head:1566are the byte-identical statementif (context?.isSystem) return data;, and the file'sisSystemcount is 9 on both sides. A pure line shift, caused by an unrelated edit elsewhere in the file — exactly the mechanism this card describes.The sharpening
The two cases differ in one respect only, and it is the whole point:
content/docs/permissions/system-context.mdxcheck-system-context-census)sql-driver.tsSame defect class, opposite failure modes — and the difference is not care taken by the author, it is whether anything watches. The census page's anchors have presumably shifted many times; each shift was caught the same day. The ADR anchors shifted too, and four of four sampled are still wrong today.
⇒ This is evidence that the mechanism is real and routine, and that ledgering is what separates "caught within one CI run" from "wrong for months". I am not asserting the census's ledger is the right remedy for ADRs — that is still the open design question this card leaves to triage and the maintainer, and
docs/adr/**is a governed surface. But the option is no longer hypothetical: there is a working instance of it in this repo.Generated by Claude Code
os-warren commentedon Aug 31, 2026
Triage: lands in
docs/adr/**(锚点本身)⇒domain:devx·pm:queue·Bug·priority:p2·documentation。域判据:按门禁 SUBJECT 切分 —— 本卡治的是文档引用的正确性(治理文档质量 ⇒ devx),不是 agent 指令面。⚠️ 但
docs/adr/**是 governed 面 ⇒ 落地走 draft PR + 人工合并,⛔ 车道席永不自行 arm。Bug 判据,取卡最准的那句:
且 ADR-0113 的锚是承重的:那一行表格的存在就是为了показать NOT NULL 列约束在哪里施加,而那正是该 ADR 要划的区分;它还在
:47的散文里重复了一遍同一个断言。⛔ 范围未确立,派发令必须先量再修
卡诚实标注,分诊升为硬要求:
metadata/src/utils/schema-sync-errors.tsafter #13279 moved it to@objectstack/types#13516 dev 估计sql-driver.ts上约有 22 个行锚,未枚举;⇒ 第一交付是枚举:仓内所有指向源码的
docs/adr/**行锚,逐个解析,给出「总数 / 已腐烂数」。修法在读数之后选,不在之前。三个修法形状,⛔ dev 不自选
卡列了:按稳定符号 pin、按引用片段 pin、或删掉行号。⚠️ 三者对 governed 面的改动量差一个数量级,且第三种会丢失定位能力。⇒ 带枚举读数回报,由分诊或维护者定形状。
content/docs/permissions/system-context.mdx被check-system-context-census纳入行锚台账 ⇒ ADR 的锚没有任何东西在看。是否该纳入是设计问题,⛔ 本卡不预设。⭐ 一处已发生的成本,记为定级依据
#13516 的 dev 专门规划了行数中性的注释改动来保护这些锚,测量后才发现已经没有什么可保护的了。⇒ 这是真实花掉的时间,用于维护一个仓里已经丢失的性质。
Generated by Claude Code
baozhoutao commentedon Sep 1, 2026
Claim: PM loop round 1
Session:
session_01WLJQhde67SeTccsmnBVarVBranch:
claude/issue-13556-adr-anchor-census(measurement branch; a PR is NOT expected this dispatch — the triage ruling makes enumeration the first deliverable and reserves the repair shape for triage/the maintainer)Worktree:
objectstack-issue-13556Domain:
domain:devxFile surface: READ-ONLY this dispatch —
docs/adr/**(anchor sources) and the source files they cite (resolution targets). ⛔ No repair edits:docs/adr/**is a governed surface and the repair shape is explicitly not the dev's to choose (stop on breach; explain in the report)Container & model: M,
mode:subagent,model: claude-opus-5—dispatch-gates --tierhas no path mandate for a read-only measurement; tier is this seat's judgment: resolving each anchor's claim against live code is careful reading, not mechanical grep.Clause-②: no
Serial constraints cleared: read-only, so no file-face contention with in-flight #13513 (manifests) or #13519 (seven gate scripts). No open PR conflicts.
Generated by Claude Code
baozhoutao commentedon Sep 1, 2026
Dev claim (os-dev seat, measurement-only dispatch)
Session:
session_01WLJQhde67SeTccsmnBVarVBranch:
claude/issue-13556-adr-anchor-census(pushed empty as a write-route probe; no PR expected — the triage ruling makes enumeration the first deliverable and reserves the repair shape for triage/the maintainer)Worktree:
objectstack-issue-13556, cut fromorigin/mainat83be46012778c07b8de6b6d3a026217f26712302(83be4601) — the census is dated to this sha, which is NEWER than theff37576976the card measured on, so line numbers may have moved again since filing.File surface: READ-ONLY.
docs/adr/**as anchor sources, the cited source files as resolution targets. ⛔ No edits todocs/adr/**(governed surface, repair shape not this seat's to choose).Deliverable: repo-wide enumeration of every
docs/adr/**line anchor into source, each resolved and classified (RESOLVES / ROTTED / AMBIGUOUS / DEAD PATH / HISTORICAL), with extraction patterns and recall controls stated.Generated by Claude Code
baozhoutao commentedon Sep 1, 2026
os-dev-report
{ "issue": 13556, "status": "done", "branch": "claude/issue-13556-adr-anchor-census", "pr": null, "premise_still_valid": true, "summary": "Measurement-only dispatch: enumerated every line anchor in docs/adr/** repo-wide and resolved each against origin/main 83be4601. 343 distinct anchors across 35 ADRs (of 134 ADR files). Excluding 4 HISTORICAL and 2 EXTERNAL (third-party) anchors, 243 of 337 live anchors are broken - a repo-wide rot rate of 72.1%. The card's four sampled anchors are all reproduced and all ROTTED, so 4-of-4 was directionally right but is NOT the rate; the rate is 72%, and the honest reading is that it is a repo-wide property, not a sql-driver.ts property. Rot tracks TARGET-FILE CHURN, not ADR age: anchors into files of 3000+ lines are 86.4% broken vs 62.1% for smaller targets, and the four hottest targets (metadata-protocol/protocol.ts, security-plugin.ts, sql-driver.ts, runtime/http-dispatcher.ts) are 100% broken across 50 anchors. Repair shape NOT chosen - reserved to triage/maintainer per the ruling. No edits made to docs/adr/**.", "tests": "No build, no test, no gate family - the diff is empty by design (measurement-only; docs/adr/** is a governed surface this dispatch may not edit). Evidence is the census itself, dated to origin/main 83be46012778c07b8de6b6d3a026217f26712302 (83be4601). Extraction recall was controlled: the required control anchor ADR-0113 sql-driver.ts:4901 is found by the extractor (twice, at ADR lines 19 and 47), and all four anchors the card sampled appear in the enumeration and classify ROTTED. A second, independent recall control found 52 CONTINUATION anchors the primary pattern misses by construction; they are reported as a measured gap rather than silently dropped. The classifier was validated against 24 anchors read by hand until it reached 0 mismatches.", "mcp_calls": "5 - 2 reads (issue body, comments) and 3 writes (claim comment, this report comment, the table comment)", "open_questions": [], "out_of_scope_findings": [] }ADR line-anchor census — repo-wide
Measured on
origin/main83be46012778c07b8de6b6d3a026217f26712302(83be4601). The whole census is dated to that sha; it is NEWER than theff37576976the card measured on. Sibling-repo resolutions were taken againstobjectuiorigin/main84ffdbcbb33762b5488742fb902faf45a3742e93.The headline reading
docs/adr/**Per-classification counts (the 343 primary anchors)
83be4601— but the repo-wide rate is 72.1%, not 100%. Sampling one hot file overstated it. It is still very high.⭐ The finding that should drive the repair-shape choice
Rot tracks TARGET-FILE CHURN, not ADR age. ADR age is a weak, confounded signal (81% broken for ADRs written before 2026-08-01 vs 40% after — but the newest ADR is also the one whose anchors were typed most recently). The strong signal is the size and churn of the file being pointed at:
packages/metadata-protocol/src/protocol.tspackages/plugins/plugin-security/src/security-plugin.tspackages/drivers/driver-sql/src/sql-driver.tspackages/runtime/src/http-dispatcher.tspackages/spec/src/data/object.zod.tspackages/objectql/src/engine.tspackages/objectql/src/registry.ts⇒ A line number into a 16,000-line file has an expected lifetime measured in days. This is the fact that separates the three candidate repair shapes, and it is what the enumeration was ordered to produce.
⭐ A rot that hides a SEMANTIC INVERSION — worth the maintainer's eye
The card called ADR-0113's anchor load-bearing. It is worse than drifted. ADR-0113 says at both
:19and:47thatsql-driver.ts:4901showsif (field.required) col.notNullable(). On83be4601that mechanism lives atsql-driver.ts:15565and reads:ADR-0113's own decision shipped, and inverted the predicate. The ADR's Context row described the pre-decision state; with the anchor rotted, that row now reads to a fresh reader as a description of today. So the cost here is not only "points at unrelated code" — it is a reader concluding the opposite of what the code does. ⛔ Recording only; no repair proposed.
Per-ADR breakdown
broken / live, where broken = ROTTED + DEAD PATH and live excludes HISTORICAL and EXTERNAL.registry.tsexported functions,stack.zod.tsschema keys,plugin-order.ts:66=resolvePluginOrder). That is a second, independent read on the same mechanism as the churn table.Extraction method, patterns, and recall controls
Primary pattern (over
docs/adr/**, 134 files):376 raw tokens, deduped to 343 distinct (ADR, anchor) pairs. Anchor spellings vary widely in the corpus, and all of these are captured: backticked (
`sql-driver.ts:610`), markdown-linked ([`engine.ts:1850`](../../packages/objectql/src/engine.ts#L1850)), inside tables, in prose, in fenced code-block header comments, with a range (:341-400), and with an en-dash range (:459–463).Path resolution, in this precedence order — every anchor's mode is recorded:
#LlinkRecall control 1 (required by the dispatch) — PASSED. ADR-0113's
sql-driver.ts:4901is found by the extractor, at both occurrences (ADR line 19 in the table, ADR line 47 in prose).Recall control 2 (required by the dispatch) — PASSED. All four anchors the card sampled appear in the enumeration, and all four classify ROTTED:
sql-driver.ts:4901:15565sql-driver.ts:1967formatInputnow at:2243(+276)sql-driver.ts:1543throw err;— the end of an error buildersql-driver.ts:610err.status = 400;;StorageNameMappingnow at:65:NNNor,NNNthat inherits its path from the full anchor earlier on the same line — e.g. ADR-0029 line 437 writes(`packages/objectql/src/engine.ts:2920`, `:2933`, `:3147`, `:3157`), which is four anchors but only one match. A second extractor that inherits the preceding path found 52 such anchors across 19 ADRs (top: ADR-0029 and ADR-0130 with 7 each, ADR-0112 with 6). 50 resolve to a file, 2 point past EOF. They are NOT included in the 343 or the 72.1%; adding them puts the true anchor surface at 395. Any repair or gate must handle this spelling or it silently covers only 87% of the surface.Classification method, and where I abstained
Two passes, and both are stated because the second corrects the first:
registry/permission/metadata. On a claim line carrying several anchors, symbols are attributed to the nearest anchor by character offset. Symbol present inside the cited range ⇒ RESOLVES; present elsewhere in the file ⇒ ROTTED, and the location it moved to is recorded; absent from the file ⇒ ROTTED.⭐ The abstention count is itself a finding: for 136 of 343 anchors the ADR sentence names nothing checkable at all — no symbol, no quoted snippet, just a line number. Those are precisely the anchors that cannot rot loudly under any gate short of a full-text pin.
Two classes the count deliberately separates out
HISTORICAL (4) — dated records, not live claims, so ⛔ not counted as rot:
packages/spec/src/contracts/workflow-service.ts:58andexamples/app-crm/src/workflows/stale-opportunity.workflow.ts:19— the ADR itself annotates both as unlinked and deleted ("the contract file was deleted on 2026-08-01 by discovery 的 workflow / graphql 槽位还声明着两条无人挂载的 route —— #4318 同款,但目前"上了膛没击发" #4451 / refactor(spec,client,metadata-protocol,runtime)!: 退役 workflow 服务槽位与 graphql 残留 (#4451) #4473"; "removed by this record's own implementation"). This is the good pattern, already present in the corpus.turso-driver.ts:764-776andremote-transport.ts:430-443— the ADR quotes an issue's citation in order to refute it.docs/design/driver-turso.md(Status: Proposal)". On83be4601,packages/drivers/driver-turso/src/turso-driver.tsdoes exist. The refutation has itself gone stale. Recording only.EXTERNAL (2) — ADR-0065 cites
packages/sdks/src/types/builder-block.ts:42andpackages/sdks/src/constants/device-sizes.ts:34, both explicitly labelledBuilder.io SDK:. They point into a third-party repository. No in-repo gate could ever resolve them, whatever shape is chosen.Two further facts a repair shape will have to price
docs/adr/**into objectui (ADR-0080, ADR-0086, ADR-0016, ADR-0065, ADR-0112). A gate living in objectstack cannot resolve them against a moving sibling repo without pinning a sha.registry.ts:13,engine.ts:441,protocol.ts:7380), and 72 more cite an abbreviated or since-moved path.registry.tsalone has four candidate files in this repo;plugin.tshas eleven. So a resolver is not areadFile— disambiguation is a real cost in all three candidate shapes, and it is why the mode table above exists.⛔ Repair shape not chosen. Per the triage ruling this seat reports the reading and stops; the choice among stable-symbol pin / quoted-snippet pin / delete-the-numbers is triage's and the maintainer's. No file under
docs/adr/**was edited, and no PR was opened.Full per-anchor table (all 343, each with its verdict and, where the mechanism moved, its true current location) follows in the next comment.
Generated by Claude Code
baozhoutao commentedon Sep 1, 2026
Full per-anchor table — part 1 of 2 (ADR-0005 … ADR-0086)
Census dated to
origin/main83be4601; objectui rows against84ffdbcbb33762b5488742fb902faf45a3742e93.validation.zod.ts:105is the clearest example in this table (line 105 says "a typo oftransitionswould be rejected", which is a comment about the union's typo-suggestion set, not thestate_machinerule the ADR cell claims). I left it as the classifier scored it rather than hand-patching individual rows, so the direction of the residual error is knowable and one-way: true rot is somewhat higher than 72.1%, never lower.Rows marked "hand-read" are ones the mechanical classifier abstained on and I adjudicated by reading the ADR sentence against the cited region.
packages/objectql/src/protocol.ts:357sys_metadatais not at 357 — it lives at line 334 (-23) → now atpackages/metadata-protocol/src/protocol.ts:334(note: the cited path itself no longer exists;protocol.tsmoved package)packages/rest/src/rest-server.ts:973-979packages/spec/src/data/object.zod.ts:432datasourceis not at 432 — it lives at line 894 (+462)packages/drivers/driver-sql/src/sql-driver.ts:1064ResourceEditPage.tsx:733(objectui)spec/contracts/approval-service.ts:11IWorkflowService) appear anywhere in the cited file — the mechanism has left this fileplugin-approvals/src/approval-service.ts:175sys_teamis not at 175 — it lives at line 429 (+254)metadata-type-schemas.ts:85workflowis not at 85 — it lives at line 120 (+35)metadata-plugin.zod.ts:90metadata-plugin.zod.ts:612object.zod.ts:534stateMachinesis not at 534 — it lives at line 2056 (+1522)validation.zod.ts:105packages/spec/src/contracts/workflow-service.ts:58examples/app-crm/src/workflows/stale-opportunity.workflow.ts:19engine.ts:1850state_machineis not at 1850 — it lives at line 1890 (+40)validation.zod.ts:362conditionalis not at 362 — it lives at line 366 (+4)query.zod.ts:586QuerySchemais not at 586 — it lives at line 593 (+7)engine.ts:2077analyticsis not at 2077 — it lives at line 1990 (-87)spec/src/stack.zod.ts:459validateNamespacePrefixis not at 459 — it lives at line 827 (+368)spec/src/kernel/manifest.zod.ts:28-76crm_accountis not at 28 — it lives at line 182 (+154)spec/src/system/constants/system-names.ts:169StorageNameMappingis not at 169 — it lives at line 268 (+99)driver-sql/src/sql-driver.ts:610err.status = 400;;StorageNameMappingnow at:65objectql/src/registry.ts:406-518priorityis not at 406 — it lives at line 259 (-147)object.zod.ts:856-897priorityis not at 856 — it lives at line 2085 (+1229)services/service-automation/src/engine.ts:441replacedis not at 441 — it lives at line 1954 (+1513)objectql/src/registry.ts:13RESERVED_NAMESPACESis not at 13 — it lives at line 45 (+32)manifest.zod.ts:66-70engine.ts:441plugin-auth/src/manifest.ts:58-67platformis not at 58 — it lives at line 42 (-16)objectql/src/registry.ts:346-389namespaceRegistryis not at 346 — it lives at line 1456 (+1110)objectql/src/registry.ts:406-518priorityis not at 406 — it lives at line 259 (-147)object.zod.ts:856-897priorityis not at 856 — it lives at line 2085 (+1229)registry.ts:13RESERVED_NAMESPACESis not at 13 — it lives at line 45 (+32)manifest.zod.ts:66-70RESERVED_NAMESPACESappears nowhere in the cited file — the mechanism has left this filemanifest.zod.ts:133platformis not at 133 — it lives at line 185 (+52)object.zod.ts:354-385platformis not at 354 — it lives at line 412 (+58)packages/objectql/src/registry.ts:38-44registerObjectis not at 38 — it lives at line 84 (+46)packages/spec/src/data/object.zod.ts:2435packages/metadata-protocol/src/protocol.ts:7897-7911applyObjectRegistryMutationis not at 7897 — it lives at line 8020 (+123)packages/metadata-protocol/src/protocol.ts:11670-11673loadMetaFromDbis not at 11670 — it lives at line 12032 (+362)registry.ts:1157-1160protocol.ts:7535-7540registry.ts:1727-1733_provenanceis not at 1727 — it lives at line 1782 (+55)protocol.ts:8460-8472packages/spec/src/kernel/metadata-plugin.zod.ts:628protocol.ts:8259-8272restoreArtifactRegistryViewis not at 8259 — it lives at line 13444 (+5185)protocol.ts:7906-7910packages/objectql/src/engine.ts:2920engine.ts:2956objectExtensionsis not at 2956 — it lives at line 4798 (+1842)object.zod.ts:1385-1392ownershipis not at 1385 — it lives at line 1685 (+300)registry.ts:1206-1234resolveObjectis not at 1206 — it lives at line 1359 (+153)registry.ts:86-108engine.ts:2944protocol.ts:7380OS_METADATA_WRITABLEis not at 7380 — it lives at line 5715 (-1665)packages/objectql/src/plugin.ts:688-693protocol.ts:11706-11708saveMetaItemis not at 11706 — it lives at line 11723 (+17)registry.ts:1075DEFAULT_OVERLAY_PRIORITYis not at 1075 — it lives at line 1576 (+501)registry.ts:1116-1130nameFieldis not at 1116 — it lives at line 1610 (+494)spec/data/object.zod.ts:2435protocol.ts:7897-7911objectql/src/plugin.ts:688packages/objectql/src/index.ts:28ObjectContributoris not at 28 — it lives at line 44 (+16)core.ts:24objectuiappears nowhere in the cited file — the mechanism has left this fileplugin.ts:688spec/shared/expression.zod.ts:84ExpressionInputSchemais not at 84 — it lives at line 99 (+15)automation/flow.zod.ts:212-214FlowSchemais present inside the cited rangeflow.zod.ts:212-214shared/expression.zod.ts:84Templateis not at 84 — it lives at line 117 (+33)permission-evaluator.ts:37DESTRUCTIVE_OPERATIONSis not at 37 — it lives at line 46 (+9)permission-evaluator.ts:35permKeyis not at 35 — it lives at line 208 (+173)security-plugin.ts:326SecurityPluginis not at 326 — it lives at line 313 (-13)permission-evaluator.ts:8-16OPERATION_TO_PERMISSIONis not at 8 — it lives at line 23 (+15)permission.zod.ts:28-30allowTransferis not at 28 — it lives at line 62 (+34)packages/plugins/plugin-audit/src/audit-plugin.ts:40packages/plugins/plugin-audit/src/audit-writers.ts:328-329audit-writers.ts:43-45packages/plugins/plugin-audit/src/audit-plugin.ts:6-11audit-plugin.ts:96-99audit-writers.test.ts:9sys-audit-log.object.ts:22managedBy: 'append-only'— the immutability claimsql-driver.ts:1967formatInputis not at 1967; it lives at line 2243 (+276)sql-driver.ts:1543throw err;, the end of an error builderstdlib.ts:36addDaysUtcis not at 36 — it lives at line 71 (+35)stdlib.ts:19startOfDayUtcis not at 19 — it lives at line 50 (+31)sql-driver.ts:1816sql-driver.ts:1543-1554coerceFilterValueis not at 1543 — it lives at line 481 (-1062)sql-driver.ts:1500datetimeFieldsis not at 1500 — it lives at line 4117 (+2617)native-sql-strategy.ts:385-425filter-normalizer.ts:127-140native-sql-strategy.ts:371dateRangeis not at 371 — it lives at line 497 (+126)security-plugin.ts:481-495opCtxis not at 481 — it lives at line 1592 (+1111)security-plugin.ts:753-788opCtxis not at 753 — it lives at line 1592 (+839)execution-context.zod.ts:74-91current_useris present inside the cited rangerls-compiler.ts:79-99current_useris present inside the cited rangesecurity-plugin.ts:341-400sharing-service.ts:53-62controlled_by_parentis not at 53 — it lives at line 83 (+30)field.zod.ts:386-400master_detailis not at 386 — it lives at line 408 (+22)rls-compiler.ts:129-138masterFKappears nowhere in the cited file — the mechanism has left this fileteam-graph.ts:27expandRecipient/role_and_subordinates/experimentalappear in the cited filesharing-rule-service.ts:253expandRecipientis not at 253 — it lives at line 668 (+415)department-graph.ts:32packages/platform-objects/src/identity/sys-member.object.ts:152managedByis not at 152 — it lives at line 20 (-132)packages/plugins/plugin-security/src/rls-compiler.ts:126ExecutionContextis not at 126 — it lives at line 60 (-66)packages/runtime/src/security/resolve-execution-context.ts:260packages/spec/src/security/permission.zod.ts:17ObjectPermissionSchemais not at 17 — it lives at line 29 (+12)packages/plugins/plugin-sharing/src/team-graph.ts:94packages/runtime/src/security/resolve-execution-context.ts:226packages/plugins/plugin-auth/src/auth-manager.ts:657packages/plugins/plugin-sharing/src/role-graph.ts:52packages/plugins/plugin-sharing/src/sharing-plugin.ts:168bindRuleHooksis not at 168 — it lives at line 42 (-126)packages/spec/src/security/sharing.zod.ts:97ENFORCEDis not at 97 — it lives at line 202 (+105)packages/platform-objects/src/apps/setup-nav.contributions.ts:48-55setup-nav.contributions.ts:50setup-nav.contributions.ts:52-53sys-business-unit.object.ts:96sys_business_unitis not at 96 — it lives at line 90 (-6)approval-service.ts:306sys_memberis not at 306 — it lives at line 426 (+120)approval-service.ts:380-389role-graph.ts:100team-graph.ts:144team-graph.ts:70-80sys_memberis present inside the cited rangerole-graph.ts:57spec/.../query.zod.ts:454liveness/fullTextSearch/searchableFieldsappear in the cited filerest-server.ts:3751page.zod.ts:97validateis not at 97 — it lives at line 163 (+66)apps/console/src/index.css:12-19(objectui)objectuiappears nowhere in the cited filepackages/components/src/renderers/basic/elements.tsx:87(objectui)packages/sdks/src/types/builder-block.ts:42packages/sdks/src/constants/device-sizes.ts:34metadata-tools.ts:268-328metadata-tools.ts:319metadata-tools.ts:304packages/services/service-automation/src/engine.ts:946-964$runIdis not at 946 — it lives at line 982 (+36)service-automation/src/engine.ts:946-964$runIdis not at 946 — it lives at line 982 (+36)objectql/src/engine.ts:119timezoneis not at 119 — it lives at line 363 (+244)objectql/src/validation/rule-validator.ts:289previousis not at 289 — it lives at line 284 (-5)objectql/src/validation/rule-validator.ts:178-190readonlyWhenis present inside the cited rangeobjectql/src/hook-wrappers.ts:84conditionis not at 84 — it lives at line 100 (+16)plugin-security/src/rls-compiler.ts:259current_useris not at 259 — it lives at line 284 (+25)plugin-sharing/src/bootstrap-declared-sharing-rules.ts:61conditionis not at 61 — it lives at line 20 (-41)cel-engine.ts:52-62featuresis not at 52 — it lives at line 100 (+48)packages/spec/src/automation/flow.zod.ts:129-132descriptionis not at 129 — it lives at line 358 (+229)packages/lint/src/validate-record-title.ts:92packages/spec/src/data/display-name.ts:6-8packages/spec/src/data/object.zod.ts:2082-2095normalizeNameFieldAliasis not at 2082 — it lives at line 2656 (+574)object.zod.ts:2084-2085object.zod.ts:1698nameFieldis not at 1698 — it lives at line 1533 (-165)docs/adr/0085-object-semantic-roles-over-surface-hint-blocks.md:57validate-record-title.ts:91-96content/docs/data-modeling/formulas.mdx:94-102packages/objectql/src/engine.ts:5212nameFieldis not at 5212 — it lives at line 8760 (+3548)packages/metadata-protocol/src/protocol.ts:4793display-name.ts:71-72display-name.ts:66-68display-name.ts:13-14packages/objectql/src/registry.ts:1079-1090warnFunctionalCompletenessis the cited regionpackages/lint/src/validate-record-title.ts:26-27validate-record-title.ts:12-14packages/lint/src/authoring-rules.ts:668-678packages/lint/src/data-model-rules.ts:404-409packages/spec/src/data/search-fields.ts:75-92packages/objectql/src/search-companion.ts:19object.zod.ts:1684-1685model-rules.ts:36packages/core/src/registry/Registry.ts:13(objectui)ComponentInputis not at 13 — it lives at line 60 (+47)page.zod.ts:85propertiesis not at 85 — it lives at line 134 (+49)packages/types/src/layout.ts:639(objectui)classNameis present inside the cited rangelayout.ts:639(objectui)BaseSchemais not at 639 — it lives at line 658 (+19)StudioDesignSurface.tsx:589(objectui)packageIdis not at 589 — it lives at line 599 (+10)PermissionMatrixEditor.tsx:171(objectui)plugin-security/objects/sys-permission-set.object.ts:20PermissionSetSchemaappears nowhere in the cited filespec/security/permission.zod.ts:108packageIdis not at 108 — it lives at line 520 (+412)manifest.zod.ts:142-179(part 2 follows)
Generated by Claude Code
baozhoutao commentedon Sep 1, 2026
Full per-anchor table — part 2 of 2 (ADR-0086 … ADR-0130)
Same caveat as part 1: the mechanical RESOLVES test is permissive, so 72.1% is a lower bound on rot, never an upper one.
permission-evaluator.ts:64-101OPERATION_TO_PERMISSIONlookup is the cited regioncore/security/resolve-authz-context.ts:84-252bootstrap-declared-roles.ts:61stack.zod.ts:235manifest.zod.ts:264permissionsis not at 264 — it lives at line 290 (+26)metadata-persistence.zod.ts:72object.zod.ts:408platformis not at 408 — it lives at line 412 (+4)MePermissionsProvider.tsx:56(objectui)}plugin-security/security-plugin.ts:719permissionsis not at 719 — it lives at line 755 (+36)spec/stack.zod.ts:235permissionis not at 235 — it lives at line 225 (-10)spec/system/metadata-persistence.zod.ts:72spec/data/object.zod.ts:408spec/kernel/manifest.zod.ts:142-179declaredis not at 142 — it lives at line 98 (-44)permissions/MePermissionsProvider.tsx:56(objectui)}spec/security/permission.zod.ts:167managedByis not at 167 — it lives at line 516 (+349)sys-permission-set.object.ts:217-266managedByis not at 217 — it lives at line 40 (-177)packages/spec/src/data/field.zod.ts:592visibleWhenis not at 592 — it lives at line 834 (+242)packages/spec/src/ui/view.zod.ts:762visibleOnis not at 762 — it lives at line 2339 (+1577)packages/spec/src/ui/page.zod.ts:109visibilityis not at 109 — it lives at line 200 (+91)field.zod.ts:594-598requiredWhenis not at 594 — it lives at line 801 (+207)field.zod.ts:592-594UniqueScopeSchema, not the conditional-rule triadpackages/objectql/src/validation/rule-validator.ts:378content/docs/protocol/objectui/layout-dsl.mdx:796-798object.zod.ts:227-230view.zod.ts:276plugin-security/security-plugin.ts:626plugin-security/security-plugin.ts:1689getReadFilteris not at 1689 — it lives at line 1778 (+89)rest/rest-server.ts:4317enforceAuthis present inside the cited rangeruntime/http-dispatcher.ts:4231runtime/sandbox/body-runner.ts:155mcp/mcp-server-runtime.ts:335http-dispatcher.ts:1322}plugin-webhooks/auto-enqueuer.ts:175objectql/engine.ts:722visibleWhenis not at 722 — it lives at line 3465 (+2743)report-service.ts:425isSystemis present inside the cited rangeknowledge-service.ts:312applyPermissionFilteris present inside the cited rangeobjectql/engine.ts:641executeActionis not at 641 — it lives at line 3106 (+2465)objectql/engine.ts:2793objectql/engine.ts:2956getDriverByNameis not at 2956 — it lives at line 13254 (+10298)sharing-plugin.ts:391deleteManyappears nowhere in the cited file — the mechanism has left this filesecurity-plugin.ts:821runtime/http-dispatcher.ts:1488realtimeis not at 1488 — it lives at line 1477 (-11)security-plugin.ts:2390manage_metadatais not at 2390 — it lives at line 160 (-2230)security-plugin.ts:71-77sharing.zod.ts:104enforcedis not at 104 — it lives at line 84 (-20)packages/plugins/plugin-security/src/security-plugin.ts:2390packages/spec/src/security/sharing.zod.ts:104field.zod.ts:151currencyis not at 151 — it lives at line 57 (-94)field.zod.ts:121LocationCoordinatesSchemais not at 121 — it lives at line 316 (+195)http-dispatcher.ts:3882script-runner.ts:60objectql/src/engine.ts:678examples/app-todo/src/actions/task.handlers.ts:63requiredis not at 63 — it lives at line 40 (-23)sql-driver.ts:59attachment-lifecycle.ts:27-29sys_attachmentis not at 27 — it lives at line 14 (-13)storage-routes.ts:231-241completeis not at 231 — it lives at line 210 (-21)engine.ts:2092-2098generateEventUuid, not the$expandoverwritehttp-dispatcher.ts:3797http-dispatcher.ts:3944plugin-security/src/tenant-layer.ts:87core/src/security/resolve-authz-context.ts:125plugin-approvals/src/approval-node.ts:118approval-service.test.ts:263-265DUPLICATE_REQUESTtestplugin-security/src/security-plugin.ts:2785-2791collectRLSPoliciesis not at 2785 — it lives at line 2264 (-521)plugin-security/src/objects/default-permission-sets.ts:150-160spec/src/security/permission.zod.ts:282PermissionSetis not at 282 — it lives at line 382 (+100)spec/src/kernel/execution-context.zod.ts:165plugin-security/src/rls-compiler.ts:164-177tenant-layer.ts:103tenant-layer.ts:54*/spec/src/data/object.zod.ts:240-256trackHistory/searchableplugin-sharing/src/business-unit-graph.ts:174-177rls-compiler.ts:164-177accessible_org_idsappears nowhere in the cited filepackages/spec/src/api/errors.zod.ts:51StandardErrorCodeis present inside the cited rangehttp-dispatcher.ts:1424PERMISSION_DENIEDis not at 1424 — it lives at line 2217 (+793)packages/spec/src/api/contract.zod.ts:12ApiErrorSchemais present inside the cited rangehttp-dispatcher.ts:475-484VALIDATION_FAILEDappears nowhere in the cited filehttp-dispatcher.ts:530-541dispatcher-plugin.ts:340-349packages/client/src/index.ts:4455-4459VALIDATION_FAILEDis not at 4455 — it lives at line 4661 (+206)packages/app-shell/src/views/RecordAttachmentsPanel.tsx:103-108(objectui)AUTH_REQUIREDis not at 103 — it lives at line 88 (-15)packages/runtime/src/domains/automation.ts:240forbiddenis not at 240 — it lives at line 1643 (+1403)packages/metadata-protocol/src/protocol.ts:4353automationis not at 4353 — it lives at line 4370 (+17)packages/rest/src/rest-server.ts:89-96requiredis not at 89 — it lives at line 75 (-14)client/src/index.ts:12StandardErrorCodeis present inside the cited rangepackages/cloud-connection/src/cloud-connection-plugin.ts:382declaredCodeis present inside the cited rangedocs/audits/2026-06-handwritten-docs-accuracy-followups.md:230api/errors.zod.ts:29-39ErrorCategoryis present inside the cited rangeintegration/connector.zod.ts:409-420RetryStrategyis present inside the cited rangeclient/src/index.ts:4473-4475ErrorCategoryis not at 4473 — it lives at line 6467 (+1994)http-dispatcher.ts:475categorynorretryableappears in the cited filedriver-sql/sql-driver.ts:4901requiredis not at 4901; the mechanism is at:15565and now keys offstorage.notNull, notrequireddriver-sql/schema-drift.ts:249-277destructiveis not at 249 — it lives at line 156 (-93)sql-driver.ts:4901schema-drift.ts:249nullSafeColumnsregistry.ts:305-313organization_idis not at 305 — it lives at line 280 (-25)packages/plugins/plugin-sharing/src/sharing-service.ts:47owner_idis not at 47 — it lives at line 69 (+22)packages/spec/src/data/object.zod.ts:818ownershipis not at 818 — it lives at line 1685 (+867)packages/spec/src/data/object.zod.ts:800-823ownershipis not at 800 — it lives at line 1685 (+885)packages/platform-objects/src/identity/sys-business-unit.object.ts:127packages/platform-objects/src/identity/sys-user.object.ts:690projectionis not at 690 — it lives at line 750 (+60)packages/spec/src/contracts/sharing-service.ts:315-320sharing-service.ts:47OWNER_FIELDis not at 47 — it lives at line 75 (+28)packages/metadata-core/src/objects/sys-metadata-history.object.ts:156sys_useris not at 156 — it lives at line 161 (+5)packages/metadata-protocol/src/sys-metadata-repository.ts:423sys_metadata_historyis present inside the cited rangepackages/spec/src/contracts/ai-service.ts:394-404ToolExecutionContextis present inside the cited rangepackages/objectql/src/lifecycle/lifecycle-service.ts:39isSystemis not at 39 — it lives at line 61 (+22)packages/spec/src/data/object.zod.ts:824-831ai-service.ts:394-404packages/objectql/src/engine.ts:4934-4973transactionis not at 4934 — it lives at line 3864 (-1070)turso-driver.ts:764-776remote-transport.ts:430-443packages/spec/src/contracts/data-driver.ts:221-235beginTransactionis not at 221 — it lives at line 281 (+60)sql-driver.ts:2214packages/metadata-protocol/src/protocol.ts:2289discoveryis not at 2289 — it lives at line 3425 (+1136)packages/mcp/src/mcp-http-tools.ts:48-81McpDataBridgeis present inside the cited rangememory-driver.ts:595-630beginTransactionis not at 595 — it lives at line 1030 (+435)engine.ts:4950transactionis not at 4950 — it lives at line 3864 (-1086)packages/spec/src/contracts/data-engine.ts:97-100IDataEngineis not at 97 — it lives at line 172 (+75)packages/spec/src/data/data-engine.zod.ts:706-717IDataEngineis not at 706 — it lives at line 759 (+53)contracts/data-engine.test.ts:162-177IDataEngineis not at 162 — it lives at line 154 (-8)packages/metadata-protocol/src/protocol.ts:5220-5323batchDatais not at 5220 — it lives at line 2689 (-2531)packages/spec/src/api/batch.zod.ts:62BatchOptionsSchemais present inside the cited rangeengine.ts:4952-4954transactionis not at 4952 — it lives at line 3864 (-1088)rest-server.ts:7166-7171NOT_IMPLEMENTEDis not at 7166 — it lives at line 7094 (-72)packages/rest/src/import-runner.ts:48-59ImportUndoLogis not at 48 — it lives at line 78 (+30)protocol.ts:7400-7424ImportUndoLogappears nowhere in the cited filepackages/spec/src/kernel/metadata-plugin.zod.ts:654/** Plugin description */packages/metadata-protocol/src/protocol.ts:13227-13260packages/metadata-core/src/meta-write-org-scope.ts:16-24permission-set-projection.ts:1128-1145packages/spec/src/data/object.zod.ts:2920objectExtensionsis not at 2920 — it lives at line 2996 (+76)content/docs/capabilities/integrations.mdx:17content/docs/build-without-code.mdx:37metadata-manager.ts:45objectstack; hand-reading says ROTTED — line 45 importsgetMetadataTypeActions, not theMetadataOverlaytype the ADR namessecurity-plugin.ts:974nav_permission_setsis not at 974 — it lives at line 1084 (+110)studio.app.ts:234-239nav_flowsentry is at the cited regionpackages/plugins/plugin-auth/src/auth-manager.ts:1403-1421secondaryStorageis present inside the cited rangepackages/plugins/plugin-auth/src/secondary-storage.ts:47-49session-of-record.test.ts:410cacheSecondaryStorageis present inside the cited rangesession-of-record.test.ts:528secondaryStorageis present inside the cited rangesecondary-storage.ts:87-89rateLimitis present inside the cited rangeauth-manager.ts:1382-1438cookieCacheis present inside the cited rangesession-of-record.test.ts:479cookieCacheis present inside the cited rangepackages/objectql/src/registry.ts:1456namespaceRegistrydeclaration is at the cited linepackages/objectql/src/engine.ts:4746registerAppis present inside the cited rangeregistry.ts:2679unregisterObjectsByPackageis present inside the cited rangeregistry.ts:3583getNamespaceOwnersconflict gate is at the cited linepackages/spec/src/data/object.zod.ts:1779packages/spec/src/stack.zod.ts:1759composeStacksmanifest union is at the cited lineregistry.ts:1540getNamespaceOwnersis present inside the cited rangeregistry.ts:3575installPackageis present inside the cited rangepackages/objectql/src/plugin.ts:405registerAppis present inside the cited rangepackages/spec/src/stack.zod.ts:854validateSingleAppis present inside the cited rangeregistry.ts:45RESERVED_NAMESPACES = new Set(['base', 'system'])is at the cited lineregistry.ts:1116isShareableNamespaceis present inside the cited rangepackages/spec/src/stack.zod.ts:240manifestkey is at the cited linepackages/cli/src/commands/compile.ts:271safeParsecall is at the cited linepackages/cli/src/commands/build.ts:60048-cross-package-metadata-collision.md:4590019-app-as-consumer-unit.md:68isConsumerInstallableis present inside the cited range0019-app-as-consumer-unit.md:810048-cross-package-metadata-collision.md:20–23stack.zod.ts:240manifestkey is at the cited linepackages/spec/src/kernel/manifest.zod.ts:70protocolrange key is at the cited linepackages/core/src/plugin-order.ts:66resolvePluginOrderis at the cited line0048-cross-package-metadata-collision.md:459–463stack.zod.ts:1759composeStacksis not at 1759 — it lives at line 1773 (+14)objectql/src/engine.ts:4745registerAppis present inside the cited rangeregistry.ts:1456installPackageis not at 1456 — it lives at line 1480 (+24)plugin.ts:405ql.registerApp(manifest)is at the cited lineEnd of the 343-anchor enumeration. The 52 CONTINUATION anchors described in the report comment are a separate, measured surface and are NOT included above.
Generated by Claude Code
13 remaining items
baozhoutao commentedon Sep 1, 2026
PM patch round 1 (devx seat, session
session_01WLJQhde67SeTccsmnBVarV) — PR #14277 CI settled 36 green / 1 red on head5b8f2d88, and the red is the PR's own:check-step-collectors --self-testfails on the new lint.yml step — verbatim:lint.yml "ADR symbol anchors resolve (no line numbers survive)": all green => every command runs (3/2). Dispatched back to the original implementing session (cloudsession_01Mszp61SetNhQfVGvWh9bNn, context retained) with the job-log quote and the fix fence: collector must run every declared command, no scope widening, PR stays a governed DRAFT. A follow-upos-dev-report-patchcomment lands here with the new head when pushed.Also filed from the report's open question 2: #14279 (61 stale full-path mentions in ADRs outside the census — path rot, a different class; recorded with the measured 1,056-finding profile of the
checkBarePathsflag). Open question 1 (bare-filename anchors upgraded to symbol anchors where resolvable — a FLOOR reading of the ruling's 「172 个裸文件名锚保持文件级」) is deliberately left to the human merger: it is a deviation from the ruling's letter in the direction of more resolution, honestly flagged in the dev report, and reversible with one flag — this seat neither reverts nor blesses a ruled class's treatment. Open question 3 (ADR-0020stateMachinesrow) stays a recorded observation, no card.Generated by Claude Code
ci(lint): keep the ADR symbol-anchor sweep out of its collector block
claude commentedon Sep 1, 2026
os-dev-report-patch
Patch round from the devx PM poke. One commit,
lint.ymlonly. PR #14277 remains a DRAFT (governeddocs/adr/**surface — a human merges); auto-merge still off.{ "issue": 13556, "pr": 14277, "branch": "claude/issue-13556-adr-symbol-anchors", "new_head_sha": "1a6cb8e2e428a36581b4ee435ed8726541f76e6e", "previous_head_sha": "5b8f2d881ae9b91c7d8796c8d031d894dc6e8dbe", "commit": "ci(lint): keep the ADR symbol-anchor sweep out of its collector block", "files_changed": [".github/workflows/lint.yml (+14 / -2)"], "scope": "lint.yml ONLY. docs/adr/**, scripts/symbol-anchors.mjs and scripts/check-adr-symbol-anchors.mjs are untouched by this patch — verified with `git diff --stat`. No scope widening.", "root_cause": "The diagnosis direction in the poke was inverted, and the counts say so: the assertion formats as (executed / collected), so `(3/2)` is THREE executed against TWO collected — not 3 declared with 2 running. `check-step-collectors` drives the real `run:` block under a real `bash -e` with a STUB planted at each collected command's SCRIPT PATH (scripts/check-step-collectors.mjs `driveBlock`). My step ended with a bare `node scripts/check-adr-symbol-anchors.mjs` after the collector's `exit 1` guard — the same script path already stubbed for its `--self-test` entry — so the harness logged a third execution against two collected commands and the equality `executed === collected` failed.", "fix": "Split into two steps: `ADR symbol-anchor gate self-tests` carries the two self-tests through the `run_self_test` collector and nothing else, and `ADR symbol anchors resolve (no line numbers survive)` is its own step running the production sweep. This is the shape BOTH existing collectors in lint.yml already have (self-tests only), and it also restores what the collector was for — the sweep now runs on its own footing instead of behind the self-tests' `exit 1`. Both invocation lines the gate's own --self-test pins in lint.yml are still present, so that wiring assertion still holds.", "my_verification_gap_last_round": "I ran `check-step-collectors` in its PRODUCTION form only, which passed — the block's shape is judged solely by the `--self-test` harness, so the production run could never have caught this. This round every gate was run in BOTH forms.", "checks_rerun_on_1a6cb8e": { "method": "both --self-test and production form for every gate that ships one", "check-step-collectors": "self-test PASS (146 assertions, 4 live blocks driven under a real bash -e) · production PASS", "symbol-anchors": "self-test PASS · production PASS", "check-adr-symbol-anchors": "self-test PASS · production PASS — 1854 anchors across 134 records resolve, 0 line anchors survive", "check-self-test-wired": "self-test PASS · production PASS", "check-aggregator-roster": "self-test PASS · production PASS", "check-ci-filter-parity": "self-test PASS · production PASS", "check-required-contexts": "self-test PASS · production PASS", "check-self-test-workflow-commands": "self-test PASS · production PASS", "check-workflow-status-functions": "self-test PASS · production PASS", "check-watch-hint-literal": "self-test PASS · production PASS", "check-declared-population-live": "self-test PASS · production PASS", "check-ratchet-remedy-authority": "self-test PASS · production PASS", "check-adr-links": "self-test PASS · production PASS", "check-adr-anchors": "self-test PASS · production PASS", "check-doc-anchors": "self-test PASS · production PASS", "check-doc-frontmatter": "self-test PASS · production PASS", "check-docs-single-h1": "self-test PASS · production PASS", "check-adr-0087-registration": "self-test PASS · production PASS", "check-empty-changeset": "self-test PASS · production PASS", "check-changeset-no-major": "self-test PASS · production PASS", "check-keyed-text-bounds": "self-test PASS · production PASS", "pnpm lint": "PASS (exit 0)", "derived_union_rerun": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack re-run on the new changeset — 51 entries, no gate newly derived beyond the set already run.", "aggregate": "0 failures across 21 gates x both forms." }, "fences_held": "PR stays DRAFT, never marked ready, auto-merge off (verified via API after push: draft=true, auto_merge=null). skip-changeset label intact. No content/docs/releases/** edits. No `git stash`.", "remote_verified": "git ls-remote origin refs/heads/claude/issue-13556-adr-symbol-anchors -> 1a6cb8e2e428a36581b4ee435ed8726541f76e6e, identical to local HEAD." }One note for the PM's own records, since it affects how the next such poke is read: the poke's diagnosis ("declares/carries 3 commands but the collector only runs 2, or the inverse") was resolved by reading
check-step-collectors.mjsrather than acting on it — the assertion string is(${allPass.executed.length}/${commands.length}), so(3/2)is unambiguously three executions against two collected commands. Fixing the guessed direction (adding a third command to the collector) would have made the red worse, not better.Generated by Claude Code
claude commentedon Sep 1, 2026
CI green on
1a6cb8e— the patch round's red is cleared. Closing the loop on the devx PM poke.Full check set on the new head: 33 check runs — 29 success, 4 skipped, 0 failures, 0 still running. The job the poke named,
Lint & Repo Gates, iscompleted / success.1a6cb8e2e428a36581b4ee435ed8726541f76e6e(local HEAD ==git ls-remote, tree clean)draft: true·auto_merge: null·mergeable_state: cleandocumentation,ci/cd,size/xl,dependencies,skip-changeset⛔ Still a DRAFT and staying one —
docs/adr/**is a governed surface, so a human merges it. Not marked ready, auto-merge not armed.No further work is queued on my side for #13556. The three open questions in the PR body still want a reviewer's eye — chiefly whether 「172 个裸文件名锚保持文件级」 was meant as a floor (my reading: disambiguate to full paths, symbol-anchor where a symbol resolves) or as a ceiling (strictly file-level for all 172). That one is a single-flag change if the reading is wrong.
Generated by Claude Code
baozhoutao commentedon Sep 1, 2026
PM review record (devx seat, session
session_01WLJQhde67SeTccsmnBVarV) — PR #14277 is ready for its human gate:1a6cb8e2e: 33/33 check-runs, zero red (independently read off the commit's check-runs, not the dev's self-report). Patch round 1 (thecheck-step-collectors3/2 collector defect) is cleared.scripts/symbol-anchors.mjsdefineCorpus) with the ADR corpus as a registration — platform-checklist step (2): re-author the 1,647 source citations as symbol anchors and add a resolver that reds on an absent symbol #13788 reuses by registering, ⛔ no second resolver; 0 line anchors survive on the migrated tree (「C 不作过渡」 made permanent by the gate's ownline-anchorrefusal class); negative controls both directions; 20-anchor spot audit 19/20 with the one miss repaired to file-level; ADR-0113 → ADR-0113's Context row now states the INVERSE of the shipped mechanism — the NOT NULL constraint keys off storage.notNull at sql-driver.ts:15565, not field.required #14193 referenced not folded; ADR-0119 already self-annotated (ruling point 4 satisfied without a duplicate card); 61 out-of-census path-rot mentions carded as [finding] 61 stale FULL-path mentions in ADRs outside the #13556 census — path rot, a different class from line-anchor rot #14279.Remaining gate:
docs/adr/**is governed — the PR stays a DRAFT and a human merges it. On merge this seat runs the close-out (label strip + origin/main probes) and dispatches #13788 (serial behind, shared resolver).Generated by Claude Code
docs(adr): migrate rotted ADR line anchors to resolver-gated symbol a…
gate(checklist): bind the platform-checklist corpus to the ONE symbol…
gate(checklist): bind the platform-checklist corpus to the ONE symbol…
docs(adr-0096): drop the three bare `:626` line pointers
docs(adr-0020): drop the two `#L198` link-target line pointers
fix(check-adr-symbol-anchors): the verdict may not claim a census wid…
fix(check-adr-symbol-anchors): the verdict may not claim a census wid…
docs(adr): delete the six stale line pointers left outside the object…