Skip to content

Commit 855e9ad

Browse files
hotlongclaude
andcommitted
docs(design): AI-first authoring as the builder's core constraint
Add §1 north star: every layout decision is judged by whether AI can generate the artifact in one shot, whether the design prevents AI mistakes, and whether a human can confirm it in one pass. Ties these to the concrete mechanisms already in the shell (same-renderer, declarative/constrained surfaces, os validate gates, draft diff per ADR-0033, no-modal). Also record the rationale for keeping the Records/Fields tab names over Grid/Form. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 34883f0 commit 855e9ad

1 file changed

Lines changed: 45 additions & 7 deletions

File tree

docs/design/builder-ui.md

Lines changed: 45 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,36 @@ composes them into one coherent builder, optimized for operation experience.
1212

1313
---
1414

15-
## 1. The shell (every pillar shares it)
15+
## 1. Core constraint — AI-first, human-confirmable authoring
16+
17+
Every layout and interaction decision in the builder is judged against three
18+
requirements. They are the north star: a design that fails any of them is wrong,
19+
however convenient it looks. Each pillar's design (below) is checked against them.
20+
21+
1. **AI generates it in one shot.** The builder must let the agent produce a whole,
22+
correct artifact — an object with its fields, validations, and layout — in a
23+
single pass. This works because the agent edits the *same flat, explicit metadata*
24+
a human does (same-renderer, §3.6) and authors within *constrained, declarative*
25+
surfaces (typed fields, enum options, the condition builder — not free-form code).
26+
The *shape of the metadata*, not a click-through wizard, is what the AI targets.
27+
28+
2. **The design prevents AI mistakes.** Constrain the space so an invalid result is
29+
hard to express: declarative over code (a condition builder, not hand-written CEL,
30+
§3 Validation), typed and enumerated inputs, and the pre-publish validation gates
31+
(`os validate` / `os build`). Nothing the AI writes goes live implicitly — it lands
32+
as a **draft** (ADR-0033), never auto-published.
33+
34+
3. **A human confirms it in one pass.** A reviewer approves or rejects with one look:
35+
AI changes arrive as a **draft diff** (ADR-0033), and the artifact renders on one
36+
canvas (the grid + inspector) with no modals hiding state (§3.7) and a non-blocking
37+
inspector, so the whole thing stays visible while it is reviewed.
38+
39+
These three are *why* the shell is what it is — same-renderer, declarative surfaces,
40+
no-modal, draft/publish all fall out of them.
41+
42+
---
43+
44+
## 2. The shell (every pillar shares it)
1645

1746
```
1847
┌───────────────────────────────────────────────────────────────────┐
@@ -41,7 +70,7 @@ composes them into one coherent builder, optimized for operation experience.
4170
visible); slides in on select, closable. This is the universal "inspector"
4271
(Figma / Retool pattern).
4372

44-
## 2. Design principles (for best operation experience)
73+
## 3. Design principles (for best operation experience)
4574

4675
1. **Consistent three zones across all four pillars** — rail / main / inspector.
4776
Muscle memory: config is always on the right, entities always on the left.
@@ -60,15 +89,15 @@ composes them into one coherent builder, optimized for operation experience.
6089
metadata is stored once; there are two navigational entries, no duplication.
6190
6. **Same renderer.** The builder manipulates the same live artifact the end user
6291
sees (edit a field on the real grid; set a permission on the real matrix). This
63-
is also what keeps AI authoring safe — the agent edits the same flat, explicit
64-
metadata a human does.
92+
is also what keeps AI authoring safe (§1) — the agent edits the same flat,
93+
explicit metadata a human does.
6594
7. **No modals.** Config surfaces in the inspector or as a focused sub-view with a
6695
breadcrumb; the work surface never fully disappears. Draft/publish is always
6796
visible.
6897

6998
---
7099

71-
## 3. Data pillar
100+
## 4. Data pillar
72101

73102
Data is the **object-model workbench**: define objects, their fields, relationships,
74103
and validations, and work with records. Data owns the *data layer and the field
@@ -98,7 +127,8 @@ Per selected object, a tab bar of its facets — grouped:
98127
- **⋯ More**: `Views` · `Forms` (Interface) · `Permissions` (Access) · `Settings` · `Indexes`
99128

100129
`Records` is the default. Cross-pillar tabs carry a pillar tag and open **in-context,
101-
scoped to this object** (their pillar is the cross-object lens — two doors, §2.5).
130+
scoped to this object** (their pillar is the cross-object lens — the two-doors
131+
principle, §3.5).
102132

103133
Note: `Actions` / `Hooks` / `Validations` are the three authoring surfaces for logic
104134
on an object, routed by intent per [ADR-0077](../adr/0077-authoring-surface-boundary-hook-flow-validation.md):
@@ -121,6 +151,12 @@ and both configure a selected field through the *same* right-hand **field editor
121151
The choice between them is a working preference: reach for `Records` when you want to
122152
see data while shaping fields, `Fields` when you want to arrange and group them.
123153

154+
**Why keep the names `Records` / `Fields`** (rather than `Grid` / `Form`): each name
155+
states the tab's *distinguishing* trait — Records is the one that shows **data**,
156+
Fields is the **pure field/layout** designer. They are also the conventional terms
157+
(Salesforce, Airtable). Style-based names would collide with Interface's existing
158+
`Views` (saved grid/kanban) and `Forms` (end-user form surfaces).
159+
124160
### Main zone (content of the active tab)
125161
| Tab | Main-zone content |
126162
|---|---|
@@ -152,6 +188,8 @@ union of six declarative rule types (`packages/spec/src/data/validation.zod.ts`)
152188
list; each rule edits in the inspector via a **condition builder** (field /
153189
operator / value, and/or) with a raw-expression escape hatch — never hand-written
154190
CEL as the primary path. Validation stays **declarative** (not a hook); Data-owned.
191+
The condition builder is also what makes validation AI-generatable and
192+
human-confirmable in one pass (§1).
155193

156194
### v1 scope
157195
- **Ship**: owned objects · `Records` grid (data + add/configure columns) · `Fields`
@@ -164,7 +202,7 @@ union of six declarative rule types (`packages/spec/src/data/validation.zod.ts`)
164202

165203
---
166204

167-
## 4. Other pillars (to design — same shell)
205+
## 5. Other pillars (to design — same shell)
168206

169207
- **Automation** — left: automations grouped by trigger (record-change / scheduled /
170208
API / manual action); main: the flow **canvas**; inspector: the selected node's

0 commit comments

Comments
 (0)