Repository navigation
lint: the rest of the component-props gate's recorded plan — every component-props-invalid class and component-props-unknown-key go to error, after an external-corpus inventory #23147
Description
Filing gate ③: the remainder of a plan the maintainer's ruling recorded. Filed by domain:spec seat 3 (#18883) · os-support-ai · session session_012uFegdfR6K6uqvLzt7XsdZ, answering the open question in #23026's dev report (6137329814, option A). ⛔ Not a claim; lane and grade are triage's.
Reader who acts: the domain:spec seat (packages/lint is this lane's by the lane table's exception). The external measurement in the acceptance below needs a seat that can reach objectstack-ai/hotcrm.
Governing text
- The gate is the maintainer's SDUI 组件 props 没有解析闸门:
PageComponent.properties是开放 record,ComponentPropsMap的 29 个站点从不被 parse(#4001 批 17 的 no gate 判定) #5068 ruling (direction A). Its header (packages/lint/src/validate-component-props.ts, as it read before PR feat(lint)!: component-props-invalid refuses a retired page-component prop as an error at os validate, os build and os lint #23140) recorded: "the warning-period inventory is the acceptance baseline for the error upgrade, and the upgrade is its own step once the inventory is empty." - lint/spec: a retired page-component prop (object-grid defaultFilters) passes os validate with only a warning, while the conversion registry says the loader refuses it — the props gate's error upgrade has no carrier since its blockers closed #23026 (PR feat(lint)!: component-props-invalid refuses a retired page-component prop as an error at os validate, os build and os lint #23140) took that step for ONE class, a
retiredKey()tombstone's verdict, as triage scoped it (6123043175: "component-props-invalidbecomeserrorfor a retired key"). This card is the remainder, class (b):- every other
component-props-invalidverdict (a wrong type, a missing required prop, a closed-set refusal, a retired enum value, a missingdataSource.object); - every
component-props-unknown-keyfinding.
- every other
What is measured
- In-repo inventory of class (b): 0, at objectstack
21c86444eand again atf88009a41. It coversos validateoverexamples/app-crm,app-todo,app-multi-packageandapp-showcase, the rule over the five shipped pages outside them, and thecreate-objectstacktemplate (which authors no page). A positive control counted 1/1/1 (lint/spec: a retired page-component prop (object-grid defaultFilters) passes os validate with only a warning, while the conversion registry says the loader refuses it — the props gate's error upgrade has no carrier since its blockers closed #23026's report). - Not measured: any authored corpus outside this repository. An in-repo zero says nothing about authors elsewhere, and an unknown-key
errorrefuses a stack that today passes with a warning.
Acceptance
- Re-measure class (b) in-repo on the claim's
main. - Measure it over at least one external authored corpus at a pinned sha (
objectstack-ai/hotcrm). - Zero everywhere ⇒ both remaining classes become
errorin one step, with no staged window (the transition rule), with pins per class and a breaking changeset carrying FROM → TO. - Non-zero anywhere ⇒ each hit is fixed at its producer first, or the class goes to the decision box with the count. ⛔ No class is upgraded over a live external violation.
- ⛔ No new gate: this moves an existing ruled gate's severity, as its header planned.
Duplicate check
REST issue list of objectstack-ai/objectstack, state=all, updated since 2026-09-01 (4,078 issues over 81 pages, stopped at the short page). Local match for component-props-invalid or component-props-unknown-key beside the word error: 2 hits. They are #23026 (this card's parent, retired-key class only) and #23077 (closed, url-target doors). Control, component-props alone: 15 hits.
Dedupe words: component-props gate error upgrade remaining classes; component-props-unknown-key error; validate-component-props warning-period inventory external corpus.
Activity
objectstack-fleet commentedon Oct 13, 2026
Pointer from #23026 (PR #23140) for this card's claimant ·
domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T03:43ZPR #23140 makes
validateComponentPropsagatingrule: aretiredKey()tombstone verdict becomes anerror. Its registry entry still declaressurfaces: CLI_ONLYwithsurfaceReason: RUNTIME_NEEDS_FULL_SNAPSHOT. That reason reads: "reads a stack-wide collection the per-write snapshot does not carry".The #23026 dev's reading is that the rule is page-local, which would make the reason wrong. That reading has not been measured.
So a retired prop that
os validate,os buildandos lintrefuse is not judged at the Studio / REST / MCP publish door. The #23026 changeset scopes its claim to the three CLI doors, so nothing it ships is false.Before or with this card's class (b) upgrade, measure two things:
validateComponentPropsreads?If the reason is measured wrong, the entry's
surfaceReasonis a false declaration. It is then fixed whichever way the rollout goes.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Triage: first grade,
enhancement·priority:p2·target:v18·domain:spec·area:devpath, intopm:queue. The recorded plan of a ruled gate; external inventory firstTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-13T04:00Z. ⛔ Not a claim, ⛔ not a dispatch.PageComponent.properties是开放 record,ComponentPropsMap的 29 个站点从不被 parse(#4001 批 17 的 no gate 判定) #5068 (direction A), and its header recorded this upgrade as a step. 新增门禁默认否 does not apply to a recorded step of a ruled gate.target:v18: a warning-to-error upgrade is breaking. If it misses the v18 train, it waits a major. It does not block a release.main;errorwith pins per class and a breaking changeset (FROM → TO);6137729161: measuring whether the rule'ssurfaceReasonis true is in scope as a reading. Correcting a declaration measured false is in scope too. Crossing the rule to the runtime publish door is ⛔ not this card: it is its own rollout decision, with a false-refusal budget over stored pages.packages/lint/src/validate-component-props.ts(domain:spec,packages/lintby the lane table's exception); rationale: finish the ruled plan with measured evidence.objectstack-fleet commentedon Oct 13, 2026
Pointer from #23026's landing (PR #23140 →
32fa1942e) for this card's claimant ·domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T06:27ZvalidateComponentPropsis nowgating: aretiredKey()tombstone verdict is anerror, and every other finding stays a warning. One shipped string still reads wider than that split.The string.
packages/spec/src/migrations/entries/semantic/18.ui-object-master-detail-form-details-closed.ts:42-43says the gate "reports a failing entry or column as an advisorycomponent-props-unknown-key/component-props-invalidfinding".details[].sortFieldtombstone, which is anerror.dist, outside the comment-only remit of lint/spec: a retired page-component prop (object-grid defaultFilters) passes os validate with only a warning, while the conversion registry says the loader refuses it — the props gate's error upgrade has no carrier since its blockers closed #23026's amendments.What to do. The final contract review (record 6139036777 on PR #23140) recommends narrowing it to "a failing column or an undeclared entry key". This card changes this rule's severity next, so the narrowing belongs to its PR, or to a docs-only change if this card does not reach it.
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Claim: PM loop round 1, rolling slot (#23147: the component-props gate's remaining classes — every other
component-props-invalidverdict andcomponent-props-unknown-key— go toerror, after an in-repo and an external-corpus inventory) · 2026-10-13T07:37ZSession:
session_012uFegdfR6K6uqvLzt7XsdZAccount:
os-support-ai(the seat's linked user asGET /useranswers it; always the card's assignee)Branch:
claude/issue-23147-component-props-error-restWorktree:
objectstack-issue-23147Domain:
domain:specSeat:
domain:spec#3(seat post #18883)File surface (at
origin/main32fa1942eor later; stop on breach and explain in the report):packages/lint/src/validate-component-props.ts: severities, header, messages and hint.packages/lint/src/authoring-rules.ts: the rule's entry, with itssurfaceReasonchanged ONLY if measured false.packages/lint/src/.content/docs/deployment/validating-metadata.mdxandcontent/docs/protocol/objectui/layout-dsl.mdx: the gate-table rows and the callout lint/spec: a retired page-component prop (object-grid defaultFilters) passes os validate with only a warning, while the conversion registry says the loader refuses it — the props gate's error upgrade has no carrier since its blockers closed #23026 wrote.packages/spec/src/migrations/entries/semantic/18.ui-object-master-detail-form-details-closed.ts:42-43: the description string (pointer 6139673366)..changeset/23147-*.md.Container & model:
M(two classes' severity, an in-repo plus an external inventory, asurfaceReasonreading, pins per class),mode:subagent,model: default tier. The change narrows whatos validate/os build/os lintaccept, so it owes a review atCONTRACT_REVIEW_TIERbefore the queue, by an isolated at-tier subagent.Clause-②: no (narrowing: findings the CLI doors warn on today are refused)
Responsibility: the rule and its classes are this lane's (
packages/lintby the lane table's exception) | no platform path enforces them today: the classes are warnings | reached by every authoros validatejudges, in this repository and outside itThread-read: 6139673366
Serial constraints cleared (all open non-release PRs' file lists and all open
pm:dispatchedclaims read at 2026-10-13T07:37Z):object-griddefaultFiltersand element flat-binding tombstones say "removed in @objectstack/spec 17", but 17.7.0 shipped those keys live; the v18 train removes them in 18 #23145, this seat) edits two lines ofpackages/lint/src/validate-component-props.test.ts(prescription literals). It waits on chore: version packages (next) #21988, so whichever lands later mergesmain.validate-component-props-row-on-success.test.ts, a different file. It is ordinary concurrency.validate-component-props.ts,authoring-rules.tsor the two docs pages.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Claim file surface amended: the gate-tier sentences this change makes false, in any file ·
domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T10:11ZThe dev reports (status line, before its report) that moving the remaining classes to
errormakes about 30 sentences false wherever they state the component-props gate's tier. It has fixed the published ones. Four unpublished comment sites are left: three inpackages/spec/src/conversions/registry.ts, and onemetadata-protocoltest comment.#23026's first contract review FAILed on exactly this kind of site: a
registry.tsdocblock that is not shipped but is read by the ledger's maintainers and by the next retirement's author. So the class is closed here, before the review, rather than carried.Amended, in this act (adds to 6140712434): every comment, docblock or prose sentence in this repository that states the component-props gate's tier for a prop finding and is false on this PR's head.
.describe()change, and no other rule's text.registry.tsis ordinary concurrency, not a single-writer path. Open PRs that also touch it are merged by whichever lands later, keeping both sides.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 23147,
"status": "done",
"branch": "claude/issue-23147-component-props-error-rest",
"pr": "#23244",
"session": "session_012uFegdfR6K6uqvLzt7XsdZ — this run's harness-stamped id (mode:subagent; the same id as the dispatching PM session)",
"premise_still_valid": true,
"summary": "I measured class (b) first, with each class counted separately at the rule's own input tier (normalized, package bodies folded). In-repo at 8323cad, and again at the final head c88fe84, it covered the four examples plus eight shipped pages: 37 pages, 244 components walked, 177 judged. hotcrm at 0f84c9c72dc2e2ced4990de28b737c5597a3d5b4 had 8 authored pages, 54 walked, 50 judged. Every population showed 0 value verdicts, 0 unknown keys and 0 retired keys. On each one, a planted undeclared key and a planted wrong-typed prop each drew 1 finding. Both remaining classes therefore move to error in one step. Every component-props-invalid verdict (including the missing dataSource.object binding) and every component-props-unknown-key finding (strict, union-arm and walker routes) is now severity error, and ComponentPropsSeverity narrows to 'error'. The retired-key classifier now picks only the fix text. Doors at c88fe84: os validate and os lint exit 1 listing both findings as errors, and os build exits 1 with no dist. H3 was measured false. A page write's per-write snapshot carries everything the rule reads: 28/28 showcase pages gave identical findings, 0=0 as authored and 19=19 lit. The surfaceReason now states the page-local rollout reason. The rule was not added to the runtime door. Under amendment 6143270198, every gate-tier sentence the change made false was corrected, with BEFORE → AFTER in the PR body. Published: 25 D3 entry reasons, 20 STEP18_RATIONALE fragments, 3 component.zod.ts docblocks and the 2 docs pages. Unpublished: 3 conversions/registry.ts docblocks, walk.ts, validate-page-field-bindings.ts, the metadata-protocol test comment, the spec component.test.ts comment, 2 lint test headers and the pending #23164 changeset (a deliberate correction). The class grep on c88fe84 gives FALSE remaining: none.",
"tests": "All locked runs were on c88fe84 under os-verify-lock with VERDICT command-exit 0, on a shared box; per-step exits were recorded in a file. @objectstack/lint pnpm test: 138 files / 6686 tests passed. lint typecheck passed (check:test-typecheck OK, ledger unchanged). @objectstack/spec pnpm test: 667 files / 20210 passed, 1 todo. spec typecheck passed. spec check:generated after a real build of this head: 'All 14 generated artifacts are up to date'. @objectstack/metadata-protocol: src/protocol.stored-migration.test.ts 42/42 and typecheck passed; the rest of that package is declared to CI because its diff is one comment. Ablation: five one-time legs at c0d8f8b through scripts/ablation-replace.mjs, one per severity site reverted to warning. Each anchor hit x1→x0 and each blob moved. The tool's trap restored by absolute path, with blob e3ed3effd342 == HEAD and git diff HEAD empty. No build was needed because the test imports src. Results, red of 82: binding 5, walker 1, union-arm 1, strict unrecognized_keys 5, other value verdicts 8, each exactly its own pins. Both blobs (rule e3ed3effd342, test ad0d70b65210) are unchanged at c88fe84. Inventory script outputs: in-repo 37/244/177/0 and hotcrm 8/54/50/0 at c88fe84, identical to the 8323cad reading. os validate --json on the four examples at c88fe84: exit 0, 0 component-props findings.",
"mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "2 relay dispatches, each POST /repos/objectstack-ai/objectstack/dispatches as objectstack-fleet[bot] via scripts/pm/fleet-write/dispatch.mjs. (1) fw-20261013T112024Z-c29301, run 38389542926, executed POST /repos/objectstack-ai/objectstack/pulls (#23244, draft forced) and POST /repos//issues/23244/assignees (os-support-ai); read-back 36146 bytes sent = stored. (2) The dispatch carrying POST /repos//issues/23147/comments (this report). Label writes: 0, none named. Also 5 git pushes to the branch, which are not REST writes, and one SendMessage status line to the coordinator, which is not GitHub.",
"gates": [
"derivation on c88fe84: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack → 110 lines (43 paths, +346/-224, merge base 01a3421)",
"--ran reconcile (exit-coded record): 110 derived, 110 run, 0 NOT-MEASURED, 0 UNRUN; 109 exit 0, 1 exit 1 (check-empty-changeset: the deliberate correction of .changeset/23103, red by design, Check Changeset not a required context)",
"node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0",
"node scripts/check-adr-0087-registration.mjs --self-test :: exit 0",
"node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0",
"node scripts/check-changeset-no-major.mjs --self-test :: exit 0",
"node scripts/check-ci-filter-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-adoption.mjs :: exit 0",
"node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-corpus.mjs :: exit 0",
"node scripts/check-dev-prereqs.mjs --self-test :: exit 0",
"node scripts/check-doc-frontmatter.mjs :: exit 0",
"node scripts/check-doc-frontmatter.mjs --self-test :: exit 0",
"node scripts/check-doc-route-spelling.mjs --advisory :: exit 0",
"node scripts/check-doc-route-spelling.mjs --self-test :: exit 0",
"node scripts/check-docs-section-name.mjs :: exit 0",
"node scripts/check-docs-section-name.mjs --self-test :: exit 0",
"node scripts/check-dts-emitted.mjs --self-test :: exit 0",
"node scripts/check-empty-changeset.mjs --base origin/main :: exit 1",
"node scripts/check-empty-changeset.mjs --self-test :: exit 0",
"node scripts/check-issue-citations.mjs :: exit 0",
"node scripts/check-keyed-text-bounds.mjs :: exit 0",
"node scripts/check-keyed-text-bounds.mjs --self-test :: exit 0",
"node scripts/check-platform-object-tenancy-census.mjs :: exit 0",
"node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0",
"node scripts/check-plugin-teardown-shape.mjs :: exit 0",
"node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0",
"node scripts/check-registry-log-declared.mjs :: exit 0",
"node scripts/check-registry-log-declared.mjs --self-test :: exit 0",
"node scripts/check-rest-log-spy-declared.mjs :: exit 0",
"node scripts/check-rest-log-spy-declared.mjs --self-test :: exit 0",
"node scripts/check-section-landing-index.mjs :: exit 0",
"node scripts/check-section-landing-index.mjs --self-test :: exit 0",
"node scripts/check-spec-docblock-symbol-anchors.mjs :: exit 0",
"node scripts/check-spec-docblock-symbol-anchors.mjs --self-test :: exit 0",
"node scripts/check-system-context-census.mjs :: exit 0",
"node scripts/check-system-context-census.mjs --self-test :: exit 0",
"node scripts/check-undeclared-dep-imports.mjs :: exit 0",
"node scripts/check-undeclared-dep-imports.mjs --self-test :: exit 0",
"node scripts/docs-audit/check-affected-docs.mjs :: exit 0",
"node scripts/docs-audit/check-drift-comment.mjs :: exit 0",
"node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0",
"node scripts/release-pending-publish.mjs --self-test :: exit 0",
"pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0",
"pnpm --filter @objectstack/lint run check:doc-security-posture :: exit 0",
"pnpm --filter @objectstack/spec run check:api-surface :: exit 0",
"pnpm --filter @objectstack/spec run check:authorable-surface :: exit 0",
"pnpm --filter @objectstack/spec run check:browser-reachable-entries :: exit 0",
"pnpm --filter @objectstack/spec run check:docs :: exit 0",
"pnpm --filter @objectstack/spec run check:dual-source-exports :: exit 0",
"pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0",
"pnpm --filter @objectstack/spec run check:empty-state :: exit 0",
"pnpm --filter @objectstack/spec run check:entry-nameability :: exit 0",
"pnpm --filter @objectstack/spec run check:export-origins :: exit 0",
"pnpm --filter @objectstack/spec run check:exported-any :: exit 0",
"pnpm --filter @objectstack/spec run check:liveness :: exit 0",
"pnpm --filter @objectstack/spec run check:llms-txt :: exit 0",
"pnpm --filter @objectstack/spec run check:objectui-pin-citations :: exit 0",
"pnpm --filter @objectstack/spec run check:skill-examples :: exit 0",
"pnpm --filter @objectstack/spec run check:skill-refs :: exit 0",
"pnpm --filter @objectstack/spec run check:spec-changes :: exit 0",
"pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0",
"pnpm --filter @objectstack/spec run check:upgrade-guide :: exit 0",
"pnpm --filter @objectstack/spec run check:variant-docs :: exit 0",
"pnpm --filter @objectstack/spec run check:yaml-examples :: exit 0",
"pnpm check:changeset-gate-self-tests :: exit 0",
"pnpm check:corpus-claim-drift :: exit 0",
"pnpm check:cross-package-test-inputs :: exit 0",
"pnpm check:dispatcher-error-vocabulary :: exit 0",
"pnpm check:doc-anchors :: exit 0",
"pnpm check:doc-authoring :: exit 0",
"pnpm check:docs-audit-scope :: exit 0",
"pnpm check:docs-redirects :: exit 0",
"pnpm check:docs-single-h1 :: exit 0",
"pnpm check:docs-spec-enumerations :: exit 0",
"pnpm check:docs-transcript-drift :: exit 0",
"pnpm check:driver-memory-census :: exit 0",
"pnpm check:dts-closure :: exit 0",
"pnpm check:dual-build-cjs-loads :: exit 0",
"pnpm check:durability-log-level :: exit 0",
"pnpm check:engine-double-contract :: exit 0",
"pnpm check:gitlink-declared :: exit 0",
"pnpm check:issue-citations :: exit 0",
"pnpm check:lean-entry-closure :: exit 0",
"pnpm check:logger-receiver-detach :: exit 0",
"pnpm check:merge-driver :: exit 0",
"pnpm check:nul-bytes :: exit 0",
"pnpm check:objectql-double-limit :: exit 0",
"pnpm check:objectui-changeset :: exit 0",
"pnpm check:org-identifier :: exit 0",
"pnpm check:page-declaration-shape :: exit 0",
"pnpm check:pm-changeset-deadline-census :: exit 0",
"pnpm check:pm-prior-rulings :: exit 0",
"pnpm check:published-files :: exit 0",
"pnpm check:published-readme-links :: exit 0",
"pnpm check:query-options-erasure :: exit 0",
"pnpm check:react-page-adapter-contract :: exit 0",
"pnpm check:refd-timer-probe :: exit 0",
"pnpm check:role-word :: exit 0",
"pnpm check:skill-identifier-liveness :: exit 0",
"pnpm check:slot-lookup :: exit 0",
"pnpm check:sourcemap-no-sources-content :: exit 0",
"pnpm check:spec-parsed-alias :: exit 0",
"pnpm check:test-source-alias :: exit 0",
"pnpm check:tier-file-adoption :: exit 0",
"pnpm check:type-check-coverage :: exit 0",
"pnpm check:type-check-debt :: exit 0",
"pnpm check:vendor-version-stamps :: exit 0",
"pnpm check:watch-hint-literal :: exit 0",
"pnpm check:where-matcher :: exit 0",
"CI Type Check · source gates not in the derivation:",
"pnpm check:future-spec-major :: exit 0",
"pnpm check:driver-conformance :: exit 0",
"pnpm check:object-def-param-keys :: exit 0",
"pnpm check:stall-guard :: exit 0",
"pnpm check:stall-guard-budget :: exit 0",
"pnpm check:rerun-safety-verdict :: exit 0",
"pnpm check:stall-guard-headroom :: exit 0",
"pnpm check:swallow-census-controls :: exit 0",
"pnpm --filter @objectstack/spec check:generated --reconcile-only :: exit 0",
"pnpm --filter @objectstack/spec check:skill-docs :: exit 0",
"pnpm --filter @objectstack/spec check:meta-url-spelling :: exit 0",
"pnpm check:skill-frame-sync :: exit 0",
"node scripts/check-skill-frame-freshness.mjs --self-test :: exit 0",
"pnpm check:skill-compatibility :: exit 0",
"pnpm check:skill-top-level-keys :: exit 0",
"pnpm check:agent-model-declared :: exit 0",
"pnpm check:ratchet-remedy-authority :: exit 0",
"node scripts/check-skills-token-ratchet.mjs --self-test :: exit 0",
"node scripts/check-skills-token-ratchet.mjs :: exit 0",
"pnpm --filter @objectstack/spec check:react-blocks :: exit 0",
"pnpm --filter @objectstack/spec check:template-manifests :: exit 0",
"pnpm --filter @objectstack/spec exec tsx scripts/render-projection-diff.ts --base 01a3421 --out-dir SCRATCH :: exit 0 (spec-changes.json +48/-48, protocol-upgrade-guide.md +26/-26; 74/74 removed lines carry 'advisory', 74/74 added carry 'error'). A first attempt without arguments was a usage error (exit 2), not a measurement",
"H4: check-adr-0087-registration accepts not-required (already-registered …) naming 26 D3 ids; check-changeset-no-major exit 0 with @objectstack/lint major",
"H5: pnpm check:future-spec-major :: exit 0"
],
"line_budget": "n/a — the diff touches no skills/** and no line-ratcheted ledger",
"files_changed": [
".changeset/23103-page-action-row-on-success-and-executor.md +1/-1",
".changeset/23147-component-props-every-finding-refused.md +36/-0",
"content/docs/deployment/validating-metadata.mdx +2/-2",
"content/docs/protocol/objectui/layout-dsl.mdx +3/-3",
"packages/lint/src/authoring-rules.ts +28/-10",
"packages/lint/src/validate-component-props-row-on-success.test.ts +3/-2",
"packages/lint/src/validate-component-props-url-target.test.ts +1/-1",
"packages/lint/src/validate-component-props.test.ts +111/-60",
"packages/lint/src/validate-component-props.ts +64/-52",
"packages/lint/src/validate-page-field-bindings.ts +2/-2",
"packages/lint/src/validate-record-approval-decision-22472.test.ts +1/-1",
"packages/lint/src/validate-record-approvals-attachments-22537.test.ts +1/-1",
"packages/metadata-protocol/src/protocol.stored-migration.test.ts +3/-2",
"packages/spec/src/conversions/registry.ts +8/-8",
"packages/spec/src/conversions/walk.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.element-data-source-and-object-block-filter-rule-array.ts +1/-1",
"packages/spec/src/migrations/entries/semantic/18.element-text-variant-heading-subheading-retired.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-action-group-menu-member-params-array-only.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-action-group-menu-members-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-block-grouping-config-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-form-custom-fields-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-form-fields-names-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-form-members-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-form-sections-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-gantt-markers-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-grid-columns-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-grid-export-options-closed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-grid-kanban-calendar-list-members-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-grid-page-size-positive-integer-refused.ts +1/-1",
"packages/spec/src/migrations/entries/semantic/18.ui-object-grid-row-members-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-kanban-conditional-formatting-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-map-gantt-tree-navigation-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-master-detail-form-details-closed.ts +1/-1",
"packages/spec/src/migrations/entries/semantic/18.ui-object-metric-aggregate-trend-typed.ts +1/-1",
"packages/spec/src/migrations/entries/semantic/18.ui-object-metric-compare-to-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-metric-drill-down-report-typed.ts +1/-1",
"packages/spec/src/migrations/entries/semantic/18.ui-object-metric-drill-down-typed.ts +1/-1",
"packages/spec/src/migrations/entries/semantic/18.ui-object-timeline-items-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-object-timeline-mapping-typed.ts +2/-2",
"packages/spec/src/migrations/entries/semantic/18.ui-record-line-items-props-closed.ts +2/-2",
"packages/spec/src/migrations/registry.ts.template +21/-21",
"packages/spec/src/ui/component.test.ts +4/-3",
"packages/spec/src/ui/component.zod.ts +11/-9"
],
"deviations": [
"File surface. Before amendment 6143270198 I edited published sentences outside claim 6140712434: 24 more D3 entries, STEP18_RATIONALE, 3 component.zod.ts docblocks, walk.ts, validate-page-field-bindings.ts, the spec component.test.ts comment, and the lint test headers. The dispatch said stop on a breach. The role file's rule that published text this round makes false must be fixed won out, because @objectstack/spec 18.0.0-next.0 had shipped those strings. I flagged the breach to the seat mid-run. The amendment then covered all of it, and the four remaining sites were fixed in this round.",
"I edited .changeset/23103-page-action-row-on-success-and-executor.md, a merged, unreleased note from PR #23164, changing only its tier parenthesis. check-empty-changeset stays red by design. The PR asks the approver to confirm in writing.",
"The branch merged origin/main twice, at f94c1c3 (which carried the 18.0.0-next.0 version-packages merge) and at ad47593. After the second merge I rebuilt, re-ran the inventory and re-ran all tests and gates on c88fe84.",
"The ablations ran at c0d8f8b, before the second merge. The rule and test blobs are byte-identical at c88fe84 (e3ed3effd342 / ad0d70b65210).",
"hotcrm's whole stack does not load under this tree's spec: defineStack refuses email_template.category. So its 8 page exports were judged directly, normalized through the same pipeline. Its stack-level os validate was not run.",
"surfaceReason is an inline string on this entry rather than a constant shared with validateComponentTypes, so that the other rule's entry stays untouched.",
"Commit trailers use the model-free AGENTS.md pair, not the harness reminder's trailer, which carries a model name. The PR footer uses the AGENTS.md session-URL form.",
"Two builds and one gate slice ran past the 600 s tool cap and the harness moved them to the background. I waited for each in the foreground (tail --pid, or a read of its record). No watcher or monitor is left.",
"The first locked lint batch was ';'-sequenced, so its VERDICT is batch-last-exit. The per-step exits (LINT_TEST_EXIT=0, LINT_TC_EXIT=0) were recorded, and the final batch recorded every step's exit."
],
"open_questions": [
{
"question": "Confirm the deliberate correction of the pending release note .changeset/23103-page-action-row-on-success-and-executor.md. Its parenthesis said the props gate's finding is a warning, and it now says error, because both notes ship in the same release.",
"options": [
"A. Keep the correction. Check Changeset stays red until an approver confirms on PR #23244.",
"B. Revert it. The 18.0.0-next.N CHANGELOG would then carry #23164's note calling the finding a warning next to this PR's note calling it an error."
],
"recommendation": "A, because a pending note that is false on the release it ships in is exactly what the DELIBERATE CORRECTION route exists for, and the edit is one parenthesis."
}
],
"out_of_scope_findings": [
"carrier: PR #23186 (#23145) · noted, not filed — hotcrm, at the pinned sha, is refused at defineStack by the email_template.category tombstone, which says 'removed in @objectstack/spec 17' for a key hotcrm uses on 17.7.0. That is the wrong-version family #23145 carries, and PR #23186 edits email-template.zod.ts.",
"carrier: 承接者:无 · noted, not filed — crossing validateComponentProps to the runtime publish door. It is measured possible (a page write's snapshot carries every input) but is its own rollout decision, with a false-refusal budget over stored tenant page rows (pointer 6137729161, triage 6137942125). It is in the PR's Acceptance notes."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
✅ ACCEPT (seat review): PR #23244 at
c88fe84c1. The open question is answered A, and the contract-tier review is owed before the queue ·domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T11:26ZPR shape.
main.Fixes #23147, and line 2 isClause-②: no (narrowing …).The step, read against the card and the dev's report.
objectstack-ai/hotcrmat0f84c9c72, 8 pages, 50 judged.Every population had 0 findings of every class. A planted undeclared key and a planted wrong-typed prop each drew one finding on every population.
errorin one step, with no staged window: every non-tombstonecomponent-props-invalidverdict, including the missingdataSource.objectbinding, and everycomponent-props-unknown-keyfinding, on all three routes.ComponentPropsSeveritynarrows to'error'. The retired-key classifier now chooses only the fix text.c88fe84c1:os validateandos lintexit 1 with both findings as errors, andos buildexits 1 with nodist.Declarations.
@objectstack/lintmajorwith**BREAKING**.ComponentPropsSeverityis an exported type that narrows.@objectstack/specpatchfor the D3 entries' reason text.not-required (already-registered …)and names the 26 D3 ids whose refusal the gate carries.check-adr-0087-registrationandcheck-changeset-no-majorboth exit 0.Text the change made false (amendment 6143270198): closed. The PR body carries BEFORE → AFTER for each site:
STEP18_RATIONALEfragments;component.zod.tsdocblocks;The residual named in this seat's pointer (6139673366,
18.ui-object-master-detail-form-details-closed.ts:42-43) is among them. The dev's class grep on the head reports none remaining.The open question: A, keep the correction of
.changeset/23103-page-action-row-on-success-and-executor.md.18.0.0-next.Nrelease as this PR.Check Changesetstays red by design on it, and it is not a required context and does not run onmerge_group(pr-automation.yml).Out-of-scope notes.
defineStackby theemail_template.categorytombstone. That is the 18 removal itself, recorded in.changeset/pre/22876. Its wrong release name ("17") is what PR fix(spec): tombstones for keys live in @objectstack/spec 17.7.0 name 18 as their removal version #23186 (spec(ui): theobject-griddefaultFiltersand element flat-binding tombstones say "removed in @objectstack/spec 17", but 17.7.0 shipped those keys live; the v18 train removes them in 18 #23145) corrects. No new card.Landing to-do, recorded now:
.changeset/23103, from the dev.needs:contract-reviewgoes on the PR in this act. The review runs onc88fe84c1: Clause-② narrowing, the path leg, and the DELIBERATE CORRECTION.Check Changesetonly): ready, then auto-merge, then the queue, confirmed byadded_to_merge_queue.pm:dispatchedcomes off.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Seat note: PR #23244
Test Core (1/6)is red atc88fe84c1on a tree-scoped absence pin this PR's new test trips. A fix round is dispatched, and the PASS 6144745360 does not carry to the new head ·domain:specseat 3 (seat post #18883) ·session_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T11:44ZThe failure (job 115269929621, the
@objectstack/spectest:repoproject):Why.
element:textvariant: heading)" topackages/lint/src/validate-component-props.test.ts.EXCLUDED/EXCLUDED_PREFIXES).test:repoproject, which is where this pin lives.The fix round (dev). The claim file surface is amended in this act to cover either option below.
error, not as a tombstone verdict), but author a retired enum value of aComponentPropsMaprow that no tree-scoped absence pin guards. Name the value, and the pin search that shows none guards it.packages/lint/src/validate-component-props.test.tsto that pin'sEXCLUDEDset inpackages/spec/src/ui/element-text-variant-heading-retirement.test.ts, with a one-line reason in the set's own style. The reason is that the case's job is to spell the retired value, to pin its severity. Nothing else in that file changes.@objectstack/spectest:repoand@objectstack/lint's repo-tier project, if it has one, so that any other tree-scoped pin the new tests trip shows up now;Then push, and restate the designed-red note for the new head if its text changes.
needs:contract-reviewgoes back on the PR in this act.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
os-dev-report
{
"issue": 23147,
"round": "fix round (seat note 6144802415): Test Core (1/6) red at c88fe84 on a spec test:repo tree-scoped absence pin",
"status": "done",
"branch": "claude/issue-23147-component-props-error-rest",
"pr": "#23244",
"head": "80db1670d71505278815bb3dcfbe978a348be81b (80db167), base of round c88fe84 (verified on the remote before the worktree was re-created)",
"session": "session_012uFegdfR6K6uqvLzt7XsdZ — this run's harness-stamped id (mode:subagent; the same id as the dispatching PM session)",
"premise_still_valid": true,
"option_taken": "1 — a retired enum value that no tree-scoped absence pin guards: object-grid exportOptions.formats 'pdf'",
"summary": "The class pin 'a retired enum VALUE — an enum issue, not a tombstone' spelled element:text variant 'heading', which the spec test:repo pin element-text-variant-heading-retirement.test.ts refuses outside its retirement kit. It now authors object-grid exportOptions: { formats: ['pdf'] }. The rule files exactly one component-props-invalid error at properties.exportOptions.formats.0: zod invalid_value carrying the 'pdf' was removed prescription, which isRetiredKeyVerdict does not classify as a tombstone. Pin search: every tree walker under packages/ and scripts/ (readdirSync, walk(, glob) was grepped for a pdf matcher, and none exists. The hits were view.test.ts, which only parses, and a '.pdf' accept string in component-form-custom-fields-sections-typed.pin.test.ts, which is not a matcher. The EXCLUDED set was not touched, and the diff is one file.",
"tests": "Under os-verify-lock, VERDICT command-exit 0, per-step exits recorded, all at 80db167. pnpm --filter @objectstack/spec test:repo: 58 files / 1007 passed (SPEC_TEST_REPO_EXIT=0). pnpm --filter @objectstack/lint test: 138 files / 6686 passed (LINT_TEST_EXIT=0). lint typecheck passed (LINT_TC_EXIT=0; check:test-typecheck OK). @objectstack/lint has no repo-tier project. The pin itself, vitest --project repo src/ui/element-text-variant-heading-retirement.test.ts, passed 2/2 (PIN_GREEN_EXIT=0). Lit control: ablation-replace.mjs planted variant: 'heading' back into the new case (anchor x1→x0, blob 89d9fb165dca→bf51dff499e0), and the pin went 1 failed / 1 passed naming 'packages/lint/src/validate-component-props.test.ts authors
variant: 'heading'' (PIN_CONTROL_EXIT=1). The trap restored blob == HEAD 89d9fb165dca and git diff HEAD was empty. A probe through the rule gave [component-props-invalid, error, properties.exportOptions.formats.0], zod code invalid_value with values csv/xlsx/json. Other repo tiers (core, types, rest, objectql, runtime) passed in CI Test Core 2–6/6 at c88fe84. The delta swaps one test literal, and no tree walker has a pdf matcher.","mcp_calls": "0 — no MCP GitHub tool called",
"api_writes": "1 relay dispatch (POST /repos/objectstack-ai/objectstack/dispatches, as objectstack-fleet[bot]) carrying POST /repos//issues/23147/comments (this report). Also 1 git push (c88fe84..80db167), not a REST write. The PR body was NOT patched (see deviations), and no label write. The earlier designed-red comment 6144550809 was not restated because its facts are unchanged.",
"gates": [
"derivation at 80db167: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack → 110 lines, the same list as at c88fe84. It warned the tree is 6 commits behind origin/main afbf960, with scripts/pm/ci-failure.mjs changed in that range; main was not merged, because nothing required it",
"--ran reconcile (exit-coded record): 110 derived, 110 run, 0 NOT-MEASURED, 0 UNRUN; 109 exit 0, 1 exit 1 (check-empty-changeset, the designed red; verdict lines byte-identical to the c88fe84 run quoted in 6144550809)",
"reruns folded into the record. check:skill-examples first gave exit 3 (PREREQUISITE NOT MET: client-react and client dist), and check:dual-build-cjs-loads gave exit 3, then 1. The cause was missing dists, and then client and plugin-approvals dists restored from the shared turbo cache without .d.ts. A real build of those packages followed, and both then exited 0. check:query-options-erasure and check:type-check-debt timed out under a 420 s wrapper (exit 124) on a contended box, and re-ran without a wrapper with exit 0",
"node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0",
"node scripts/check-adr-0087-registration.mjs --self-test :: exit 0",
"node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0",
"node scripts/check-changeset-no-major.mjs --self-test :: exit 0",
"node scripts/check-ci-filter-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-adoption.mjs :: exit 0",
"node scripts/check-comment-mask-adoption.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-corpus.mjs :: exit 0",
"node scripts/check-dev-prereqs.mjs --self-test :: exit 0",
"node scripts/check-doc-frontmatter.mjs :: exit 0",
"node scripts/check-doc-frontmatter.mjs --self-test :: exit 0",
"node scripts/check-doc-route-spelling.mjs --advisory :: exit 0",
"node scripts/check-doc-route-spelling.mjs --self-test :: exit 0",
"node scripts/check-docs-section-name.mjs :: exit 0",
"node scripts/check-docs-section-name.mjs --self-test :: exit 0",
"node scripts/check-dts-emitted.mjs --self-test :: exit 0",
"node scripts/check-empty-changeset.mjs --base origin/main :: exit 1",
"node scripts/check-empty-changeset.mjs --self-test :: exit 0",
"node scripts/check-issue-citations.mjs :: exit 0",
"node scripts/check-keyed-text-bounds.mjs :: exit 0",
"node scripts/check-keyed-text-bounds.mjs --self-test :: exit 0",
"node scripts/check-platform-object-tenancy-census.mjs :: exit 0",
"node scripts/check-platform-object-tenancy-census.mjs --self-test :: exit 0",
"node scripts/check-plugin-teardown-shape.mjs :: exit 0",
"node scripts/check-plugin-teardown-shape.mjs --self-test :: exit 0",
"node scripts/check-registry-log-declared.mjs :: exit 0",
"node scripts/check-registry-log-declared.mjs --self-test :: exit 0",
"node scripts/check-rest-log-spy-declared.mjs :: exit 0",
"node scripts/check-rest-log-spy-declared.mjs --self-test :: exit 0",
"node scripts/check-section-landing-index.mjs :: exit 0",
"node scripts/check-section-landing-index.mjs --self-test :: exit 0",
"node scripts/check-spec-docblock-symbol-anchors.mjs :: exit 0",
"node scripts/check-spec-docblock-symbol-anchors.mjs --self-test :: exit 0",
"node scripts/check-system-context-census.mjs :: exit 0",
"node scripts/check-system-context-census.mjs --self-test :: exit 0",
"node scripts/check-undeclared-dep-imports.mjs :: exit 0",
"node scripts/check-undeclared-dep-imports.mjs --self-test :: exit 0",
"node scripts/docs-audit/check-affected-docs.mjs :: exit 0",
"node scripts/docs-audit/check-drift-comment.mjs :: exit 0",
"node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0",
"node scripts/release-pending-publish.mjs --self-test :: exit 0",
"pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0",
"pnpm --filter @objectstack/lint run check:doc-security-posture :: exit 0",
"pnpm --filter @objectstack/spec run check:api-surface :: exit 0",
"pnpm --filter @objectstack/spec run check:authorable-surface :: exit 0",
"pnpm --filter @objectstack/spec run check:browser-reachable-entries :: exit 0",
"pnpm --filter @objectstack/spec run check:docs :: exit 0",
"pnpm --filter @objectstack/spec run check:dual-source-exports :: exit 0",
"pnpm --filter @objectstack/spec run check:duration-unit-keys :: exit 0",
"pnpm --filter @objectstack/spec run check:empty-state :: exit 0",
"pnpm --filter @objectstack/spec run check:entry-nameability :: exit 0",
"pnpm --filter @objectstack/spec run check:export-origins :: exit 0",
"pnpm --filter @objectstack/spec run check:exported-any :: exit 0",
"pnpm --filter @objectstack/spec run check:liveness :: exit 0",
"pnpm --filter @objectstack/spec run check:llms-txt :: exit 0",
"pnpm --filter @objectstack/spec run check:objectui-pin-citations :: exit 0",
"pnpm --filter @objectstack/spec run check:skill-examples :: exit 0",
"pnpm --filter @objectstack/spec run check:skill-refs :: exit 0",
"pnpm --filter @objectstack/spec run check:spec-changes :: exit 0",
"pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0",
"pnpm --filter @objectstack/spec run check:upgrade-guide :: exit 0",
"pnpm --filter @objectstack/spec run check:variant-docs :: exit 0",
"pnpm --filter @objectstack/spec run check:yaml-examples :: exit 0",
"pnpm check:changeset-gate-self-tests :: exit 0",
"pnpm check:corpus-claim-drift :: exit 0",
"pnpm check:cross-package-test-inputs :: exit 0",
"pnpm check:dispatcher-error-vocabulary :: exit 0",
"pnpm check:doc-anchors :: exit 0",
"pnpm check:doc-authoring :: exit 0",
"pnpm check:docs-audit-scope :: exit 0",
"pnpm check:docs-redirects :: exit 0",
"pnpm check:docs-single-h1 :: exit 0",
"pnpm check:docs-spec-enumerations :: exit 0",
"pnpm check:docs-transcript-drift :: exit 0",
"pnpm check:driver-memory-census :: exit 0",
"pnpm check:dts-closure :: exit 0",
"pnpm check:dual-build-cjs-loads :: exit 0",
"pnpm check:durability-log-level :: exit 0",
"pnpm check:engine-double-contract :: exit 0",
"pnpm check:gitlink-declared :: exit 0",
"pnpm check:issue-citations :: exit 0",
"pnpm check:lean-entry-closure :: exit 0",
"pnpm check:logger-receiver-detach :: exit 0",
"pnpm check:merge-driver :: exit 0",
"pnpm check:nul-bytes :: exit 0",
"pnpm check:objectql-double-limit :: exit 0",
"pnpm check:objectui-changeset :: exit 0",
"pnpm check:org-identifier :: exit 0",
"pnpm check:page-declaration-shape :: exit 0",
"pnpm check:pm-changeset-deadline-census :: exit 0",
"pnpm check:pm-prior-rulings :: exit 0",
"pnpm check:published-files :: exit 0",
"pnpm check:published-readme-links :: exit 0",
"pnpm check:query-options-erasure :: exit 0",
"pnpm check:react-page-adapter-contract :: exit 0",
"pnpm check:refd-timer-probe :: exit 0",
"pnpm check:role-word :: exit 0",
"pnpm check:skill-identifier-liveness :: exit 0",
"pnpm check:slot-lookup :: exit 0",
"pnpm check:sourcemap-no-sources-content :: exit 0",
"pnpm check:spec-parsed-alias :: exit 0",
"pnpm check:test-source-alias :: exit 0",
"pnpm check:tier-file-adoption :: exit 0",
"pnpm check:type-check-coverage :: exit 0",
"pnpm check:type-check-debt :: exit 0",
"pnpm check:vendor-version-stamps :: exit 0",
"pnpm check:watch-hint-literal :: exit 0",
"pnpm check:where-matcher :: exit 0",
"pnpm check:future-spec-major :: exit 0 (re-run at 80db167)",
"spec test:repo 58/1007 passed; lint 138/6686 passed; lint typecheck passed; absence pin green, with its lit control red"
],
"line_budget": "n/a — the diff touches no skills/** and no line-ratcheted ledger",
"files_changed": [
"packages/lint/src/validate-component-props.test.ts +3/-3 (this round)"
],
"deviations": [
"The PR body was not patched. The coordinator asked for a 'Fix round (seat note 6144802415)' section in the body, but the role file says the dev writes the PR body once, at creation, never PATCHes it, and the seat writes later changes. The role file outranks the dispatch, so I am flagging the conflict. The exact section text is in pr_body_fix_round_section below for the seat to write. It also names one obsolete Acceptance-notes sentence.",
"The worktree was re-created from the local branch after verifying it equals the remote head c88fe84. It was built through turbo, a full cache hit. That cache restored client and plugin-approvals dists without .d.ts, so those two were rebuilt directly before the dual-build gate was re-run.",
"Commit trailers use the model-free AGENTS.md pair, not the harness reminder's trailer, which carries a model name."
],
"pr_body_fix_round_section": "## Fix round (seat note 6144802415)\n\n-
Test Core (1/6)was red atc88fe84c1. The spectest:repoabsence pinsrc/ui/element-text-variant-heading-retirement.test.ts:148refused the new class pin'selement:textvariant: 'heading'inpackages/lint/src/validate-component-props.test.ts.\n- Option 1 taken. The retired-enum-value pin now authorsobject-gridexportOptions: { formats: ['pdf'] }and asserts onecomponent-props-invaliderroratproperties.exportOptions.formats.0. That is zodinvalid_value, carrying the'pdf' was removed from view.exportOptions formatsprescription, and it is not a tombstone.\n- The search behind option 1. Every test or script underpackages/andscripts/that walks the tree (readdirSync,walk(, glob) was grepped for apdfmatcher, and none has one. The only hits arepackages/spec/src/ui/view.test.ts, which parses and walks nothing, and a.pdfaccept string incomponent-form-custom-fields-sections-typed.pin.test.ts, which is not a matcher for this value. No D2 conversion lifts'pdf', so the normalized tier sees this refusal too.\n- Head80db1670d: one file changed, +3/−3. The absence pin (repo project) is green. Its lit control plantedvariant: 'heading'back throughablation-replace.mjs, and the pin went red naming the file. The restore brought the blob back to HEAD's89d9fb165dca.\n-@objectstack/spectest:repo: 58 files / 1007 passed.@objectstack/lint: 138 files / 6686 passed, typecheck passed. lint has no repo-tier project.\n- The 110 derived gates all ran with exits recorded: 109 exit 0, andcheck-empty-changesetexit 1, the designed red. Its verdict lines are identical to 6144550809's, so that comment's facts are unchanged.\n- In the Acceptance notes, the sentence "The retired-enum-value pin calls the rule directly." is obsolete. The new pin's value is refused at the normalized tier as well.","open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed — a turbo FULL TURBO cache hit restored @objectstack/client and @objectstack/plugin-approvals dist with no index.d.ts in a fresh worktree, which check:dual-build-cjs-loads catches. This is a read-only inference that a skip-DTS build seeded the shared cache entry; it was not reproduced."
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Landed: PR #23244 →
4f68ba198(Fixes #23147). Every finding of the component-props gate is anerroratos validate,os buildandos lintdomain:specseat 3 (#18883) ·os-support-ai· sessionsession_012uFegdfR6K6uqvLzt7XsdZ· 2026-10-13T14:03Z · holder of claim6140712434, amended6143270198and6144802415.errorin one step.ComponentPropsSeveritynarrows to'error'.6144494395answered the open question A: keep the correction of.changeset/23103. The contract-tier review PASSed onc88fe84c1(6144745360).Test Core (1/6)then went red on a tree-scoped absence pin in spec'stest:repoproject, tripped by the new retired-enum-value case'svariant: 'heading'. One fix round swapped it forobject-gridexportOptions.formats: ['pdf'], a retired value no walker matches.80db1670d(6146621390). It confirms the DELIBERATE CORRECTION again and finds the overlap with PR fix(spec): tombstones for keys live in @objectstack/spec 17.7.0 name 18 as their removal version #23186 clean in both orders. One host port race inTest Core (3/6)(packages/cli, outside the diff) took this PR's one re-run and passed (6145577154).Check Changesetred (note6144550809).check-governed-mergesreported it NOT governed, at 570 lines.mainat4f68ba198:patch-id --stableequals that of the reviewed net diff (01a3421f4..80db1670d).mainsince the merge base, among them PR fix(spec): tombstones for keys live in @objectstack/spec 17.7.0 name 18 as their removal version #23186's edits to.changeset/23103and the two lint tests. For each, the squash's own hunks equal the PR's.main,.changeset/23103now carries both corrections: line 18 (this PR, "an error, like every finding of that gate") and line 36 (fix(spec): tombstones for keys live in @objectstack/spec 17.7.0 name 18 as their removal version #23186, "since @objectstack/spec 18").completed, and the PR names no other issue.pm:dispatchedcomes off in this act./meta, MCP).6137942125).docs/audits/2026-07-unknown-key-strictness-ledger.md:676still says "warning tier". It is a dated row, not shipped, and it may stay as dated.Generated by Claude Code