Skip to content

fix(spec): trim dead 'delete' member from validation-rule events enum - #3189

Merged
os-zhuang merged 1 commit into
mainfrom
claude/validation-multi-row-updates-kqxgg4
Jul 18, 2026
Merged

fix(spec): trim dead 'delete' member from validation-rule events enum#3189
os-zhuang merged 1 commit into
mainfrom
claude/validation-multi-row-updates-kqxgg4

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Summary

Closes#3184. Follow-up to #3106 / PR #3160, which fixed the multi-row-update call-site gap and explicitly split this out.

The validation-rule events enum admitted ['insert', 'update', 'delete'], but the rule evaluator's runtime Mode is 'insert' | 'update' and engine.delete never invokes evaluateValidationRules — so a rule declaring events: ['delete']silently never ran. This was flagged in #3106's "Related" section and independently by docs/audits/2026-06-validationschema-property-liveness.md, and the published objectstack-data skill actively taught it — advertising a capability the runtime never delivers (AGENTS.md PD #10).

Decision: trim, not enforce. Delete-time guards belong in beforeDelete lifecycle hooks (already taught correctly in the skills); only script/cross_field would be meaningful on delete, and hooks cover that. Removing the member is contract-first (PD #12): any off-spec metadata now fails loudly at os validate / registration instead of parsing and doing nothing.

Blast radius: zero. No example app, seed, template, fixture, or test declares events: ['delete'] — the only repo-wide occurrences were doc/skill text.

Changes

  • packages/spec/src/data/validation.zod.ts — narrow the events enum to ['insert', 'update']; narrow the BaseValidationRuleShape.events mirror type; move the delete explanation into the module's "Deliberately NOT validation rules" doc block (restoring the "nothing is a silent no-op" invariant).
  • packages/objectql/src/validation/rule-validator.ts — narrow the BaseRule.events mirror; update the header doc comment (drops the "known gap … tracked separately" note). No evaluator logic change (the events filter already could never match delete).
  • packages/metadata-protocol/src/protocol.ts — narrow the hand-written JSON-schema form-helper mirror; also correct its stale type enum (still listed the removed unique/async/custom variants and json instead of json_schema; "9 variants" → 6) in the same mirror-drift pass.
  • skills/objectstack-data/rules/validation.md — remove the events: ['delete'] line; point delete guards at beforeDelete hooks.
  • content/docs/data-modeling/validation.mdx (hand-written table) and docs/design/builder-ui.md (prose) — drop 'delete'.
  • content/docs/references/data/validation.mdx — regenerated (gen:schema && gen:docs).
  • .changeset/trim-validation-delete-event.md — patch (fixed version group).

Tests

Verified: spec suite 256 files / 6914 tests green, objectql suite 71 files / 936 tests green, check:docs reports 258 generated files in sync (the check that failed on #3160), spec + metadata-protocol + objectql builds green, eslint clean.

Out of scope

  • Other June-audit recommendations (drop label/description/tags, merge cross_field into script) — separate decisions.
  • engine.delete behavior — unchanged; delete guards remain lifecycle-hook territory.

🤖 Generated with Claude Code

https://claude.ai/code/session_01VCUSMJBsX14C3RQdWFw7N7


Generated by Claude Code

…#3184)
The rule evaluator only runs on the insert/update write path — engine.delete
never invokes evaluateValidationRules — so a rule declaring events:['delete']
was a silent no-op (flagged in #3106 and the 2026-06 validation liveness audit,
and actively taught by the objectstack-data skill). Guard deletions with a
beforeDelete lifecycle hook instead.
Narrows the enum and its hand-written mirrors in lockstep: the
BaseValidationRuleShape type, objectql's BaseRule, and the metadata-protocol
JSON-schema form helper (whose stale `type` enum still listing the removed
unique/async/custom variants and `json`→`json_schema` is corrected in the same
pass). Updates the module doc comments (delete now lives under "Deliberately
NOT validation rules"), the published skill, the hand-written validation doc,
and regenerates content/docs/references/data/validation.mdx.
No shipped metadata declares events:['delete']; any off-spec metadata that did
now fails loudly at os validate / registration instead of parsing and silently
doing nothing (contract-first, PD #12). Adds a spec test asserting the
rejection.
Closes#3184
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VCUSMJBsX14C3RQdWFw7N7
@vercel

vercelBot commented Jul 18, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specBuildingBuildingPreview, CommentJul 18, 2026 6:52am

Request Review

@github-actionsgithub-actionsBot added size/m documentation Improvements or additions to documentation protocol:data tests tooling and removed size/m labels Jul 18, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/metadata-protocol, @objectstack/objectql, @objectstack/spec.

107 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 @objectstack/metadata-protocol, @objectstack/objectql, 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 packages/objectql, @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/migration-from-objectql.mdx(via @objectstack/objectql)
  • content/docs/deployment/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/deployment/vercel.mdx(via @objectstack/objectql)
  • 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/objectql, @objectstack/spec)
  • content/docs/kernel/services.mdx(via @objectstack/objectql)
  • content/docs/permissions/authentication.mdx(via @objectstack/objectql)
  • 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/objectql, @objectstack/spec)
  • content/docs/plugins/packages.mdx(via @objectstack/objectql, @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/index.mdx(via @objectstack/objectql)
  • 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/objectql, @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/objectql, @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/objectql, @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.

@os-zhuang
os-zhuang marked this pull request as ready for review July 18, 2026 07:23
@os-zhuang
os-zhuang merged commit f16b492 into mainJul 18, 2026
16 of 17 checks passed
@os-zhuang
os-zhuang deleted the claude/validation-multi-row-updates-kqxgg4 branch July 18, 2026 07:23
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:datateststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Validation events: ['delete'] is a silent no-op — trim it from the spec

2 participants

@os-zhuang@claude