Skip to content

feat(rest): treatAsHistorical import option — skip the state machine for historical-data migration (#3479)#3483

Merged
os-zhuang merged 1 commit into
mainfrom
claude/import-historical-fsm-3479
Jul 25, 2026
Merged

feat(rest): treatAsHistorical import option — skip the state machine for historical-data migration (#3479)#3483
os-zhuang merged 1 commit into
mainfrom
claude/import-historical-fsm-3479

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #3479. #3433(种子豁免)的同构缺口,换了一个入口。

问题

#3165initialStates 在每次 INSERT 强制 FSM 入口,所以导入历史既成事实(一批已 closed 的工单、closed_won 的商机、completed 的项目)会被逐行 invalid_initial_state 拒,挡住数据迁移这个核心场景。与种子不同它可见(per-row 报错),但仍功能性挡住合法用途。

方案(用户开关,默认关 —— 不照抄种子一刀切)

导入意图二义:历史迁移该豁免,批量新建该走 FSM。所以加一个显式开关,默认走 FSM。引擎豁免管道已由 #3433 备好,本 PR 只接线。

改动
spec ExecutionContext.skipStateMachine(通用 server-set 旗标,seedReplay 的姊妹)+ ImportRequestSchema.treatAsHistorical(默认 false,用户面选项)
objectql 引擎对 seedReplay || skipStateMachine 都跳 state_machine(一个 shouldSkipStateMachine helper),覆盖种子重放 + 历史导入
rest import runner 仅当请求 opt-in treatAsHistorical 时往 writeCtx 塞 skipStateMachine;默认关(正常导入仍走 FSM,严格是默认)。undo 也带上(恢复旧快照会重写一个非法 transition 的旧态)
platform-objects sys_import_job.treat_as_historical 审计列(加性)

prepareImportRequest 的输出经 ...prepared spread 自动流入同步 + 异步 job worker 两条 runImport 路径,零额外接线。

语义范围

与种子豁免完全一致:只跳 state_machine 规则;字段 shape / format / cross_field / script 照跑。

测试(均已验红)

  • engine.test:skipStateMachine 上下文豁免 FSM(seedReplay 的姊妹用例)。
  • import-runner-historical:选项 → writeCtx.skipStateMachine 接线,门控(默认关)、automation 开关独立;临时注释接线→2/4 红,证明有区分力。
  • 四包全绿:spec 6857 / objectql 1069 / rest 339 / platform-objects 215;gen:docs 已同步 references(execution-context + export)。

端到端由引擎豁免 + import 接线两半单测覆盖;objectui 导入向导复选框是独立 follow-up。

🤖 Generated with Claude Code

…for historical-data migration (#3479)

Sibling of #3433 (seed exemption), one entry point over. #3165's `initialStates`
enforced the FSM entry point on every INSERT, so importing established historical
facts — already-`closed` tickets, `closed_won` deals, `completed` projects — was
rejected row-by-row with `invalid_initial_state`, blocking the core data-migration
path. Visible (per-row errors), unlike the silent seed case, but still a functional
block on a legitimate use.

- spec: `ExecutionContext.skipStateMachine` — general server-set flag (seedReplay's
  sibling) skipping the `state_machine` rule for a write; `ImportRequestSchema.
  treatAsHistorical` (default false) — the user-facing import option.
- objectql: engine skips the state machine for `seedReplay` OR `skipStateMachine`
  (one `shouldSkipStateMachine` helper) — covers seed replay and historical import.
- rest: the import runner sets `skipStateMachine` on the write context iff the
  request opts into `treatAsHistorical`; default off, so a normal import still walks
  the FSM. Import undo also carries it now (restoring a prior snapshot re-writes an
  earlier state that need not be a legal transition from the current one).
- platform-objects: `sys_import_job.treat_as_historical` audit column (additive).

Scope identical to the seed exemption: ONLY the `state_machine` rule is skipped;
field shape / format / cross_field / script all still run.

Regression tests (red-verified): engine.test — a `skipStateMachine` context bypasses
the FSM (sibling of the seedReplay case); import-runner-historical — the option maps
to `skipStateMachine` on the write context, gated (off by default), automation toggle
independent. The objectui import-wizard checkbox is a separate follow-up.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 25, 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 25, 2026 2:29am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 4 package(s): @objectstack/objectql, @objectstack/platform-objects, @objectstack/rest, @objectstack/spec.

108 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/rest, @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/rest, @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/rest, @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/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/cli.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/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 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/rest, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/objectql, @objectstack/platform-objects, @objectstack/rest, @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 packages/rest, @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/kernel/runtime-capabilities.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 @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/rest, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/rest, @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.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/platform-objects, @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.

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 size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

data import: mid-lifecycle rows rejected by state_machine.initialStates — historical-data migration blocked (#3433 sibling)

1 participant