Skip to content

Commit 8f35ffc

Browse files
docs(skills): object-level composite/repeater are untyped JSON — a typed list is a child object (#25741)
Refs #25681 Clause-②: no Metadata-protocol: none Ruling-ref: 6386744473 The governed half of ruling 6386744473 (batch #12 item 4, letter b): object-level `composite` / `repeater` are untyped JSON, and a typed list is a child object. The code and docs half is the companion PR on `claude/issue-25681-repeater-untyped-json`. It is split off because `skills/**` is a Tier H governed surface and never rides a code PR. ## What changed - `skills/objectstack-data/rules/field-types.md`, the Embedded table. The `composite` row said "Single embedded sub-object with declared sub-fields". An object field has no member that declares sub-fields: `fields`, `subFields` and `columns` are refused on the field (true on `main` today, measured with `FieldSchema.safeParse`). Both rows now say the type is untyped JSON. The `repeater` row names the route: a child object with a `master_detail` field, and `inlineEdit: 'grid'` to edit it inline. - `.changeset/25681-skills-repeater-untyped.md`: `@objectstack/skills` patch. Its `dist` ships the skill files, the same as the precedent `061cc94d`. ## Size readings | reading | before | after | |---|---|---| | `skills/objectstack-data/rules/field-types.md` | 322 lines | 322 lines | | whole catalog (sum of every `skills/*/SKILL.md`) | 4389 lines | 4389 lines | Two cells rewritten, zero lines added: no expansion. ## Verification (head `14a58a3a`) `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran …` → `✓ 44 derived famil(ies) accounted for — 39 run, 5 NOT-MEASURED (5 DERIVED from a recorded exit 3)`. All 39 that ran exited 0, `check-skills-token-ratchet.mjs` and its `--self-test` among them. The 5 NOT MEASURED are prerequisite refusals in an unbuilt worktree (`check:doc-formula-expressions`, `check:dts-closure`, `check:dual-build-cjs-loads`, `check:lean-entry-closure`, `check:sourcemap-no-sources-content`); CI builds and runs them. ## 维护者速读(草稿) - **改了什么**:对外发布的技能包里,`objectstack-data` 的字段类型表有两行改了措辞:`composite` / `repeater` 是无类型 JSON,对象字段不能声明子字段;要带列的列表请建子对象(`master_detail`,`inlineEdit: 'grid'` 在父表单内联编辑)。另附一条 `@objectstack/skills` patch changeset。 - **为什么改**:旧文写着「declared sub-fields」,可协议里根本没有声明子字段的成员,AI 照着技能包写就会写出被拒收的字段。这是裁决 6386744473(25681 b)的技能包一半;代码与文档一半在配套 PR。 - **风险与代价(含回滚)**:纯文档,行数不变(322 → 322;技能包合计 4389 → 4389),不改任何键、值或行为。回滚就是 revert 这一个提交。 - **席位意见**: - **你要做的**:`skills/**` 属 Tier H。复核通过、CI 全绿后请您批准合并。 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01T2U7eGg8aRTpJ8kKXxDiog --- _Generated by [Claude Code](https://claude.ai/code/session_01T2U7eGg8aRTpJ8kKXxDiog)_ --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 2e3e276 commit 8f35ffc

2 files changed

Lines changed: 14 additions & 2 deletions

File tree

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
'@objectstack/skills': patch
3+
---
4+
5+
docs(skills): object-level `composite` / `repeater` are untyped JSON — a typed list is a child object
6+
7+
Clause-②: no
8+
Metadata-protocol: none
9+
10+
The `objectstack-data` field-types table said a `composite` carries "declared sub-fields". An object field has no member that declares them: `fields`, `subFields` and `columns` are refused on the field. The two rows now say the types are untyped JSON and that a list needing typed columns is a child object with a `master_detail` field (`inlineEdit: 'grid'` edits it inline on the parent's form).
11+
12+
What to do: nothing. No key, value or behaviour changes.

‎skills/objectstack-data/rules/field-types.md‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -113,8 +113,8 @@ Stored as JSON on the parent row — no separate table / FK:
113113

114114
| Type | When to Use |
115115
|:-----|:------------|
116-
| `composite` | Single embedded sub-object with declared sub-fields |
117-
| `repeater` | Repeating embedded sub-object **array** |
116+
| `composite` | Single embedded JSON object, **untyped** — a field declares no sub-fields (`fields` / `subFields` are refused) |
117+
| `repeater` | Embedded JSON **array**, **untyped** — no sub-fields or `columns`; a typed list is a child object (`master_detail`, `inlineEdit: 'grid'`) |
118118
| `record` | Name-keyed **map** of embedded sub-objects (insertion order = display order; ADR-0007) |
119119

120120
## Calculated

0 commit comments

Comments
 (0)