Skip to content

When the @objectstack/spec pin moves to 17.3: PR #7510 / #7520's comment "repairs" become FALSE — rows and options[].description are now declared keys #7635

Description

@os-sam

Filed by the domain:ui execution seat (#5560, PM session session_01KbJQ1y1J12nZxYzFWhP8Q3, login os-sam) after the maintainer reported that @objectstack/spec 17.3 has shipped. ⛔ Recording, not claiming.

The repo is still on 17.2.0 — so nothing is broken today

Measured on origin/main 0b24d7f8:

  • pnpm-lock.yaml resolves @objectstack/spec to 17.2.0 everywhere — 57 occurrences of 17.2., zero of 17.3.. CI and every dev worktree install 17.2.0.
  • But every declared range is a caret^17.0.0 (most packages), ^17.1.0 (plugin-detail), ^17.2.0 (core, data-objectstack). 17.3.0 satisfies all of them, so the bump is a lockfile change that a pnpm update or a dependabot PR lands at any time.

⇒ This card is the bump-blocked work, in the shape #7122 already uses for this class.

⭐ The defect the bump creates

@objectstack/spec 17.3.0, changelog entry 86e765a"rows and options[].description become declared, authorable field-metadata keys" (objectui#6140 / objectui#6153, maintainer ruling 2026-08-25, Option A, verbatim 「就全部接受,然后继续下一批」):

  • rows?: number is now declared on textarea / markdown / html / richtext. The changelog names objectui as the consumer that was already reading it: RichTextField reads richField?.rows || 8, TextAreaField reads textareaField?.rows || 4.
  • description?: string is now declared on SelectOptionSchema. Again objectui is named as the existing consumer: LookupField searches opt.description on a lookup's authored static options, and recordToOption produces the same key.

Both were consumed-but-undeclared — "real behaviour in the running app… while the strict publish door refused exactly the author who wrote them legally." The ruling declares them. Additive: nothing legal changes meaning.

Why that makes shipped comments false

PR #7510 and PR #7520 "repaired" three comments by rewriting them to assert the spec refuses those keys. Two of the three are exactly these keys. Under 17.3 the repaired prose asserts the opposite of the contract:

repaired comment now says 17.3 says
SelectOptionSchema is .strict() and spells five keys, none of them description — a description on an option 422s the whole field description is a declared SelectOptionSchema key
rows is not a field key at all rows is declared on the four multiline editor types

This is the same defect class that PR #7617 landed a gate for this morning — a comment teaching a rule the contract does not hold — pointing the other way. Its own header records the measurement as version-stamped (1bae75bb against @objectstack/spec@17.2.0), which is exactly the discipline that makes this card findable rather than a surprise.

⚠️ check:spec-symbols will NOT catch it. Its member-granularity rule flags a citation naming a key the symbol does not declare; under 17.3 these citations name keys it does declare, so they pass. The falsehood is in the surrounding prose, which no gate reads. The scripts/__tests__ red/green fixtures are insulated too — they supply their own hand-written SPEC_MEMBERS map precisely so the pair is judged against a fixed spec rather than the installed one. ⇒ Nothing goes red. The prose just quietly becomes wrong.

What a round would need to decide (⛔ not proposing a disposition)

  • Whether the two comment sites are re-repaired (say the keys are declared, and by which types) or deleted — they exist to warn about a refusal that stops existing.
  • Whether RichTextField / TextAreaField / LookupField gain anything from the declaration, or whether the objectui half is prose-only. ⚠️ The changelog says the ruling's capability expansion STOPS at rows — the four inert rich-text keys (toolbar / preview / minHeight / maxHeight) stay undeclared with a pin holding that door shut. ⛔ Do not widen.
  • ⚠️ dependsOn is deliberately NOT declared — the canonical field-level depends_on already exists, "and the widget-side spelling fix rides the objectui half." That is an objectui obligation named by the spec's own ruling and is not covered by this card.
  • Whether fix(scripts): judge spec citations at member granularity, and stop the header teaching a retired filter (objectui#7513) #7617's header measurement is re-taken and re-stamped at 17.3.

✅ One landed PR that the bump does NOT break — recorded so nobody "fixes" it

Changelog c459da6 narrows the per-option default key out of the form-view options vocabulary, via a new FormSelectOptionSchema (an Omit of SelectOptionSchema minus default). The object-field face is explicitly "ENFORCED and UNTOUCHED".

PR #7629 (#7540, merged 09:28Z today) works on ObjectFieldInspector — the object-field face — so its probe table and its default-preservation behaviour remain correct under 17.3. ⚠️ But its prose, and my review of it, say "SelectOptionSchema accepts default" without naming the face. Under 17.3 there are two faces and only one accepts it; a reader re-deriving that claim on the form-view face would measure a refusal and think the PR wrong. Worth one sentence of disambiguation whenever that file is next touched.

Not measured

⛔ I did not run the 17.3 schema against this repo — the repo does not install it yet. Everything above is read from @objectstack/spec's own CHANGELOG.md on objectstack main (c64e65fb, packages/spec/package.json = 17.3.0). The FieldSchema / objectName / SelectOptionSchema hit counts across the 17.3.0 section were taken to bound the blast radius (DashboardSchema, ComponentInput, displayField, lookupFilters all read 0), with ActionSchema (11) as the lit control. Whoever takes this card should re-measure against the installed 17.3 rather than trust the changelog.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

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

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions