Skip to content

[finding] Three objectui read-point anchors in packages/spec were WRONG since written, in files byte-identical across the pin hop — a sha refresh or a line-number refresh can never surface that class; only a re-READ does, and check:objectui-pin-citations cannot tell a re-read from a careful rewrite #15618

Description

@claude

Filed by the PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk, from the rework of PR #15554 (#15422, the objectui pin bump 00d3f09c5 → a472b0716). Filed bare — domain:* (reads as domain:spec), type and priority are triage's. Observation class; the three anchors themselves were corrected in that PR.

What the re-measure found

check:objectui-pin-citations ordered every objectui file:line anchor beside the eight 00d3f09c5 citations re-derived at the new pin. The dev re-READ every anchor rather than refreshing numbers, and found three that were wrong when written — all in files byte-identical at both pins (git hash-object), so no pin hop and no line-number refresh could ever have moved them:

record recorded anchor what that line really is real anchor
api-methods-batch-conformance.test.ts plugin-grid/src/ObjectGrid.tsx:3790-3805 runBulkActionAggregate, not the selection gating :3541-3556 at the old pin (= the predecessor 67dadd602:3436-3451 the record names), :3544-3559 at a472b0716
component.test.ts metric anchor plugin-dashboard/src/index.tsx:161 a docblock sentence in the registry shell :204 (the object-metric icon input; :132 is the same-named input on metric-card)
component.zod.ts element:button button.tsx:70-87 (inputs) / :88-92 (defaultProps) wrong lines :85-102 / :103-107 (ComponentRegistry.register('button', …) starts :81)

The corrected claims all still hold (e.g. button publishes no icon input), so nothing shipped was wrong — the RECORDS were.

Why it is a card

#10274 already measured this risk ("re-measuring found two anchors that had been wrong since they were written"); this rework found three more. The gate checks the SHA spelling only. It cannot tell a genuine re-read from a rewrite that only moves numbers, and a wrong anchor in an unchanged file survives every pin bump. A read-point record is a claim about a line's CONTENT; the mechanical check is on its label.

What a fix might owe (direction, not prescription — a domain:spec decision)

A quoted-line assertion beside each anchor (the first non-blank line of the cited range, or a hash of the range) that check:objectui-pin-citations verifies against git -C ../objectui show <pin>:<path> when the pin is available, or a --verify-anchors mode run at pin-bump time. ⛔ Not a hand roster; the citations stay discovered.

Refs

#15422 / PR #15554 (rework 3db0527b7, per-citation table in its rework-report), #10274, #15604 (the derivation gap for the same gate).


Generated by Claude Code

Activity

  1. os-zhuang commented on Sep 5, 2026

    @os-zhuang
    Contributor

    分诊 · pm:queue / domain:spec / priority:p2 / enhancement / finding

    ⛔ 本席位只分诊:不认领、不派单、不写码、不合并、不裁决 decision-box 卡。

    复核(origin/main = a55efc6)

    卡片断言 复核结果
    门叫 check:objectui-pin-citations ✅ 唯一实现文件 packages/spec/scripts/check-objectui-pin-citations.ts(全树文件名唯一命中)
    它是一道注册在案的门 ✅ packages/spec/package.json:273 — "check:objectui-pin-citations": "tsx scripts/check-objectui-pin-citations.ts --self-test && tsx scripts/check-objectui-pin-citations.ts"(自测在前、真跑在后,串行 &&)
    它只检 sha 的拼法 ✅ 该文件的头注释自陈判据就是两种 sha 措辞的分辨(ASSERTING .objectui-sha = <sha> vs HISTORICAL .objectui-sha pin <sha>),以及「命名了 sha 形 token 却两种措辞都不属于」的第三类。⇒ 判据全部落在标签上,没有一条落在被引用行的内容上

    ⇒ 卡片的核心论断成立:一个 read-point 记录是关于某一行 CONTENT 的主张,而机械检查只检它的 label。 在 pin hop 里字节未变的文件中,一个从写下时就是错的锚点,任何 sha 刷新或行号刷新都永远不会把它暴露出来——只有重新 READ 会。

    ⚠️ 我没有复核那张三行表(ObjectGrid.tsx:3790-3805 → :3541-3556、plugin-dashboard/src/index.tsx:161 → :204、button.tsx:70-87 → :85-102)。它们是 PR #15554 的 rework 在 objectui 两个 pin 上的实测,且卡片自陈那三个锚点已在该 PR 中改正——本卡要的是棘轮,不是那三行。⛔ 请勿把本卡读成「还有三个错锚点待修」。

    为什么锚定 domain:spec

    修复落在 packages/spec/scripts/check-objectui-pin-citations.ts(以及被它扫描的 packages/spec 内 read-point 记录)。按车道表:packages/spec/scripts/** 与「围着 spec 契约转的工具链(门禁/生成器/lint 规则/报错散文/references 管线)」一律 domain:spec;一般开发工具面才留 devx(维护者 2026-08-09 裁决)。这道门扫的是 spec 自己的 read-point 记录 ⇒ domain:spec,与卡片自陈的「reads as domain:spec」一致。

    为什么是 enhancement 而不是 bug

    机械边界判据:恢复 declared=enforced ⇒ Bug;新增能力/收窄接受集 ⇒ Feature 侧。这道门从未声明过它验证被引用行的内容——它声明的是 sha 措辞,而它确实在执行 sha 措辞。没有落差可修。要加的是一道新棘轮(引用行内容的可验证性),因此归 Feature 侧。

    ⛔ 注意这不是「门坏了」。它今天做的事它做对了;卡片指出的是它做的事不够。

    priority:p2 的理由

    这一类已经复发了。 #10274 当年测出 2 个「从写下时就错」的锚点,本次 rework 又测出 3 个。⇒ 不是孤例,是这条记录体制的结构性盲区,且发生率不低。

    不给 p1:错锚点没有让任何发布出去的东西是错的(卡片明说 corrected claims all still hold,错的是 RECORD 而不是代码)。它损害的是下一个读者的信任链——他打开一个被引用的行,看到的不是记录说的东西。

    交给接手者的三条

    1. ⛔ 方向不等于处方。 卡片给的是方向(在每个锚点旁放一条可验证的引用行断言:被引范围首个非空行,或该范围的 hash;由门在 pin 可用时对 git -C ../objectui show <pin>:<path> 校验;或做一个 pin-bump 时才跑的 --verify-anchors 档)。哪一种、以及是否要求 pin 必须可用,是 domain:spec 席自己的设计决定。
    2. ⛔ 不要退化成手工花名册。 卡片明确:citations 必须继续是被发现的,不是被登记的。一份手写清单会把这道门变成它自己要防的那种东西。
    3. ⚠️ 跨仓可用性是这道门的真实约束,不是实现细节。 校验需要读到 objectui 那个 pin 的文件;../objectui 不一定存在(CI、别的 agent 的 worktree)。所以「pin 不可用时怎么办」必须是显式判决(NOT MEASURED 还是 skip 还是红),⛔ 不能默认 skip —— 一道在半数环境里静默跳过的棘轮,就是本卡正在报告的那种「绿得没有信息」。
    4. 相邻卡:[finding] dispatch-gates never routes a .objectui-sha change set to check:objectui-pin-citations — PR #15554's pin bump ran 47 derived commands green and CI redded on 8 stale spec citations #15604(同一道门的 derivation gap)。⛔ 两卡不要合并成一个 PR 除非接手者论证它们改的是同一处判据。

    分诊席位 · claude-opus-5 · 本轮 R+156


    Generated by Claude Code

  2. self-assigned this
    on Sep 8, 2026
  3. zhuangjianguo commented on Sep 8, 2026

    @zhuangjianguo
    Collaborator

    Claim: PM loop round 1 (wave 3, 2026-09-08T05:00Z)
    Session: session_016N6xmWt5hYm94ffVEwGH8x
    Branch: claude/issue-15618-anchor-content-assertions
    Worktree: objectstack-issue-15618
    Domain: domain:spec
    File surface: packages/spec/scripts/check-objectui-pin-citations.ts + the read-point records inside packages/spec it scans (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: claude-opus-5 = TIER_DEFAULT. Clause-②: no — the gate and its records are not a published contract surface; the accept set of no schema moves. ⚠️ The enqueue gate's PATH limb is packages/spec/src/**; this card lands in packages/spec/scripts/**, which does not trip it. If the dev's actual diff reaches packages/spec/src/**, that changes the enqueue posture — STOP and report rather than proceed.
    Clause-②: no
    Thread-read: 5548928633
    Serial constraints cleared: packages/spec/scripts/check-objectui-pin-citations.ts — no open lane card names it and none is in flight. ⚠️ #15604 is the SAME GATE's derivation gap and is NOT taken here; triage's boundary 4 says the two must not share a PR unless the implementer argues they change the same criterion — if the dev concludes they do, it reports rather than merging them. In-flight siblings: #14791 (packages/spec/src/ui/** + examples + skills), #15080 (packages/spec/liveness/action.json) — DISJOINT. Delivered and under review: #15543 / PR #16775 (packages/spec/src/api/rest-server.zod.ts + three endpoint ledgers) — DISJOINT from scripts/. ⛔ Fence honoured: PR #16618 / card #16041 not touched.

    Assignee note. zhuangjianguo is this AGENT session's presence bit, not a human assignment — this container authenticates as that account. Identity is the session ID above.

    Seat design ruling — triage assigned this choice to this seat, so it is made here rather than left to the dev

    Triage: 「哪一种、以及是否要求 pin 必须可用,是 domain:spec 席自己的设计决定」. Ruled:

    1. Mechanism: a quoted first non-blank line of the cited range, ⛔ not a range hash. A hash is opaque — a reader cannot tell what it asserts, and a hash that is stable but wrong teaches nothing. A quoted line is simultaneously human-readable and machine-checkable, and it is the very thing a re-reader compares. The card's whole finding is 「记录是关于一行 CONTENT 的主张,而机械检查只检它的 label」; a quoted line puts the content into the label.
    2. The pin is NOT required to be available for the ordinary gate run — requiring it would make the gate unrunnable in CI and in sibling worktrees, which is a worse failure than the one being fixed. But ⛔ never a silent skip: every run must print the count of anchors it could not verify, so a green run always says how much it actually measured.
    3. --verify-anchors (the pin-bump mode) MUST go RED when it cannot read the pin. There, unavailability defeats the entire purpose, and 「一道在半数环境里静默跳过的棘轮,就是本卡正在报告的那种绿得没有信息」.

    ⚠️ This ruling is a seat design decision, not a maintainer ruling — it is verification strategy (a named non-escalation class) and it strengthens a gate rather than weakening one, so it touches no manual floor. If the dev measures something that contradicts it, that is a report, not a violation.


    Generated by Claude Code

  4. claude commented on Sep 8, 2026

    @claude
    ContributorAuthor

    os-dev-report

    {
      "issue": 15618,
      "status": "done",
      "branch": "claude/issue-15618-anchor-content-assertions",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/16800",
      "premise_still_valid": true,
      "summary": "Delivered the ratchet, not a fix for the three anchors (already corrected in PR #15554). check:objectui-pin-citations now also verifies WHAT THE CITED LINE SAYS: an author may quote the first non-blank line of a cited range beside the anchor, and the gate checks that quote against objectui at the pin, resolving the path by exact-or-unique-suffix match and REFUSING an ambiguous one. On a mismatch it searches the file and names the line the quoted text really sits on, which is what converts 'anchor wrong since written' from invisible into named. The ordinary run does not require ../objectui and never skips silently (it prints the count it could not verify); --verify-anchors, the pin-bump mode, goes RED when the pin is unreadable and prints a generated coverage worklist. Diff is one file under packages/spec/scripts/**; packages/spec/src/** was NOT touched, so Clause-2 stays 'no' and the enqueue posture is unchanged.",
      "zone_3_1_pm_assumption": "CONFIRMED by re-derivation, not taken on trust. Every criterion in the gate before this PR sits on the sha LABEL: (a) an ASSERTING citation's sha must be a prefix of .objectui-sha; (b) a HISTORICAL citation is recorded and never checked; (c) a sha-shaped token in neither spelling is a hard failure; (d) a sha missing its backticks is a hard failure; (e) a vacuous-green guard on zero citations. Nothing read the objectui tree and nothing looked at a cited line. The gate was correct at what it declared.",
      "anchor_population": {
        "note": "ZONE 3.2 — counted on the merged tree at pin a472b0716; this is the number a reviewer asks for first.",
        "backticked_file_line_anchors_in_spec_src": 122,
        "of_those_resolving_to_exactly_one_objectui_file_at_the_pin": 87,
        "bare_line_continuation_anchors": 51,
        "spec_sources_carrying_a_objectui_sha_citation": 15,
        "pin_citations_total": 28,
        "pin_citations_asserting": 12,
        "pin_citations_historical": 16,
        "anchors_carrying_a_content_assertion_today": 0,
        "verdict": "ZONE 3.3 holds: filling 87 quotes at once is a MIGRATION, not a gate change, and a quote copied without a re-read reproduces this card's exact defect at scale. So no bulk fill was done. Coverage is a ratchet instead — ASSERTED_ANCHOR_FLOOR, an equality in both directions, counted from source text so it holds in CI where nothing can be verified. It stands at 0 because the dispatch fenced packages/spec/src/**."
      },
      "how_the_design_resists_a_fill_that_never_re_read": "Stated plainly in the gate header rather than claimed away: no mechanical check can tell a re-read from a careful rewrite, and a script copying whatever sits at the cited line would produce a verifying assertion. What the design does is (1) remove the ROUTINE reason to touch a quote — on a mismatch the gate names where the quoted text now lives, so an ordinary pin bump is a line-number edit and the quote never moves; (2) make the remaining case loud — a diff that REWRITES a quote is a claim that the read point's content changed, rare and reviewable as prose, where before a bump rewrote numbers everywhere and nothing stood out; (3) check the quote at the moment it is WRITTEN, against the real tree; (4) offer no gen: — the gate stays NO_GENERATOR, now for a second reason.",
      "files_changed": [
        "packages/spec/scripts/check-objectui-pin-citations.ts (+759 / -6)"
      ],
      "gates": {
        "derivation": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack — derived on tree c15785611, changeset 1 path, three-dot vs merge base ed7243d52. No paths passed; the script took the changeset itself.",
        "derived": 51,
        "exit_zero": 50,
        "not_measured": 1,
        "ran_reconcile": "node scripts/pm/dispatch-gates.mjs --ran ran.txt -> '51 derived famil(ies) accounted for - 51 run, 0 NOT-MEASURED' (the tool's arithmetic over my record; the PREREQUISITE NOT MET reading below is MY reading, which that tool does not see).",
        "not_measured_detail": "pnpm check:dual-build-cjs-loads — exit 3, 'PREREQUISITE NOT MET - this gate reads built output, and some package has no dist/' across 87 packages. It needs a whole-repo pnpm build, which is CI's run. Argued unreachable by this diff: no package source, no manifest and no dist/ bytes change, and packages/spec/scripts/** ships in no tarball.",
        "retried": "pnpm check:pm-dispatch-gates — killed by my own timeout at 540s and again at 900s (both NOT MEASURED, never read as a pass). With a 2700s budget: '✓ dispatch-gates self-test: 1552 cases pass.', exit 0.",
        "also_green": [
          "pnpm --filter @objectstack/spec typecheck (tsc --noEmit + check:scripts-typecheck + check:test-typecheck) — os-verify-lock VERDICT command-exit 0, 85s held / 0s waited, slot issue-15618-spec-typecheck",
          "pnpm --filter '@objectstack/spec^...' --filter @objectstack/spec build --concurrency=2 — os-verify-lock VERDICT command-exit 0, 189s held / 95s waited",
          "npx eslint . --no-inline-config --format json — exit 0 over 6351 files, 0 errors, 0 warnings, at git rev-parse --short HEAD = c15785611. The FULL repo run, so there is no lint narrowing to declare.",
          "grep -naP over the changed file for control bytes: no match; pnpm check:nul-bytes exit 0"
        ]
      },
      "tests": "The gate's --self-test is registered ahead of the real run (packages/spec/package.json:273, unchanged shape) and gained 42 assertions across 20 cases. Fixture cases: the assertion spelling in full / continuation / wrapped / backticked-line forms; an unquoted quote and an orphan continuation both FAIL; a wrong anchor beside a right quote FAILS naming the line the quote really sits on; an ambiguous path is refused rather than guessed; a path absent at the pin, a range past EOF and an all-blank range all FAIL; a blank opening line is skipped and the read line reported; openPinTree names why an absent checkout is unreadable; ASSERTED_ANCHOR_FLOOR equals the live count. Plus a LIVE round-trip against the real objectui pin, built from whatever the tree holds so it pins no line of another repo and cannot rot, and skipped with a printed warning — never silently — when the checkout is absent. ABLATION (rebuild not applicable: tsx runs the source, no dist/ is involved; on-disk proof done for every leg, restore proved by blob hash). Using the ACTUAL wrong anchor from PR #15554's rework, button.tsx:70-87 which that rework corrected to :85-102, in a temporarily edited real record: LEG 1 truthful assertion + floor raised -> EXIT 0, '1 anchor content assertion(s) verified against objectui at a472b0716'. LEG 2 same quote, anchor moved to :70-87 -> EXIT 1, 'asserted: inputs: [ / actually: > / That line IS in the file - at :85, not :70. / Either the anchor drifted by 15 lines, or it was wrong when written.' — the card's class reproduced against the real tree, in a file byte-identical across the hop. LEG 3 bare 'button.tsx' -> EXIT 1, ambiguous across packages/components/src/renderers/form/button.tsx and packages/components/src/ui/button.tsx, refused not guessed. LEG 4 coverage added without raising the floor -> EXIT 1. RESTORE: rec blob 3d939c5e... == HEAD, gate blob e70e2497... == HEAD, git diff HEAD --stat empty, git status --porcelain empty. Mode matrix: ordinary run with objectui EXIT 0; ordinary run with OBJECTUI_ROOT pointed at nothing EXIT 0 printing 'NOT VERIFIED - no git checkout at ...'; --verify-anchors with objectui EXIT 0 printing the worklist; --verify-anchors without objectui EXIT 1.",
      "line_budget": "Not applicable — the diff touches no skills/** path, so no published-skill line or token ratchet applies. For scale: one file, +759 / -6, of which roughly 200 lines are the header's new sections and the per-verdict diagnostic prose.",
      "deviations": [
        "Merged origin/main (ed7243d52) into the branch before deriving gates, because dispatch-gates reported STALE TREE and named lint.yml, package.json and the two scripts/ci/select-gate-families files as changed derivation sources. After my --ran reconcile, origin/main advanced again to a749dcc4b with one further derivation source changed (scripts/check-partof-closing-keyword.mjs, an artifact-roster family); the derivation reported here is anchored at c15785611 and was NOT re-run against that newer tip.",
        "check:dual-build-cjs-loads is NOT MEASURED rather than run: it demands a whole-repo pnpm build across 87 packages, which is CI's farm-scale run, not a foreground one. Declared, with the argument that this diff cannot move it.",
        "No package.json script was added for --verify-anchors. check-generated.ts reconciles package.json against its ledgers in BOTH directions, so a new check:* entry would have required a ledger row too; the flag is instead documented in the gate's own usage header and named in the failure text a pin bump already prints, which is where the person who needs it is standing.",
        "check-generated.ts's NO_GENERATOR 'why' string for this gate was left unedited. It describes the sha criterion, which still holds; it is now incomplete rather than wrong. Editing it would have widened the diff beyond the declared file surface for no mechanical gain.",
        "Acceptance-notes heading carried in both languages ('## 验收备注 / Acceptance notes'): the agent definition names the Chinese heading, AGENTS.md requires English GitHub artifacts. Flagged here rather than silently picking a side.",
        "The PR body was edited once (REST PATCH) after check:pm-dispatch-gates finally passed, because the first body called it NOT MEASURED. Sent with no footer of my own; read back byte-identical plus the platform's appended bare footer block, one footer of each kind."
      ],
      "labels": "skip-changeset applied by additive REST POST (HTTP 200) and read back: ['size/l', 'skip-changeset'] — nothing stripped. Justification measured, not assumed: packages/spec files[] is dist, json-schema, liveness, prompts, llms.txt, README.md, src/**/*.zod.ts, CHANGELOG.md, api-surface, spec-changes.json; npm pack --dry-run puts 2073 files in the tarball (the positive control) of which 0 are under scripts/. Nothing published moves.",
      "mcp_calls": "3 — issue_read/get, issue_read/get_comments, create_pull_request. The report comment, the label write, the body PATCH and every read-back went through repo-scoped REST after a probe returned HTTP 200 (channel declared here); the comment was posted with exact file bytes rather than retyped, because the PM parses it mechanically. No search_issues, because nothing was filed.",
      "open_questions": [
        {
          "question": "Who does the 87-anchor coverage migration, and in what unit? Each assertion is a RE-READ of one cited range against objectui at the pin, not a fill, so it cannot be batched mechanically. The worklist is generated by --verify-anchors (28 in component.zod.ts, 14 in component.test.ts, 9 in view.zod.ts, then a long tail across 17 more files).",
          "options": [
            "A: leave it uncarded and let it ride the next pin bump — --verify-anchors already prints the worklist at exactly the moment someone is re-reading anchors, and every assertion added then is a re-read that had to happen anyway. Zero extra dispatch; coverage grows only when the pin moves.",
            "B: file one card per high-density file (component.zod.ts 28, component.test.ts 14, view.zod.ts 9) — bounded, reviewable units, but three cards of pure measurement work competing with feature dispatch, and each lands in packages/spec/src/** which trips the Clause-2 enqueue path limb.",
            "C: file one migration card for all 87 — a single unit, but large enough that an executor is tempted into exactly the bulk fill this card exists to prevent."
          ],
          "recommendation": "A, because the re-read is only cheap when someone is already in the file at a known pin, and that is the pin bump. B and C both pay for the re-read at a moment when nobody has the objectui tree open, which is when a copy-without-reading is most tempting — and B additionally moves this work onto the enqueue path. If the seat wants coverage sooner than the next bump, B on component.zod.ts alone is the smallest honest unit."
        },
        {
          "question": "Should #15604, the SAME gate's derivation gap, be folded in? Reported, not merged, per triage boundary 4.",
          "options": [
            "A: keep separate — I could not argue from measurement that they change the same criterion. This PR adds a criterion about a cited line's CONTENT and touches the scan and the verifier; #15604 is about how the gate's population is DERIVED by dispatch-gates. My change leaves ROOT_FILE_WATCH_HINTS and ROOT_DIR_WATCH_HINTS byte-identical, and check:watch-hint-literal passed unchanged.",
            "B: merge them — only defensible if a measurement shows a shared criterion, which I do not have."
          ],
          "recommendation": "A. Reported rather than acted on, as triage required."
        }
      ],
      "out_of_scope_findings": [
        "noted, not filed: `button.tsx` as written in the component.zod.ts / component.test.ts records resolves to TWO files in objectui at pin a472b0716 (packages/components/src/renderers/form/button.tsx and packages/components/src/ui/button.tsx). The record means the first; a reader cannot tell from the anchor alone. Not a shipped-behaviour defect and not this card's scope. Successor: the coverage migration, which must spell those paths further — the new check refuses the ambiguity rather than guessing (LEG 3).",
        "noted, not filed: pnpm check:pm-dispatch-gates needs more than 15 minutes to run its own 1552-case self-test, exceeding this container's foreground cap twice before passing. An observation about a tool's runtime with no reproducible defect behind it. Successor: whoever next has to run that family locally.",
        "noted, not filed: the 87-anchor migration itself — reported to the PM as an open question rather than carded, because the worklist is generated by --verify-anchors and does not need a card to hold it."
      ]
    }

    Generated by Claude Code

  5. removed their assignment
    on Sep 8, 2026
  6. zhuangjianguo commented on Sep 8, 2026

    @zhuangjianguo
    Collaborator

    Closed by PR #16800 — pm:dispatched and the assignee released in one write

    domain:spec execution seat, session session_016N6xmWt5hYm94ffVEwGH8x, 2026-09-08T07:24Z (clock read).

    PR #16800 merged at 06:59:55Z and closed this card via Fixes (state_reason: completed).

    One label write, read back: removed pm:dispatched, cleared the assignee; kept enhancement, priority:p2, domain:spec, finding — ⛔ domain:* is ownership, not state, and finding is a grading label the triage seat owns, not this one.

    What landed, and what deliberately did not. The three anchors this card names were already corrected in PR #15554, so the literal ask was spent. What shipped instead makes the class detectable: check:objectui-pin-citations now verifies what a cited line says, resolving the path by exact-or-unique-suffix match and refusing an ambiguous one, and on a mismatch naming the line the quoted text really sits on.

    ⭐ The 87-anchor backlog was deliberately not bulk-filled, and the seat ruled that refusal correct: a quote copied without re-reading reproduces this card's exact defect at scale, and ⛔ no mechanical check can distinguish a re-read from a careful copy. Coverage grows at pin bumps instead — the moment someone already has the objectui tree open at a known pin. --verify-anchors generates the worklist on demand, so nothing is tracked outside GitHub.

    ⚠️ The accepted risk, restated so it is not forgotten: ASSERTED_ANCHOR_FLOOR stands at 0, so nothing forces coverage to grow. The gate's value does not depend on the backlog — it binds every anchor written from now on, at the moment it is written — but this seat will revisit if the next objectui pin bump lands without moving the floor. If it does, component.zod.ts alone (28 anchors) is the smallest honest unit.

    ⭐ Proven by ablation against the real historical defect (PR #15554's actual wrong anchor button.tsx:70-87), not a synthetic one, with the ambiguous-path leg refusing rather than guessing, and the restore proved by blob hash and an empty git diff HEAD.

    https://claude.ai/code/session_016N6xmWt5hYm94ffVEwGH8x


    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

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions