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

claude added 2 commits August 8, 2026 07:36
`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

vercel Bot commented Aug 8, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 8, 2026 9:12am

Request Review

@github-actions github-actions Bot added the size/m label Aug 8, 2026
@github-actions

github-actions Bot commented Aug 8, 2026

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-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests tooling labels Aug 8, 2026
claude added 2 commits August 8, 2026 08:36
…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 queue Aug 8, 2026
@github-actions

github-actions Bot commented Aug 8, 2026

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-queue Bot 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 queue Aug 8, 2026
Merged via the queue into main with commit b3efeb7 Aug 8, 2026
26 checks passed
@qq9340100
qq9340100 deleted the claude/issue-5628-autonumber-readonly branch August 8, 2026 10:04

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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

3 participants