Skip to content

chore(spec): metadata-liveness P2 follow-through — mark aspirational props experimental + declare renderer-read props (#1878)#3223

Merged
os-zhuang merged 3 commits into
mainfrom
claude/metadata-property-liveness-audit-sj47n1
Jul 18, 2026
Merged

chore(spec): metadata-liveness P2 follow-through — mark aspirational props experimental + declare renderer-read props (#1878)#3223
os-zhuang merged 3 commits into
mainfrom
claude/metadata-property-liveness-audit-sj47n1

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Summary

Follow-through on the metadata-liveness audit umbrella #1878 (reopened). After re-evaluating every open sub-issue against the current code, this PR lands the unambiguous framework-spec portions of the open P2 hygiene issues — the changes that are localized to packages/spec and provable by the existing gates.

#1893 — Aspirational config: mark experimental (ADR-0049)

Properties that parse but have no runtime consumer now carry an [EXPERIMENTAL — not enforced] marker in their .describe(), so authors (and objectstack compile) are not misled into thinking they take effect:

Type Props
object enable.trash, enable.mru (ledger dead → experimental)
job retryPolicy, timeout
theme spacing, breakpoints, rtl, density, touchTarget
translation messageFormat:'icu', cache
webhook authentication (non-HMAC bearer/basic/api-key)
portal entire PortalSchema — not registered as a metadata type, no route/renderer

#1891 + #1894 — Naming drift & inverse drift (app cluster)

Declare the props the objectui renderers already read, so a strict Schema.parse() holds instead of silently stripping renderer-needed keys:

  • app branding accentColor (read by ConsoleLayout)
  • nav item badgeVariant (read by NavigationRenderer)
  • nav item separator type (read by AppContent as a nav divider)
  • agent knowledge.sources promoted to the canonical key (the renderer reads sources); knowledge.topics kept as a deprecated alias

Testing / gates

  • check:liveness ✅ — all governed-type properties classified
  • check:docs ✅ — 253 generated reference files regenerated & in sync (content/docs/references)
  • check:spec-changes ✅ — up to date
  • Full spec suite: 6763 passed

Not in this PR (deferred — need a maintainer design decision, tracked in the sub-issues)

🤖 Generated with Claude Code

https://claude.ai/code/session_01LddW4NaQBdf5FTEnBPpnUJ


Generated by Claude Code

@vercel

vercel Bot commented Jul 18, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 18, 2026 3:58pm

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

102 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

claude added 3 commits July 18, 2026 15:40
…read props (#1878)

Metadata-liveness audit follow-through (umbrella #1878). Resolves the
unambiguous framework-spec portions of the open P2 sub-issues.

#1893 (aspirational config — prune or mark experimental): add
[EXPERIMENTAL — not enforced] markers to properties that parse but have no
runtime consumer, so authors are not misled (ADR-0049):
- object enable.trash / enable.mru (ledger dead -> experimental)
- job retryPolicy / timeout
- theme spacing / breakpoints / rtl / density / touchTarget
- translation messageFormat:'icu' / cache
- webhook authentication (non-HMAC bearer/basic/api-key)
- PortalSchema (entire — not registered, no route/renderer)

#1891 / #1894 (naming drift + inverse drift — app cluster): declare the
props the objectui renderers already read so a strict Schema.parse() holds:
- app branding accentColor (ConsoleLayout)
- nav item badgeVariant (NavigationRenderer)
- nav item `separator` type (AppContent nav divider)
- agent knowledge.sources as the canonical key, topics kept as deprecated alias

Regenerated reference docs (content/docs/references) to match. All spec
gates green: check:liveness, check:docs, check:spec-changes; full spec
suite 6763 passing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LddW4NaQBdf5FTEnBPpnUJ
…uthor-lint)

The author-side liveness lint (lintLivenessProperties, #1966) auto-warns on
every `experimental` prop. enable.trash / enable.mru default to `true`, and
the lint cannot distinguish an authored `true` from the schema default — so
tagging them experimental warned on the default value of every object,
tripping the "does NOT warn on a default-on flag left alone (enable.trash)"
contract test in Test Core.

Revert those two to `dead` (their audit classification) with a ledger note
explaining why; drop the [EXPERIMENTAL] marker from their spec .describe().
Their #1893 disposition (prune-or-build) stays tracked in the sub-issue.
All other #1893 experimental markers are on ungoverned types the lint never
loads, so they are unaffected.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LddW4NaQBdf5FTEnBPpnUJ
…on entry point (#1892)

#1892 tool disposition (ADR-0049 line): the ledger already documents that
tool metadata is a one-way, write-only projection (no executor loads a
metadata-authored tool; the runtime uses a separate AIToolDefinition in
cloud service-ai). Surface that on the SPEC itself so an author/AI reading
the Zod schema — not just the ledger — knows a hand-authored tool will not
run in the open edition. Non-breaking describe-only change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LddW4NaQBdf5FTEnBPpnUJ
@os-zhuang
os-zhuang force-pushed the claude/metadata-property-liveness-audit-sj47n1 branch from d55c442 to 2f05725 Compare July 18, 2026 15:42
@os-zhuang
os-zhuang merged commit 21bd3dd into main Jul 18, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/metadata-property-liveness-audit-sj47n1 branch July 18, 2026 16:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants