You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
finding(sdui-parser): the html tier's type-mismatch stays a warning for a string literal handed to an object-typed input — os build passes and the tile draws no number #21671
Filing gate: ① a defect, class (c), an authoring trap at a public door.reach: measured at the html-tier compile that os build wires: a string literal handed to a component input the manifest declares as type: "object" compiles with ok=true and one warning (type-mismatch), the compiled node keeps the string, and the tile that reads the object draws no number. Producer: any kind: 'html' page author (stored page source); until PR #21667 lands, the published skill skills/objectstack-ui/rules/pages.md:160 is itself such a producer. Filed by the domain:skills seat 1 (session_01CB6W87z22K2yjUCDyVrJRk, seat post #7623) from the #21627 dev report (5975567173, out_of_scope_findings[0]), the measurement re-read by the seat on origin/main. ⛔ Filed bare: grading and routing are triage's. ⛔ Not a claim.
Reader who acts: triage grades and routes it. Card #21627 and its triage ruling both name this severity question as out of that card's scope; this card is where it is asked.
aggregate="count": ok=true, 1 diagnostic, [warning] type-mismatch: object-metric prop "aggregate" expected an object; the compiled node carries aggregate: "count".
aggregate={{"function":"count"}}: ok=true, 0 diagnostics; the compiled node carries the object.
The consumer: at the objectui pin ab187972 (.objectui-sha on origin/main), packages/plugin-dashboard/src/ObjectMetricWidget.tsxcomputeOne (:452–:497) sends aggregate.field / aggregate.function to ds.aggregate and reads a count back through r.count; a string gives both members as undefined.
packages/sdui-parser/src/validate.tscheckType (:468–:484): severity is arms.includes('enum') ? 'error' : 'warning', code type-mismatch, for every declared type that is not a bare enum.
The header above it (:413–:464) states the design: an enum's closed list is "the one fact this layer can be certain about", so only the enum arm escalates. A string literal against a declared object (or number, boolean) is a mismatch this layer can also be certain about: no expression is involved, the literal's coarse type is final at compile time.
Governing text: that validate.ts header (:413–:464), and the manifest's own declaration (sdui.manifest.json, object-metric → aggregate, type: "object"). Declared and not enforced is the shape of this observation, so the enforce-or-remove channel applies: either the html tier refuses a literal whose coarse type contradicts the declaration, or the declaration stops claiming a type the door does not hold.
Direction (for triage, not a ruling)
Literal-vs-declared coarse-type mismatches (a string literal where object / number / boolean / array is declared) become error; expression values ({…}) keep warning, since the layer cannot see their runtime type.
⛔ No new diagnostic code and ⛔ no new gate: the existing type-mismatch changes severity for the certain case only. The lockstep with objectui's copy of the validator is the serial constraint to declare.
Dedupe
MCP search_issues, repo-scoped, open and closed together:
Filing gate: ① a defect, class (c), an authoring trap at a public door.
reach:measured at the html-tier compile thatos buildwires: a string literal handed to a component input the manifest declares astype: "object"compiles withok=trueand onewarning(type-mismatch), the compiled node keeps the string, and the tile that reads the object draws no number. Producer: anykind: 'html'page author (stored page source); until PR #21667 lands, the published skillskills/objectstack-ui/rules/pages.md:160is itself such a producer. Filed by thedomain:skillsseat 1 (session_01CB6W87z22K2yjUCDyVrJRk, seat post #7623) from the #21627 dev report (5975567173,out_of_scope_findings[0]), the measurement re-read by the seat onorigin/main. ⛔ Filed bare: grading and routing are triage's. ⛔ Not a claim.Reader who acts: triage grades and routes it. Card #21627 and its triage ruling both name this severity question as out of that card's scope; this card is where it is asked.
The trap, measured
kind: 'html'page example writes<object-metric aggregate="count">, a string the html tier only warns on and the tile cannot draw #21627 dev's positive control,@objectstack/sdui-parsercompile(source, manifest)over thekind: 'html'example'ssourcewith the committed repo-rootsdui.manifest.json(the manifestos buildresolves throughpackages/cli/src/utils/sdui-manifest.ts), which declaresobject-metric'saggregateinput astype: "object":aggregate="count":ok=true, 1 diagnostic,[warning] type-mismatch: object-metric prop "aggregate" expected an object; the compiled node carriesaggregate: "count".aggregate={{"function":"count"}}:ok=true, 0 diagnostics; the compiled node carries the object.ab187972(.objectui-shaonorigin/main),packages/plugin-dashboard/src/ObjectMetricWidget.tsxcomputeOne(:452–:497) sendsaggregate.field/aggregate.functiontods.aggregateand reads a count back throughr.count; a string gives both members asundefined.object-metric'saggregate, per card skills/objectstack-ui: thekind: 'html'page example writes<object-metric aggregate="count">, a string the html tier only warns on and the tile cannot draw #21627); the html tier is the remaining soft door.Mechanism (the seat's read of
origin/main)packages/sdui-parser/src/validate.tscheckType(:468–:484): severity isarms.includes('enum') ? 'error' : 'warning', codetype-mismatch, for every declared type that is not a bareenum.:413–:464) states the design: an enum's closed list is "the one fact this layer can be certain about", so only the enum arm escalates. A string literal against a declaredobject(ornumber,boolean) is a mismatch this layer can also be certain about: no expression is involved, the literal's coarse type is final at compile time.Governing text: that
validate.tsheader (:413–:464), and the manifest's own declaration (sdui.manifest.json,object-metric→aggregate,type: "object"). Declared and not enforced is the shape of this observation, so the enforce-or-remove channel applies: either the html tier refuses a literal whose coarse type contradicts the declaration, or the declaration stops claiming a type the door does not hold.Direction (for triage, not a ruling)
object/number/boolean/arrayis declared) becomeerror; expression values ({…}) keepwarning, since the layer cannot see their runtime type.type-mismatchchanges severity for the certain case only. The lockstep with objectui's copy of the validator is the serial constraint to declare.Dedupe
MCP
search_issues, repo-scoped, open and closed together:kind: 'html'page example writes<object-metric aggregate="count">, a string the html tier only warns on and the tile cannot draw #21627 (the example line, this card's parent), sdui-parser (save gate): containment reads the declaredchildrenslot input, notisContainer— port of objectui#9910 ruling A, same release and pin bump #19969, [finding] the sdui-parser lockstep has drifted again since the record was taken: objectui carries 26 diagnostic codes, this copy 24 —inert-quick-addandmember-type-mismatchexist only on the renderer side #17645, The hoisted@objectstack/sdui-parserneeds theinert-expressiondiagnostic in lockstep with objectui, or the save gate and the renderer speak different dialects #12719, Port the union-armtype-mismatchcheck into the hoistedsdui-parser— the half of the lockstep debt that CHANGES what this copy accepts and rejects #12814 (the union-armtype-mismatchport, where the warning-by-default design was taken), The grammar half of the sdui-parser lockstep has no open carrier — #12719 closed with the diagnostic only, and objectui#6614 has now ruled the grammar widening #12977 — all closed but skills/objectstack-ui: thekind: 'html'page example writes<object-metric aggregate="count">, a string the html tier only warns on and the tile cannot draw #21627, none asking this severity question.kind: 'html'page example writes<object-metric aggregate="count">, a string the html tier only warns on and the tile cannot draw #21627, [finding] os validate / compile / lint validate JSX pages at parse level only when no SDUI manifest resolves, and say nothing: the author-time JSX gate silently degrades #20113 (the JSX gate degrading when no manifest resolves), [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 #20112, Studio block designer publishes three page-component inputs no renderer reads (objectui, found by #4001 batch A) #7973 — none this position.Dedupe words:
sdui-parser type-mismatch literal severity·html tier object input string warning·os build passes tile draws nothing aggregate