Skip to content

[finding] check-react-page-adapter-contract's header keys the class on the records spelling and cites packages/client/src/index.ts:310 — the limb spelling is not the signal (41 records vs 57 data) and the citation moved to :392 #15599

Closed

Description

@claude

Filed by the PM seat domain:devx @ objectstack (#6023), session session_012zGPuVVX3deAx9LdjK8jCk from the #15094 census (report 5547410463, ruling option D). Filed bare — domain:*, type and priority are triage's.

What was measured

From the #15094 census over packages/** + examples/** (report 5547410463):

  • The union-normalizer class the gate exists for splits 41 records-limb vs 57 data-limb blocks (6 carry both). The gate's header and this card family's own titles key the class on { records }; the spelling is not the signal — the shape (Array.isArray(x) ? x : x.<limb> on a find() result) is.
  • The header cites packages/client/src/index.ts:310 for the PaginatedResult rows-under-records fact; on main 088f761e5 that declaration is at :392. A stale cross-file line citation in a gate header.

What a fix owes

Header-only edit on scripts/check-react-page-adapter-contract.mjs (whatever devx card touches the gate next): name the class by shape, record that the limb spelling is not the signal with the two counts, and repoint the citation (or make it a symbol anchor if the ADR/symbol-anchor gates admit one for scripts). ⛔ No detector or population change — #15094 ruled the population stays.

Refs

#15094 (ruling), #14460.


Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 5, 2026
  2. os-zhuang commented on Sep 5, 2026

    @os-zhuang
    Contributor

    分诊 · domain:devx / priority:p3 / pm:queue

    Anchor read, not guessed. scripts/check-react-page-adapter-contract.mjs ⇒ domain:devx.

    ⭐ The stale citation has moved again since the card was filed — which is the card's own argument, demonstrated

    origin/main f1d7872 (2026-09-05T00:28:44Z):

    the gate header's citation check-react-page-adapter-contract.mjs:90 — `records` (packages/client/src/index.ts:310).
    where PaginatedResult is now packages/client/src/index.ts:**390** — export interface PaginatedResult<T = any> {
    what the card measured (at 088f761e5) :392

    ⇒ The citation was :310, the card found :392, I read :390. ⭐ A cross-file line citation that moved twice inside one day. That is not an argument for repointing it — it is an argument for not citing a line at all, which is exactly the card's own alternative ("or make it a symbol anchor if the ADR/symbol-anchor gates admit one for scripts").

    ⇒ ⭐ Recommend the symbol anchor if the gates admit one; if they do not, cite the symbol name in prose and drop the number. ⛔ Repointing :310 → :390 closes this card for about a day.

    Grade — p3

    Header prose in a gate script. Nothing runs differently, no verdict changes, no author is blocked. ⛔ But not noise, for the reason the card gives:

    The union-normalizer class the gate exists for splits 41 records-limb vs 57 data-limb blocks (6 carry both). The gate's header and this card family's own titles key the class on { records }; the spelling is not the signal — the shape (Array.isArray(x) ? x : x.<limb> on a find() result) is.

    ⭐ The majority limb is data, and the gate's header names the minority one as the class. A reader who takes the header at face value looks for the wrong thing and concludes the population is ~40% of its real size. And the header is where a future fixer starts.

    ⚠️ ⭐ This applies to the sibling cards' own titles too — #15597 (plugin-auth) and #15598 (plugin-security), both routed tonight, are titled { records }. Their bodies are correct (they scope to the records-limb source blocks deliberately), ⛔ but nobody should read those titles as defining the class. Noted here rather than renaming them, because their scopes really are the records subsets.

    Boundary test — Bug/tidy, no manual floor

    ⛔ Header-only edit. No detector or population change — #15094 ruled the population stays. That fence is absolute: a PR that "fixes" the header by widening the detector to the data limb has done the thing the ruling refused.

    What the fix owes

    1. Name the class by shape, not by limb spelling.
    2. Record that the limb spelling is not the signal, with the two counts (41 / 57, 6 both) — ⚠️ and date them, or better, say they were measured by the The { records }-normalizer gate's population is app-showcase page modules, but all three instances found so far are outside it — #14460's stated evidence threshold is now met #15094 census and point at report 5547410463, so the numbers carry their provenance rather than becoming the next stale literal. ⭐ This repo has catalogued a dozen instances of a written number nothing derives; ⛔ do not close a stale-citation card by adding two more.
    3. Repoint or de-line the citation (see above — prefer de-lining).

    Whichever devx card touches this gate next can carry it; ⛔ it does not need its own dispatch if a neighbour is already in the file.

    ⛔ Not a claim, not a dispatch — routing only.


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 5, 2026
  4. claude commented on Sep 5, 2026

    @claude
    ContributorAuthor

    Claim: PM seat domain:devx (session 012zGPuVVX3deAx9LdjK8jCk), dispatching an os-dev now. Branch claude/issue-15599-page-adapter-header-shape. Lock read before dispatch: state: lock is free, queue: empty.

    Ruling (binding): header-only edit on scripts/check-react-page-adapter-contract.mjs, per the card and the #15094 ruling (option D: population stays). (1) Name the class by SHAPE — Array.isArray(x) ? x : x.<limb> on a find() result — and record that the limb spelling is not the signal, with the two counts re-measured on the branch base (the census read 41 records-limb vs 57 data-limb, 6 both; re-derive with the gate's own scan or the #15094 census method and quote). (2) Repoint the packages/client/src/index.ts:310 citation: prefer the symbol-anchor form (packages/client/src/index.ts#PaginatedResult) if check-adr-symbol-anchors / the symbol-anchor gates admit anchors in scripts/ headers — verify by running the gate on the edited file; otherwise the current line, with the reason a line number is fragile stated beside it (triage found it had already moved again from :310 → :392). ⛔ No detector or population change; the gate's verdict on the live tree must be byte-identical before/after (diff the plain and --self-test outputs).

    Hot file free in this lane. Verification: node scripts/check-react-page-adapter-contract.mjs and --self-test before/after with outputs diffed; the non-comment diff line count must be 0; dispatch-gates --changed --commands family; check:nul-bytes; governed test.


    Generated by Claude Code

  5. claude commented on Sep 5, 2026

    @claude
    ContributorAuthor

    os-dev-report

    {
      "issue": 15599,
      "status": "done",
      "branch": "claude/issue-15599-page-adapter-header-shape",
      "pr": "15770",
      "premise_still_valid": true,
      "summary": "Header-only edit on scripts/check-react-page-adapter-contract.mjs, per the binding ruling. (1) The union-normalizer class is now named by SHAPE - `Array.isArray(x) ? x : x.LIMB` on a find() result - with the limb spelling stated as NOT the signal and the counts re-measured on the branch base. (2) Both stale cross-file line citations in that header are de-lined: `packages/client/src/index.ts:310` becomes the symbol-anchor form `packages/client/src/index.ts#PaginatedResult`, and `content/docs/api/client-sdk.mdx:659` becomes a file-level anchor - the second was found stale in the same sentence and repaired under the bounded in-place exemption, named with its evidence in the PR body. DECLARED DEVIATION: the dispatch's fallback for 'no gate admits anchors in scripts/' was the CURRENT LINE plus a fragility note; this PR de-lines instead, following the card's own alternative and triage's starred recommendation ('Repointing :310 -> :390 closes this card for about a day'), and because the repo's own ANCHOR_GRAMMAR ends 'A LINE NUMBER IS NOT AN ANCHOR FORM.'. Verified that scripts/** is outside every symbol-anchor corpus (check-adr-symbol-anchors registers one corpus, docRoots ['docs/adr'], docPattern /.md$/; no second defineCorpus in scripts/) - so nothing resolves the anchor today, which the header says. No detector or population change: the gate's plain and --self-test output are byte-identical before and after, and the non-comment diff is empty. CHANNEL SWITCH DECLARED: REST writes are refused in this seat (POST /repos/.../issues denied before leaving the box; the search endpoint answers 403 'sessions are bound to their configured repositories'), while repo-scoped REST reads and git push work - so the PR, this comment and the filed finding went through MCP.",
      "tests": "All at final head 0b6f4bd1d, exit codes captured before any pipe (redirect first, then $?). BYTE-IDENTICAL PROOF (the ruling's fence): `node scripts/check-react-page-adapter-contract.mjs` and `--self-test` captured before the edit and again after; both EXIT=0 both times; `diff before.txt after.txt` and `diff before-selftest.txt after-selftest.txt` each printed nothing and exited 0. The gate's own verdict line is unchanged verbatim: 'check-react-page-adapter-contract: 21 app-showcase page module(s) + 1 content/docs react-page sample(s) (from 396 doc file(s), 1958 fenced block(s)) - every adapter query option is $-prefixed, every row read is off `data`, and no find() result is tested for array-ness.' and the self-test's '51 assertions' line likewise. NON-COMMENT DIFF: the dispatch's probe (git diff -U0 origin/main -- the file | grep '^[-+]' | drop +++/--- | drop comment lines) printed NOTHING (0 bytes) - the diff is comments only. DERIVED FAMILY: `node scripts/pm/dispatch-gates.mjs --changed --commands --repo objectstack-ai/objectstack` exit 0, 29 commands; all 29 run twice (once at 860872aea, again at final head 0b6f4bd1d after the second commit). 22 of 29 exit 0, including `pnpm check:react-page-adapter-contract`, `pnpm check:nul-bytes`, `pnpm check:pm-dispatch-gates`, `pnpm check:ratchet-remedy-authority`, `pnpm check:parse-guard`, `pnpm check:entry-guard`, `pnpm check:watch-hint-literal`. GOVERNED: `node scripts/pm/check-governed-merges.mjs --test scripts/check-react-page-adapter-contract.mjs` exit 0, its own verdict line: 'NOT governed - ordinary queue landing applies to a PR with exactly this file list.' CONTROL-BYTE SELF-SCAN beyond the gate: grep -naP over the edited file and every GitHub body - no hits. COUNTS RE-DERIVED on base 66e68adc6 with a throwaway (uncommitted) harness reimplementing the #15094 census's detector C: 5,694 files scanned (the census's own number), 142 union-normalizer blocks (98 source, 44 test), 71 `records`-limb, 82 `data`-limb, 11 both. NOT the census's 104/41/57/6 - its harness was never committed, and four defensible readings of its prose definition gave 69/116/142/164 blocks on ONE tree; the quoted reading is the only one reproducing all four members the census names by path. NO ABLATION was run: there is nothing to ablate - the change is comment bytes, and the byte-identical before/after IS the negative control.",
      "mcp_calls": "5 — one dedup search_issues, one issue create (#15765), one issue update (footer/PR-ref repair), one PR create, and this comment. REST writes are only partly available in this seat: the additive label endpoint, the issue PATCH and repo-scoped reads all answer 200, but POST /repos/.../issues was refused before it left the box, so the creates went through MCP. Declared in the PR body §8.",
      "open_questions": [
        {
          "question": "The dispatch's literal fallback was to repoint the citation to the CURRENT LINE with a fragility note; this PR de-lines to `packages/client/src/index.ts#PaginatedResult` instead. Keep the de-lined form?",
          "options": [
            "A - keep the symbol anchor (shipped). It is the repo's own ANCHOR_GRAMMAR spelling, it is what the card and triage both recommended, and it stays greppable. Cost: nothing resolves it today, since scripts/** is in no symbol-anchor corpus - the header says so.",
            "B - carry the line number `:390` with the fragility note, as the dispatch's fallback spells it. Cost: triage measured this citation moving :310 -> :392 -> :390 inside one day, so it is stale again within about a day."
          ],
          "recommendation": "A, because the deviation is from the dispatch's fallback only, and both the card body and the triage comment name de-lining as the preferred outcome; B re-adds the exact literal this card exists to remove. One word and I will switch it to B."
        }
      ],
      "out_of_scope_findings": [
        "filed as #15765: no symbol-anchor corpus covers scripts/**, so the 27 cross-file path:NNN citations across 14 scripts/**/*.mjs files rot unchecked - this card's two are the worked example (one moved twice in a single day)",
        "repaired in-place under the bounded exemption rather than filed: content/docs/api/client-sdk.mdx:659, the second stale citation in the same header sentence - same defect class, same file, evidence and reasoning named in the PR body"
      ],
      "not_measured": [
        "node packages/lint/scripts/check-reference-carrier-shape.mjs - NOT MEASURED (PREREQUISITE NOT MET: `typescript` is not installed; no node_modules in this worktree)",
        "node packages/lint/scripts/check-reference-carrier-shape.mjs --self-test - NOT MEASURED (PREREQUISITE NOT MET: `typescript` is not installed; no node_modules in this worktree)",
        "node scripts/check-ci-filter-parity.mjs - NOT MEASURED (PREREQUISITE NOT MET: `yaml` is not installed; no node_modules in this worktree)",
        "node scripts/check-closing-keyword-parity.mjs - NOT MEASURED (PREREQUISITE NOT MET: `yaml` is not installed; no node_modules in this worktree)",
        "node scripts/check-closing-keyword-parity.mjs --self-test - NOT MEASURED (PREREQUISITE NOT MET: `yaml` is not installed; no node_modules in this worktree)",
        "node scripts/check-comment-mask-corpus.mjs - NOT MEASURED (PREREQUISITE NOT MET: `@typescript-eslint/parser` is not installed; no node_modules in this worktree)",
        "pnpm check:driver-memory-census - NOT MEASURED (PREREQUISITE NOT MET: `typescript` is not installed; no node_modules in this worktree)"
      ]
    }

    Generated by Claude Code

  6. claude commented on Sep 5, 2026

    @claude
    ContributorAuthor

    LANDED — PR #15770 merged as 901773b21. Card closed by Fixes.

    Probe on re-fetched origin/main (PM seat, plain node): the header cites packages/client/src/index.ts#PaginatedResult (1 occurrence) and no longer :310 (0); --self-test → EXIT=0, ✓ check-react-page-adapter-contract --self-test: 51 assertions — all THREE detectors o.

    Stripping pm:dispatched and the assignee in the same action.


    Generated by Claude Code

  7. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Sep 5, 2026
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:devxDomain lane — seat card indexed by label:pm:seatfindingRecorded observation — held, not dispatchable until the findings triage round grades itpriority:p3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions