Skip to content

Commit 612468c

Browse files
docs(deployment): give the twelve publish-door rules with no row their four-doors rows (#30774)
<!-- claude-projects-attribution: {"github_login":"os-elon-musk"} --> _Requested by **Elon** · [project thread](https://claude.ai/code/project/chan_01WedDzV26nniwxv7jC88B9D?thread=cmsg_01WedDzV26nniwxv7jC88B9D8fcd5rdwaRD11xXZFTsP7M)_ domain:devx#1 · os-elon-musk · session_016WV4cwZNvkxPxgYDtckTvD Fixes #30733 Clause-②: no Metadata-protocol: none Skills-docs: updated here ## 维护者速读 - **改了什么**:`validating-metadata.mdx` 的「一道闸、四道门」表格补上 12 条在运行时发布门运行、却没有任何一行的规则(12 行);图例为 `connector` 新增代码 `ᶜ`。 - **为什么改**:作者靠这张表查发布门会拒收什么;这 12 条规则拒收时文档里没有一行可对照。 - **风险与回滚**:纯文档,一个文件,无行为改动;回滚即 revert。 - **先看**:① 表格新增的 12 行(页面三行在 SDUI component props 之后,流程四行在 Flow trigger readiness 之后);② 表下图例新增的 `✓ᶜ` `connector`。 - **两分钟验证**:对照 `packages/lint/src/authoring-rules.ts` 里任一新行规则的 `runtimeTypes`,看该行最后一格的上标是否按同序拼出。 - **需要你做的**:无,席位落地。 ## What changes One file, `content/docs/deployment/validating-metadata.mdx`: twelve new rows in the four-doors table and one new legend code. Re-derivation on `origin/main` (`b3098661`, this branch's base): `AUTHORING_RULES` holds 63 entries, 33 with `surfaces: CLI_AND_RUNTIME`. Every one of those 33 now has a row; before this PR exactly the twelve the card lists had none. The reference-integrity suite's 33 members are all covered by the existing umbrella and member rows (unchanged). All twelve declare `commands: ALL`, so the three CLI cells are `✓ ✓ ✓` on every new row. | New row | Rule | `runtimeTypes` | `os validate` | `os build` | `os lint` | runtime publish | |:--|:--|:--|:--|:--|:--|:--| | Retired object title template | `validateTitleFormatRetired` | `object` | ✓ | ✓ | ✓ | `✓ᵒ` | | Roll-up aggregands | `lintSummaryRollups` | `object` | ✓ | ✓ | ✓ | `✓ᵒ` | | Page component types inside a spec-reserved namespace | `validateComponentTypes` | `page` | ✓ | ✓ | ✓ | `✓ᵖ` | | Print page blocks | `validatePrintPageBlocks` | `page` | ✓ | ✓ | ✓ | `✓ᵖ` | | Page variable declarations | `validatePageVariables` | `page` | ✓ | ✓ | ✓ | `✓ᵖ` | | Advisory: retired permission residue | `validateRetiredPermissionResidue` | `permission` | ✓ | ✓ | ✓ | `✓ᵖᵉ` | | Form thank-you panel fields | `validateThankYouRecordFields` | `view, page` | ✓ | ✓ | ✓ | `✓ᵛᵖ` | | Email template hole grammar | `validateEmailTemplateHoleGrammar` | `email_template` | ✓ | ✓ | ✓ | `✓ᵉ` | | Flow `api` trigger signing | `validateFlowApiTriggerSecret` | `flow` | ✓ | ✓ | ✓ | `✓ᶠ` | | Flow region shape | `validateFlowRegionShape` | `flow` | ✓ | ✓ | ✓ | `✓ᶠ` | | Advisory: credential literals in a flow | `lintFlowCredentialLiterals` | `flow` | ✓ | ✓ | ✓ | `✓ᶠ` | | Advisory: credential literals in a connector | `lintConnectorCredentialLiterals` | `connector` | ✓ | ✓ | ✓ | `✓ᶜ` | Each rule has its own row, placed beside the existing row of its family (object rows after the inert-declarations row, page rows after SDUI component props, the thank-you row after public-form file fields, hole grammar after hole placements, flow rows after flow trigger readiness, permission residue after membership keys). Rules that share a cell were not merged into one row, because they are different families; the table's rows are families. The three `tier: 'advisory'` rules carry the table's own `Advisory:` prefix. Legend: `✓ᶜ` `connector`, the bare `ᶜ`, said in the sentence that explains the two-letter codes. ## Acceptance notes - **Pair check.** A script decoded every `runtime publish` cell longest-first against the 18 codes. Every cell decodes, every new cell decodes to its rule's `runtimeTypes` in declared order, and no existing cell changed its reading. The only two-letter code that ends in `ᶜ` is `ᵃᶜ`, and no cell puts `ᶜ` right after `ᵃ`. - **Row text.** Each new row names the rule id(s) it reports under and the origin issue or ADR read from the rule's source file or the release notes. `lintSummaryRollups` names no origin issue in its source, so its row cites only its rule id `rollup/non-numeric-aggregand`. ## Verification `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (exit 0) derived 43 commands for this one path (35 by path, 8 whole-tree). Docs only, no package files, so `skip-changeset`; nothing to ablate. All 43 ran at `ef000aa5` (the final head, on `origin/main` `b3098661`) and every one exited 0, after building the `@objectstack/lint` and `@objectstack/client-react` closures, which five of them read as built output. `dispatch-gates.mjs --ran` on that record: exit 0, "43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED". <details><summary>43 gates, exit codes at ef000aa</summary> ```text node scripts/check-adr-links.mjs :: exit 0 node scripts/check-adr-links.mjs --self-test :: 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-corpus.mjs :: 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-section-landing-index.mjs :: exit 0 node scripts/check-section-landing-index.mjs --self-test :: exit 0 node scripts/ci/plan-test-core-shards.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:docs :: exit 0 pnpm --filter @objectstack/spec run check:empty-state :: exit 0 pnpm --filter @objectstack/spec run check:liveness :: exit 0 pnpm --filter @objectstack/spec run check:skill-examples :: exit 0 pnpm --filter @objectstack/spec run check:strictness-ledger :: exit 0 pnpm --filter @objectstack/spec run check:variant-docs :: exit 0 pnpm --filter @objectstack/spec run check:yaml-examples :: exit 0 pnpm check:ci-filter-parity :: exit 0 pnpm check:closed-ceremony-text :: exit 0 pnpm check:corpus-claim-drift :: exit 0 pnpm check:cross-package-test-inputs :: exit 0 pnpm check:doc-anchors :: exit 0 pnpm check:doc-authoring :: exit 0 pnpm check:doc-frontmatter :: 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:gitlink-declared :: exit 0 pnpm check:nul-bytes :: exit 0 pnpm check:published-readme-links :: 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:vendor-version-stamps :: exit 0 pnpm check:watch-hint-literal :: exit 0 ``` </details> --- _Generated by [Claude Code](https://claude.ai/code/session_016WV4cwZNvkxPxgYDtckTvD)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent 802c98c commit 612468c

1 file changed

Lines changed: 14 additions & 2 deletions

File tree

‎content/docs/deployment/validating-metadata.mdx‎

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -481,6 +481,8 @@ orthogonal to both, and no cell here can carry it; it is written out in
481481
| CEL / predicate validation (ADR-0032) | ✓ | ✓ | ✓ | ✓ᶠᵃᶜʰᵒᵛᵖ |
482482
| List-view navigation modes (ADR-0053) | ✓ | ✓ | ✓ | — |
483483
| Zod-valid but functionally inert declarations — a `summary` with no operations (ADR-0078), a managed object advertising an API method its affordances refuse (#7521) | ✓ | ✓ | ✓ | ✓ᵒ |
484+
| Retired object title template — an object that declares `titleFormat`, retired by ADR-0079 for `nameField` (`title-format-retired`, #29007) | ✓ | ✓ | ✓ | ✓ᵒ |
485+
| Roll-up aggregands — a `summaryOperations` `min` / `max` whose answer is not a number, or a `sum` / `avg` over a child field type the aggregate × field-type table refuses (`rollup/non-numeric-aggregand`) | ✓ | ✓ | ✓ | ✓ᵒ |
484486
| View container shape | ✓ | ✓ | ✓ | — |
485487
| Widget-binding integrity (ADR-0021) | ✓ | ✓ | ✓ | ✓ᵈ |
486488
| Dataset measure `aggregate` × the field's declared type — a pair the spec's compatibility table refuses, e.g. `avg` over a `datetime` field (#16354) | ✓ | ✓ | ✓ | ✓ᵈᵗ |
@@ -497,6 +499,9 @@ orthogonal to both, and no cell here can carry it; it is written out in
497499
| Navigation vs. granted access (ADR-0090 D6) | ✓ | ✓ | ✓ | ✓ᶠ |
498500
| SDUI scoped styling (ADR-0065) | ✓ | ✓ | ✓ | — |
499501
| SDUI component props — every `ComponentPropsMap` verdict: an undeclared prop, a value its props schema rejects, a missing `dataSource.object` binding, and a retired prop (`retiredKey()`) refused with its prescription (#23026, #23147; at the save door #23388) | ✓ | ✓ | ✓ | ✓ᵖ |
502+
| Page component types inside a spec-reserved namespace — a type the platform does not declare, e.g. `global:serch` (`component-type-unknown`, ADR-0078; at the save door #23388) | ✓ | ✓ | ✓ | ✓ᵖ |
503+
| Print page blocks — a page that declares `print` holds only printable component types (`print-page-block-unprintable`, #22158) | ✓ | ✓ | ✓ | ✓ᵖ |
504+
| Page variable declarations — each name once and never blank, a `defaultValue` of its declared type, a `source` naming a component the page holds (#28663, #28725) | ✓ | ✓ | ✓ | ✓ᵖ |
500505
| JSX / React page source parses (ADR-0080/0081) | ✓ | ✓ | ✓ | — |
501506
| Approval-node approvers (ADR-0090 D3) | ✓ | ✓ | ✓ | ✓ᶠ |
502507
| Security posture (ADR-0090 — e.g. every custom object declares `sharingModel`) | ✓ | ✓ | ✓ | ✓ˢᵖᵉᵇᵒ |
@@ -506,14 +511,21 @@ orthogonal to both, and no cell here can carry it; it is written out in
506511
| Declared enforcement that cannot run, **declared on another collection** — sharing-rule conditions (#4698) | ✓ | ✓ | ✓ | — |
507512
| Row-level-security predicates (#4983) — a permission set's policies, an object's `defaultRowScope`, a membership key's `filter` and a field permission entry's `when` (#25866); at the save door also a membership key nothing owns (#25234) | ✓ | ✓ | ✓ | ✓ᵖᵉᵒ |
508513
| Membership key declarations — `userField` / `valueField` columns, one key on one object, a key the registered resolver also owns (save door only) (#25234) | ✓ | ✓ | ✓ | ✓ᵒ |
514+
| Advisory: retired permission residue — the `allowRestore` / `allowPurge` default the parse strips in silence (`permission-retired-lifecycle-residue`, #17425) | ✓ | ✓ | ✓ | ✓ᵖᵉ |
509515
| Platform-schedule `create_record` organization (#6285) | — | — | — | ✓ᶠ |
510516
| Public-form anonymous intake on this deployment's tenancy posture — advisory only (#21476) | — | — | — | ✓ᵛ |
511517
| Public-form file fields — a form open to anonymous intake whose sections declare a `file`, `image`, `avatar`, `video` or `audio` field (#25650) | ✓ | ✓ | ✓ | ✓ᵛ |
518+
| Form thank-you panel fields — a `thank-you` panel may name only a field the engine generates on insert, on a `views[]` form or a page `object-form` (`thank-you-record-field`, #28005) | ✓ | ✓ | ✓ | ✓ᵛᵖ |
512519
| Autonumber `{field}` interpolation | ✓ | ✓ | ✓ | ✓ᵒ |
513520
| Email template HTML hole placements — a hole in a placement the mail renderer's encoding does not suit (#25189) | ✓ | ✓ | ✓ | ✓ᵉ |
521+
| Email template hole grammar — one whitelisted formatter per hole, a `currency` argument that is an ISO 4217 code or a declared `@path` (`email-template-hole-grammar`, #26799) | ✓ | ✓ | ✓ | ✓ᵉ |
514522
| View references — form targets, view-key collisions (#2554) | ✓ | ✓ | ✓ | — |
515523
| Flow authoring anti-patterns (#1874) | ✓ | ✓ | ✓ | ✓ᶠ |
516524
| Flow trigger readiness — a flow that looks armed and never launches (#5762) | ✓ | ✓ | ✓ | ✓ᶠ |
525+
| Flow `api` trigger signing — a start node with no signing secret, or a `config.signature` the spec refuses; a withheld secret that is stored reads as present at the save door (`flow-api-trigger-secret-missing`, `flow-api-trigger-signature-unusable`, #20611, #30009) | ✓ | ✓ | ✓ | ✓ᶠ |
526+
| Flow region shape — a `loop`, `parallel` or `try_catch` region the automation engine refuses to register (`flow-region-shape-invalid`, ADR-0031, #29233) | ✓ | ✓ | ✓ | ✓ᶠ |
527+
| Advisory: credential literals in a flow — an `http` node's headers or url query, a node's `connectorConfig.input` (`flow-credential-literal`, #20698) | ✓ | ✓ | ✓ | ✓ᶠ |
528+
| Advisory: credential literals in a connector — its header and environment maps, and a stdio MCP credential route (`connector-credential-literal`, #29424) | ✓ | ✓ | ✓ | ✓ᶜ |
517529
| `views[]` and page-component conditional-visibility predicates — CEL syntax, parse budget, bare identifiers, binding-root layer; schema path refs on `views[]` only (ADR-0089 D3b, #7010; page components at the save door #24491); an app navigation entry's `visible` at the save door (#28663) | ✓ | ✓ | ✓ | ✓ᵛᵖᵃ |
518530
| Advisory: record titles, semantic field pointers (ADR-0085), action placement, seed replay/state safety, capability references | ✓ | ✓ | ✓ | — |
519531
| Advisory: form-section layout | ✓ | ✓ | ✓ | ✓ᵛ |
@@ -529,10 +541,10 @@ orthogonal to both, and no cell here can carry it; it is written out in
529541
writes that rule inspects: `✓ᶠ` `flow`, `✓ᵛ` `view`, `✓ᵈ` `dashboard`, `✓ᵒ`
530542
`object`, `✓ᵖ` `page`, `✓ˢ` `seed`, `✓ᵇ` `book`, `✓ᵖᵉ` `permission`,
531543
`✓ᵖᵒ` `position`, `✓ᵃ` `app`, `✓ᵉ` `email_template`, `✓ᵈᵗ` `dataset`, `✓ʳ` `report`,
532-
`✓ᵃᶜ` `action`, `✓ʰ` `hook`, `✓ᵐ` `mapping`, `✓ᵈˢ` `datasource`** — the two
544+
`✓ᵃᶜ` `action`, `✓ʰ` `hook`, `✓ᵐ` `mapping`, `✓ᵈˢ` `datasource`, `✓ᶜ` `connector`** — the two
533545
`ᵖ`-initial pairs carry a second letter because `page` already holds `ᵖ` on its
534546
own, `dataset` and `datasource` carry `ᵈᵗ` and `ᵈˢ` because `dashboard` holds `ᵈ`,
535-
and `action` carries `ᵃᶜ` because `app` holds `ᵃ`. Read the codes **longest-first**: `ᵖᵒ` is `position`, never `page`
547+
and `action` carries `ᵃᶜ` because `app` holds `ᵃ`, while `connector` takes the bare `ᶜ`. Read the codes **longest-first**: `ᵖᵒ` is `position`, never `page`
536548
followed by `object`, `ᵖᵉ` is `permission`, never `page` followed by
537549
`email_template`, `ᵈᵗ` is `dataset`, `ᵈˢ` is `datasource` and `ᵃᶜ` is `action`.
538550
A row whose rules are members of the reference-integrity suite reads the

0 commit comments

Comments
 (0)