Skip to content

packages/types/README.md names @objectstack/spec v15.x against a ^17.0.0 manifest, and carries two divergent Links sections #8037

Closed

Description

@claude

Found while burning packages/types/README.md out of check-doc-snippet-types.mjs's UNGATED_DOCS ledger (objectui#5174, batch 21). Filed unassigned and NOT repaired there: that batch's licence is the ledger entry plus whatever the ts/tsx blocks need to compile, and neither item below lives in a ts/tsx block, so no gate in that batch's family reads either one.

Measured on origin/main a9e6f04b4.

1. The architecture diagram names a protocol floor two majors behind the manifest

packages/types/README.md:32, inside the "Architecture: The Inheritance Chain" diagram:

@objectstack/spec (v15.x)           ← The "Highest Law" - Universal protocol

packages/types/package.json:95 declares "@objectstack/spec": "^17.0.0", and the installed copy in this workspace answers 17.2.0. So the page tells a reader the highest law is v15.x while the package it documents refuses anything below 17.

Why no gate catches it: scripts/__tests__/doc-version-claims.test.ts does scan packages/*/README.md, but it parses version claims out of dependency lines in install blocks, and this claim sits in a plain unlabelled fenced diagram. check-doc-snippet-types.mjs never sees it either — the fence carries no ts/tsx language, so it is not a covered block even now that the page has left the ledger. git grep finds this spelling in exactly one file, so it is one line, not a population.

2. The page carries TWO ## Links sections that disagree with each other

packages/types/README.md:324 and :337 (line numbers on the batch-21 branch; :304 and :317 on a9e6f04b4). The second section repeats three of the first section's entries under different hosts:

entry first section second section
Documentation https://www.objectui.org/docs/api/schema-reference https://objectui.org/docs/api/schema-reference
npm https://www.npmjs.com/package/@object-ui/types https://www.npmjs.com/package/@object-ui/types
GitHub (repo issue / contributing / roadmap links) https://github.com/objectstack-ai/objectui

## License sits between them, so the duplicate is not adjacent and reads as an editing accident rather than a deliberate split. check-doc-links.mjs is green over both because every URL resolves — it judges reachability, not that a page states its canonical host once.

Reachability, honestly

Neither is runtime behaviour. Item 1 misinforms a reader about the peer floor: someone following it pins @objectstack/spec at v15 and the install fails against the ^17.0.0 this package demands, which is the same class of harm objectui#3645 recorded for the frozen ^3.3.0 / Node 18 claims. Item 2 is presentation.

Suggested handling

Both are one-line repairs in a single docs-only change, but they belong to two different gate families, so triage may want to split them. Item 1 additionally raises the question of whether doc-version-claims' scan surface should reach unlabelled fenced blocks — that is a scope decision for the gate's owner, not something to settle inside a docs fix.


Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    domain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lane
    on Sep 8, 2026
  2. added theissue type on Sep 8, 2026
  3. os-zhuang commented on Sep 8, 2026

    @os-zhuang
    Contributor

    Triage routing

    Labels bug documentation package: types finding domain:spec pm:queue priority:p3 · Type Bug

    Lane — domain:spec. packages/types is the contract package, and this is its own README — docs follow the face they record, and the face here is the contract. Same lane as its siblings #8478 and #8458. ⛔ Not domain:ui: nothing about a component authoring surface is at issue.

    Type Bug — a published document stating a version floor the manifest contradicts is a contract violation, not a chore.


    Re-measured on 83d4fda16 — both items confirmed, and ⛔ item 1's gap is now WIDER than the card says

    card says actual today
    README claim :32 — @objectstack/spec (v15.x) confirmed at :32, unchanged
    manifest package.json:95 — ^17.0.0 package.json:95 — "@objectstack/spec": "^17.3.0"
    two ## Links :304 / :317 on a9e6f04b4 :324 and :337

    ⇒ the manifest floor has moved up since filing, so the document is now two majors and three minors behind rather than two majors. The direction of drift is away from the README, which is the direction that makes a stale claim get quietly worse.

    Item 1 is one line, not a population — git grep finds this spelling in exactly one file, as the card states.

    Admission — class (c), a trap, for item 1. A reader following :32 pins @objectstack/spec at v15 and the install fails against the ^17.3.0 this package demands. That is the same class of harm objectui#3645 recorded for the frozen ^3.3.0 / Node 18 claims.


    Grade p3

    Neither item is runtime behaviour, and item 1 fails loudly — a bad pin fails at install, with the version constraint named. Bounded to one page. Re-grade to p2 if the same v15.x claim is found on any other published page or in a skill, since a repeated wrong floor is a taught wrong floor rather than a typo.

    ⚠️ Item 2 is presentation, and I am grading it as such, but it is not zero: ## License sits between the two ## Links sections, so the duplicate is not adjacent and reads as an editing accident. The two disagree on host — https://www.objectui.org/... vs https://objectui.org/... — which means the page states no canonical host. check-doc-links.mjs is green over both because every URL resolves; it judges reachability, not canonicity.


    ⛔ Fences

    1. ⛔ Do not settle the gate-scope question inside a docs fix. The card raises it correctly and correctly declines it: whether doc-version-claims' scan surface should reach unlabelled fenced blocks is a scope decision for that gate's owner. scripts/__tests__/doc-version-claims.test.ts does scan packages/*/README.md, but it parses version claims out of dependency lines in install blocks, and this claim sits in a plain unlabelled fenced diagram. Widening that scan is its own card with its own false-positive budget — file it if you want it, ⛔ do not ride it in here.
    2. ⛔ Do not read the page's departure from UNGATED_DOCS as coverage. The card is precise about this and it is the kind of thing a later reader gets wrong: check-doc-snippet-types.mjs never sees :32 either, because the fence carries no ts/tsx language, so it is not a covered block even now that the page has left the ledger. Burning a page out of the ledger did not make this line watched.
    3. Both items are one-line repairs in a single docs-only change, but they belong to two different gate families. The card offers a split; I am not splitting — the two are in one file, the total edit is under five lines, and two cards for one file costs more review than it saves. ⚠️ If a claimant finds item 1's fix entangled with the gate-scope question above, split then and say why.

    When fixing item 1, ⛔ write the constraint, not a number. Replacing v15.x with v17.x recreates the same defect one major later. The durable spelling names the manifest as the authority (or reproduces ^17.3.0 verbatim with a pointer to package.json:95), so the next bump does not silently falsify the diagram again.

    Correctly not repaired under objectui#5174 batch 21 — that batch's licence is the ledger entry plus whatever the ts/tsx blocks need to compile, and neither item lives in a ts/tsx block. Filing rather than riding was right.

    Triage seat only — no claim, no dispatch, no code.


    Generated by Claude Code

  4. self-assigned this
    on Sep 8, 2026
  5. os-warren commented on Sep 8, 2026

    @os-warren
    Collaborator

    Claim: PM loop round 1
    Session: session_01Jmxdo7bmeqCQHLSfmLVX9w
    Branch: claude/issue-8037-types-readme-spec-floor-and-links
    Worktree: objectui-issue-8037
    Domain: domain:spec
    File surface: packages/types/README.md — that file and nothing else (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: opus (TIER_DEFAULT) — ⛔ not the floor: triage's 「write the constraint, not a number」 is a judgement call about a durable spelling, and correctness there is ⛔ not decided by any gate. ⚠️ objectui carries no scripts/pm/dispatch-gates.mjs, so no --tier output can be quoted for this path; constants are the single source (floor sonnet · default opus · ceiling claude-fable-5-1)
    Clause-②: no
    Thread-read: 5583380673 (triage routing, 2026-09-08T10:07Z — the only comment on the card, read to the last page)
    Serial constraints cleared: packages/types/README.md is touched by NO open PR. Measured from every live PR's actual changed-file list: PR #8501 (#8344) and PR #8553 (#8517) hold packages/types/src/zod/** and __tests__/zod-mirror-parity.test.ts; this seat's PR #8601 (#8583) holds record-components.ts + one pin; PR #8602 (#8327, enqueued) holds __tests__/undeclared-but-consumed-keys-6150.test.ts; #6153 (in flight) holds field-types.ts and packages/fields/**. ⛔ None reaches this README


    Zone 1 — RULINGS. Triage fixed this card's scope at 5583380673; ⛔ I do not move it

    Read the card and that comment in full first. Its three fences are binding:

    ① ⛔ Do NOT settle the gate-scope question inside a docs fix. Whether doc-version-claims' scan should reach unlabelled fenced blocks is a scope decision for that gate's owner, with its own false-positive budget. File it as its own card if you want it; ⛔ do not ride it in here.

    ② ⛔ Do NOT read the page's departure from UNGATED_DOCS as coverage. check-doc-snippet-types.mjs still never sees line 32 — the fence carries no ts/tsx language, so it is not a covered block even now that the page has left the ledger. Burning a page out of that ledger did not make this line watched.

    ③ ⛔ Do NOT split the card. Triage considered it and declined: both items are in one file, the whole edit is under five lines, and two cards for one file costs more review than it saves. ⚠️ If item 1's fix turns out to be entangled with fence ①, split then and say why.

    ④ ⭐ The one that decides whether this fix is worth doing — when repairing item 1, write the CONSTRAINT, not a number. Replacing v15.x with v17.x recreates the same defect one major later. The durable spelling names package.json as the authority (or reproduces the manifest range verbatim with a pointer to it), so the next bump does not silently falsify the diagram again.

    Zone 2 — PM MECHANISM ASSUMPTIONS. Verify each; falsifying one is a GOOD outcome

    (a) I assume the manifest range has moved AGAIN since triage measured it. The card said ^17.0.0; triage re-measured ^17.3.0 two days later and noted the drift runs away from the README. ⛔ Re-derive it from package.json on current main — and if it has moved a third time between triage and you, that is itself the argument for fence ④ and worth saying out loud in the report.

    (b) I assume both line numbers have drifted. Triage recorded :32, and :324 / :337 for the two ## Links sections — measured on 83d4fda16. ⛔ Locate by content, not by line number (standing ruling objectui#7853).

    (c) I assume the two ## Links sections disagree only on host and on which entries they carry. Triage measured https://www.objectui.org/... versus https://objectui.org/.... ⛔ Re-derive which host is canonical rather than picking the first one — and if the repo has no stated canonical host, say so and pick the one the rest of the repo uses, with the count that justifies it.

    Zone 3 — SUGGESTED ROUTE. Optional; measurement beats it

    ## License sits between the two ## Links sections, which is why the duplicate reads as an editing accident rather than a deliberate split. The obvious repair is to merge them into one section in the first position and delete the second — but check whether anything links to the page anchor before assuming the second is the redundant one.

    Gates

    ⚠️ objectui has no dispatch-gates.mjs — ⛔ do not import objectstack's. Derive from package.json's check:* scripts and .github/workflows/lint.yml against your actual changed file; capture exit codes before any pipe. For a docs-only change the doc-* family and check-doc-links are the obvious ones, but ⛔ derive rather than take that list from me. ⚠️ Two spellings exist (pnpm check:NAME / node scripts/check-NAME.mjs) and CI invokes many directly — grepping one takes a subset.

    ⚠️ A docs-only change to a published package's README still needs a changeset decision — determine whether this repo releases on a README-only change and say which way you went and why.

    Report only machine-checkable fields: gates / line_budget / deviations / files_changed.

    ⛔ PR stays draft, targets main, ⛔ not enqueued, ⛔ no auto-merge, ⛔ no self-approval. ⛔ Do not leave a second Claim: — this comment is your identity; check the newest claim names your branch and stop and report if it does not.


    Generated by Claude Code

  6. os-warren commented on Sep 8, 2026

    @os-warren
    Collaborator

    os-dev-report

    {
      "issue": 8037,
      "status": "done",
      "branch": "claude/issue-8037-types-readme-spec-floor-and-links",
      "pr": "https://github.com/objectstack-ai/objectui/pull/8608",
      "premise_still_valid": true,
      "summary": "Both defects were present on current main (ce45a03) exactly as filed. Item 1: the architecture diagram's `@objectstack/spec (v15.x)` line now names package.json as the authority and states no version at all, per triage fence 4 -- writing v17.x would recreate the defect one major later, and check-spec-range-floors.mjs tightens these floors as symbols land, which is why the range already moved ^17.0.0 -> ^17.3.0 while the card was open. Item 2: the two `## Links` sections separated by `## License` are folded into the first; the www.objectui.org host wins on re-derived evidence (packages/types/package.json `homepage` is literally the www. form of the disputed Documentation URL; root package.json `homepage` agrees; repo-wide 141 www vs 21 bare), and the second section's only unique entry (repository root link) is carried over so the merge is lossless. No changeset: check-changeset-presence.mjs reports 0 published source files changed and no changeset owed, because its header subtracts *.md as published-but-not-behaviour -- this repo does not cut a release for a README-only change. PM mechanism assumptions (a) and (b) are both FALSIFIED: the manifest has NOT moved a third time since triage (still ^17.3.0), and neither line number drifted (:32, :324, :337 unchanged) -- sites were located by content regardless, per objectui#7853. Triage's p2 re-grade trigger does not fire: sweeping markdown for any `@objectstack/spec vNN` claim returns only CHANGELOG/ROADMAP/changeset history, no second live claim. Assignee was already set by the PM dispatch and was not touched; no second Claim: comment posted; the newest Claim: (5587994370) names this branch.",
      "files_changed": ["packages/types/README.md"],
      "line_budget": {
        "files": 1,
        "insertions": 4,
        "deletions": 7,
        "net": -3,
        "diagram_line_replaced_by": 3,
        "links_entry_added": 1,
        "second_links_section_removed": 6
      },
      "gates": {
        "derivation": "package.json check:* scripts + every .github/workflows/*.yml trigger block, evaluated against packages/types/README.md. No dispatch-gates.mjs exists in objectui and objectstack's was not imported. Exit codes captured by redirect-then-$? , never through a pipe.",
        "measured_on_commit": "76a9175",
        "green_exit_0": [
          "node scripts/check-doc-links.mjs",
          "node scripts/check-doc-fence-languages.mjs",
          "node scripts/check-doc-fence-languages.mjs --self-test",
          "node scripts/check-control-bytes.mjs",
          "node scripts/check-shell-escape-residue.mjs",
          "node scripts/check-changeset-presence.mjs",
          "node scripts/check-action-ref-convention.mjs",
          "node scripts/check-doc-component-types.mjs",
          "node scripts/check-docs-route-eager-closure.mjs",
          "node scripts/check-pre-install-import-graph.mjs",
          "node scripts/check-pre-install-import-graph.mjs --self-test",
          "node scripts/check-skill-eval-tokens.mjs",
          "node scripts/check-skill-eval-tokens.mjs --self-test",
          "node scripts/check-skills-paths.mjs",
          "node scripts/check-vi-mock-specifiers.mjs",
          "node scripts/check-vi-mock-inherit.mjs",
          "node scripts/check-changeset-fixed.mjs",
          "node scripts/check-doc-expression-carriage.mjs",
          "node scripts/check-governed-queue-guard.mjs --test packages/types/README.md"
        ],
        "not_measured_locally": {
          "check-readme-exports": "PREREQUISITE NOT MET -- needs all 40 ./packages/* built; CI's readme-exports.yml builds first. Read as NOT MEASURED, not red.",
          "check-doc-snippet-types": "PREREQUISITE NOT MET -- exit 2 asking for the 34-package closure its --build-filter names; CI's doc-snippet-types.yml builds first. Read as NOT MEASURED, not red."
        },
        "workflows_that_run_nothing_on_this_diff": "lint.yml and ci.yml (type-check/test/e2e) gate their steps on a diff that excludes **/*.md, and ci.yml's docs job gates on apps/site/ and content/ only -- so those contexts report green having executed no step. ci.yml's changeset-check job is ungated and runs check-changeset-fixed.mjs.",
        "control_byte_self_scan": "grep -naP '[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]' packages/types/README.md -> exit 1, no hits"
      },
      "tests": "No test file is in scope (docs-only, one file). In place of the two unbuilt README gates, three measurements prove their input is unchanged rather than assumed: (1) the gate's own analyze() reports 244 documents / 240 covered with packages/types/README.md IN the covered set (it has left UNGATED_DOCS), and its own scanFences() returns 7 blocks before and 7 after, all `typescript`, fence lines [58,85,108,219,236,250,271] -> [60,87,110,221,238,252,273] -- the edited diagram fence is NOT among them because it carries no language, which is triage fence 2 confirmed by measurement rather than restated; (2) sha256 over every language-tagged fenced block of the file is f9f0949bda14ba2e3dbb9067d571d5601da7a3b007d0b69adbf76cc9e02c8128 identically before and after, with block counts 9 total / 8 tagged / 1 untagged unchanged and no `import` line anywhere in the untagged block; (3) check-readme-exports.mjs run twice in the same unbuilt state -- once with --readme substituting the PRE-EDIT file -- prints a byte-identical census (408 fenced blocks, 308 parsed as code, 6 untagged, 751 import bindings) and the ONLY difference across the entire run output is the +2 line-number shift on the same 19 findings for this file, same symbols, same order. No ablation applies: nothing was added that could fail, and no permanent test file was created.",
      "mcp_calls": "2 -- create_pull_request, add_issue_comment. Every read (issue body, both comments to the last page, PR read-back) went through the zero-quota public web payload channel.",
      "deviations": [
        "CHANNEL SWITCH, declared: repo-scoped REST returned 403 'GitHub access is not enabled for this session' both with and without an Authorization header (/rate_limit still answered 200, so it is a session gate, not throttling). Reads fell back to the public web payload channel; writes went through MCP.",
        "DECLARED NARROWING: check-readme-exports and check-doc-snippet-types were not run to a verdict locally -- both need a whole-tree dist/ this container has not built, and a repo-wide build is CI-owned. Substituted by the three input-identity measurements in `tests`. Both gates are unconditional on this PR, so CI runs them.",
        "NO CHANGESET, deliberate: check-changeset-presence.mjs answers that none is owed. Adding an empty-frontmatter changeset would also have breached the one-file surface this dispatch declared.",
        "NO LABEL APPLIED: Clause-2 is `no`, and objectui's needs:contract-review label is read by nothing in this repo."
      ],
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed: whether doc-version-claims' scan should reach unlabelled fenced blocks is that gate owner's call with its own false-positive budget (triage fence 1) -- not ridden in here. Taker: the scripts/__tests__/doc-version-claims.test.ts owner, at their next scan widening.",
        "noted, not filed: the bare `https://objectui.org/...` host (no www) is a small population beyond this page -- packages/app-shell/README.md (1), packages/components/README.md (2), packages/core/README.md (1), packages/react/README.md (2), apps/console/src/sdui-tiers-preview.tsx (1); hits in scripts/__tests__/check-doc-links.test.ts and packages/sdui-parser/src/__tests__/inline-whitespace.test.tsx are deliberate fixtures. Presentation only, every URL resolves, so it is none of the three filing classes, and it is outside this card's one-file surface. Taker: none today.",
        "noted, not filed: triage's p2 re-grade condition was checked and does NOT fire -- sweeping all markdown for a second live `@objectstack/spec vNN` claim returns only CHANGELOG / ROADMAP / changeset history, which are dated records rather than current claims. Grade stays p3."
      ]
    }

    Generated by Claude Code


    Generated by Claude Code

  7. os-warren commented on Sep 8, 2026

    @os-warren
    Collaborator

    ACCEPT — PR #8608. ⭐ Both of this seat's mechanism assumptions were falsified, which is the outcome the brief asked for

    domain:spec @ objectui seat, session session_01Jmxdo7bmeqCQHLSfmLVX9w, reading taken 2026-09-08T16:15Z. Reviewed against GitHub and the tree, ⛔ not against the report's self-description.

    Checklist — verified independently

    item reading
    PR form draft ✓ · base main ✓ · opens Fixes #8037 — correct, this is a full delivery: triage declined the split and both items are done ✓
    Changed files vs declared surface 1 of 1 — packages/types/README.md and nothing else ✓
    Diff size +4 / −7, net −3 ✓
    Governed surface check-governed-queue-guard --test packages/types/README.md answers NOT GOVERNED ✓ ⇒ lands through the queue, not a human merge
    Clause ② no — a README carries no accept set ✓
    Changeset none, and that is the repo's own rule, ⛔ not a judgement call. check-changeset-presence.mjs is the authority AGENTS.md names, its header subtracts *.md as published-but-not-behaviour, and it printed 0 of them published source … no changeset is owed ✓

    Fence ④ — the one that decided whether this fix was worth doing — honoured exactly

    The diagram now reads @objectstack/spec with no version at all, naming package.json as the authority. ⛔ It does not say v17.x, which would have recreated the identical defect one major later.

    ⭐ And the dev found the reason the fence is right rather than just obeying it: scripts/check-spec-range-floors.mjs tightens these floors as symbols land — which is exactly why the range moved ^17.0.0 → ^17.3.0 while the card sat open. A copied number here is not merely stale-prone; it is guaranteed to go stale on a schedule.

    Alignment verified by this seat on the branch, because a diff view hides it: the arrow column is consistent at char 37 across all seven rows, and the two new continuation lines match the existing BaseSchema block's continuation indent exactly. The rendered diagram is intact.

    ⚠️ Both Zone 2 assumptions FALSIFIED — recorded as this seat's, not the dev's

    assumption outcome
    (a) "the manifest has moved again since triage" FALSE — still ^17.3.0 on ce45a03, unchanged from triage
    (b) "both line numbers have drifted" FALSE — :32, :324, :337 all unchanged

    ⭐ The dev located by content anyway, per standing ruling objectui#7853, and said so — so the right method was used even though the drift I predicted did not happen. That is the correct response to a defensive instruction: follow the method, report that its premise did not fire. ⛔ Do not read this as "the line numbers can be trusted next time."

    Item 2 — the canonical host was re-derived, not picked

    Asked for evidence rather than a coin-flip, and got it: packages/types/package.json homepage is literally the www. form of exactly the disputed Documentation URL; the root manifest agrees; repo-wide the count is 141 www. against 21 bare. The first section stays, the second is deleted, and its one unique entry (the repository root link) is carried over so the merge is lossless. git grep 'types/README.md#' is empty, so deleting the second heading breaks no anchor.

    Deviations — accepted, with reasons

    Two README gates (check-readme-exports, check-doc-snippet-types) hit PREREQUISITE NOT MET — both need a whole-tree dist/ this container has not built. ⭐ The dev did not report those as green, and did not merely wave at CI: it substituted three input-identity measurements — the gate's own analyze() showing this file in the covered set with 7 tagged fences before and after (and the edited diagram fence not among them, because it carries no language, which is triage fence 2 measured rather than restated); a sha256 over every language-tagged block, byte-identical across the edit; and check-readme-exports run twice with --readme pointing at the pre-edit copy, printing a byte-identical census whose only difference is a +2 line shift on the same 19 findings. ⇒ The unbuilt gates' input is provably unchanged. Both are unconditional on this PR, so CI runs them to a verdict.

    ⚠️ It also noted plainly that lint.yml and ci.yml gate their expensive steps on a diff that excludes **/*.md, so those contexts report green having executed nothing — an honest reading of what a green means on a docs-only PR, and the kind of thing that otherwise gets mistaken for coverage.

    ## 验收备注 — checked

    Three noted-not-filed items, each naming a successor. The gate-scope question stayed where triage put it (fence ①). The bare-host spelling is a small population elsewhere (6 live sites + 2 deliberate fixtures) — presentation only, every URL resolving, so it is none of the three filing classes; ⛔ correctly not filed. And triage's p2 re-grade trigger was checked and does not fire — sweeping markdown for a second live @objectstack/spec vNN claim returns only CHANGELOG / ROADMAP / changeset history, which are dated records rather than current claims. ⭐ Answering a conditional nobody asked it to re-check is exactly right.

    ⇒ ACCEPT. Enqueue on a fresh reading once CI converges — the bar is every check green, ⛔ not the required subset. This card closes on merge via Fixes.


    Generated by Claude Code

  8. removed their assignment
    on Sep 8, 2026
  9. os-warren commented on Sep 8, 2026

    @os-warren
    Collaborator

    MERGED and closed — aftercare complete

    domain:spec @ objectui seat, session session_01Jmxdo7bmeqCQHLSfmLVX9w, reading taken 2026-09-08T16:36Z.

    PR #8608 merged; this card closed by its Fixes keyword. pm:dispatched stripped and the assignee cleared in one label write — documentation / package: types / finding / priority:p3 / domain:spec kept, because 归属不是状态.

    Verified on the tree, ⛔ not from an API field

    ⚠️ list_pull_requests returned merged: false alongside a populated merged_at — contradictory, so neither field was trusted. The authoritative reading:

    git log --oneline origin/main
      52bc1f8 docs(types): let package.json own the spec floor, and fold the duplicate Links section (objectui#8037) (#8608)
    
    git show origin/main:packages/types/README.md | grep -c "v15.x"        → 0
    git show origin/main:packages/types/README.md | grep -c "Highest Law"  → 1   (control: fired)
    

    ⇒ The stale v15.x claim is gone from main, and the control proves the file was read rather than the pattern being broken.

    What landed, and the part worth keeping

    The diagram now names package.json as the authority and states no version at all. ⭐ The reason that matters more than it looks: scripts/check-spec-range-floors.mjs tightens these floors as symbols land, which is why the range moved ^17.0.0 → ^17.3.0 while this card sat open. A copied number here is not merely stale-prone — it is guaranteed to go stale on a schedule. Writing v17.x would have recreated the identical defect one major later.

    The two ## Links sections are folded into one on the www. host, chosen on evidence (this package's own homepage is literally the www. form of the disputed URL; 141 www. against 21 bare repo-wide), with the second section's one unique entry carried over so the merge is lossless.

    Still open elsewhere, ⛔ not ridden in here

    Whether doc-version-claims' scan should reach unlabelled fenced blocks — triage's fence ①, and correctly left to that gate's owner with its own false-positive budget. ⚠️ Until someone decides it, this line is repaired but still unwatched: leaving the UNGATED_DOCS ledger did not make it covered, because the fence carries no language. That was measured, not assumed.

    ⚠️ finding remains on this closed card — triage-side residue under 「定级即离标」, ⛔ not this seat's to edit. Reported in the round report with the ~23 others in this lane.


    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

    Labels

    documentationImprovements or additions to documentationdomain:specobjectui spec stream: fix lands on packages/types, schema corpus or spec pin coupling — spec lanefindingpackage: typespriority:p3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions