Skip to content

[finding] Neither plugin-detail top-level spec-parity block measures its own schema's strictness — strictness is per schema, so the sibling's probe is not evidence about these two #5887

Description

@claude

Filed by the domain:ui execution seat (session session_01EuPCi56cnGyykygi3z9w4m) as the ruled follow-up to #4918 / PR #5879. Unassigned, not queued.

What #4918 fixed, and what it deliberately did not

#4918 removed stale prose from two plugin-detail spec-parity blocks that narrated strip mode as a present-tense fact about the installed @objectstack/spec. That claim was false — both schemas are strict on the installed pin — and it was invisible to every gate because no assertion depended on the sentence.

That card was scoped prose-only, with an explicit bar on adding assertions, and the PM ruled it lands that way (see #4918). What it leaves open is this:

The gap

file block measures its own schema's strictness?
packages/plugin-detail/src/__tests__/recordDetailsInputs.spec-parity.test.ts section-level (~:140) yesspecRefusesUnknownSectionKeys
the same file top-level (~:277) no
packages/plugin-detail/src/__tests__/recordRelatedListInputs.spec-parity.test.ts top-level (~:98) no
packages/plugin-detail/src/__tests__/recordHighlightsInputs.spec-parity.test.ts top-level (~:85) yes — specRefusesUnknownTopLevelKeys (the model, PR #4671)

Why the sibling's probe cannot simply be cited

Strictness is per schema. recordDetailsInputs says so itself, at its own section-level probe. So specRefusesUnknownTopLevelKeys in recordHighlightsInputs is evidence about RecordHighlightsProps and nothing else — it is the shape to copy, not a reading of RecordDetailsProps or RecordRelatedListProps. #5879's new prose is written to say exactly that, so it stays true whichever way this card goes.

Measured while implementing #4918 (both on the installed pin, each with a declared-key control that parses green):

RecordRelatedListProps: control.success = true; probe.success = false; codes = ["unrecognized_keys"]; keys = ["__objectui_4918_probe__"]
RecordDetailsProps:     control.success = true; probe.success = false; codes = ["unrecognized_keys"]; keys = ["__objectui_4918_probe__"]

So the probes would pass today. The point of adding them is not to discover a defect — it is that the next pin change should turn a test red rather than turn a comment false, which is the failure this whole family keeps re-paying for.

Suggested disposition

Add a per-file specRefusesUnknownTopLevelKeys constant plus a two-arm assertion to each of the two top-level blocks, mirroring recordHighlightsInputs (~8–10 lines per file). This is an assertion change and wants reviewing as one — which is why it is its own card rather than a rider on a prose fix.

⛔ Does not absorb #5881 (the reference file's own module header still narrates strip mode as fact). That one is more stale prose; this one adds assertions. Different work, different review.

Related: #4918 (the prose half, PR #5879), #5881, #4671 (the model), #4910, #4611.


Generated by Claude Code


Generated by Claude Code

Activity

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

    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions