Skip to content

feat(spec): deriveRecordFlowSurface — flow-aware record-surface derivation (#2604 Step 1)#2622

Merged
os-zhuang merged 3 commits into
mainfrom
claude/record-surface-design-ftuljs
Jul 5, 2026
Merged

feat(spec): deriveRecordFlowSurface — flow-aware record-surface derivation (#2604 Step 1)#2622
os-zhuang merged 3 commits into
mainfrom
claude/record-surface-design-ftuljs

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

概述

#2604Step 1(framework 侧),设计结论见 issue 评论(#2604 (comment)):create/edit/子表子记录一律 overlay、永不路由;派生的 'page' 映射为全屏 modal。本 PR 把这张映射表落成 spec 里的单源纯函数(ADR-0085 §5 "one shared derivation"),供 objectui 侧(Step 2,另开 PR)消费。

变更

  • packages/spec/src/data/record-surface.ts:新增 deriveRecordFlowSurface(def, flow, opts){ container: 'route'|'overlay', surface, size: 'auto'|'full' }
    • flow: 'view' → 与 字段多的对象:自适应呈现表面 + 语义 field span(auto/full)+ 表单布局防呆 lint(AI-authored,ADR-0085 对齐) #2578 已上线行为逐字一致(字段多 → route/page,少 → drawer overlay);
    • 任务流(create / edit / child-create / child-edit)→ 永远 overlay:派生 'page' ⇒ 全屏 modal(size:'full'),轻对象 ⇒ drawer;
    • child-*子对象的 def(overlay 按被编辑的记录定尺寸,返回目标恒为父详情);移动端任务流一律全屏 modal;
    • 渲染器只当默认用 —— 显式 navigation.mode/sizeFormView.type/modalSize、assigned Page 照旧优先。零新增可授权 key(ADR-0085 §2)。
  • 单测 +6(阈值边界 × 各 flow × 移动端 × 子对象独立性 × 裸输入容错),record-surface.test.ts 14/14;spec 全量 6690 通过
  • api-surface.json 再生成(+4 导出:RecordFlowRecordFlowContainerRecordFlowSurfacederiveRecordFlowSurface)。
  • minor changeset(additive,无 breaking)。

注:分支上保留了此前设计文档提交及其 revert(维护者已定设计入 issue 评论、不落仓库文档),净 diff 只有上述 4 个文件。

验证

  • pnpm vitest run src/data/record-surface.test.ts 14/14
  • pnpm test(spec)6690/6690
  • pnpm build + gen:api-surface 干净再生成

Refs #2604 · #2578 · ADR-0085 §2/§5

🤖 Generated with Claude Code

https://claude.ai/code/session_019zKcAtbtxuF9SXYgSzjk9v


Generated by Claude Code

claude added 3 commits July 5, 2026 02:46
…#2604)

Decides the three open questions from #2604 (follow-up to #2578):

- D1: create/edit are ALWAYS overlays, never routes — the derived 'page'
  surface maps to a full-screen modal (size 'full'); light objects keep a
  drawer. Deep-linkability belongs to state (detail route, shipped), not to
  transient tasks.
- D2: detail → edit reuses the same edit overlay over the detail route —
  one edit surface everywhere; in-place field editing deferred, not rejected.
- D3: subtable child create/edit = overlay over the parent detail, never a
  route; size derived from the CHILD object's own field count.

Specifies the return-flow contract (cancel invariant, save invariant —
edit never moves you, create lands on the record, child tasks never leave
the parent — dirty guard, full-screen-modal history integration), the
Step 1 spec helper deriveRecordFlowSurface as the one shared derivation
(ADR-0085 §5), the objectui wiring plan, and the browser-verification
matrix. Zero new authorable keys (ADR-0085 §2); docs-only, empty changeset.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019zKcAtbtxuF9SXYgSzjk9v
…ation (#2604)

Step 1 of #2604 (design decided in the issue thread; follow-up to #2578):

- deriveRecordFlowSurface(def, flow, opts): 'view' keeps the shipped #2578
  behavior verbatim (heavy → route/page, light → drawer overlay); task flows
  (create/edit/child-create/child-edit) are ALWAYS overlays — never routes —
  with derived 'page' mapped to a full-screen modal (size 'full'). child-*
  flows take the CHILD def; mobile task flows are full-screen modals.
- One shared derivation (ADR-0085 §5); renderers use it as the DEFAULT only —
  explicit navigation.mode/size, FormView.type/modalSize, assigned page win.
  No new authorable key (ADR-0085 §2).
- 6 new unit tests (threshold × flow × mobile × child independence × bare
  input); spec suite 6690 green; api-surface regenerated (+4 exports);
  minor changeset.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019zKcAtbtxuF9SXYgSzjk9v
@vercel

vercel Bot commented Jul 5, 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 5, 2026 4:56am

Request Review

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

github-actions Bot commented Jul 5, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

94 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/cloud-artifact-api.mdx (via packages/spec)
  • content/docs/deployment/troubleshooting.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/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/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via packages/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/profiles.mdx (via @objectstack/spec)
  • content/docs/permissions/roles.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/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/runtime-capabilities.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 packages/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/v9.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/setup-app.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 5, 2026 06:22
@os-zhuang os-zhuang merged commit 0426d27 into main Jul 5, 2026
17 checks passed
@os-zhuang os-zhuang deleted the claude/record-surface-design-ftuljs branch July 5, 2026 06:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants