Skip to content

feat(spec): declare cloud-connection:panel / marketplace:installed-list in ComponentPropsMap — undeclared keys refused (#11575) - #11743

Draft
os-warren wants to merge 2 commits into
mainfrom
claude/issue-11575-cloud-connection-props-rows
Draft

feat(spec): declare cloud-connection:panel / marketplace:installed-list in ComponentPropsMap — undeclared keys refused (#11575)#11743
os-warren wants to merge 2 commits into
mainfrom
claude/issue-11575-cloud-connection-props-rows

Conversation

@os-warren

Copy link
Copy Markdown
Collaborator

Fixes#11575

Two console-registered widget types on @objectstack/cloud-connection's published Setup pages — cloud-connection:panel and marketplace:installed-list — had no ComponentPropsMap row: the #8691/#8744 silent no-op class (any authored key in their properties bag rode through every validator in silence, because the #5068 gate's dispatch skips unmapped types).

What landed

Verification (all at merged head b60e520de, after git merge origin/main)

  • pnpm --filter @objectstack/spec test — 420 files / 11225 tests passed; typecheck OK (test layer held at 55 files / 263 errors in the shrink-only debt ledger, unchanged).
  • pnpm --filter @objectstack/lint test — 81 files / 2274 tests passed; typecheck OK.
  • pnpm --filter @objectstack/cloud-connection test — 26 files / 281 tests passed (includes the edited envelope gate: door 3 now reads both bags; the exact-set assert holds with zero exemptions — which also proves the suite consumed the rebuilt spec dist, since against the old dist it reds).
  • pnpm --filter @objectstack/spec check:generated — "All 14 generated artifacts are up to date" (only the migration registry needed regenerating; no new exports, so api-surface / docs / authorable-surface are unchanged — the map rows are BFS-unreachable from metadata roots by design, per the file's own header measurement).
  • Gate families derived by node scripts/pm/dispatch-gates.mjs (no hand-built path list; the derivation's stderr named this repo and my HEAD, change set 7 paths vs merge base). All path-derived and convention-triggered families green, with two declared deviations:
    • check:dev-prereqs — red on "workspace is not built" (37/67 package dists absent in this fresh worktree): a build-state precondition, not a diff finding; every package my diff touches is built; CI builds fresh.
    • check:type-check-debt — NARROWED (declared): the re-measure population is the DEBT ledger in scripts/check-type-check-coverage.mjs; the only DEBT entry among my touched packages is @objectstack/cloud-connection, re-measured with the gate's own measurement (tsc --noEmit in the package): 13 errors = the recorded 13, and none of them are in the file this PR edits. spec and lint are typecheck-covered (not DEBT) and their full typechecks ran green. The full-farm re-measure is CI's.
  • Ratchet families re-run at the merged head b60e520: check:type-check-coverage, check:query-options-erasure, check:engine-double-contract, check:where-matcher, check:cross-package-test-inputs — all green.

Reverse verification (ablation — both legs rebuilt, both proven on disk)

Fix committed first. RED leg: the two map rows deleted (anchored greps on the exact row text 1/1 to 0/0 = mutation proof on disk), spec rebuilt, scripts/ablation-dist-preflight.mjs proved the compiled row markers ABSENT from all 209 built files — then the three suites went red in exactly the new pins: spec 3 (the whole #11575 describe), lint 2 (the loud dispatch pins), cloud-connection 2 (the exact-set asserts). GREEN leg: restore from HEAD (greps 0/0 to 1/1, porcelain clean), rebuilt, preflight proved the markers PRESENT in dist/ui/index.js and .mjs, all three suites exit 0. Both leg scripts carried trap-based restores. Note: the lint suite's third pin (empty bag stays silent) is green in both states by design — its value is guarding the accept face, not the row's existence.

Clause-②: this PR changes accept behaviour on a published face (silently-accepted authored keys become validated refusals) — draft; the contract-review chain runs before enqueue.


Generated by Claude Code

…st in ComponentPropsMap — undeclared keys refused (#11575)
- ui/component.zod.ts: two emptyProps rows — key sets measured from the
renderers' ACTUAL read points at the .objectui-sha pin (app-shell
CloudConnectionPanel.tsx / InstalledListWidget.tsx): both registrations
discard the schema node ('() => <Widget />') and neither component takes
a prop, so the accepted key set is EMPTY (strict). The registrations'
declared 'inputs: []' agree here; the row is the measurement, not the claim.
- cloud-connection canonical-expression-envelopes.test.ts: the two
exemptUnmappedTypes entries and the emptiness pins deleted — door 3 now
reads both bags; the exact-set assert (still in place) demands exactly this.
- pins: spec-side (component.test.ts — rows defined, {} accepted, any key
refused naming the surface) + lint-side dispatch pins
(validate-component-props.test.ts #11575 suite).
- semantic migration entry under protocol-18 + regenerated registry (111).
- changeset: minor + BREAKING + ADR-0087 disposition (#8744 precedent).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Rxnd8cyFnoU8V5y21PaTsy
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec, touching 2 documentable anchor(s).

1 release-owned page(s) name something this change touched. These are read-only:

  • content/docs/releases/v17.mdx(via ComponentPropsMap (symbol))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 4 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 45 of 222 client-bound route-ledger rows — the other 177 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run: node scripts/docs-audit/affected-docs.mjs --bridge-coverage

Coarse fallback — 126 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 945ffbea814c07ec93e81a3444af1790d9692cc3packageMentionDocs.

Which tree this was computed on

This run read content/docs from 3d5495d506abd3b4a096a8d76e2b28bbd3a5e81c — the merge of head b60e520deaa63de63ab1b0e17baa7cead349153d into base 945ffbea814c07ec93e81a3444af1790d9692cc3, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 3d5495d506abd3b4a096a8d76e2b28bbd3a5e81c && git checkout 3d5495d506abd3b4a096a8d76e2b28bbd3a5e81c
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 945ffbea814c07ec93e81a3444af1790d9692cc3 b60e520deaa63de63ab1b0e17baa7cead349153d && git checkout -B drift-repro 945ffbea814c07ec93e81a3444af1790d9692cc3 && git merge --no-ff b60e520deaa63de63ab1b0e17baa7cead349153d
node scripts/docs-audit/affected-docs.mjs --json 945ffbea814c07ec93e81a3444af1790d9692cc3

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 945ffbea814c07ec93e81a3444af1790d9692cc3 → pass the list as
args.docs, on the commit named under Which tree this was computed on.

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

Labels

documentationImprovements or additions to documentationneeds:contract-reviewprotocol:uisize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

spec: cloud-connection:panel and marketplace:installed-list have no ComponentPropsMap row — two more instances of the #8691/#8744 silent no-op class

2 participants

@os-warren@claude