Skip to content

[finding] ADR line anchors into sql-driver.ts have rotted — 4 of 4 sampled resolve to unrelated code, and the ADRs read as if they still point at the mechanism they name #13556

Description

@zhuangjianguo

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

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

  1. zhuangjianguo commented on Aug 31, 2026

    @zhuangjianguo
    CollaboratorAuthor

    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:

    [site-without-a-row]        protocol.ts:1566 reads `context.isSystem` and NO row on the page anchors it
    [anchor-is-not-a-read-site] the page anchors protocol.ts:1451, which the census does not call an elevation read
    

    I measured it: merge-base :1451 and head :1566 are the byte-identical statement if (context?.isSystem) return data;, and the file's isSystem count 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:

    anchored in outcome when the line moves
    content/docs/permissions/system-context.mdx a ledger a CI gate enforces (check-system-context-census) reds loudly, names both halves, and prescribes its own repair
    ADR-0113 / ADR-0053 / ADR-0028 → sql-driver.ts nothing rots silently, still reads as if it points at the mechanism

    Same 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.

    ⚠️ Scope unchanged from the filing: I sampled 4 anchors into ONE file. The repo-wide rate remains UNMEASURED.


    Generated by Claude Code

  2. added theissue type on Aug 31, 2026
  3. os-warren commented on Aug 31, 2026

    @os-warren
    Collaborator

    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 的散文里重复了一遍同一个断言。

    ⛔ 范围未确立,派发令必须先量再修

    卡诚实标注,分诊升为硬要求:

    ⇒ 第一交付是枚举:仓内所有指向源码的 docs/adr/** 行锚,逐个解析,给出「总数 / 已腐烂数」。修法在读数之后选,不在之前。

    三个修法形状,⛔ dev 不自选

    卡列了:按稳定符号 pin、按引用片段 pin、或删掉行号。⚠️ 三者对 governed 面的改动量差一个数量级,且第三种会丢失定位能力。⇒ 带枚举读数回报,由分诊或维护者定形状。

    ⚠️ 一条相邻事实,派发时有用:目前只有 content/docs/permissions/system-context.mdx 被 check-system-context-census 纳入行锚台账 ⇒ ADR 的锚没有任何东西在看。是否该纳入是设计问题,⛔ 本卡不预设。

    ⭐ 一处已发生的成本,记为定级依据

    #13516 的 dev 专门规划了行数中性的注释改动来保护这些锚,测量后才发现已经没有什么可保护的了。⇒ 这是真实花掉的时间,用于维护一个仓里已经丢失的性质。


    Generated by Claude Code

  4. self-assigned this
    on Sep 1, 2026
  5. baozhoutao commented on Sep 1, 2026

    @baozhoutao
    Contributor

    Claim: PM loop round 1
    Session: session_01WLJQhde67SeTccsmnBVarV
    Branch: 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-13556
    Domain: domain:devx
    File 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 --tier has 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

  6. baozhoutao commented on Sep 1, 2026

    @baozhoutao
    Contributor

    Dev claim (os-dev seat, measurement-only dispatch)

    Session: session_01WLJQhde67SeTccsmnBVarV
    Branch: 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 from origin/main at 83be46012778c07b8de6b6d3a026217f26712302 (83be4601) — the census is dated to this sha, which is NEWER than the ff37576976 the 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 to docs/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

  7. baozhoutao commented on Sep 1, 2026

    @baozhoutao
    Contributor

    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/main 83be46012778c07b8de6b6d3a026217f26712302 (83be4601). The whole census is dated to that sha; it is NEWER than the ff37576976 the card measured on. Sibling-repo resolutions were taken against objectui origin/main 84ffdbcbb33762b5488742fb902faf45a3742e93.

    The headline reading

    ADR files in docs/adr/** 134
    ADR files carrying at least one line anchor 35
    Distinct line anchors enumerated 343
    — pointing at source/config 332
    — pointing at another doc 11
    — pointing into objectui (cross-repo) 11
    Plus: CONTINUATION anchors (see recall gap) +52
    Total anchor surface 395

    Per-classification counts (the 343 primary anchors)

    verdict count share of live
    ROTTED — cited line shows something else 234 69.4%
    DEAD PATH — cited file exists nowhere 9 2.7%
    RESOLVES — cited line still shows the named mechanism 94 27.9%
    HISTORICAL — a dated record, not a live claim 4 excluded
    EXTERNAL — points into a third-party repo 2 excluded
    BROKEN / LIVE 243 / 337 72.1%

    ⚠️ The ruling's constraint, honoured: "4 of 4" is not a rate. The card's four sampled anchors do all reproduce as ROTTED on 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:

    target file broken / anchors file lines
    packages/metadata-protocol/src/protocol.ts 16 / 16 — 100% 20,804
    packages/plugins/plugin-security/src/security-plugin.ts 13 / 13 — 100% 7,293
    packages/drivers/driver-sql/src/sql-driver.ts 11 / 11 — 100% 16,847
    packages/runtime/src/http-dispatcher.ts 10 / 10 — 100% 2,390
    packages/spec/src/data/object.zod.ts 19 / 21 — 90% 3,099
    packages/objectql/src/engine.ts 16 / 18 — 89% 13,976
    packages/objectql/src/registry.ts 14 / 22 — 64% 3,922
    target size broken / anchors rate
    3,000+ lines 108 / 125 86.4%
    under 3,000 lines 126 / 203 62.1%

    ⇒ 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 :19 and :47 that sql-driver.ts:4901 shows if (field.required) col.notNullable(). On 83be4601 that mechanism lives at sql-driver.ts:15565 and reads:

    // ADR-0113: the physical NOT NULL comes from the EXPLICIT storage
    // constraint, not from `required` — `required` is the write-time
    // contract enforced by the record validator at the engine seam, and
    // binding the DDL to it made every post-deploy tightening a
    // destructive migration.
    if ((field as { storage?: { notNull?: boolean } }).storage?.notNull) col.notNullable();
    

    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.

    ADR broken / live rate
    ADR-0029 kernel-object-ownership 36 / 36 100%
    ADR-0104 field-runtime-value-shape 12 / 12 100%
    ADR-0028 metadata-naming-and-namespace 10 / 10 100%
    ADR-0089 unify-visibility-predicate-naming 9 / 9 100%
    ADR-0049 no-unenforced-security-properties 5 / 5 100%
    ADR-0099 posture-adjudicated-tiering 5 / 5 100%
    ADR-0113 required-write-vs-column-constraint 4 / 4 100%
    ADR-0056 permission-model-landing-verification 3 / 3 100%
    ADR-0070 package-first-authoring 3 / 3 100%
    ADR-0005 metadata-customization-overlay 2 / 2 100%
    ADR-0015 external-datasource-federation 2 / 2 100%
    ADR-0019 approval-as-flow-node 2 / 2 100%
    ADR-0021 analytics-dataset-semantic-layer 2 / 2 100%
    ADR-0061 record-search-architecture 2 / 2 100%
    ADR-0016 studio-package-authoring 1 / 1 100%
    ADR-0053 date-and-datetime-semantics 9 / 10 90%
    ADR-0072 reference-scope-and-resolvability 9 / 10 90%
    ADR-0119 plugin-reachable-transactions 14 / 16 88% (+2 historical)
    ADR-0105 group-tenancy-posture 12 / 14 86%
    ADR-0020 state-machine-converge-and-enforce 6 / 7 86% (+2 historical)
    ADR-0096 execution-surface-identity-admission 14 / 17 82%
    ADR-0086 authz-metadata-config-boundary 16 / 21 76%
    ADR-0057 erp-authorization-core 15 / 20 75%
    ADR-0055 master-detail-controlled-by-parent 6 / 8 75%
    ADR-0117 owning-business-unit-record-stamp 6 / 8 75%
    ADR-0032 unified-expression-layer 3 / 4 75%
    ADR-0080 ai-authored-ui-jsx-source 3 / 4 75%
    ADR-0065 sdui-styling-model 2 / 3 67% (+2 external)
    ADR-0112 error-code-vocabulary-and-ledger 11 / 18 61%
    ADR-0126 packaged-metadata-customization 5 / 10 50%
    ADR-0118 non-user-actor-contract 3 / 6 50%
    ADR-0079 record-display-name 7 / 22 32%
    ADR-0052 audit-is-not-the-activity-feed 2 / 7 29%
    ADR-0130 release-artifact-as-co-ownership 2 / 27 7%
    ADR-0127 authorization-cache-invalidation 0 / 7 0%

    ⚠️ ADR-0130 and ADR-0127 are the two records whose anchors overwhelmingly still resolve. Both are recent AND both anchor mostly at symbol definition sites in small, stable files (registry.ts exported functions, stack.zod.ts schema 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):

    [A-Za-z0-9_@.\-]+(?:/[A-Za-z0-9_@.\-]+)*\.(ts|tsx|mts|cts|js|jsx|mjs|cjs|sh|ya?ml|jsonc?|mdx?|sql|css|scss|py|rs|go|toml|prisma):(\d+)([-–]\d+)?(:\d+)?
    

    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:

    mode count rule
    direct 282 cited path is a unique suffix of a tracked file
    full-path-elsewhere-in-ADR 31 bare basename, ambiguous; the same ADR spells one candidate in full
    objectui 10 not in objectstack; exact path in the sibling repo
    line-count feasibility 8 only one candidate is long enough to contain the cited line
    hand-adjudicated 8 I read the ADR context myself
    markdown #L link 2 the link target disambiguates
    unresolvable 2 reported as DEAD PATH

    Recall control 1 (required by the dispatch) — PASSED. ADR-0113's sql-driver.ts:4901 is 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:

    card's sample found at verdict what is there today
    ADR-0113 → sql-driver.ts:4901 ADR lines 19, 47 ROTTED connect-timeout/dialect prose; mechanism at :15565
    ADR-0053 → sql-driver.ts:1967 ADR line 19 ROTTED formatInput now at :2243 (+276)
    ADR-0053 → sql-driver.ts:1543 ADR line 21 ROTTED throw err; — the end of an error builder
    ADR-0028 → sql-driver.ts:610 ADR line 68 ROTTED err.status = 400;; StorageNameMapping now at :65

    ⚠️ Known recall gap, measured rather than hidden: 52 CONTINUATION anchors. The primary pattern cannot see a bare :NNN or ,NNN that 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:

    1. Mechanical. For each anchor, take the distinctive symbols the ADR's own sentence names (backticked identifiers only), ⛔ excluding tokens that come from the anchor's own path — otherwise every anchor "resolves" on the word 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.
    2. Hand. The mechanical pass abstains whenever the ADR sentence names no testable symbol — 136 of 343. I read all 136 (ADR sentence vs cited region) rather than reporting them as a black box. It also cannot be trusted blind: I validated it against 24 anchors I had already read by hand and iterated until it reached 0 mismatches (20 agreements, 4 honest abstentions). An earlier version was wrong in both directions and is not what produced these numbers.

    ⭐ 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:

    ⚠️ One live snag inside that: ADR-0119 refutes with "There is no Turso driver here — only docs/design/driver-turso.md (Status: Proposal)". On 83be4601, packages/drivers/driver-turso/src/turso-driver.ts does exist. The refutation has itself gone stale. Recording only.

    EXTERNAL (2) — ADR-0065 cites packages/sdks/src/types/builder-block.ts:42 and packages/sdks/src/constants/device-sizes.ts:34, both explicitly labelled Builder.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

    • 11 anchors are CROSS-REPO, pointing from 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.
    • 172 of 343 anchors cite a BARE filename with no directory (registry.ts:13, engine.ts:441, protocol.ts:7380), and 72 more cite an abbreviated or since-moved path. registry.ts alone has four candidate files in this repo; plugin.ts has eleven. So a resolver is not a readFile — 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

  8. baozhoutao commented on Sep 1, 2026

    @baozhoutao
    Contributor

    Full per-anchor table — part 1 of 2 (ADR-0005 … ADR-0086)

    Census dated to origin/main 83be4601; objectui rows against 84ffdbcbb33762b5488742fb902faf45a3742e93.

    ⚠️ Read the 72.1% as a LOWER BOUND on rot. The mechanical RESOLVES test is permissive: it accepts a symbol appearing anywhere inside the cited range. That is right far more often than not, but it does pass a few anchors whose line merely mentions the term in unrelated prose — ADR-0020 line 39 → validation.zod.ts:105 is the clearest example in this table (line 105 says "a typo of transitions would be rejected", which is a comment about the union's typo-suggestion set, not the state_machine rule 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.

    ADR at ADR line anchor verdict evidence / true current location
    ADR-0005 80 packages/objectql/src/protocol.ts:357 ROTTED sys_metadata is not at 357 — it lives at line 334 (-23) → now at packages/metadata-protocol/src/protocol.ts:334 (note: the cited path itself no longer exists; protocol.ts moved package)
    ADR-0005 333 packages/rest/src/rest-server.ts:973-979 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0015 19 packages/spec/src/data/object.zod.ts:432 ROTTED datasource is not at 432 — it lives at line 894 (+462)
    ADR-0015 389 packages/drivers/driver-sql/src/sql-driver.ts:1064 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0016 45 ResourceEditPage.tsx:733 (objectui) ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0019 30 spec/contracts/approval-service.ts:11 ROTTED none of the symbols the ADR names (IWorkflowService) appear anywhere in the cited file — the mechanism has left this file
    ADR-0019 71 plugin-approvals/src/approval-service.ts:175 ROTTED sys_team is not at 175 — it lives at line 429 (+254)
    ADR-0020 37 metadata-type-schemas.ts:85 ROTTED workflow is not at 85 — it lives at line 120 (+35)
    ADR-0020 37 metadata-plugin.zod.ts:90 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0020 37 metadata-plugin.zod.ts:612 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0020 38 object.zod.ts:534 ROTTED stateMachines is not at 534 — it lives at line 2056 (+1522)
    ADR-0020 39 validation.zod.ts:105 RESOLVES ⚠️ permissive pass — see the caveat above; hand-reading says ROTTED
    ADR-0020 43 packages/spec/src/contracts/workflow-service.ts:58 HISTORICAL the ADR itself annotates it "unlinked: the contract file was deleted on 2026-08-01 by #4451 / #4473"
    ADR-0020 48 examples/app-crm/src/workflows/stale-opportunity.workflow.ts:19 HISTORICAL the ADR itself annotates it "unlinked — removed by this record's own implementation"
    ADR-0020 52 engine.ts:1850 ROTTED state_machine is not at 1850 — it lives at line 1890 (+40)
    ADR-0020 87 validation.zod.ts:362 ROTTED conditional is not at 362 — it lives at line 366 (+4)
    ADR-0021 14 query.zod.ts:586 ROTTED QuerySchema is not at 586 — it lives at line 593 (+7)
    ADR-0021 360 engine.ts:2077 ROTTED analytics is not at 2077 — it lives at line 1990 (-87)
    ADR-0028 66 spec/src/stack.zod.ts:459 ROTTED validateNamespacePrefix is not at 459 — it lives at line 827 (+368)
    ADR-0028 67 spec/src/kernel/manifest.zod.ts:28-76 ROTTED crm_account is not at 28 — it lives at line 182 (+154)
    ADR-0028 68 spec/src/system/constants/system-names.ts:169 ROTTED StorageNameMapping is not at 169 — it lives at line 268 (+99)
    ADR-0028 68 driver-sql/src/sql-driver.ts:610 ROTTED ⭐ card's sample — hand-read: err.status = 400;; StorageNameMapping now at :65
    ADR-0028 70 objectql/src/registry.ts:406-518 ROTTED priority is not at 406 — it lives at line 259 (-147)
    ADR-0028 70 object.zod.ts:856-897 ROTTED priority is not at 856 — it lives at line 2085 (+1229)
    ADR-0028 71 services/service-automation/src/engine.ts:441 ROTTED replaced is not at 441 — it lives at line 1954 (+1513)
    ADR-0028 73 objectql/src/registry.ts:13 ROTTED RESERVED_NAMESPACES is not at 13 — it lives at line 45 (+32)
    ADR-0028 75 manifest.zod.ts:66-70 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0028 243 engine.ts:441 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 55 plugin-auth/src/manifest.ts:58-67 ROTTED platform is not at 58 — it lives at line 42 (-16)
    ADR-0029 56 objectql/src/registry.ts:346-389 ROTTED namespaceRegistry is not at 346 — it lives at line 1456 (+1110)
    ADR-0029 57 objectql/src/registry.ts:406-518 ROTTED priority is not at 406 — it lives at line 259 (-147)
    ADR-0029 57 object.zod.ts:856-897 ROTTED priority is not at 856 — it lives at line 2085 (+1229)
    ADR-0029 59 registry.ts:13 ROTTED RESERVED_NAMESPACES is not at 13 — it lives at line 45 (+32)
    ADR-0029 59 manifest.zod.ts:66-70 ROTTED RESERVED_NAMESPACES appears nowhere in the cited file — the mechanism has left this file
    ADR-0029 60 manifest.zod.ts:133 ROTTED platform is not at 133 — it lives at line 185 (+52)
    ADR-0029 60 object.zod.ts:354-385 ROTTED platform is not at 354 — it lives at line 412 (+58)
    ADR-0029 353 packages/objectql/src/registry.ts:38-44 ROTTED registerObject is not at 38 — it lives at line 84 (+46)
    ADR-0029 355 packages/spec/src/data/object.zod.ts:2435 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 362 packages/metadata-protocol/src/protocol.ts:7897-7911 ROTTED applyObjectRegistryMutation is not at 7897 — it lives at line 8020 (+123)
    ADR-0029 363 packages/metadata-protocol/src/protocol.ts:11670-11673 ROTTED loadMetaFromDb is not at 11670 — it lives at line 12032 (+362)
    ADR-0029 366 registry.ts:1157-1160 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 378 protocol.ts:7535-7540 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 379 registry.ts:1727-1733 ROTTED _provenance is not at 1727 — it lives at line 1782 (+55)
    ADR-0029 384 protocol.ts:8460-8472 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 386 packages/spec/src/kernel/metadata-plugin.zod.ts:628 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 388 protocol.ts:8259-8272 ROTTED restoreArtifactRegistryView is not at 8259 — it lives at line 13444 (+5185)
    ADR-0029 395 protocol.ts:7906-7910 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 437 packages/objectql/src/engine.ts:2920 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 438 engine.ts:2956 ROTTED objectExtensions is not at 2956 — it lives at line 4798 (+1842)
    ADR-0029 443 object.zod.ts:1385-1392 ROTTED ownership is not at 1385 — it lives at line 1685 (+300)
    ADR-0029 451 registry.ts:1206-1234 ROTTED resolveObject is not at 1206 — it lives at line 1359 (+153)
    ADR-0029 466 registry.ts:86-108 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 547 engine.ts:2944 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 605 protocol.ts:7380 ROTTED OS_METADATA_WRITABLE is not at 7380 — it lives at line 5715 (-1665)
    ADR-0029 651 packages/objectql/src/plugin.ts:688-693 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 665 protocol.ts:11706-11708 ROTTED saveMetaItem is not at 11706 — it lives at line 11723 (+17)
    ADR-0029 708 registry.ts:1075 ROTTED DEFAULT_OVERLAY_PRIORITY is not at 1075 — it lives at line 1576 (+501)
    ADR-0029 709 registry.ts:1116-1130 ROTTED nameField is not at 1116 — it lives at line 1610 (+494)
    ADR-0029 721 spec/data/object.zod.ts:2435 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 722 protocol.ts:7897-7911 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 723 objectql/src/plugin.ts:688 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0029 725 packages/objectql/src/index.ts:28 ROTTED ObjectContributor is not at 28 — it lives at line 44 (+16)
    ADR-0029 726 core.ts:24 ROTTED objectui appears nowhere in the cited file — the mechanism has left this file
    ADR-0029 772 plugin.ts:688 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0032 43 spec/shared/expression.zod.ts:84 ROTTED ExpressionInputSchema is not at 84 — it lives at line 99 (+15)
    ADR-0032 44 automation/flow.zod.ts:212-214 RESOLVES FlowSchema is present inside the cited range
    ADR-0032 84 flow.zod.ts:212-214 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0032 126 shared/expression.zod.ts:84 ROTTED Template is not at 84 — it lives at line 117 (+33)
    ADR-0049 3 permission-evaluator.ts:37 ROTTED DESTRUCTIVE_OPERATIONS is not at 37 — it lives at line 46 (+9)
    ADR-0049 38 permission-evaluator.ts:35 ROTTED permKey is not at 35 — it lives at line 208 (+173)
    ADR-0049 49 security-plugin.ts:326 ROTTED SecurityPlugin is not at 326 — it lives at line 313 (-13)
    ADR-0049 52 permission-evaluator.ts:8-16 ROTTED OPERATION_TO_PERMISSION is not at 8 — it lives at line 23 (+15)
    ADR-0049 55 permission.zod.ts:28-30 ROTTED allowTransfer is not at 28 — it lives at line 62 (+34)
    ADR-0052 19 packages/plugins/plugin-audit/src/audit-plugin.ts:40 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0052 74 packages/plugins/plugin-audit/src/audit-writers.ts:328-329 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0052 82 audit-writers.ts:43-45 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0052 91 packages/plugins/plugin-audit/src/audit-plugin.ts:6-11 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0052 105 audit-plugin.ts:96-99 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0052 107 audit-writers.test.ts:9 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0052 158 sys-audit-log.object.ts:22 RESOLVES hand-read: managedBy: 'append-only' — the immutability claim
    ADR-0053 19 sql-driver.ts:1967 ROTTED ⭐ card's sample — formatInput is not at 1967; it lives at line 2243 (+276)
    ADR-0053 21 sql-driver.ts:1543 ROTTED ⭐ card's sample — hand-read: throw err;, the end of an error builder
    ADR-0053 30 stdlib.ts:36 ROTTED addDaysUtc is not at 36 — it lives at line 71 (+35)
    ADR-0053 31 stdlib.ts:19 ROTTED startOfDayUtc is not at 19 — it lives at line 50 (+31)
    ADR-0053 57 sql-driver.ts:1816 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0053 60 sql-driver.ts:1543-1554 ROTTED coerceFilterValue is not at 1543 — it lives at line 481 (-1062)
    ADR-0053 110 sql-driver.ts:1500 ROTTED datetimeFields is not at 1500 — it lives at line 4117 (+2617)
    ADR-0053 354 native-sql-strategy.ts:385-425 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0053 356 filter-normalizer.ts:127-140 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0053 376 native-sql-strategy.ts:371 ROTTED dateRange is not at 371 — it lives at line 497 (+126)
    ADR-0055 22 security-plugin.ts:481-495 ROTTED opCtx is not at 481 — it lives at line 1592 (+1111)
    ADR-0055 22 security-plugin.ts:753-788 ROTTED opCtx is not at 753 — it lives at line 1592 (+839)
    ADR-0055 23 execution-context.zod.ts:74-91 RESOLVES current_user is present inside the cited range
    ADR-0055 23 rls-compiler.ts:79-99 RESOLVES current_user is present inside the cited range
    ADR-0055 24 security-plugin.ts:341-400 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0055 25 sharing-service.ts:53-62 ROTTED controlled_by_parent is not at 53 — it lives at line 83 (+30)
    ADR-0055 26 field.zod.ts:386-400 ROTTED master_detail is not at 386 — it lives at line 408 (+22)
    ADR-0055 50 rls-compiler.ts:129-138 ROTTED masterFK appears nowhere in the cited file — the mechanism has left this file
    ADR-0056 67 team-graph.ts:27 ROTTED none of expandRecipient / role_and_subordinates / experimental appear in the cited file
    ADR-0056 119 sharing-rule-service.ts:253 ROTTED expandRecipient is not at 253 — it lives at line 668 (+415)
    ADR-0056 119 department-graph.ts:32 DEAD PATH cited path resolves to no file in objectstack or objectui
    ADR-0057 72 packages/platform-objects/src/identity/sys-member.object.ts:152 ROTTED managedBy is not at 152 — it lives at line 20 (-132)
    ADR-0057 77 packages/plugins/plugin-security/src/rls-compiler.ts:126 ROTTED ExecutionContext is not at 126 — it lives at line 60 (-66)
    ADR-0057 79 packages/runtime/src/security/resolve-execution-context.ts:260 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0057 103 packages/spec/src/security/permission.zod.ts:17 ROTTED ObjectPermissionSchema is not at 17 — it lives at line 29 (+12)
    ADR-0057 154 packages/plugins/plugin-sharing/src/team-graph.ts:94 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0057 168 packages/runtime/src/security/resolve-execution-context.ts:226 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0057 174 packages/plugins/plugin-auth/src/auth-manager.ts:657 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0057 185 packages/plugins/plugin-sharing/src/role-graph.ts:52 DEAD PATH cited path resolves to no file in objectstack or objectui
    ADR-0057 205 packages/plugins/plugin-sharing/src/sharing-plugin.ts:168 ROTTED bindRuleHooks is not at 168 — it lives at line 42 (-126)
    ADR-0057 210 packages/spec/src/security/sharing.zod.ts:97 ROTTED ENFORCED is not at 97 — it lives at line 202 (+105)
    ADR-0057 374 packages/platform-objects/src/apps/setup-nav.contributions.ts:48-55 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0057 429 setup-nav.contributions.ts:50 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0057 436 setup-nav.contributions.ts:52-53 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0057 446 sys-business-unit.object.ts:96 ROTTED sys_business_unit is not at 96 — it lives at line 90 (-6)
    ADR-0057 571 approval-service.ts:306 ROTTED sys_member is not at 306 — it lives at line 426 (+120)
    ADR-0057 572 approval-service.ts:380-389 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0057 575 role-graph.ts:100 DEAD PATH cited path resolves to no file in objectstack or objectui
    ADR-0057 575 team-graph.ts:144 ROTTED hand-read: line 144 is blank
    ADR-0057 576 team-graph.ts:70-80 RESOLVES sys_member is present inside the cited range
    ADR-0057 579 role-graph.ts:57 DEAD PATH cited path resolves to no file in objectstack or objectui
    ADR-0061 20 spec/.../query.zod.ts:454 ROTTED none of liveness / fullTextSearch / searchableFields appear in the cited file
    ADR-0061 27 rest-server.ts:3751 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0065 3 page.zod.ts:97 ROTTED validate is not at 97 — it lives at line 163 (+66)
    ADR-0065 23 apps/console/src/index.css:12-19 (objectui) ROTTED objectui appears nowhere in the cited file
    ADR-0065 65 packages/components/src/renderers/basic/elements.tsx:87 (objectui) RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0065 96 packages/sdks/src/types/builder-block.ts:42 EXTERNAL explicitly labelled "Builder.io SDK:" — a third-party repository, unresolvable and unwatchable from here
    ADR-0065 100 packages/sdks/src/constants/device-sizes.ts:34 EXTERNAL explicitly labelled "Builder.io SDK:" — a third-party repository
    ADR-0070 43 metadata-tools.ts:268-328 DEAD PATH cited path resolves to no file in objectstack or objectui
    ADR-0070 43 metadata-tools.ts:319 DEAD PATH cited path resolves to no file in objectstack or objectui
    ADR-0070 71 metadata-tools.ts:304 DEAD PATH cited path resolves to no file in objectstack or objectui
    ADR-0072 39 packages/services/service-automation/src/engine.ts:946-964 ROTTED $runId is not at 946 — it lives at line 982 (+36)
    ADR-0072 53 service-automation/src/engine.ts:946-964 ROTTED $runId is not at 946 — it lives at line 982 (+36)
    ADR-0072 54 objectql/src/engine.ts:119 ROTTED timezone is not at 119 — it lives at line 363 (+244)
    ADR-0072 55 objectql/src/validation/rule-validator.ts:289 ROTTED previous is not at 289 — it lives at line 284 (-5)
    ADR-0072 56 objectql/src/validation/rule-validator.ts:178-190 RESOLVES readonlyWhen is present inside the cited range
    ADR-0072 57 objectql/src/hook-wrappers.ts:84 ROTTED condition is not at 84 — it lives at line 100 (+16)
    ADR-0072 58 plugin-security/src/rls-compiler.ts:259 ROTTED current_user is not at 259 — it lives at line 284 (+25)
    ADR-0072 59 plugin-sharing/src/bootstrap-declared-sharing-rules.ts:61 ROTTED condition is not at 61 — it lives at line 20 (-41)
    ADR-0072 60 cel-engine.ts:52-62 ROTTED features is not at 52 — it lives at line 100 (+48)
    ADR-0072 68 packages/spec/src/automation/flow.zod.ts:129-132 ROTTED description is not at 129 — it lives at line 358 (+229)
    ADR-0079 76 packages/lint/src/validate-record-title.ts:92 RESOLVES hand-read: the quoted text is present at the cited line
    ADR-0079 101 packages/spec/src/data/display-name.ts:6-8 RESOLVES hand-read: the blockquote matches the cited region
    ADR-0079 111 packages/spec/src/data/object.zod.ts:2082-2095 ROTTED normalizeNameFieldAlias is not at 2082 — it lives at line 2656 (+574)
    ADR-0079 116 object.zod.ts:2084-2085 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0079 118 object.zod.ts:1698 ROTTED nameField is not at 1698 — it lives at line 1533 (-165)
    ADR-0079 124 docs/adr/0085-object-semantic-roles-over-surface-hint-blocks.md:57 RESOLVES hand-read: doc-to-doc anchor, the cited line is the quoted passage
    ADR-0079 142 validate-record-title.ts:91-96 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0079 143 content/docs/data-modeling/formulas.mdx:94-102 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0079 164 packages/objectql/src/engine.ts:5212 ROTTED nameField is not at 5212 — it lives at line 8760 (+3548)
    ADR-0079 167 packages/metadata-protocol/src/protocol.ts:4793 ROTTED hand-read: the quoted sentence is not at the cited line
    ADR-0079 187 display-name.ts:71-72 RESOLVES hand-read: the quoted text is present at the cited region
    ADR-0079 190 display-name.ts:66-68 RESOLVES hand-read: the quoted text is present at the cited region
    ADR-0079 196 display-name.ts:13-14 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0079 204 packages/objectql/src/registry.ts:1079-1090 RESOLVES hand-read: warnFunctionalCompleteness is the cited region
    ADR-0079 226 packages/lint/src/validate-record-title.ts:26-27 RESOLVES hand-read: the blockquote matches the cited region
    ADR-0079 231 validate-record-title.ts:12-14 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0079 231 packages/lint/src/authoring-rules.ts:668-678 ROTTED hand-read: the cited region is about view writes, not record titles
    ADR-0079 237 packages/lint/src/data-model-rules.ts:404-409 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0079 256 packages/spec/src/data/search-fields.ts:75-92 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0079 261 packages/objectql/src/search-companion.ts:19 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0079 286 object.zod.ts:1684-1685 ROTTED hand-read: the quoted sentence is not at the cited region
    ADR-0079 306 model-rules.ts:36 DEAD PATH cited path resolves to no file in objectstack or objectui
    ADR-0080 10 packages/core/src/registry/Registry.ts:13 (objectui) ROTTED ComponentInput is not at 13 — it lives at line 60 (+47)
    ADR-0080 20 page.zod.ts:85 ROTTED properties is not at 85 — it lives at line 134 (+49)
    ADR-0080 36 packages/types/src/layout.ts:639 (objectui) RESOLVES className is present inside the cited range
    ADR-0080 87 layout.ts:639 (objectui) ROTTED BaseSchema is not at 639 — it lives at line 658 (+19)
    ADR-0086 57 StudioDesignSurface.tsx:589 (objectui) ROTTED packageId is not at 589 — it lives at line 599 (+10)
    ADR-0086 58 PermissionMatrixEditor.tsx:171 (objectui) ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0086 71 plugin-security/objects/sys-permission-set.object.ts:20 ROTTED PermissionSetSchema appears nowhere in the cited file
    ADR-0086 72 spec/security/permission.zod.ts:108 ROTTED packageId is not at 108 — it lives at line 520 (+412)
    ADR-0086 78 manifest.zod.ts:142-179 RESOLVES hand-read: the cited region shows the mechanism the ADR names

    (part 2 follows)


    Generated by Claude Code

  9. baozhoutao commented on Sep 1, 2026

    @baozhoutao
    Contributor

    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.

    ADR at ADR line anchor verdict evidence / true current location
    ADR-0086 81 permission-evaluator.ts:64-101 RESOLVES hand-read: OPERATION_TO_PERMISSION lookup is the cited region
    ADR-0086 82 core/security/resolve-authz-context.ts:84-252 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0086 84 bootstrap-declared-roles.ts:61 DEAD PATH cited path resolves to no file in objectstack or objectui
    ADR-0086 86 stack.zod.ts:235 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0086 87 manifest.zod.ts:264 ROTTED permissions is not at 264 — it lives at line 290 (+26)
    ADR-0086 93 metadata-persistence.zod.ts:72 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0086 94 object.zod.ts:408 ROTTED platform is not at 408 — it lives at line 412 (+4)
    ADR-0086 206 MePermissionsProvider.tsx:56 (objectui) ROTTED hand-read: line 56 is a bare }
    ADR-0086 214 plugin-security/security-plugin.ts:719 ROTTED permissions is not at 719 — it lives at line 755 (+36)
    ADR-0086 341 spec/stack.zod.ts:235 ROTTED permission is not at 235 — it lives at line 225 (-10)
    ADR-0086 342 spec/system/metadata-persistence.zod.ts:72 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0086 342 spec/data/object.zod.ts:408 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0086 343 spec/kernel/manifest.zod.ts:142-179 ROTTED declared is not at 142 — it lives at line 98 (-44)
    ADR-0086 348 permissions/MePermissionsProvider.tsx:56 (objectui) ROTTED hand-read: line 56 is a bare }
    ADR-0086 376 spec/security/permission.zod.ts:167 ROTTED managedBy is not at 167 — it lives at line 516 (+349)
    ADR-0086 376 sys-permission-set.object.ts:217-266 ROTTED managedBy is not at 217 — it lives at line 40 (-177)
    ADR-0089 18 packages/spec/src/data/field.zod.ts:592 ROTTED visibleWhen is not at 592 — it lives at line 834 (+242)
    ADR-0089 19 packages/spec/src/ui/view.zod.ts:762 ROTTED visibleOn is not at 762 — it lives at line 2339 (+1577)
    ADR-0089 20 packages/spec/src/ui/page.zod.ts:109 ROTTED visibility is not at 109 — it lives at line 200 (+91)
    ADR-0089 35 field.zod.ts:594-598 ROTTED requiredWhen is not at 594 — it lives at line 801 (+207)
    ADR-0089 41 field.zod.ts:592-594 ROTTED hand-read: the cited region is UniqueScopeSchema, not the conditional-rule triad
    ADR-0089 61 packages/objectql/src/validation/rule-validator.ts:378 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0089 74 content/docs/protocol/objectui/layout-dsl.mdx:796-798 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0089 86 object.zod.ts:227-230 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0089 131 view.zod.ts:276 ROTTED hand-read: the cited region is about two-element range operators
    ADR-0096 179 plugin-security/security-plugin.ts:626 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0096 180 plugin-security/security-plugin.ts:1689 ROTTED getReadFilter is not at 1689 — it lives at line 1778 (+89)
    ADR-0096 182 rest/rest-server.ts:4317 RESOLVES enforceAuth is present inside the cited range
    ADR-0096 183 runtime/http-dispatcher.ts:4231 ROTTED ⚠️ cited line 4231 is past EOF — the file has 2,390 lines
    ADR-0096 184 runtime/sandbox/body-runner.ts:155 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0096 185 mcp/mcp-server-runtime.ts:335 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0096 187 http-dispatcher.ts:1322 ROTTED hand-read: line 1322 is a bare }
    ADR-0096 187 plugin-webhooks/auto-enqueuer.ts:175 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0096 187 objectql/engine.ts:722 ROTTED visibleWhen is not at 722 — it lives at line 3465 (+2743)
    ADR-0096 194 report-service.ts:425 RESOLVES isSystem is present inside the cited range
    ADR-0096 195 knowledge-service.ts:312 RESOLVES applyPermissionFilter is present inside the cited range
    ADR-0096 203 objectql/engine.ts:641 ROTTED executeAction is not at 641 — it lives at line 3106 (+2465)
    ADR-0096 204 objectql/engine.ts:2793 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0096 205 objectql/engine.ts:2956 ROTTED getDriverByName is not at 2956 — it lives at line 13254 (+10298)
    ADR-0096 206 sharing-plugin.ts:391 ROTTED deleteMany appears nowhere in the cited file — the mechanism has left this file
    ADR-0096 206 security-plugin.ts:821 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0096 210 runtime/http-dispatcher.ts:1488 ROTTED realtime is not at 1488 — it lives at line 1477 (-11)
    ADR-0099 68 security-plugin.ts:2390 ROTTED manage_metadata is not at 2390 — it lives at line 160 (-2230)
    ADR-0099 73 security-plugin.ts:71-77 ROTTED hand-read: the cited region is an import block
    ADR-0099 198 sharing.zod.ts:104 ROTTED enforced is not at 104 — it lives at line 84 (-20)
    ADR-0099 317 packages/plugins/plugin-security/src/security-plugin.ts:2390 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0099 322 packages/spec/src/security/sharing.zod.ts:104 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0104 55 field.zod.ts:151 ROTTED currency is not at 151 — it lives at line 57 (-94)
    ADR-0104 58 field.zod.ts:121 ROTTED LocationCoordinatesSchema is not at 121 — it lives at line 316 (+195)
    ADR-0104 77 http-dispatcher.ts:3882 ROTTED ⚠️ cited line 3882 is past EOF — the file has 2,390 lines
    ADR-0104 78 script-runner.ts:60 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0104 79 objectql/src/engine.ts:678 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0104 82 examples/app-todo/src/actions/task.handlers.ts:63 ROTTED required is not at 63 — it lives at line 40 (-23)
    ADR-0104 88 sql-driver.ts:59 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0104 92 attachment-lifecycle.ts:27-29 ROTTED sys_attachment is not at 27 — it lives at line 14 (-13)
    ADR-0104 99 storage-routes.ts:231-241 ROTTED complete is not at 231 — it lives at line 210 (-21)
    ADR-0104 134 engine.ts:2092-2098 ROTTED hand-read: the cited region is generateEventUuid, not the $expand overwrite
    ADR-0104 182 http-dispatcher.ts:3797 ROTTED ⚠️ cited line 3797 is past EOF — the file has 2,390 lines
    ADR-0104 323 http-dispatcher.ts:3944 ROTTED ⚠️ cited line 3944 is past EOF — the file has 2,390 lines
    ADR-0105 71 plugin-security/src/tenant-layer.ts:87 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0105 80 core/src/security/resolve-authz-context.ts:125 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0105 81 plugin-approvals/src/approval-node.ts:118 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0105 82 approval-service.test.ts:263-265 ROTTED hand-read: the cited region is a DUPLICATE_REQUEST test
    ADR-0105 93 plugin-security/src/security-plugin.ts:2785-2791 ROTTED collectRLSPolicies is not at 2785 — it lives at line 2264 (-521)
    ADR-0105 102 plugin-security/src/objects/default-permission-sets.ts:150-160 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0105 111 spec/src/security/permission.zod.ts:282 ROTTED PermissionSet is not at 282 — it lives at line 382 (+100)
    ADR-0105 113 spec/src/kernel/execution-context.zod.ts:165 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0105 114 plugin-security/src/rls-compiler.ts:164-177 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0105 167 tenant-layer.ts:103 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0105 190 tenant-layer.ts:54 ROTTED hand-read: line 54 is a bare */
    ADR-0105 198 spec/src/data/object.zod.ts:240-256 ROTTED hand-read: the cited region is trackHistory / searchable
    ADR-0105 217 plugin-sharing/src/business-unit-graph.ts:174-177 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0105 314 rls-compiler.ts:164-177 ROTTED accessible_org_ids appears nowhere in the cited file
    ADR-0112 30 packages/spec/src/api/errors.zod.ts:51 RESOLVES StandardErrorCode is present inside the cited range
    ADR-0112 32 http-dispatcher.ts:1424 ROTTED PERMISSION_DENIED is not at 1424 — it lives at line 2217 (+793)
    ADR-0112 34 packages/spec/src/api/contract.zod.ts:12 RESOLVES ApiErrorSchema is present inside the cited range
    ADR-0112 43 http-dispatcher.ts:475-484 ROTTED VALIDATION_FAILED appears nowhere in the cited file
    ADR-0112 44 http-dispatcher.ts:530-541 ROTTED hand-read: the cited region is identity resolution, not the 404/405 paths
    ADR-0112 44 dispatcher-plugin.ts:340-349 ROTTED hand-read: the cited region is a headers helper
    ADR-0112 46 packages/client/src/index.ts:4455-4459 ROTTED VALIDATION_FAILED is not at 4455 — it lives at line 4661 (+206)
    ADR-0112 50 packages/app-shell/src/views/RecordAttachmentsPanel.tsx:103-108 (objectui) ROTTED AUTH_REQUIRED is not at 103 — it lives at line 88 (-15)
    ADR-0112 57 packages/runtime/src/domains/automation.ts:240 ROTTED forbidden is not at 240 — it lives at line 1643 (+1403)
    ADR-0112 57 packages/metadata-protocol/src/protocol.ts:4353 ROTTED automation is not at 4353 — it lives at line 4370 (+17)
    ADR-0112 77 packages/rest/src/rest-server.ts:89-96 ROTTED required is not at 89 — it lives at line 75 (-14)
    ADR-0112 104 client/src/index.ts:12 RESOLVES StandardErrorCode is present inside the cited range
    ADR-0112 124 packages/cloud-connection/src/cloud-connection-plugin.ts:382 RESOLVES declaredCode is present inside the cited range
    ADR-0112 166 docs/audits/2026-06-handwritten-docs-accuracy-followups.md:230 RESOLVES hand-read: doc-to-doc anchor; the casing-drift entry is at the cited line
    ADR-0112 170 api/errors.zod.ts:29-39 RESOLVES ErrorCategory is present inside the cited range
    ADR-0112 170 integration/connector.zod.ts:409-420 RESOLVES RetryStrategy is present inside the cited range
    ADR-0112 170 client/src/index.ts:4473-4475 ROTTED ErrorCategory is not at 4473 — it lives at line 6467 (+1994)
    ADR-0112 206 http-dispatcher.ts:475 ROTTED neither category nor retryable appears in the cited file
    ADR-0113 19 driver-sql/sql-driver.ts:4901 ROTTED ⭐ card's sample — required is not at 4901; the mechanism is at :15565 and now keys off storage.notNull, not required
    ADR-0113 20 driver-sql/schema-drift.ts:249-277 ROTTED destructive is not at 249 — it lives at line 156 (-93)
    ADR-0113 47 sql-driver.ts:4901 ROTTED ⭐ card's sample (the prose repeat) — hand-read: connect-timeout/dialect prose
    ADR-0113 130 schema-drift.ts:249 ROTTED hand-read: the cited region is nullSafeColumns
    ADR-0117 25 registry.ts:305-313 ROTTED organization_id is not at 305 — it lives at line 280 (-25)
    ADR-0117 31 packages/plugins/plugin-sharing/src/sharing-service.ts:47 ROTTED owner_id is not at 47 — it lives at line 69 (+22)
    ADR-0117 47 packages/spec/src/data/object.zod.ts:818 ROTTED ownership is not at 818 — it lives at line 1685 (+867)
    ADR-0117 55 packages/spec/src/data/object.zod.ts:800-823 ROTTED ownership is not at 800 — it lives at line 1685 (+885)
    ADR-0117 57 packages/platform-objects/src/identity/sys-business-unit.object.ts:127 RESOLVES hand-read: the Hierarchy block is at the cited line
    ADR-0117 58 packages/platform-objects/src/identity/sys-user.object.ts:690 ROTTED projection is not at 690 — it lives at line 750 (+60)
    ADR-0117 124 packages/spec/src/contracts/sharing-service.ts:315-320 RESOLVES hand-read: the quoted block matches the cited region
    ADR-0117 138 sharing-service.ts:47 ROTTED OWNER_FIELD is not at 47 — it lives at line 75 (+28)
    ADR-0118 24 packages/metadata-core/src/objects/sys-metadata-history.object.ts:156 ROTTED sys_user is not at 156 — it lives at line 161 (+5)
    ADR-0118 24 packages/metadata-protocol/src/sys-metadata-repository.ts:423 RESOLVES sys_metadata_history is present inside the cited range
    ADR-0118 25 packages/spec/src/contracts/ai-service.ts:394-404 RESOLVES ToolExecutionContext is present inside the cited range
    ADR-0118 27 packages/objectql/src/lifecycle/lifecycle-service.ts:39 ROTTED isSystem is not at 39 — it lives at line 61 (+22)
    ADR-0118 46 packages/spec/src/data/object.zod.ts:824-831 ROTTED hand-read: the cited region is the duration-literal doc
    ADR-0118 70 ai-service.ts:394-404 RESOLVES hand-read: the "Identity semantics (fail-closed)" block is at the cited region
    ADR-0119 29 packages/objectql/src/engine.ts:4934-4973 ROTTED transaction is not at 4934 — it lives at line 3864 (-1070)
    ADR-0119 31 turso-driver.ts:764-776 HISTORICAL the ADR is QUOTING an issue's citation in order to refute it
    ADR-0119 31 remote-transport.ts:430-443 HISTORICAL same quoted-to-refute citation, same line
    ADR-0119 34 packages/spec/src/contracts/data-driver.ts:221-235 ROTTED beginTransaction is not at 221 — it lives at line 281 (+60)
    ADR-0119 34 sql-driver.ts:2214 ROTTED hand-read: the cited region does not show what the ADR sentence claims
    ADR-0119 40 packages/metadata-protocol/src/protocol.ts:2289 ROTTED discovery is not at 2289 — it lives at line 3425 (+1136)
    ADR-0119 46 packages/mcp/src/mcp-http-tools.ts:48-81 RESOLVES McpDataBridge is present inside the cited range
    ADR-0119 53 memory-driver.ts:595-630 ROTTED beginTransaction is not at 595 — it lives at line 1030 (+435)
    ADR-0119 54 engine.ts:4950 ROTTED transaction is not at 4950 — it lives at line 3864 (-1086)
    ADR-0119 61 packages/spec/src/contracts/data-engine.ts:97-100 ROTTED IDataEngine is not at 97 — it lives at line 172 (+75)
    ADR-0119 61 packages/spec/src/data/data-engine.zod.ts:706-717 ROTTED IDataEngine is not at 706 — it lives at line 759 (+53)
    ADR-0119 61 contracts/data-engine.test.ts:162-177 ROTTED IDataEngine is not at 162 — it lives at line 154 (-8)
    ADR-0119 63 packages/metadata-protocol/src/protocol.ts:5220-5323 ROTTED batchData is not at 5220 — it lives at line 2689 (-2531)
    ADR-0119 74 packages/spec/src/api/batch.zod.ts:62 RESOLVES BatchOptionsSchema is present inside the cited range
    ADR-0119 90 engine.ts:4952-4954 ROTTED transaction is not at 4952 — it lives at line 3864 (-1088)
    ADR-0119 118 rest-server.ts:7166-7171 ROTTED NOT_IMPLEMENTED is not at 7166 — it lives at line 7094 (-72)
    ADR-0119 136 packages/rest/src/import-runner.ts:48-59 ROTTED ImportUndoLog is not at 48 — it lives at line 78 (+30)
    ADR-0119 136 protocol.ts:7400-7424 ROTTED ImportUndoLog appears nowhere in the cited file
    ADR-0126 77 packages/spec/src/kernel/metadata-plugin.zod.ts:654 ROTTED hand-read: line 654 is /** Plugin description */
    ADR-0126 79 packages/metadata-protocol/src/protocol.ts:13227-13260 ROTTED hand-read: the cited region does not show the three-tier split the ADR claims
    ADR-0126 90 packages/metadata-core/src/meta-write-org-scope.ts:16-24 RESOLVES hand-read: the phantom-write defect is described at the cited region
    ADR-0126 94 permission-set-projection.ts:1128-1145 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0126 95 packages/spec/src/data/object.zod.ts:2920 ROTTED objectExtensions is not at 2920 — it lives at line 2996 (+76)
    ADR-0126 118 content/docs/capabilities/integrations.mdx:17 RESOLVES hand-read: the quoted sentence is at the cited line
    ADR-0126 120 content/docs/build-without-code.mdx:37 ROTTED hand-read: the quoted phrase is not at the cited line
    ADR-0126 280 metadata-manager.ts:45 ROTTED ⚠️ permissive pass on objectstack; hand-reading says ROTTED — line 45 imports getMetadataTypeActions, not the MetadataOverlay type the ADR names
    ADR-0126 351 security-plugin.ts:974 ROTTED nav_permission_sets is not at 974 — it lives at line 1084 (+110)
    ADR-0126 352 studio.app.ts:234-239 RESOLVES hand-read: the nav_flows entry is at the cited region
    ADR-0127 114 packages/plugins/plugin-auth/src/auth-manager.ts:1403-1421 RESOLVES secondaryStorage is present inside the cited range
    ADR-0127 149 packages/plugins/plugin-auth/src/secondary-storage.ts:47-49 RESOLVES hand-read: the ADR quotes this region verbatim and the quote still matches
    ADR-0127 151 session-of-record.test.ts:410 RESOLVES cacheSecondaryStorage is present inside the cited range
    ADR-0127 151 session-of-record.test.ts:528 RESOLVES secondaryStorage is present inside the cited range
    ADR-0127 151 secondary-storage.ts:87-89 RESOLVES rateLimit is present inside the cited range
    ADR-0127 152 auth-manager.ts:1382-1438 RESOLVES cookieCache is present inside the cited range
    ADR-0127 152 session-of-record.test.ts:479 RESOLVES cookieCache is present inside the cited range
    ADR-0130 55 packages/objectql/src/registry.ts:1456 RESOLVES hand-read: namespaceRegistry declaration is at the cited line
    ADR-0130 56 packages/objectql/src/engine.ts:4746 RESOLVES registerApp is present inside the cited range
    ADR-0130 57 registry.ts:2679 RESOLVES unregisterObjectsByPackage is present inside the cited range
    ADR-0130 59 registry.ts:3583 RESOLVES the getNamespaceOwners conflict gate is at the cited line
    ADR-0130 109 packages/spec/src/data/object.zod.ts:1779 RESOLVES hand-read: the cited region shows the mechanism the ADR names
    ADR-0130 127 packages/spec/src/stack.zod.ts:1759 RESOLVES the composeStacks manifest union is at the cited line
    ADR-0130 136 registry.ts:1540 RESOLVES getNamespaceOwners is present inside the cited range
    ADR-0130 139 registry.ts:3575 RESOLVES installPackage is present inside the cited range
    ADR-0130 140 packages/objectql/src/plugin.ts:405 RESOLVES registerApp is present inside the cited range
    ADR-0130 141 packages/spec/src/stack.zod.ts:854 RESOLVES validateSingleApp is present inside the cited range
    ADR-0130 142 registry.ts:45 RESOLVES hand-read: RESERVED_NAMESPACES = new Set(['base', 'system']) is at the cited line
    ADR-0130 142 registry.ts:1116 RESOLVES isShareableNamespace is present inside the cited range
    ADR-0130 143 packages/spec/src/stack.zod.ts:240 RESOLVES the singular optional manifest key is at the cited line
    ADR-0130 143 packages/cli/src/commands/compile.ts:271 RESOLVES hand-read: the safeParse call is at the cited line
    ADR-0130 143 packages/cli/src/commands/build.ts:6 RESOLVES hand-read: the "alias for compile" description is at the cited line
    ADR-0130 168 0048-cross-package-metadata-collision.md:459 RESOLVES doc-to-doc: the D2 heading is at the cited line
    ADR-0130 178 0019-app-as-consumer-unit.md:68 RESOLVES isConsumerInstallable is present inside the cited range
    ADR-0130 184 0019-app-as-consumer-unit.md:81 RESOLVES doc-to-doc: the quoted D4 heading is at the cited line
    ADR-0130 213 0048-cross-package-metadata-collision.md:20–23 RESOLVES doc-to-doc: the quoted passage is at the cited region
    ADR-0130 248 stack.zod.ts:240 RESOLVES the singular manifest key is at the cited line
    ADR-0130 260 packages/spec/src/kernel/manifest.zod.ts:70 RESOLVES hand-read: the protocol range key is at the cited line
    ADR-0130 287 packages/core/src/plugin-order.ts:66 RESOLVES hand-read: resolvePluginOrder is at the cited line
    ADR-0130 345 0048-cross-package-metadata-collision.md:459–463 RESOLVES doc-to-doc: the quoted D2 passage is at the cited region
    ADR-0130 411 stack.zod.ts:1759 ROTTED composeStacks is not at 1759 — it lives at line 1773 (+14)
    ADR-0130 471 objectql/src/engine.ts:4745 RESOLVES registerApp is present inside the cited range
    ADR-0130 482 registry.ts:1456 ROTTED installPackage is not at 1456 — it lives at line 1480 (+24)
    ADR-0130 484 plugin.ts:405 RESOLVES hand-read: ql.registerApp(manifest) is at the cited line

    End 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

  10. 13 remaining items

  11. baozhoutao commented on Sep 1, 2026

    @baozhoutao
    Contributor

    PM patch round 1 (devx seat, session session_01WLJQhde67SeTccsmnBVarV) — PR #14277 CI settled 36 green / 1 red on head 5b8f2d88, and the red is the PR's own: check-step-collectors --self-test fails 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 (cloud session_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-up os-dev-report-patch comment 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 checkBarePaths flag). 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-0020 stateMachines row) stays a recorded observation, no card.


    Generated by Claude Code

  12. claude commented on Sep 1, 2026

    @claude
    Contributor

    os-dev-report-patch

    Patch round from the devx PM poke. One commit, lint.yml only. PR #14277 remains a DRAFT (governed docs/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.mjs rather 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

  13. claude commented on Sep 1, 2026

    @claude
    Contributor

    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, is completed / success.

    head 1a6cb8e2e428a36581b4ee435ed8726541f76e6e (local HEAD == git ls-remote, tree clean)
    PR #14277 draft: true · auto_merge: null · mergeable_state: clean
    labels documentation, 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

  14. baozhoutao commented on Sep 1, 2026

    @baozhoutao
    Contributor

    PM review record (devx seat, session session_01WLJQhde67SeTccsmnBVarV) — PR #14277 is ready for its human gate:

    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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions