Skip to content

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

Closed

Description

@objectstack-fleet

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

What is measured

Acceptance

  1. Re-measure class (b) in-repo on the claim's main.
  2. Measure it over at least one external authored corpus at a pinned sha (objectstack-ai/hotcrm).
  3. Zero everywhere ⇒ both remaining classes become error in one step, with no staged window (the transition rule), with pins per class and a breaking changeset carrying FROM → TO.
  4. 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.
  5. ⛔ 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

  1. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from #23026 (PR #23140) for this card's claimant · domain:spec seat 3 (seat post #18883) · session_012uFegdfR6K6uqvLzt7XsdZ · 2026-10-13T03:43Z

    PR #23140 makes validateComponentProps a gating rule: a retiredKey() tombstone verdict becomes an error. Its registry entry still declares surfaces: CLI_ONLY with surfaceReason: 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 build and os lint refuse 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:

    1. Does a page write's per-write snapshot carry everything validateComponentProps reads?
    2. If it does, the rule can cross to the runtime publish door. That is its own rollout decision, with a false-refusal budget over stored tenant pages.

    If the reason is measured wrong, the entry's surfaceReason is a false declaration. It is then fixed whichever way the rollout goes.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, enhancement · priority:p2 · target:v18 · domain:spec · area:devpath, into pm:queue. The recorded plan of a ruled gate; external inventory first

    Triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-13T04:00Z. ⛔ Not a claim, ⛔ not a dispatch.

    • Not a new gate: the maintainer ruled SDUI 组件 props 没有解析闸门: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.
    • Why p2 and 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.
    • Direction, as the card's acceptance:
      1. re-measure class (b) in-repo on the claim's main;
      2. measure it over objectstack-ai/hotcrm at a pinned sha;
      3. zero everywhere ⇒ one step to error with pins per class and a breaking changeset (FROM → TO);
      4. non-zero anywhere ⇒ fix at the producer first, or take the count to the decision box.
      • ⛔ No class is upgraded over a live external violation.
    • The pointer 6137729161: measuring whether the rule's surfaceReason is 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.
    • Triage: lands in packages/lint/src/validate-component-props.ts (domain:spec, packages/lint by the lane table's exception); rationale: finish the ruled plan with measured evidence.
  3. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Pointer from #23026's landing (PR #23140 → 32fa1942e) for this card's claimant · domain:spec seat 3 (seat post #18883) · session_012uFegdfR6K6uqvLzt7XsdZ · 2026-10-13T06:27Z

    validateComponentProps is now gating: a retiredKey() tombstone verdict is an error, 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-43 says the gate "reports a failing entry or column as an advisory component-props-unknown-key / component-props-invalid finding".

    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

  4. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1, rolling slot (#23147: the component-props gate's remaining classes — every other component-props-invalid verdict and component-props-unknown-key — go to error, after an in-repo and an external-corpus inventory) · 2026-10-13T07:37Z
    Session: session_012uFegdfR6K6uqvLzt7XsdZ
    Account: os-support-ai (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-23147-component-props-error-rest
    Worktree: objectstack-issue-23147
    Domain: domain:spec
    Seat: domain:spec#3 (seat post #18883)
    File surface (at origin/main 32fa1942e or later; stop on breach and explain in the report):


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim file surface amended: the gate-tier sentences this change makes false, in any file · domain:spec seat 3 (seat post #18883) · session_012uFegdfR6K6uqvLzt7XsdZ · 2026-10-13T10:11Z

    The dev reports (status line, before its report) that moving the remaining classes to error makes 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 in packages/spec/src/conversions/registry.ts, and one metadata-protocol test comment.

    #23026's first contract review FAILed on exactly this kind of site: a registry.ts docblock 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.

    • That includes the published sites the dev already edited outside the original list. Each one is to be named in the PR body with BEFORE → AFTER.
    • It also includes the four sites above.
    • Text only. ⛔ No schema, guidance string or .describe() change, and no other rule's text.

    registry.ts is 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

  6. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  7. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    ✅ ACCEPT (seat review): PR #23244 at c88fe84c1. The open question is answered A, and the contract-tier review is owed before the queue · domain:spec seat 3 (seat post #18883) · session_012uFegdfR6K6uqvLzt7XsdZ · 2026-10-13T11:26Z

    PR shape.

    • Draft, targeting main.
    • Line 1 is Fixes #23147, and line 2 is Clause-②: no (narrowing …).
    • 43 files, +346 / −224.
    • No skills or governed ledger is touched, and the runtime publish door is not crossed.

    The step, read against the card and the dev's report.

    • Class (b) was measured before the severity moved, each class counted on its own, at the rule's own input tier:
      • in-repo, 37 pages, 244 components walked, 177 judged;
      • objectstack-ai/hotcrm at 0f84c9c72, 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.
    • Then both remaining classes move to error in one step, with no staged window: every non-tombstone component-props-invalid verdict, including the missing dataSource.object binding, and every component-props-unknown-key finding, on all three routes.
    • ComponentPropsSeverity narrows to 'error'. The retired-key classifier now chooses only the fix text.
    • The doors at c88fe84c1: os validate and os lint exit 1 with both findings as errors, and os build exits 1 with no dist.
    • The ablation: five legs, one per severity site, red exactly on their own pins (82 of 82), each restored to blob == HEAD. The rule and test blobs are unchanged at the final head.

    Declarations.

    • @objectstack/lint major with **BREAKING**. ComponentPropsSeverity is an exported type that narrows.
    • @objectstack/spec patch for the D3 entries' reason text.
    • The ADR-0087 marker is not-required (already-registered …) and names the 26 D3 ids whose refusal the gate carries.
    • check-adr-0087-registration and check-changeset-no-major both exit 0.
    • The FROM → TO table and the "Who is affected, measured" paragraph give an upgrader something to act on.

    Text the change made false (amendment 6143270198): closed. The PR body carries BEFORE → AFTER for each site:

    • 25 D3 entry reasons;
    • 20 STEP18_RATIONALE fragments;
    • 3 component.zod.ts docblocks;
    • 2 docs pages;
    • the unpublished comments.
      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.

    • That note (PR feat(spec)!: a page action row's onSuccess is ActionSchema's own block, and its executor key refuses the 'navigation' alias #23164) is merged and unreleased. It ships in the same 18.0.0-next.N release as this PR.
    • Its parenthesis "(that gate's one tier, a warning)" would be false there, next to this PR's note saying the finding is an error.
    • The edit is that one parenthesis, and the frontmatter is untouched.
    • So it is a DELIBERATE CORRECTION. Check Changeset stays red by design on it, and it is not a required context and does not run on merge_group (pr-automation.yml).
    • Owed before the queue: one PR comment naming the gate and the reason. The dev's PR body asks for it, but it is not yet a standalone comment. The same-head at-tier review then confirms it.

    Out-of-scope notes.

    Landing to-do, recorded now:

    1. The designed-red PR comment for .changeset/23103, from the dev.
    2. needs:contract-review goes on the PR in this act. The review runs on c88fe84c1: Clause-② narrowing, the path leg, and the DELIBERATE CORRECTION.
    3. When the review is PASS and every check is green or red by design (Check Changeset only): ready, then auto-merge, then the queue, confirmed by added_to_merge_queue.
    4. When it merges: a landing record here, and pm:dispatched comes off.

    Generated by Claude Code

  8. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Seat note: PR #23244 Test Core (1/6) is red at c88fe84c1 on 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:spec seat 3 (seat post #18883) · session_012uFegdfR6K6uqvLzt7XsdZ · 2026-10-13T11:44Z

    The failure (job 115269929621, the @objectstack/spec test:repo project):

    src/ui/element-text-variant-heading-retirement.test.ts:148
    a heading / subheading variant authoring means the retirement is being undone
    +   "packages/lint/src/validate-component-props.test.ts authors `variant: 'heading'`",
    

    Why.

    • This PR adds the case "a retired enum VALUE — an enum issue, not a tombstone (element:text variant: heading)" to packages/lint/src/validate-component-props.test.ts.
    • The spec pin walks the tree and refuses any authoring of that retired value outside its retirement kit (EXCLUDED / EXCLUDED_PREFIXES).
    • This is this PR's failure, not a flake, so there is no re-run.
    • The dev's local runs covered spec's default project, not its test:repo project, which is where this pin lives.

    The fix round (dev). The claim file surface is amended in this act to cover either option below.

    1. Preferred: keep the case's intent (a retired enum value is filed as an error, not as a tombstone verdict), but author a retired enum value of a ComponentPropsMap row that no tree-scoped absence pin guards. Name the value, and the pin search that shows none guards it.
    2. Only if no such value exists: add packages/lint/src/validate-component-props.test.ts to that pin's EXCLUDED set in packages/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.
    3. Re-measure:
      • @objectstack/spec test:repo and @objectstack/lint's repo-tier project, if it has one, so that any other tree-scoped pin the new tests trip shows up now;
      • the lint suite;
      • the derived gates for the new diff.
        Then push, and restate the designed-red note for the new head if its text changes.
    4. Then: a short at-tier review on the new head, which restates PASS 6144745360's judgments for the unchanged diff and judges the delta. needs:contract-review goes back on the PR in this act.

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    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 at c88fe84c1. The spec test:repo absence pin src/ui/element-text-variant-heading-retirement.test.ts:148 refused the new class pin's element:text variant: 'heading' in packages/lint/src/validate-component-props.test.ts.\n- Option 1 taken. The retired-enum-value pin now authors object-grid exportOptions: { formats: ['pdf'] } and asserts one component-props-invalid error at properties.exportOptions.formats.0. That is zod invalid_value, carrying the 'pdf' was removed from view.exportOptions formats prescription, and it is not a tombstone.\n- The search behind option 1. Every test or script under packages/ and scripts/ that walks the tree (readdirSync, walk(, glob) was grepped for a pdf matcher, and none has one. The only hits are packages/spec/src/ui/view.test.ts, which parses and walks nothing, and a .pdf accept string in component-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- Head 80db1670d: one file changed, +3/−3. The absence pin (repo project) is green. Its lit control planted variant: 'heading' back through ablation-replace.mjs, and the pin went red naming the file. The restore brought the blob back to HEAD's 89d9fb165dca.\n- @objectstack/spec test: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, and check-empty-changeset exit 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

  10. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #23244 → 4f68ba198 (Fixes #23147). Every finding of the component-props gate is an error at os validate, os build and os lint

    domain:spec seat 3 (#18883) · os-support-ai · session session_012uFegdfR6K6uqvLzt7XsdZ · 2026-10-13T14:03Z · holder of claim 6140712434, amended 6143270198 and 6144802415.

    • Path:
      • The baseline. Class (b) was measured first. It found 0 findings of every class over 37 in-repo pages (177 judged components) and 8 hotcrm pages (50 judged), each population with a planted positive control. Then both remaining classes moved to error in one step. ComponentPropsSeverity narrows to 'error'.
      • The ACCEPT. ACCEPT 6144494395 answered the open question A: keep the correction of .changeset/23103. The contract-tier review PASSed on c88fe84c1 (6144745360).
      • The fix round. Test Core (1/6) then went red on a tree-scoped absence pin in spec's test:repo project, tripped by the new retired-enum-value case's variant: 'heading'. One fix round swapped it for object-grid exportOptions.formats: ['pdf'], a retired value no walker matches.
      • The second review. The delta review PASSed on 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 in Test Core (3/6) (packages/cli, outside the diff) took this PR's one re-run and passed (6145577154).
      • The checks. Every check was green or an expected skip, apart from the designed Check Changeset red (note 6144550809). check-governed-merges reported it NOT governed, at 570 lines.
      • The queue. Ready and auto-merge went on at 2026-10-13T13:29Z. The PR entered the merge queue at 2026-10-13T13:31Z, and the queue merged it at 2026-10-13T14:02Z.
    • On main at 4f68ba198:
    • Closing keywords: this card closed as completed, and the PR names no other issue. pm:dispatched comes off in this act.
    • Carried:
      • Crossing this rule to the runtime publish door (Studio, REST /meta, MCP).
        • It was measured possible: a page write's snapshot carries every input, and 28 of 28 showcase pages gave identical findings.
        • It is a rollout decision of its own, with a false-refusal budget over stored tenant page rows (triage 6137942125).
        • It stays in the PR's Acceptance notes. This seat puts it to the maintainer in the round report.
      • A dated audit row. docs/audits/2026-07-unknown-key-strictness-ledger.md:676 still says "warning tier". It is a dated row, not shipped, and it may stay as dated.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:specenhancementNew feature or requestpriority:p2Medium: important, M3target:v18

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions