Skip to content

fix(spec): Field.autonumber declares readonly: true (#5628) - #6646

Merged
qq9340100 merged 4 commits into
mainfrom
claude/issue-5628-autonumber-readonly
Aug 8, 2026
Merged

fix(spec): Field.autonumber declares readonly: true (#5628)#6646
qq9340100 merged 4 commits into
mainfrom
claude/issue-5628-autonumber-readonly

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes#5628

方向 1(PM 派发时拍板,否决窗口见认领评论)落地。完整实施叙事见分支 feature commit(eabcc3666)。摘要:

交付通道注记(容器重启恢复)

实施 dev(容器内 os-dev)在合并 origin/main 后、合并后验证运行中被容器重启杀死;工作树干净、feature commit 完整。PM(session_011M7UwH25Unfi73UHim7ajY)代推分支并开本 PR,合并后验证交由 CI 全量裁决 —— 本 PR 保持 draft 直至 CI 收敛后由 PM step-7 复核。


Generated by Claude Code

`FieldSchema.readonly` is a two-part contract: "never editable in forms" AND
server-enforced on both write paths. #5503 closed the server half for
`autonumber` BY TYPE — a caller-supplied record number is stripped before any
driver sees it, flag or no flag. The form half is keyed on the FLAG, and the
builder never set it, so a renderer deciding editability from `field.readonly`
drew an editable "record number" input whose value the server was already
guaranteed to discard.
`Field.autonumber(...)` now emits `readonly: true`, applied AFTER the author's
config so it cannot be spread away, with the authoring type narrowed to
`readonly?: true` — `Field.autonumber({ readonly: false })` is a compile error
at the metadata site rather than a silently coerced value. A hand-written
`{ type: 'autonumber' }` literal is unaffected: it is covered by the by-type
server enforcement, which never depended on the flag.
Measured side effect, neutralized in the same change: the DataProtocol create
ingress (`stripReadonlyForInsert`, #3043) knows only the `isSystem` exemption,
while the engine's runtime-owned strip also honours `preserveAudit` (#3493).
With the flag present the ingress would have deleted a historical import's
legacy record number BEFORE the engine could keep it — and no test would have
gone red, because every existing preserveAudit pin calls `engine.insert`
directly. The ingress now skips runtime-owned field types outright and leaves
them to the engine strip, which runs on every insert path including the direct
`engine.insert` callers the ingress never sees. Author-declared `readonly` on
every other type keeps its full #3043 width.
The backing set moves to `@objectstack/spec/data` as
`RUNTIME_OWNED_FIELD_TYPES` — the protocol's one statement of the ownership —
now that a second consumer needs it; objectql keeps the reasoning comment and
imports the membership.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011M7UwH25Unfi73UHim7ajY
@vercel

vercelBot commented Aug 8, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 8, 2026 9:12am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

115 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 @objectstack/spec)
  • content/docs/automation/connectors.mdx(via @objectstack/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 @objectstack/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/cli.mdx(via @objectstack/spec)
  • content/docs/deployment/migration-from-objectql.mdx(via @objectstack/objectql)
  • content/docs/deployment/tenancy-modes.mdx(via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/deployment/validating-metadata.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/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/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 @objectstack/spec)
  • content/docs/kernel/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx(via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx(via packages/objectql, @objectstack/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 @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx(via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx(via @objectstack/metadata-protocol, @objectstack/objectql, @objectstack/spec)
  • content/docs/kernel/services.mdx(via @objectstack/objectql, @objectstack/spec)
  • 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/http-protocol.mdx(via @objectstack/metadata-protocol, @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx(via @objectstack/objectql, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx(via packages/objectql, @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/v16.mdx(via @objectstack/spec)
  • content/docs/releases/v17.mdx(via @objectstack/spec)
  • content/docs/releases/v9.mdx(via @objectstack/metadata-protocol, @objectstack/spec)
  • content/docs/ui/actions.mdx(via @objectstack/spec)
  • content/docs/ui/apps.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/field-grouping-and-order.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.

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation protocol:data tests tooling labels Aug 8, 2026
…api-surface)
Recovery commit: completes the regen the dev agent never reached before
the container restart. check:generated 10/10.
check:type-check-debt --re-measure caught +3 in objectql's TEST_DEBT
layer (355 -> 358): the new cases copied the file's frozen-debt idioms —
one-arg registerObject (packageId is required) and .at() under the
package's lib target. Fixed to the file's clean two-arg idiom and indexed
access; raw count back to 355, the 32-case suite stays green.
@qq9340100
qq9340100 added this pull request to the merge queueAug 8, 2026
@github-actions

Copy link
Copy Markdown
Contributor

⛔ merge queue 构建失败 — 先分诊,再决定要不要重排

队列构建 31250767006 红了。队列跑的是全量套件(PR 侧 CI 只跑 affected 子集),
所以失败的测试可能在本 PR 没碰过的包里 —— 那不是重排能修的。每次盲目重排都会让排在后面的所有 PR 重建一轮。

失败的 job(日志抽取,best effort):

  • Dogfood Verify CLI — 失败步骤: Verify pnpm version

    AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
    

历史信号:

  • 本 PR 过去 24h 无队列失败记录(首次)。
  • 过去 24h 队列共有 4 个失败构建(不含本次)。

分诊清单:

  1. 失败测试在本 PR 改动的包里 → 真回归,修 PR。
  2. 失败测试与本 PR 无关 → 在其他 PR 的同类评论里搜同名测试;出现过 ⇒ flaky 实锤,开 issue 修/隔离那条测试。修好前重排只会再烧一轮全队列。
  3. 两者都不是 → 可能与同组 PR 语义冲突;等前面的 PR 落地或失败出队后再重排一次即可,不要连续重排。

Generated by Claude Code · merge-queue-triage workflow (#4859)

@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to failed status checks Aug 8, 2026
@qq9340100
qq9340100 added this pull request to the merge queueAug 8, 2026
Merged via the queue into main with commit b3efeb7Aug 8, 2026
26 checks passed
@qq9340100
qq9340100 deleted the claude/issue-5628-autonumber-readonly branch August 8, 2026 10:04
@os-zhuangClaude

Copy link
Copy Markdown
Contributor

Queue steward — signature triage (post-hoc audit; no steward action was needed)

The merge-queue generation pr-6646-d13f627e… (run 31250767006, created 09:31:33Z) went red. Signature read from the complete job log, not the tail:

  • Failing job:Dogfood Verify CLI, step 5 Verify pnpm version.
  • Error: corepack downloading pnpm-10.31.0.tgz from registry.npmjs.org crashed Node v22.23.1 —
    AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value: assert(!this.paused) at Parser.finish (node:internal/deps/undici/undici:6157:9), reached from a TLSSocket end-of-stream. Exit code 1, seven seconds into the job, before any repository code ran.
  • The second red job is not independent.Dogfood Regression Gate (step Verify dogfood shard results) failed because of the first: its own log shows OS_VERIFY_RESULT: failure and dogfood-verify-1-of-1 MISSING, while all three dogfood shards attested 3 / 3. Causality here is read from the aggregator's declared inputs, not from log adjacency.

Ledger verdict: hits the cross-repo general row of the signature ledger (#5810) — GitHub Actions runner loss / npm registry 5xx / network timeout (infrastructure noise, unrelated to the diff). A response truncated mid-tarball during toolchain setup is squarely that row; this PR's diff cannot reach it.

Disposition — re-queue as-is, already satisfied without steward action. The PR re-entered the queue at 09:48:14Z as pr-6646-a6431555…, all four gates green, and merged at 10:04:07Z. Nothing is owed by the lane: no re-diagnosis, and no annotation on a flaky issue (the hit changes no fix's scope, per Operational note 2). This answers the automated triage checklist posted at 09:44Z — branch 3 of it, infrastructure rather than regression or test flake.

This comment is the audit record only. The steward merged nothing, toggled no ready/draft state, and re-queued nothing.


Generated by Claude Code

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

Labels

documentationImprovements or additions to documentationprotocol:datasize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[观察] autonumber builder 不注入 readonly: true —— readonly 契约的「表单不可编辑」那一半对单号字段不成立

3 participants

@qq9340100@os-zhuang@claude