Repository navigation
feat(spec)!: record:json is retired — refused by name at the schema door, the approval request page's raw JSON panel it was declared for was dropped (#24162) - #24170
Conversation
…moved (WIP) Claude-Session: https://claude.ai/code/session_01LKyb454ATwXXksfRnB8Xiy Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKyb454ATwXXksfRnB8Xiy Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKyb454ATwXXksfRnB8Xiy Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKyb454ATwXXksfRnB8Xiy Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LKyb454ATwXXksfRnB8Xiy Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckThis PR changes 1 package(s): 23 hand-written doc(s) name something this change touched — list omitted above 15 rows. Re-derive on the tree named below: ⛔ 11 release-owned page(s) also affected — read-only, see AGENTS.md Documentation Guardrails. What this run could not see
Coarse fallback — 143 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): Which tree this was computed onThis run read A worktree cut from an older # while this PR is open — GitHub drops the merge commit once it closes
git fetch origin d450005a06e7d1c4794ea0d926567ff6b02f90b8 && git checkout d450005a06e7d1c4794ea0d926567ff6b02f90b8
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin bd4276a91e94d6edf803110ccea4ca6bcbbf810d a12ff6bd8835bf887ece378b577d235776e1133d && git checkout -B drift-repro bd4276a91e94d6edf803110ccea4ca6bcbbf810d && git merge --no-ff a12ff6bd8835bf887ece378b577d235776e1133d
node scripts/docs-audit/affected-docs.mjs --json bd4276a91e94d6edf803110ccea4ca6bcbbf810d
|
Contract reviewServed-tier: ① Derived judgmentsEvery door
Nothing else's accept set moves, judged right.
No D2 conversion — right under the playbook's §3. §3's conversion is a per-key Registration keys are spelled as the gates read them. The The flipped lint pin asserts the refusal at the codes it names, with a live control. The tree-scoped absence walk is a complete pin. It judges the authoring shape (a ② Semver level
③ Boundary flags
Implemented-by: VERDICT: FAIL Generated by Claude Code |
…ker id Claude-Session: https://claude.ai/code/session_01LKyb454ATwXXksfRnB8Xiy Co-authored-by: Claude <noreply@anthropic.com>
Contract reviewServed-tier: ① Derived judgmentsThe delta is exactly the prescribed one-token removal, and nothing else in the PR moved. The fragment at the head passes the rule the previous record applied. The full text, read at the head (lines 3165–3178 of the template): "It also retires the The whole template at the head carries exactly two tracker ids outside comments, and neither is this PR's. A grep of every A re-scan of every added non-comment line in the five in-scope files finds no other id. The net diff against The fix reaches the artifact it must, and no committed artifact moves. ② Semver levelUnchanged. The delta edits one runtime prose string, the 17 → 18 upgrade rationale printed by ③ Boundary flags
The one defect of the previous record is closed by the delta, read in full, and nothing else moved. Implemented-by: VERDICT: PASS Generated by Claude Code |
席位核对ACCEPT · The seat's own reading, on top of the
Landing: Generated by Claude Code |
Fixes #24162
Clause-②: no (narrowing)
Retires the page component type
record:jsonand its props defRecordJsonProps, refused by name throughRETIRED_PAGE_COMPONENT_TYPES. This follows the maintainer's ruling quoted on the card (「业务上没有这个需求啊,处理审批的人为什么需要看json」) and triage grade6232511377.record:jsonwas declared spec first (#23745,97b8e7a51d) for one face, the approval request page's raw JSON panel, and that face was dropped. No renderer was built, no page placed it, and its one planned producer (PR #23837) was closed unmerged. It shipped in18.0.0-next.3. Under the no-staging rule, this PR removes it in the next prerelease, with its own changeset. The shape is theai:chat_windowretirement (PR #21531,48eb9c193), surface for surface.Dev session:
session_01LKyb454ATwXXksfRnB8Xiy(cloud dispatch from thedomain:spec#2seat, claim6232774903).Accept set, before → after, at each door
eda6f14b7b)PageComponentType(enum alone)record:jsoninvalid_valuewith the retirement prescription (the enum error map). A stranger such asrecord:jsonlkeeps zod's own messagePageComponentSchema.type(node){ type: 'record:json' }code: 'custom',path: ['type'],params.retiredComponentType: 'record:json', message = the prescription. Bare,{}-bag and populated alikePageSchema(whatos validate/ save parse)regions[i].components[j].type, one issue per nodeComponentPropsMap['record:json'](props gate,check-yaml-examples, vocabulary)RecordJsonProps:field(req.),label,requiredPermissions(req., min 1)retiredComponentProps('record:json')(z.never): every bag refused,{}included,invalid_typeat[]with the prescriptioncomponent-type-unknownerrorat…type, message = the prescription's head, hint = its "Delete the …" sentencecomponent-props-*component-props-invaliderrorat…propertiesfor every bagrecord:jsonforrecord:jsnKNOWN_COMPONENT_TYPE_CANDIDATES)PRINT_REFUSED_PAGE_COMPONENT_TYPESrowRecordJsonProps(const + type), JSON Schemaui/RecordJsonPropsEverything else is byte-identical, including the record blocks' own fail-open
requiredPermissionsgate. The open string arm stays open.The prescription (one string, all doors): "
record:jsonwas removed in @objectstack/spec 18 (ADR-0049) — it shipped only in the 18.0.0-next.3 prerelease, declared for one raw-JSON panel on the approval request page, and that panel was dropped: … Delete therecord:jsoncomponent node and put nothing in its place." It names no replacement, by ruling, and carries no tracker number (check:doc-authoring).The precedent's surfaces, and whether this PR touches each
PageComponentType, joinsRETIRED_PAGE_COMPONENT_TYPESwith a prescription, no tracker numberpage.zod.tsPageComponentSchema.type.describe()name the retirementretiredComponentPropscomponent.zod.ts, plus the factory's docblock listSTEP18_RATIONALEfragment,RETIRED_DEFS_BY_MAJOR[18]entryui-record-json-retired(inserted at its sorted id,order: 100= max + 1),retired-defs/18.ui__RecordJsonProps.ts;registry.tsgenerated, not committedcomponent-record-json-retirement.test.ts(replacescomponent-record-json.test.ts)component-type-vocabulary.test.ts: known through the row, not a candidate,record:still reservedcomponent-props-unknown-members.pin.test.tslineRecordJsonPropshad noz.unknown()membercontent/docs/ui/pages.mdxhand-written listrecord:json(grep 0)RecordJsonPropsvalidate-record-json-23745.test.tsis flipped into a refusal pin, not deleted: both lint rules, the sharedrunAuthoringRules('validate')pipeline, and the typo case, withrecord:approvalsas the live control. Kept rather than deleted because the map-drivenflags %scase invalidate-component-types.test.tscovers only the type rule, not the props rule or the pipelinecomponent-record-block-field-security.test.ts(therequiredPermissionscensus losesrecord:json),component-record-related-list-parent-23134.test.ts(the whole-bag set gains it),type-alias-convention.pin.test.ts(Iso_ui_component__RecordJsonPropsremoved, 789 → 788 and the prose counts)@objectstack/specalready declares incross-package-test-inputs.mjs, judging the authoring shape (atypekey valuedrecord:json), with its exclusions written beside it. Registered invitest.repo-tests.json, whichcheck:cross-package-test-inputsdemandedD2 decision: none registered
The playbook's §3 conversion is a per-key
stripKeys. Here the whole element leaves, so there is no key a walker could strip that leaves a valid node behind. Deleting an authored page node is a layout decision, and theelement-filter-removeddocblock rules that a conversion must not make it. The precedent registered none for the same reason. The D3 entry carries the delegated deletion. A user onnext.3meets the prescription atos validate.Because
packages/spec/src/conversions/registry.tsis not edited, the carried correction from contract review6142098559item A does not ride this PR (per the dispatch: only if that file is edited).Ratchets: a whole-def removal, so all four move
Each was regenerated by its generator. The two hand deletions are the ones the build gate prescribes.
json-schema.manifest/ui.jsonui/RecordJsonProps)authorable-surface/ui.jsonfield,label,requiredPermissions)api-surface/ui.jsonRecordJsonProps (const),(type))gen:api-surfacedeclaration-map/ui.json,export-origins/ui.jsongen:declaration-map,gen:export-originsui.mdui/sites 214 → 213,component.zod.ts81 → 80gen:strictness-ledgerindex.mdx,ui/component.mdx,ui/page.mdxRecordJsonPropssection gone, enum list −1gen:docsauthorable-defaults/,docs-import-surface.baseline.jsoncheck:generatedgreenauthorable-surface.base.jsoncheck:generatedon the final head:✓ All 14 generated artifacts are up to date. Noskills/**path moved, socheck-governed-mergesis not owed.Consumer grep on this head
git grep -e 'record:json' -e RecordJsonProps -- . ':!**/CHANGELOG.md' ':!.changeset/'.**/CHANGELOG.mdand.changeset/are excluded because they are release-owned records of whatnext.3shipped and are not edited here (seat ruling). The hits:page.zod.ts,component.zod.ts, the two entry files,registry.ts.template, the five spec test files and the lint pin;content/docs/references/ui/page.mdx: 2 lines, the regenerated.describe()naming it as retired.The control in the same query shape is
record:approvals, which hits in 9 files. The.objectui-shapin is not touched (objectuimain: 0 hits, per the card).Ablation (fix committed first,
scripts/ablation-replace.mjs, restored by blob)The subject resolves by relative import (
./page.zod,./component.zod) tosrc, so nodistrebuild was involved.record:json-ABLATED(held), and the row turned intoemptyProps('record:json'). Tool output: "anchor 1 -> 0, blob fee472ca872d -> 9927e199cb36".PageComponentSchema,PageSchemaat the element path, the enum error map, the vocabulary pin and the candidate-list pin.HEADblobs (e3f3674b323f,fee472ca872d), andgit diff HEADis empty.Gates (local, final head
26e52c407)buildexit 0.check:generated✓ All 14 generated artifacts are up to date.--project local --maxWorkers=2: 691 files, 20969 passed, 1 skipped, 1 todo. The new walk runs under--project repo: 10 of 10 passed.typecheckexit 0, withcheck:test-typecheck: OK.vitest: 142 files, 6812 passed, 5 skipped.typecheckexit 0.canonical-expression-envelopes(15, 11 and 16 passed), metadata-protocolprotocol.runtime-authoring-gate(145 passed), showcasecommand-center-metric-filter(3 passed), dogfoodexpression-conformance(7 passed).check-platform-checklist --changed-from origin/main: OK, 0 anchors lost.dispatch-gates --ran: "✓ 110 derived famil(ies) accounted for — 108 run, 2 NOT-MEASURED". Every family exited 0 except the two below.check:dual-build-cjs-loads. Reason: it needs a whole-repo build, and it exited 3 with PREREQUISITE NOT MET.check:type-check-debt. Reason: repo-wide tsc, killed by the 420s per-gate cap on the shared box. The two packages this PR touches typecheck green. Both are declared to CI.test:repoas a whole. It belongs to CI (Test Core); only this PR's new repo-project file was run.--eventpayload: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 nomajorbump." and "✓ LEVEL AXIS: this PR declares clause-②no (narrowing), and no package whose published source … it moves is gradedpatch".check-empty-changeset: exit 0.Deviations, stated
Clause-②: no (narrowing), not the claim'sClause-②: no. The dispatch asked for the spelling the gates accept for a narrowing today.check-changeset-no-major.mjsreads(narrowing)as the BREAKING arm and stands the level axis down on a bareno. The newest merged narrowings (24131-rest-public-form-required,24062-authored-install-scope-project) carry the same line.component-record-json.test.ts→component-record-json-retirement.test.ts, the*-retirement.test.tshouse name. Its accept pins are flipped, not kept.Acceptance notes
.changeset/pre/23745-record-json-block.mdandpackages/spec/CHANGELOG.mdare untouched. They record whatnext.3shipped, and this PR's changeset records the retirement (seat ruling).content/docs/releases/is untouched.domain:uiowner's call, per triage.pnpm install --frozen-lockfile52s. The first spec build took 252s on the shared box, and later ones 431–462s.Generated by Claude Code