feat(core,components): the html tier registers and declares code — an html page's code tag renders its text, not the field:code editor (objectui#10756) - #10776
Conversation
… html page's code tag renders its text On a kind:'html' page, `<code>inline</code>` resolved to the bare `code` key, which was the `field:code` widget's namespace fallback — a code editor reading `value`, no declared inputs, no child slot — so the authored text was dropped while `pre`, `strong`, `em` and `span` rendered theirs through the passthrough. The published manifest left `code` undeclared for the same reason. - components: `code` joins the `TAGS` loop of `html-elements.tsx` (registered `ui:code`, sanitised like its siblings: `className` + the `children` slot); the header no longer calls it "registered elsewhere". - fields: `code` joins `FIELD_TYPES_SKIP_FALLBACK` — the widget keeps `field:code` and stands down from the bare key, so `ui:code` is the one bare claimant (the bare-name collision gate stays at zero contested keys). - core: `code` joins `HTML_TIER_INTRINSICS`; `getPublicConfigs()` projects it stamped `tier: 'html'` — the regenerated manifest grows from 106 to 107 components (48 html-tier), 0 curated entries changed, `div` / `kbd` absent. - types: `HtmlElementSchema` (zod + TS) names `code`, keeping the JSON-surface arm equal to the registration as the objectui#8499 parity pin requires (its count guards move 37 -> 38). - pins: the console renders the text in a `code` element and compiles the tag cleanly against the live page manifest; `field:code` still renders the widget; the manifest declares `code`; the react-page scope injects no `Code` wrapper; the console ledger drops `code`, the core roster test carries it. - generated: `known-schema-types.ts` gains `ui:code`; `body-dialect-census.mjs` mirrors the tag list; two pending changesets take dated notes (47 -> 48, 37 -> 38); one new changeset declares minor for components/core/types/fields. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
|
changeset-claim-re-read
|
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
…elements siblings
The sweep's completeness case ("components: every widget it registers is
swept") derives the registered set from the registry and compares it with the
enumerated targets, so the `ui:code` passthrough registered by the previous
commit went red there: expected [ 'action:bar', …(158) ] to deeply equal
[ 'action:bar', …(159) ], missing "ui:code".
`ui:code` joins `COMPONENTS_PLAIN_TYPES` (rendered with the shared readiness
class and scanned like `ui:cite` / `ui:strong`) and the BARE_SPREAD ledger
group those siblings sit in — the same `html-elements.tsx` factory forwards its
whole prop bag, so it leaks the same fourteen attributes. The docblock's
hand-written counts and the sentences the file pins them against move with it
(targets 159 -> 160, plain 140 -> 141, ledgered 89 -> 90, ready 156 -> 157,
all targets 182 -> 183, all ledgered 91 -> 92); the clean count stays 70.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
…with `code` in the html tier
The branch moved `HtmlElementSchema` from 37 to 38 tags and updated the count
guards and most of the prose beside them, but two sentences still read 37:
`public-contract.test.ts`'s anti-vacuity note ("a single enum arm contributes
37 spellings") and the 8499 parity pin's note on its own `toBe(...)` guards.
Both now read 38; comment-only, no assertion changes.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: FAIL
After these two text fixes, the code, pins, manifest, CI and boundaries pass as reviewed. |
…li names ui:code Contract review 5856453707 (VERDICT: FAIL, text only) on objectui#10756: - The `@object-ui/fields` bullet gets the BREAKING (authoring) banner the protocol and the objectui#9533 precedent require for a bare-key resolution change, with the `field:code` migration sentence, and stays `minor` (a breaking change never declares `major`). - The `@object-ui/types` bullet gains the `AnyComponentSchema` / `objectui validate` accept-set-widening clause. - The intro's "`pre`, `strong`, `em` and `span` rendered their children through the passthrough" corrects `span`'s own renderer (`span.tsx:149`). - `@object-ui/cli` joins the frontmatter as `minor` (`known-schema-types.ts` gains `ui:code`; the objectui#9533 and objectui#6416 precedents name it in the fixed group either way) with a body bullet. No code, test or manifest changes; check:changeset-presence, check:changeset-no-major, check:changeset-overwrite (report-only) and check:changeset-fixed all exit 0, as do check:control-bytes and check:new-line-citations. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014mXUNuFomfj24w7s1pZzhN
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
Contract reviewServed-tier: Narrow round-3 review, run in-seat by the dispatching seat, of the delta ① Derived judgments
② Semver level
③ Boundary flags
Implemented-by: VERDICT: PASS |
Fixes #10756
Clause-②: yes — the published
sdui.manifest.jsongains one html-tier tag (code, stampedtier: 'html'; 47 becomes 48).Executes triage
5853741286on objectui#10756 under ruling A on objectstack-ai/objectstack#20112 (5852014527): akind:'html'page may author the intrinsic tags its renderer registers, and the published manifest declares that set. PR objectui#10753 (objectui#10735) landed the roster and ledgeredcodeout because the only barecoderegistration was thefield:codewidget's namespace fallback; this PR is the element that ledger was waiting for. Baseorigin/mainb5b6f37531; headd601b5c1d2(four commits: the feature974840acbd;2fb626af0d, which enrolsui:codein the app-shell DOM-leak sweep after CI went red on the feature commit;b62fca8044, two comment-only prose counts;d601b5c1d2, the changeset-text fix contract review5856453707required). H1 to H5 below are the round-1 readings taken at974840acbd; the round-2 section records what changed after it; the round-3 section records the changeset-only text fix.What changed
packages/components/src/renderers/basic/html-elements.tsx—codejoinsTAGS(registeredui:code, sanitised like its siblings:classNameand thechildrenslot). The header no longer listscodeas "registered elsewhere"; the exclusion comment drops it.packages/fields/src/index.tsx—codejoinsFIELD_TYPES_SKIP_FALLBACK: the widget keepsfield:codeand stands down from the bare key, soui:codeis the one bare claimant (file-surface amendment, forced by H2 below: the bare-name collision gate refuses a second claimant, and in the console graph the widget registers AFTER the passthrough and would have won the bare key back).packages/core/src/registry/html-tier-intrinsics.ts—codejoinsHTML_TIER_INTRINSICS; the header's "deliberately NOT here" bullet forcodeis replaced by the admission note.packages/types/src/zod/layout.zod.tsandpackages/types/src/layout.ts—HtmlElementSchema(zod and TS) namescode(file-surface amendment, forced by the objectui#8499 parity pin:HtmlElementSchemamust name exactly the tagsTAGSregisters).apps/console/src/__tests__/html-tier-code-element-10756.test.tsx;html-tier-manifest.test.ts(ledger dropscode;declares code; the compile case flips from refuses to accepts); corehtml-tier-intrinsics.test.ts(roster carriescode; the squatting-widget case moves tosummary, plus a projection case for the stand-down);react-page-scope.test.tsx(noCodewrapper); fieldsregistry-collision.test.ts(codejoins the colliding set); typesnode-slot-registered-arms-8499.test.ts(count guards 37 to 38, 47 to 48 literals); prose counts incontainer-declaration-census.test.tsxandpublic-contract.test.ts(all three of its 37-tag sentences now read 38; the note under the 8499 pin'stoBeguards likewise).packages/app-shell/src/__tests__/widget-dom-leak-sweep.test.tsx—ui:codeis enrolled where itsTAGSsiblingsui:cite/ui:strongsit:COMPONENTS_PLAIN_TYPES(rendered with the shared readiness class and scanned) and theBARE_SPREADgroup ofCOMPONENTS_LEAK_GROUPS(the same factory forwards its whole prop bag, so it leaks the same fourteen attributes, objectui#5574's recorded shape). The docblock counts the file pins against its own arrays move with it: targets 159 to 160, plain 140 to 141, ledgered 89 to 90, ready-matched 156 to 157, all targets 182 to 183, all ledgered 91 to 92; clean stays 70. The completeness assertion is untouched.packages/cli/src/utils/known-schema-types.tsregenerated byscripts/regenerate-known-schema-types.mjs(+ui:code);scripts/body-dialect-census.mjsmirrors the tag list..changeset/10756-html-tier-code-element.mddeclaresminorfor@object-ui/components,@object-ui/core,@object-ui/types,@object-ui/fieldsand@object-ui/cli. Round 3 (contract review5856453707) gave the@object-ui/fieldsbullet a BREAKING (authoring) banner: the barecodekey no longer resolves to the code-editor widget, migration{ "type": "code" }becomes{ "type": "field:code" }, and it staysminorunder objectui's version policy. The same round also appended theAnyComponentSchema/objectui validateaccept-set-widening sentence to the@object-ui/typesbullet, corrected the intro'sspanclause, and added the@object-ui/clibullet (known-schema-types.tsregenerates and gainsui:code; the objectui#9533 and objectui#6416 precedent). Dated notes in the objectui#10533 form remain on.changeset/10735-html-tier-manifest.md(47 to 48,codenow declared) and.changeset/8499-node-slot-registered-arms.md(37 to 38).check-changeset-overwritereports both modifications (report-only, exit 0) and did not refuse them.PUBLIC_BLOCKS,kbd,div,docs/adr/**, anything in objectstack (the lockstep port and the manifest regeneration at the pin are [Decision] may a kind:'html' page author intrinsic HTML tags (div, a)? The console manifest says no, 3 of 3 shipped html pages say yes, and #19922's fallback cannot go live until one side changes objectstack#20112's lane).H1 — reproduced on
origin/main(b5b6f37531)The new console pin, run on a detached worktree at the base commit through the real page path (
SchemaRendererwith akind:'html'page whose source is amainholding apthat holds acodetag with the textinlineandclassName="k"):renders the authored text inside a code element—AssertionError: expected null to be truthy(nocodeelement rendered; the bare key drew the field widget).compiles cleanly against the live page manifest—expected [ 'not-a-container:code' ] to deeply equal [](the widget declared no child slot).resolves to the field widget under its namespaced key, while the bare key is the passthrough—expected 'field:code' to be 'ui:code'.preandstrongrendered their text (the control case passed on base and on head).H2 — the registration, measured (
ComponentRegistryanswers in the console registration graph:@object-ui/componentsplussrc/register-plugins.ts, which pulls@object-ui/fieldsthroughplugin-form)b5b6f37531974840acbdcodefield:code(namespacefield, inputs[],FieldCarrier)ui:code(namespaceui, inputsclassName,children, the forwardRef passthrough)ui:codeui:codefield:codefield:code(unchanged)field:code(unchanged)kbd/ui:kbdui:kbd, inputslabel,classNamegetPublicConfigs()html, nocodehtml,codestampedhtmlHow the
TAGSpassthroughs register:ComponentRegistry.register(tag, Component, { namespace: 'ui', … })— every roster tag isui-namespaced and also takes the bare key (theregisterfallback branch). The bare key is last-writer-wins, and in the console graph@object-ui/fieldsregisters after@object-ui/components, so without the stand-downfield:codewould have takencodeback (ablation L3 below shows exactly that).FIELD_TYPES_SKIP_FALLBACKis the repository's settled mechanism for this shape (textarea,select,email,password,slideralready stand down toui:*). Forms resolve widgets through thefield:namespace (form.tsxresolvesfield:${type}), so a field of typecoderenders the same editor; a JSON-surfacefield:codenode is unchanged; only a bare JSON{ "type": "code" }node moves, and it now renders the element — the widget's key isfield:code.check:registry-bare-namesstays at 0 contested keys; nothing is added to its shrink-only ledger.H3 — the roster and the regenerated artefacts
Generated with the repo's own generator (
buildArtifactsinpackages/sdui-parser/scripts/gen-manifest.ts) over the console registration graph with the 16 plugin modules eager-imported indev/manifest-dump.tsxorder, once on the base tree and once on head:sdui.manifest.jsoncomponentscode), 0 removed, 0 curated entries changedcodeentry{ type: 'code', namespace: 'ui', tier: 'html', inputs: className (string), children (slot) }div/kbdpresentsdui-intrinsics.d.tsCodePropsinterface, +"code": CodePropsintrinsic)sdui-blocks.md## html tier intrinsic elements (47)## html tier intrinsic elements (48);# SDUI public blocks (59)unchangedcodeleavesEXCLUDED_HTML_NAMEDinapps/console/src/__tests__/html-tier-manifest.test.ts; the ledger's liveness pin would have gone red had it stayed. The 47 count PR objectui#10753 pinned lives in prose only (its changeset and the core roster test's "three registered elsewhere" case, which stays at three becausecodeis now on the JSON-surface enum too); the changeset takes a dated note.H4 — pins, red on the base and green on the head
Run on a detached worktree at
b5b6f37531with the six pin files copied in:Test Files 6 failed (6) · Tests 13 failed | 68 passed (81). Run on head974840acbd(16 files including the neighbours):Test Files 16 passed (16) · Tests 241 passed (241).codewith text renders the text in acodeelement (real page path)expected null to be truthynot-a-container:codefield:coderenders the widget (read-onlyprewith the value) and keeps its key'field:code'to be'ui:code')declares code(tier html, ui, className + children)expected undefined to be definedunaccounted: codecodewith childrencode, leaveskbdoutexpected undefined to be 'html'Codewrapper,codestamped htmlexpected undefined to be truthycodeis not the field rendererFieldCarrierAdapterHtmlElementSchemanames exactlyTAGS(38), literal count 48expected 37 to be 38,expected 47 to be 48Per-hunk ablations (each through
scripts/ablation-replace.mjsfrom../objectstack,--deletemode, on the committed head; the tool printed anchorx1 -> x0and the blob change for every leg, and restore proofblob == HEADplus emptygit diff HEAD; an outer hash-against-HEAD check agreed on all legs; finalgit statusclean). Pin set: the six files above pluszod-mirror-parity.test.ts(118 tests).'code'out ofTAGS'code'out ofHTML_TIER_INTRINSICSdeclares code, the census (codeunaccounted), the react-page pin, the core roster pins; the render pin stayed green (the renderer does not read the roster)'code'out ofFIELD_TYPES_SKIP_FALLBACKnot-a-container:code),declares code(the projection copied the widget), the fields collision pin; andcheck:registry-bare-namesexit 1 naming the contested bare keycode'code'out of the zod enum| 'code'out of the TS unionpnpm --filter @object-ui/types type-checkexit 2,zod-mirror-parity.test.ts … TS2322: Type '"layout.zod.ts#HtmlElementSchema"' is not assignable to type 'never'Disclosed: a first ablation pass was a no-op —
ablation-replace.mjsrefused every leg before any test ran (the replacement count moved 1 -> 1, a rise of 0: the replacement text was a substring of the anchor) and restored each file; the pass above is the rerun in--deletemode.H5 —
kbd, measured onlypackages/components/src/renderers/data-display/kbd.tsxregistersui:kbdwith inputslabel,className, no child slot; it readsschema.keys(array) orschema.labeland renders onekbdper key inside a wrapperdiv. That is a component under an HTML tag name, not an element passthrough — a different shape fromcode. Untouched; it stays inEXCLUDED_HTML_NAMEDwith its reason.Round 2 — CI red on
974840acbd, and the repairTest (shard 6/8)(run 36319935360, job 108621700100) failed the sweep's completeness case:the sweep covers a real, non-empty target set (objectui#4425) › components: every widget it registers is swept — a new one cannot slip past,expected [ 'action:bar', …(158) ] to deeply equal [ 'action:bar', …(159) ], missing"ui:code". The case derives the registered set fromComponentRegistryand compares it with the enumerated targets, so theui:codethis PR registers had no target.974840acbd's blob written into the worktree (on-disk blob76f8f62ca0equal to974840acbd's, zero'ui:code'occurrences) and restored afterwards (blob6bed2c87dcequal to HEAD's,git diff HEADempty):Test Files 1 failed (1) · Tests 1 failed | 229 passed (230), the same case, the same- "ui:code"diff.Test Files 1 passed (1) · Tests 231 passed (231). The file gains one test becauseui:codeis now its own swept case.../objectstack'sscripts/ablation-replace.mjs, wrap mode; each leg printed anchorx1 -> x0with the blob change, and restoreblob == HEADplus emptygit diff HEAD; an outer hash-against-HEAD check agreed after each leg):'ui:code'fromCOMPONENTS_PLAIN_TYPES(the enrolment)every widget it registers is swept) first, then the ledger's well-formedness, the family-size / ledgered / clean cases, five derived-count cases and the reading table'ui:code'from theBARE_SPREADledger groupui:codesweep case itself (ui:code leaked 14 non-DOM attribute(s), read off a renderedcodeelement carrying the readiness class), plus the ledgered / clean / derived-count / reading-table casesLeg A shows the completeness case catches a missing enrolment; leg B shows the enrolled
codeis actually rendered and scanned, not only listed. Disclosed: the first ablation attempt was a no-op — the tool refused both legs before any mutation (not inside a git repository: it was invoked from outside the worktree); the legs above are the rerun from the worktree root.git grepfor every test or script that enumerates theTAGSroster,ui:citeor a sibling tag, or states the 37 / 47 / 106 counts; every one run atb62fca8044:Test Files 13 passed (13) · Tests 368 passed (368): app-shellwidget-dom-leak-sweep; consolehtml-tier-code-element-10756,html-tier-manifest,public-contract; componentscontainer-declaration-census,span-deprecation-provenance,registration-uniqueness,shadowed-renderer-behaviour,react-page-scope; fieldscellRenderers.childlessContainer-8580,richtext-cell-renderer-5452,registry-collision; sdui-parserinline-whitespace.Test Files 15 passed (15) · Tests 430 passed (430): corehtml-tier-intrinsics; typesnode-slot-registered-arms-8499,arm-named-export-8784,form-barrel-mirror-9406,node-recursion-point-8344,zod-mirror-parity,breadcrumb-object-tree-nameable-7917; sdui-parserhtml-tier-manifest-10735; scriptscheck-doc-component-types,body-dialect-census,known-schema-types-derivation-5115,check-component-surface-parity,registry-bare-name-collisions,check-handler-key-read-sites; clicheck-known-types.regenerate-known-schema-types.mjs --checkOK;check:registry-bare-names0 contested✓;census:body-dialectexit 0;check:component-surface-parityreport-only exit 0;check:doc-types✅.b62fca8044:public-contract.test.ts's anti-vacuity note (37 spellings, now 38) and the note under the 8499 pin'stoBeguards. Left as historical readings, not live counts:check-component-surface-parity.mjs's "(37 + 7 tags)" (it describes the guard's earlier shape, objectui#4631 review F1), and theAnyComponentSchema106 / 107-arm figures innode-recursion-point-8344,node-slot-registered-arms-8499,breadcrumb-object-tree-nameable-7917andcheck-handler-key-read-sites(a different population, the union's arms; this PR adds a literal to an existing enum arm, not an arm).Round 3 — text-only FAIL on
b62fca8044, and the repairContract review
5856453707(VERDICT: FAIL, code/pins/manifest/CI/boundariesPASS) held the changeset text short of the protocol's BREAKING-banner
requirement for a bare-key resolution change (the objectui#9533 precedent) and
listed two nits plus an advisory. Only
.changeset/10756-html-tier-code-element.mdchanged; no source, test or generated file moved.
@object-ui/fieldsbullet is replaced verbatim with the review'sBREAKING (authoring) banner text: the bare
codekey no longer resolvesto the code-editor widget, with the
{ "type": "code" }→{ "type": "field:code" }migration, and the explicit "released asminor... abreaking change never declares
major" sentence.@object-ui/typesbullet gains theAnyComponentSchema/objectui validateaccept-set-widening clause the review's nit asked for.pre,strong,emandspanrendered their childrenthrough the passthrough" is corrected to "
pre,strongandemrenderedtheir children through the passthrough, and
spanthrough its ownrenderer" (
span.tsx:149is its own renderer, per the review's nit).'@object-ui/cli': minorjoins the frontmatter per the review's advisory(
known-schema-types.tsgainsui:code; the objectui#9533 and objectui#6416precedents name it in the fixed group either way), with a one-sentence body
bullet in the same house style those two precedents use.
false by this round's re-read.
Verified with a normalized-whitespace string match that the replaced
@object-ui/fieldsbullet is byte-for-byte the review's quoted text (ignoringline-wrap only).
Gates, each run as itself at head
d601b5c1d2, all exit 0:node scripts/check-changeset-presence.mjs(✅ 15 source file(s) of 7 released package(s) changed, and this change declares 1 changeset(s));node scripts/check-changeset-no-major.mjs(✅ No changeset declares amajorbump.);node scripts/check-changeset-overwrite.mjs(report-only; reports thesame two pre-existing dated-note modifications as round 2, unchanged by this
round);
node scripts/check-changeset-fixed.mjs(✅ All workspace packages are in the changeset fixed group./✅ privatePackages declared: version=true, tag=false.);pnpm check:control-bytes(✅ … scanned 8958 tracked text file(s); skipped 85 binary);pnpm check:new-line-citations(VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0). No test suite was run: nothing executable changes (git diff --statagainstb62fca8044: 1 file changed, 20 insertions, 10 deletions).Merge:
git fetch origin mainthengit merge-tree --write-tree HEAD origin/mainatd601b5c1d2againstorigin/mainbf14b64608(main moved 7commits / 76 files past
b62fca8044, none of them this branch's one file):exit 0, tree
dfe14b140f, no conflicts, no merge commit needed. Pushed once,b62fca8044..d601b5c1d2. CI ond601b5c1d2read once after the push, notwaited on: 27 check-runs, 26 queued, 1 skipped, 0 failing.
Gates (local, targeted; the farm is CI's)
b62fca8044: the sweep and the 28-file census above;check-changeset-presence:✅ 15 source file(s) of 7 released package(s) changed, and this change declares 1 changeset(s);check-control-bytes✅;check-new-cross-file-line-citations0 new citation(s);eslint --no-inline-configover the three round-2 files: 3 files, 0 errors, 0 warnings.d601b5c1d2(changeset text only):check-changeset-presence✅ (15 source file(s) of 7 released package(s),1 changeset(s));check-changeset-no-major✅;check-changeset-overwritereport-only, same two pre-existing dated notes;check-changeset-fixed✅ (both lines);check:control-bytes✅ (8958 scanned, 85 binary skipped);check:new-line-citations0 new citation(s). No test suite: this round touches only.changeset/10756-html-tier-code-element.md.pnpm exec vitest runover 16 files at974840acbd:Test Files 16 passed (16) · Tests 241 passed (241)(consolehtml-tier-code-element-10756,html-tier-manifest,public-contract; corehtml-tier-intrinsics; typesnode-slot-registered-arms-8499,arm-named-export-8784,zod-mirror-parity; fieldsregistry-collision; componentsreact-page-scope,span-deprecation-provenance,registration-uniqueness,container-declaration-census,shadowed-renderer-behaviour; sdui-parserhtml-tier-manifest-10735; scriptsbody-dialect-census,known-schema-types-derivation-5115).pnpm --filter PKG type-checkafterpnpm --workspace-concurrency=2 --filter '@object-ui/fields^...' build(the dependency closure):@object-ui/types,@object-ui/core,@object-ui/fields,@object-ui/components,@object-ui/cliall exit 0.@object-ui/consoletype-check NOT MEASURED locally: it needs every plugin'sdist/and the first attempt without the closure failed onTS2882/TS6305"not built" errors, not on this diff — declared to CI'sType Check.node scripts/check-registry-bare-name-collisions.mjs:0 contested; ledger holds 0 … ✓ no new bare-name collision.node scripts/regenerate-known-schema-types.mjs --check:OK … matches the registry derivation.node scripts/check-changeset-presence.mjs:✅ 13 source file(s) of 6 released package(s) changed, and this change declares 1 changeset(s).check-changeset-no-major:✅.check-changeset-overwrite: reports the two dated-note modifications, report-only exit 0.check-doc-component-types✅ ·check-new-cross-file-line-citations:0 new citation(s)·check-test-path-roots✅ ·check-control-bytes✅ ·check-pending-changeset-literals✅ ·check-prompt-component-keysOK ·check-side-effects-array✅.pnpm exec eslint --no-inline-config --format jsonover the 15 changed lintable files: 0 errors, 155 warnings, all in the pre-existing classes (no-explicit-any,react-refresh/only-export-components; the two in the new test are theas anycasts the sibling console suites use).eslint.config.jsconfigures no type-aware linting (noparserOptions.project/projectService), so this diff moves no untouched file's verdict; the repo-widepnpm lintpopulation is CI's.Serial
Open-PR file lists were read by the seat before dispatch (none touches these files). Before the round-2 push:
git fetch origin main:refs/os-dev/issue-10756/main -f— main moved fromb5b6f37531to17b323e5ca(2 commits, 24 files), none of them among this branch's 19;git merge-tree --write-tree HEAD refs/os-dev/issue-10756/mainexit 0, no conflicts. No merge commit was needed.Acceptance notes
kbd: measured above (H5) — auicomponent readingkeys/label, no child slot; not the same shape; not widened here.code;docs/adr/**is a governed surface and is not edited in this PR. The admission is documented in the roster's header (html-tier-intrinsics.ts) and the changeset. Carrier: none named.FIELD_TYPES_SKIP_FALLBACKcomment abovetime/addresssays no other package owns those bare keys, whilehtml-elements.tsxregistersui:timeandui:addressfromTAGS. Behaviour is unaffected (both stand down already); noted, not touched.scripts/body-dialect-census.mjscarries a hand-copiedHTML_ELEMENT_TAGSlist with no pin againstTAGS; updated here to includecode, drift otherwise unguarded.{ "type": "code" }used to draw thefield:codeeditor through the fallback and now draws the element passthrough. No producer in this tree authors that node (thetype: 'code'hits inplugin-designer/plugin-chartsare input-kind declarations, not node types); the changeset says so — BREAKING (authoring), migrationfield:code; see the changeset.sdui.manifest.jsonthere regenerates at its next.objectui-shabump under [Decision] may a kind:'html' page author intrinsic HTML tags (div, a)? The console manifest says no, 3 of 3 shipped html pages say yes, and #19922's fallback cannot go live until one side changes objectstack#20112; nothing in objectstack changes here.Generated by Claude Code