Skip to content

spec(ui): retire record:json (#23745, 97b8e7a51d): its only consumer, the approval request page panel, was dropped by the maintainer; main already versions it into 18.0.0-next.3, which is not yet published #24162

Closed

Description

@objectstack-fleet

Filing gate ①: a declared capability left with zero consumers by a maintainer ruling, with a named landing. Time-sensitive: see "Timing".

Filed by the domain:services seat 2 (#21118) · os-elon-musk · session_018VqJPGA1NDNSCZsnecsChP, at the maintainer's ruling in that session. ⛔ Not a claim. Lane, grade and area:* are triage's; the reader who acts is the domain:spec seat.

The ruling

The maintainer, in session session_018VqJPGA1NDNSCZsnecsChP, verbatim:

  • 「审批单详情页为什么需要原始 JSON 面板,这个不应该直接删除吗?」 ("why does the approval request page need a raw JSON panel; shouldn't it just be deleted?")
  • 「业务上没有这个需求啊,处理审批的人为什么需要看json」 ("there is no business need for it; why would the person handling an approval need to see JSON")
  • Then the option 「关我的卡+立两张后续」 ("close my cards and file the two follow-ups"), whose text names this card: retire record:json before next.3 publishes.

Face 4 of ruling C on objectui#12438 (6190549995) is therefore dropped. #23746 is closed not planned (6232118266) and its PR #23837 closed unmerged.

Measured on origin/main eda6f14b7b

Timing

  • The version PR chore: version packages (next) #23825 has merged. packages/spec/package.json on main reads 18.0.0-next.3, and packages/spec/CHANGELOG.md lists record:json under 18.0.0-next.3, line 282.
  • npm still has next at 18.0.0-next.2 (npm view @objectstack/spec versions, read now), so nothing carrying record:json is published yet.
  • If the retirement lands before next.3 is published, the type never ships. Otherwise it ships in next.3, and the retirement removes it in the next prerelease, under the project's no-staging rule for retirements.
  • When to publish is the maintainer's call, not this card's.

The work (for the spec seat to scope)

Remove record:json and RecordJsonProps, with their tests and the generated baselines, through the repo's generators. Retire the lint pin validate-record-json-23745.test.ts and the docs row. Whether the consumed .changeset/pre/ note and the next.3 CHANGELOG entry are corrected or superseded is the spec seat's call: a deliberate correction of a consumed note, as #23938 was.

Dedupe

MCP search_issues on objectstack-ai/objectstack, retire record:json page component type RecordJsonProps zero consumers → 0 hits.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, priority:p1 · target:v18 · domain:spec · area:records · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-17T09:53Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.

    • Timing has moved: 18.0.0-next.3 was published at about 09:21Z (release.yml run 39015917065), before this card could land. So record:json ships in next.3. Under the no-staging rule, the retirement removes it in the next prerelease, with its own changeset.
      • The next.3 CHANGELOG entry records what shipped, so it is not a factual error to amend.
    • Why p1 + target:v18: it retires a declared page-component type before GA (protocol-first), and a maintainer ruling left it with zero consumers. If it reached GA, retiring it afterwards would be a breaking change.
    • The premise holds on origin/main eda6f14b7b: record:json still has rows in packages/spec/src/ui/page.zod.ts and component.zod.ts, and objectui main has no consumer.
    • Scope is the card's own: the type, RecordJsonProps, their tests, the generated baselines through the repo's generators, the lint pin and the docs row. The spec seat follows the spec-property-retirement playbook.
    • Neighbour: objectui#12490 (face 4), whose close or re-point is its domain:ui owner's call (pointer 6232139151).

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 5 (takeover shift, serial) · 2026-10-17T10:23Z · #24162: retire the page component type record:json and its RecordJsonProps, refused by name, by the maintainer's ruling that the approval request page's raw JSON panel is dropped (triage grade 6232511377)
    Session: session_01HSDGREvqxQUt7K7pjHXMyC (the seat; the dev is a cloud session whose draft PR carries its own session link, named on the seat post)
    Account: huangyiirene (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-24162-retire-record-json
    Worktree: objectstack-issue-24162
    Domain: domain:spec (triage 6232511377)
    Seat: domain:spec#2 (seat post #18549)
    File surface (paths on origin/main eda6f14b7b or later; stop on a breach and explain it in the report):


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24162,
      "status": "done",
      "branch": "claude/issue-24162-retire-record-json",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24170",
      "session": "session_01LKyb454ATwXXksfRnB8Xiy",
      "premise_still_valid": true,
      "summary": "record:json leaves PageComponentType and joins RETIRED_PAGE_COMPONENT_TYPES. Its prescription: removed in spec 18 (ADR-0049), shipped only in 18.0.0-next.3, delete the node and put nothing in its place, no replacement named, no tracker number. Its print-classification row is removed. RecordJsonProps is deleted, and the ComponentPropsMap row is kept as retiredComponentProps('record:json'), the ai:chat_window (PR #21531) shape. ADR-0087: D3 entry ui-record-json-retired, a STEP18_RATIONALE fragment (order 100, at its sorted id) and RETIRED_DEFS_BY_MAJOR[18] ui/RecordJsonProps. No D2, because deleting an authored page node is a layout decision; so conversions/registry.ts is not edited and the 6142098559 item A correction does not ride (A5). Pins: component-record-json.test.ts is replaced by component-record-json-retirement.test.ts. It pins code/path/params/first sentence at the map, the row (empty and populated bags), PageComponentSchema, PageSchema at the element path and the enum error map, with record:approvals as the live control at every door, plus a tree-scoped absence walk registered in vitest.repo-tests.json. The vocabulary pin is added. The lint accept pin validate-record-json-23745.test.ts is FLIPPED, not deleted, into a refusal pin at component-type-unknown, component-props-invalid and runAuthoringRules('validate'). It was kept because the map-driven flags case covers only the type rule. Census pins moved: field-security census, 23134 whole-bag set, type-alias 789 -> 788. Generated (generators only, plus the two deletions the build prescribes): api-surface -2, authorable-surface -3 ('def no longer emitted by this build'), json-schema.manifest -1 ('left the published set ... RETIRED_DEFS_BY_MAJOR, major 18'), declaration-map -1, export-origins -1, strictness counts ui 214 -> 213, reference docs. authorable-defaults, docs-import-surface and authorable-surface.base.json are unchanged; no skills/** path. Changeset .changeset/24162-record-json-retired.md: spec minor, BREAKING banner, FROM -> TO, Clause-② no (narrowing), adr-0087 registered ui-record-json-retired. The pre note and CHANGELOG.md are untouched. files_changed (23): .changeset/24162-record-json-retired.md; content/docs/references/{index,ui/component,ui/page}.mdx; docs/audits/2026-07-unknown-key-strictness-ledger.counts/ui.md; packages/lint/src/validate-record-json-23745.test.ts; packages/spec/{api-surface,authorable-surface,declaration-map,export-origins,json-schema.manifest}/ui.json; packages/spec/src/migrations/entries/{retired-defs/18.ui__RecordJsonProps.ts,semantic/18.ui-record-json-retired.ts}; packages/spec/src/migrations/registry.ts.template; packages/spec/src/type-alias-convention.pin.test.ts; packages/spec/src/ui/{component-record-block-field-security,component-record-json-retirement (new),component-record-json (deleted),component-record-related-list-parent-23134,component-type-vocabulary}.test.ts; packages/spec/src/ui/{component,page}.zod.ts; packages/spec/vitest.repo-tests.json. Consumer grep on head 26e52c407 (excluding **/CHANGELOG.md and .changeset/, release-owned records of what next.3 shipped): only the kit files plus 2 lines in the regenerated references/ui/page.mdx naming it retired; control record:approvals hits 9 files. Open PRs #24167 and #23969 touch no hot file; main moved 1 commit with no overlap, so no merge was needed. Container overhead, measured: pnpm install --frozen-lockfile 52s, deepen fetch about 30s; spec build 252s first, 431-462s later on the shared box. One turbo build of the downstream set spent its whole 590s window on a spec cache miss and was killed mid-dts. That left packages/spec/dist without .d.ts (caught by check-dev-prereqs), so spec was rebuilt directly (VERDICT exit 0) before any later reading.",
      "tests": "All at head 26e52c407 unless noted. spec build: VERDICT command-exit 0. check:generated: 'All 14 generated artifacts are up to date'. spec vitest --project local --maxWorkers=2: 691 files passed, 1 skipped; 20969 passed, 1 skipped, 1 todo (VERDICT 0). The new walk under --project repo: 10/10. spec typecheck: VERDICT 0, 'check:test-typecheck: OK'. lint closure (lint^...) built, then lint vitest: 142 files, 6812 passed, 5 skipped; lint typecheck exit 0; validate-record-json-23745.test.ts 5/5 (verbose). Downstream importers of the changed symbols (closure built first): platform-objects/mcp/cloud-connection canonical-expression-envelopes 15/11/16 passed, metadata-protocol protocol.runtime-authoring-gate 145 passed, example-showcase command-center-metric-filter 3 passed, dogfood expression-conformance 7 passed (after building @objectstack/verify). The full '...@objectstack/spec' set was not run: this is the retirement-playbook default (a tree-scoped absence pin instead of a whole-closure rebuild), and it is declared to CI. Ablation (fix committed first, scripts/ablation-replace.mjs, src via relative import so no dist): the map key was renamed (held) and the row set to emptyProps, 'anchor 1 -> 0, blob fee472ca872d -> 9927e199cb36'. Result: 7 failed / 24 passed (map, row, PageComponentSchema, PageSchema, enum error map, vocabulary, candidate-list pins). Restore: 'blob == HEAD (e3f3674b323f)' and 'blob == HEAD (fee472ca872d)', git diff HEAD empty.",
      "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no paths): 110 commands. Each was run with its exit captured before any pipe (420s cap) and reconciled: '✓ dispatch-gates --ran: 110 derived famil(ies) accounted for — 108 run, 2 NOT-MEASURED (1 DERIVED from a recorded exit 3, 1 claimed)'. Re-runs after their prerequisite was met (all exit 0): check:doc-formula-expressions, check:doc-security-posture, check:skill-examples, check:docs-transcript-drift, check:lean-entry-closure, check-plugin-teardown-shape --self-test (after fetching its pinned fixture commit). One real finding was fixed: check:cross-package-test-inputs was exit 1 because the new walk was not in vitest.repo-tests.json; after adding it, 'OK: 31 package(s) read outside themselves, all declared'. check:generated was re-run on the final head: exit 0. NOT MEASURED: check:dual-build-cjs-loads (exit 3, PREREQUISITE NOT MET, needs a whole-repo build); check:type-check-debt (repo-wide tsc killed by the 420s cap, exit 124; the touched packages typecheck green); spec test:repo as a whole (CI's Test Core). All three are declared to CI. check-platform-checklist --changed-from origin/main: 'OK — ... 6 anchor(s) judged, 0 lost'. Changeset gates, with the PR body as the --event payload: check-adr-0087-registration '✓ 1 declared-breaking changeset(s) ... [BREAKING+bang+clause-②-narrowing] registered ui-record-json-retired (new here: ui-record-json-retired)'; check-changeset-no-major '✓ This diff introduces no major bump' and '✓ LEVEL AXIS: this PR declares clause-② no (narrowing) ...'; check-empty-changeset exit 0; pnpm check:adr-0087-registration exit 0. CI on PR #24170 at 26e52c407 when reported: 24 check-runs, 22 in_progress, 1 success, 1 skipped. Not waited on, per contract.",
      "mcp_calls": "0 — no MCP tool used. Card and thread reads were public REST GETs (issue, comments, open pulls and their files, PR and check-runs read-back).",
      "api_writes": "2 relay strokes. (1) pr_create via scripts/pm/fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/dispatches (fleet-write run 39035675189, success). Executed as POST /repos/objectstack-ai/objectstack/pulls (draft) and POST /repos/objectstack-ai/objectstack/issues/24170/assignees ['huangyiirene']; read-back: 12446 bytes sent and stored identically. (2) this os-dev-report comment: POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/objectstack/issues/24162/comments. git push is not a REST write. No label writes (none required).",
      "open_questions": [],
      "out_of_scope_findings": [
        "deviation (not a finding): Clause-② is spelled 'no (narrowing)', not the claim's bare 'no'. The dispatch asked for the spelling the gates accept for a narrowing today, check-changeset-no-major reads it as the BREAKING arm, and the newest merged narrowings (24131, 24062) carry the same line. The seat may want the claim line aligned.",
        "noted, not filed · carrier: none · objectui#12490 (face 4) re-point or close stays its domain:ui owner's call, per triage 6232511377."
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 24162,
      "status": "done",
      "branch": "claude/issue-24162-retire-record-json",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/24170",
      "session": "session_01LKyb454ATwXXksfRnB8Xiy",
      "premise_still_valid": true,
      "summary": "Patch round 1 (contract review 6234523454, record ①; the record was read and verified before acting). One token in one file: the ui-record-json-retired STEP18_RATIONALE fragment in packages/spec/src/migrations/registry.ts.template now reads 'page element (ADR-0049 enforce-or-remove), one ...', with '#24162, ' deleted. Nothing else changed. The id stays in the // comments and the schema comments. Commit a12ff6bd8 is pushed, and the PR stays draft. The generated (gitignored) registry.ts line 6991 now carries the id-free text. check:generated is green, so no committed artifact carries the rationale and none moved. pr_body_replacement: not owed, because the PR body names the fragment's id, order and placement but never quotes its text. main moved 3 commits since the branch point; it was not merged (no conflict, no main-caused red). files_changed (1): packages/spec/src/migrations/registry.ts.template. Container overhead this round: worktree re-add, then pnpm install --frozen-lockfile 112s; spec build 594s on the shared box.",
      "tests": "At head a12ff6bd8, under the verify lock (slot issue-24162): spec build VERDICT command-exit 0. Then, chained with &&: check:generated '✓ All 14 generated artifacts are up to date', and scripts/step18-rationale-merge.test.ts (--project repo) 1 file, 9/9 passed; VERDICT command-exit 0. Ablation: not owed, because a comment-text-only change in a rationale string changes no tested behaviour.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack, scoped to the round's change set (the one path packages/spec/src/migrations/registry.ts.template, as the seat directed), at a12ff6bd8: 72 families. Each was run with its exit captured before any pipe (420s cap). Re-runs: lint and objectql closures built (VERDICT 0), then check:doc-formula-expressions exit 0 (was exit 3, lint unbuilt), check:lean-entry-closure exit 0 (was exit 3, objectql unbuilt), check:query-options-erasure exit 0 with a 900s cap (it hit the 420s cap, exit 124; it took 390s last round). Reconciled: '✓ dispatch-gates --ran: 72 derived famil(ies) accounted for — 71 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)'. NOT MEASURED: check:dual-build-cjs-loads (exit 3, PREREQUISITE NOT MET, needs a whole-repo build); declared to CI (Build Core). check:doc-authoring exit 0; it does not reach a text: field (per the review), so the fix itself is evidenced by the diff and the regenerated registry.ts line. CI on a12ff6bd8 is the seat's to read.",
      "deviations": "(1) The round's derivation was passed the one changed path rather than run path-less, because the seat directed 'only the families the round's change set derives'. A path-less run would derive the whole PR's set. (2) The PR body was not written; the seat holds that write.",
      "mcp_calls": "0 — no MCP tool used. The review record was read by public REST GET (comment 6234523454).",
      "api_writes": "1 relay stroke: this os-dev-report comment, POST /repos/objectstack-ai/objectstack/dispatches, executed as POST /repos/objectstack-ai/objectstack/issues/24162/comments. git push (a12ff6bd8) is not a REST write. No label or PR writes.",
      "open_questions": [],
      "out_of_scope_findings": [
        "noted, not filed · carrier: the seat (record 6234523454 already names it) · the two '(#11509, ruling A-narrow)' STEP18_RATIONALE fragments from 317cddd40 are the same kind of debt; not touched here, per the round's 'change nothing else'."
      ]
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 17, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #24170 → 030a7b83e8 (Fixes #24162) · domain:spec seat 2 · huangyiirene · session session_01HSDGREvqxQUt7K7pjHXMyC · 2026-10-17T15:53Z

    probe reading
    PR object merged 2026-10-17T15:52Z out of the merge queue (enqueued 2026-10-17T15:18Z); squash 030a7b83e8 on parent cb8756b005
    origin/main git merge-base --is-ancestor 030a7b83e8 origin/main → exit 0
    merged vs reviewed head the squash tree 4e7bc917a2 equals git merge-tree --write-tree cb8756b005 a12ff6bd88 (the reviewed head)
    queue branch no gh-readonly-queue/main/pr-24170-* ref remains
    mis-close scan the body's only closing keyword is Fixes #24162; this card closed completed. #24060 closed in the same second, but it was closed by PR #24177 (62c4441ef, the next commit in the same queue batch), its own fix
    chain claim 6232774903 (mode:cloud, dev session session_01LKyb454ATwXXksfRnB8Xiy; its Clause-② line aligned to no (narrowing)) · report 6234318015 · contract review FAIL → PR #24170 comment 6234523454 · patch-round report 6235442527 · contract review PASS → PR #24170 comment 6235567508 · ACCEPT → PR #24170 comment 6235596068

    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

area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:specpriority:p1High: required for production / M2target:v18

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions