baldart 4.83.0 → 4.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -5,6 +5,40 @@ All notable changes to BALDART will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [4.85.0] - 2026-07-01
9
+
10
+ **Root-file primitives gain universal delegation + quality rules (primitive `1.1.0`).** The v4.83.0 skeletons pointed to `.claude/agents/REGISTRY.md` for agent routing but never stated the single highest-frequency rule in the always-loaded file: *which agent writes what*. The `AGENTS.md` primitive (the cross-tool SSOT Codex also reads) now carries a **MUST**: plan-and-delegate, never write substantial code inline — **code / logic / tests → `coder`**, **UI → `ui-expert`** (dual-tool: Claude Task `subagent_type` / Codex custom agent by name; every other agent routes via `REGISTRY.md`). The `CLAUDE.md` stub's Plan Mode names both agents to match (was `coder` only).
11
+
12
+ Alongside it, the **universal, stack-agnostic** subset of rules a mature project accumulates — previously discoverable only after a project authored them by hand — is promoted into the skeleton: a **security-hygiene MUST** (no hardcoded secrets, no exposed stack traces, no PII in logs, validate/parse external inputs), a **Quality bar (SHOULD)** (bound/paginate list queries — no unbounded/N+1 — + Core Web Vitals for web UIs + baseline accessibility), and explicit **worktree isolation** in the Git Workflow (new branch → `/nw`; never `git switch`/`checkout -b`/`branch` on the shared main checkout). **Deliberately NOT promoted** (they stay project overlay, and would trip the contamination scanner): exact KPI numbers, database/ORM specifics, CSS-framework choices, and project-specific git rituals.
13
+
14
+ **MINOR** — enriches the shipped skeleton's protocol content; no new `baldart.config.yml` key, no layout/CLI change. Consumers pick it up on the next `npx baldart update` (the writer regenerates `AGENTS.md`/`CLAUDE.md`, byte-stable on everything else). `primitive_version` 1.0.0 → 1.1.0.
15
+
16
+ ### Changed
17
+
18
+ - **`framework/templates/primitives/AGENTS.md`** — added the implementation-delegation MUST (`coder`/`ui-expert`), the security-hygiene MUST, a `## Quality bar (SHOULD)` section (performance + accessibility), and worktree isolation in Git Workflow. `primitive_version` → 1.1.0.
19
+ - **`framework/templates/primitives/CLAUDE.md`** — Plan Mode delegation now names `coder` (code) + `ui-expert` (UI) + `doc-reviewer` (docs). `primitive_version` → 1.1.0.
20
+ - **`framework/templates/primitives/AGENTS.CHANGELOG.md` + `CLAUDE.CHANGELOG.md`** — `1.1.0` entries.
21
+
22
+ ## [4.84.0] - 2026-07-01
23
+
24
+ **`/ds-handoff` decision & preference pass — anticipa le domande di Claude Design invece di rimandargliele.** Il prompt field-level di `ds-handoff` copriva un solo asse (correttezza dei *campi* via field-extraction + coverage gate) e lasciava scoperto il **secondo asse — le decisioni di design aperte + le preferenze di consegna** — che è esattamente ciò su cui Claude Design rimanda le domande all'utente (nel caso reale "Hub fornitore", 6 domande su 6 erano su questo asse, zero sui campi). Una era **auto-inflitta** (il PRD diceva *"da proporre"* e la skill l'ha inoltrata testualmente), un'altra su un fatto **già in mano alla skill** (enum categoria con `color`) mai tradotto in istruzione.
25
+
26
+ Il fix è **combinato**: (1) un nuovo **Step 5.5 — Decision & preference pass** (`references/decision-pass.md`) che risolve PRIMA di emettere le scelte aperte / formato consegna / scope stati / canvas / varianti — **triggered, non always-on** (stessa filosofia del BLOCK del coverage gate: parte solo se c'è un irrisolto, UNA `AskUserQuestion` consolidata, no-op quando nulla è aperto; per le decisioni aperte offre "decido io" vs "fai proporre N opzioni a Claude Design"); (2) **arricchimento** che pre-compila i fatti rilevabili — nuova **§ 0 "Direttive di consegna & decisioni"** nel template + regola **enum presentazionale** in `field-extraction.md` (metadata `color`/`icon`/`badge`/`label` → render hint automatico, non una domanda). Attivo standalone **e** delegato da `/prd` (Branch B ora inoltra le preferenze già risolte in Discovery → la skill riconcilia e chiede solo il residuo). **DEGRADE** su Codex/no-TTY: bake dei default DICHIARATI in § 0, mai abort.
27
+
28
+ Resta un *thin orchestrator*, **nessun dual-SSOT** (delivery/placement/varianti non sono in `design-system-protocol.md`). **MINOR** — capability additiva su una skill esistente. **Nessuna nuova chiave `baldart.config.yml`** (rides on `features.has_design_system`) → la schema-change propagation rule NON si applica. Skill versionata `1.0.0 → 1.1.0` (bump `version` + entry nel `CHANGELOG.md` per-skill, stesso edit).
29
+
30
+ ### Added
31
+
32
+ - **`framework/.claude/skills/ds-handoff/references/decision-pass.md`** — il pre-emit Step 5.5: trigger inventory, `AskUserQuestion` consolidata, DEGRADE bake-defaults, riconciliazione in modalità delegata, false-positive guards.
33
+
34
+ ### Changed
35
+
36
+ - **`framework/.claude/skills/ds-handoff/SKILL.md`** — nuovo Step 5.5 nel workflow, Step 6 popola anche § 0, Invocation + Inline fallbacks aggiornati; `version: 1.0.0 → 1.1.0`.
37
+ - **`framework/.claude/skills/ds-handoff/assets/claude-design-handoff-prompt.template.md`** — nuova § 0 "Direttive di consegna & decisioni"; § 7 rimanda a § 0 per il formato export.
38
+ - **`framework/.claude/skills/ds-handoff/references/field-extraction.md`** — regola enum presentazionale (render hint automatico) nel mapping + sezione dedicata.
39
+ - **`framework/.claude/skills/prd/references/ui-design-phase.md`** — Branch B inoltra a `/ds-handoff` le preferenze di consegna/decisione già emerse in Discovery.
40
+ - **`framework/.claude/skills/ds-handoff/CHANGELOG.md`** — entry `1.1.0`.
41
+
8
42
  ## [4.83.0] - 2026-07-01
9
43
 
10
44
  **Versioned root-file primitives — BALDART now generates `AGENTS.md` + `CLAUDE.md` from SOTA skeletons.** Previously `AGENTS.md` was a bulk symlink into the framework payload (not customizable without losing auto-update) and `CLAUDE.md` was not shipped at all. Now both are **generated real files**, produced on every install/update from **versioned skeletons** under `framework/templates/primitives/`.
package/VERSION CHANGED
@@ -1 +1 @@
1
- 4.83.0
1
+ 4.85.0
@@ -2,6 +2,26 @@
2
2
 
3
3
  Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
4
4
 
5
+ ## 1.1.0 — 2026-07-01
6
+
7
+ - **Decision & preference pass (Step 5.5)** — nuovo `references/decision-pass.md`.
8
+ Chiude l'asse *decisioni* (accanto all'asse *campi* del coverage gate): risolve
9
+ PRIMA di emettere le scelte di design aperte + preferenze di consegna che Claude
10
+ Design altrimenti rimanda all'utente come domande (token `da proporre`, formato
11
+ consegna, scope stati, canvas/placement, appetito varianti). Triggered-not-always-on,
12
+ UNA `AskUserQuestion` consolidata, no-op quando nulla è aperto; per le decisioni
13
+ aperte offre "decido io" vs "fai proporre N opzioni a Claude Design".
14
+ - **Template § 0 "Direttive di consegna & decisioni"** — nuova sezione che porta le
15
+ risposte del pass (placement, formato, stati da consegnare, decisioni aperte,
16
+ varianti) come direttive esplicite; § 7 ora rimanda a § 0 per il formato export.
17
+ - **Enum presentazionale** — `references/field-extraction.md` rileva metadata di
18
+ display (`color`/`icon`/`badge`/`label`) sulle opzioni enum ed emette un render
19
+ hint automatico (es. Categoria con colore → pallino colore per opzione), evitando
20
+ la domanda "come lo rendo?". Non è un `da definire` né una domanda.
21
+ - **DEGRADE** (Codex / no-TTY): il pass fa bake dei default e li DICHIARA in § 0,
22
+ mai abort. **Delegated mode**: riconcilia con le preferenze già risolte da `/prd`
23
+ (Branch B in `ui-design-phase.md` ora le inoltra), chiede solo il residuo.
24
+
5
25
  ## 1.0.0 — 2026-07-01
6
26
 
7
27
  - Baseline: versioning per-skill introdotto al framework v4.82.0.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: ds-handoff
3
3
  effort: medium
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  description: >
6
6
  Produce a FIELD-LEVEL, 1:1, interaction-complete handoff brief for Claude Design
7
7
  — every screen's real fields (label, control type, required, validation, default,
@@ -67,7 +67,9 @@ user input. Level→behavior mapping, parsing contract, and precedence caveats:
67
67
  `/ds-handoff <screens-or-feature>` (standalone) · `/ds-handoff` (ask). When called
68
68
  by `/prd` Step 3.0 Branch B, the caller passes the resolved context (state-file
69
69
  path + feature title/objective/user_flow/personas/screens_in_scope/mockup_analysis
70
- + brand + DS flag) skip the standalone screen-resolution prompt (Step 1's ask).
70
+ + brand + DS flag + any delivery/decision preferences already resolved in Discovery)
71
+ — skip the standalone screen-resolution prompt (Step 1's ask), and reconcile the
72
+ Step 5.5 decision pass against those preferences (ask only the residual).
71
73
 
72
74
  ## Pre-flight
73
75
 
@@ -120,10 +122,23 @@ Each step is a delegation. Read the cited SSOT; do not paraphrase it.
120
122
  user-confirmation (present best-effort, ask the user to fill `da definire`);
121
123
  never hard-abort.
122
124
 
125
+ This gate closes the **field** axis. The **decision** axis is Step 5.5.
126
+
127
+ 5.5. **Decision & preference pass.** DELEGATE —
128
+ [references/decision-pass.md](references/decision-pass.md). Resolve the open
129
+ design choices + delivery/placement preferences that Claude Design would
130
+ otherwise bounce back as questions (the `da proporre` tokens, delivery format,
131
+ state scope, canvas, variation appetite). **Triggered, not always-on** — fires
132
+ only when an item is unresolved; ONE consolidated `AskUserQuestion`; a no-op when
133
+ nothing is open. **DEGRADE** (Codex / no-TTY): bake defaults and DECLARE them in
134
+ § 0, never abort. **Delegated mode:** skip whatever `/prd` already resolved. The
135
+ answers populate the template's § 0.
136
+
123
137
  6. **Fill the mandatory template.** Populate
124
138
  [assets/claude-design-handoff-prompt.template.md](assets/claude-design-handoff-prompt.template.md)
125
- with the reconciled per-screen specs + the top-level sections (brand / design
126
- system / stack / cosa restituirmi). § 5's numeric constraints are the
139
+ with the § 0 delivery/decision directives (from Step 5.5), the reconciled
140
+ per-screen specs + the top-level sections (brand / design system / stack / cosa
141
+ restituirmi). § 5's numeric constraints are the
127
142
  `{{tokens.*}}` placeholders that **cite** `design-system-protocol.md` § Reference
128
143
  Tables — copy values verbatim from the protocol, never invent numbers. Strip
129
144
  empty conditionals.
@@ -152,8 +167,9 @@ Each step is a delegation. Read the cited SSOT; do not paraphrase it.
152
167
 
153
168
  - **No `Workflow` tool needed** — this skill is prose-orchestrated.
154
169
  - **Codex (no subagents):** Step 3's `codebase-architect` degrades to inline Grep
155
- (per `references/field-extraction.md`); the gate degrades BLOCK → user-confirmation
156
- (Step 5). Runs end-to-end.
170
+ (per `references/field-extraction.md`); the Step 5 gate degrades BLOCK →
171
+ user-confirmation; the Step 5.5 decision pass degrades to **bake-defaults**
172
+ declared in § 0 (per `references/decision-pass.md`). Runs end-to-end.
157
173
  - **No LSP / no code-graph:** silent fallback down the retrieval order. Surface a
158
174
  broken layer via `baldart doctor`, never abort here.
159
175
  - **No formal schema in the stack:** the DEGRADE branch — best-effort inventory +
@@ -22,6 +22,23 @@
22
22
 
23
23
  # Feature: {{feature_title}}
24
24
 
25
+ ## 0. Direttive di consegna & decisioni
26
+
27
+ > Queste sono decisioni **già prese** (o esplicitamente delegate a te). Non
28
+ > richiedermele: seguile, oppure — dove indicato "proponi N opzioni" — proponi le
29
+ > alternative con i loro trade-off invece di sceglierne una a caso.
30
+
31
+ - **Dove collocarlo**: {{delivery.target_canvas}} <!-- es. "Nuovo canvas «Hub fornitore desktop/tablet», NON dentro il master-detail Fornitori esistente" -->
32
+ - **Formato di consegna**: {{delivery.output_delivery}} <!-- "1 artboard per stato (PNG ≥2x)" | "prototipo interattivo navigabile" | "entrambi" -->
33
+ - **Stati da consegnare**: {{delivery.states_to_deliver}} <!-- lista esplicita — consegna ESATTAMENTE questi, non chiedermi di deselezionare -->
34
+ {{#if delivery.open_decisions}}
35
+ - **Decisioni di design aperte**:
36
+ {{#each delivery.open_decisions}}
37
+ - **{{this.topic}}**: {{this.directive}} <!-- valore deciso, OPPURE "proponi {{this.n}} opzioni con trade-off" -->
38
+ {{/each}}
39
+ {{/if}}
40
+ - **Varianti**: {{delivery.variations}} <!-- "nessuna oltre le decisioni sopra" | assi richiesti (es. layout griglia, densità gruppi, posizione action bar) -->
41
+
25
42
  ## 1. Obiettivo
26
43
 
27
44
  {{feature_objective_one_sentence}}
@@ -172,9 +189,13 @@
172
189
 
173
190
  ## 7. Cosa restituirmi
174
191
 
175
- Per ogni schermata elencata in § 3:
192
+ Per ogni schermata elencata in § 3, nel **formato di consegna deciso in § 0**
193
+ ({{delivery.output_delivery}}):
176
194
 
177
- 1. **PNG export** ad alta risoluzione (≥ 2x) di OGNI stato richiesto (es. `dettaglio-fornitore__loading.png`, `dettaglio-fornitore__populated.png`).
195
+ 1. **Export** ad alta risoluzione (≥ 2x) di OGNI stato in **§ 0 → Stati da
196
+ consegnare** (es. `dettaglio-fornitore__loading.png`,
197
+ `dettaglio-fornitore__populated.png`). Se § 0 chiede un prototipo interattivo,
198
+ consegna gli stati come schermi navigabili invece che come PNG separati.
178
199
  2. {{output_format_preference_block}} <!-- "Codice HTML/CSS in un file unico" | "Codice React (.tsx) con import Tailwind" | "Link Figma alla frame" -->
179
200
  3. **Mappa di tracciabilità campo→funzione** — per OGNI campo della field inventory,
180
201
  conferma che sia presente e col controllo/mode indicati. Se un campo di § 3 manca
@@ -0,0 +1,94 @@
1
+ # Decision & preference pass — resolve the open choices BEFORE emitting
2
+
3
+ `ds-handoff` Step 5.5. Runs **after** the coverage gate (Step 5, which verifies the
4
+ *fields*) and **before** filling the template (Step 6). Where the coverage gate
5
+ closes the *data-correctness* axis, this pass closes the **decision axis**: the open
6
+ design choices, delivery preferences and workspace directives that — if left
7
+ implicit — Claude Design bounces back to the user as questions.
8
+
9
+ The failure this prevents: a prompt that says *"pattern editing per-sede, da
10
+ proporre"* forces Claude Design to STOP and ask which pattern; a prompt that lists
11
+ states but never says "deliver exactly these" invites a "deselect what you don't
12
+ need" round-trip; an enum with a colour but no render directive gets a "how do I
13
+ show the colour?" question. Every one of those is a decision BALDART can make (or
14
+ frame) up front.
15
+
16
+ **Same discipline as the coverage gate:** decision-**triggered**, not always-on —
17
+ it fires ONLY when there is an unresolved item; ONE consolidated `AskUserQuestion`;
18
+ never assume a default silently. If nothing is unresolved, this step is a **no-op**
19
+ and you proceed straight to Step 6.
20
+
21
+ ## Trigger inventory — what makes the pass necessary
22
+
23
+ Scan the reconciled per-screen specs (Step 4 output: regions, actions, states,
24
+ list behaviour) plus the delegated/standalone context. An item is "unresolved" when:
25
+
26
+ | Item | Unresolved when… | Detection |
27
+ |---|---|---|
28
+ | **Open design decision** | an affordance/layout/pattern is explicitly left open | literal token `da proporre` / `da decidere` / `(… inline/pannello/rotta, da proporre)` / `TBD` / `?` in a region/action/state cell |
29
+ | **Delivery format** | not stated in context | no `output_delivery` in the delegated context / standalone args |
30
+ | **State scope** | states enumerated but not confirmed as the deliverable set | states present but no explicit "deliver these" directive |
31
+ | **Placement / canvas** | the Claude Design workspace target is unknown | no `target_canvas` in context |
32
+ | **Variation appetite** | the user's want for alternatives beyond the open decisions is unknown | not stated in context |
33
+
34
+ If EVERY row is already resolved (all decided in the source / passed by `/prd`),
35
+ **do not ask** — skip to Step 6.
36
+
37
+ ## The consolidated AskUserQuestion (interactive, human present)
38
+
39
+ Raise **exactly ONE** `AskUserQuestion` covering only the unresolved rows. Suggested
40
+ questions (drop any that is already resolved; `multiSelect` where noted):
41
+
42
+ 1. **Per each open design decision** — offer two shapes of resolution:
43
+ - *"Decido io"* → the user picks the concrete option (list the plausible ones:
44
+ e.g. inline / side-panel / dedicated route). The chosen value goes into §0 as a
45
+ firm directive.
46
+ - *"Fai proporre a Claude Design"* → frame it in the prompt as *"proponi N opzioni
47
+ per X con trade-off"*. This is legitimate — Claude Design is a design tool and
48
+ proposing is its job; the point is to make the ASK **intentional** in the prompt
49
+ instead of an accidental blocker.
50
+ 2. **Formato di consegna** — `artboard-per-stato (PNG ≥2x)` (default) | `prototipo
51
+ interattivo navigabile` | both.
52
+ 3. **Stati da consegnare** (`multiSelect`) — pre-checked with the full detected list;
53
+ the user unchecks any out of scope. The confirmed set becomes `states_to_deliver`.
54
+ 4. **Placement / canvas** — `nuovo canvas dedicato «<feature>»` (default) | `dentro
55
+ un canvas esistente` (ask which).
56
+ 5. **Varianti oltre le decisioni aperte** — `nessuna` (default) | pick axes (grid
57
+ layout, densità gruppi, posizione action bar, …).
58
+
59
+ Only after the user answers do you populate §0 and proceed to Step 6. Consistent with
60
+ always-ask-never-assume and "no silent deferral".
61
+
62
+ ## DEGRADE (graceful — Codex / no-TTY / unattended)
63
+
64
+ When no interactive prompt is possible (Codex without subagents, no-TTY, an
65
+ autonomous run), do **not** hard-abort and do **not** ask. Instead **bake the
66
+ defaults** and **declare them explicitly** in §0 so the choice is visible, not
67
+ silent:
68
+
69
+ - Open decisions → framed as *"proponi 2 opzioni per X"* (let CD propose, since we
70
+ can't ask the user).
71
+ - Delivery → `artboard-per-stato (PNG ≥2x)`.
72
+ - States → deliver the full detected list.
73
+ - Placement → `nuovo canvas dedicato`.
74
+ - Variations → `nessuna`.
75
+
76
+ The prompt still ships, with an honest §0 the user can review — never an abort.
77
+
78
+ ## Delegated-mode reconciliation (called from /prd)
79
+
80
+ When invoked from `/prd` Step 3.0 Branch B, the caller may already have resolved some
81
+ of these during Discovery (a delivery preference, a placement, an explicit design
82
+ decision). The passed context is authoritative: **skip every already-resolved row**
83
+ and ask only the residual. Never re-ask what `/prd` already knows. If the context
84
+ resolves everything, the pass is a no-op even in delegated mode.
85
+
86
+ ## False-positive guards (do NOT treat as an open decision)
87
+
88
+ - **Descriptive prose that isn't a bivio** — a region note like "header con nome e
89
+ stato" is a spec, not a choice. Only a literal open-choice token (see the trigger
90
+ table) counts.
91
+ - **Fields** — those are the coverage gate's job (Step 5), not this pass. A `da
92
+ definire` cell is a *data* gap, not a *decision*; do not surface it here.
93
+ - **Already-decided affordances** — an action with a concrete effect/destination is
94
+ resolved; don't ask about it.
@@ -44,7 +44,7 @@ Anything you cannot ground in code is the **literal `da definire`** — never a
44
44
  | **Required** | `sì` unless `.optional()` / `.nullish()` / `?` / `.partial()`. | `da definire` |
45
45
  | **Validazione/Vincoli** | `.min()`/`.max()`/`.length()`/`.regex()`/`.email()`/`.url()`/`.int()`/`.positive()`/refinements. | `—` if none |
46
46
  | **Default** | `.default(x)` / a form `defaultValues` entry. | `—` if none |
47
- | **Opzioni / sorgente enum** | `z.enum([...])` / `z.nativeEnum` literals verbatim; a `z.string()` whose options come from a runtime query → `"query runtime — da definire"`. | `—` / `da definire` |
47
+ | **Opzioni / sorgente enum** | `z.enum([...])` / `z.nativeEnum` literals verbatim; a `z.string()` whose options come from a runtime query → `"query runtime — da definire"`. When the option source carries **presentational metadata**, add the render hint (see below). | `—` / `da definire` |
48
48
  | **Helper text** | JSDoc on the field; the i18n `context` for the key; an existing form description. | `da definire` |
49
49
  | **Mode** | `editable` by default; `readonly` for server-set / computed fields (see below). | `editable` |
50
50
  | **Card/gruppo** | From `mockup_analysis.screens[].layout` when present, else the reconciliation decision (Step 4). | `da definire` |
@@ -57,6 +57,7 @@ component binding, a form control already in code) over the heuristic when prese
57
57
  | Schema / type shape | Control |
58
58
  |---|---|
59
59
  | `z.enum([...])` / `z.nativeEnum` / union of string literals | `select` (or `radio` for ≤ 3 options / `segmented` per project convention) |
60
+ | enum whose option source carries **presentational metadata** (`color` / `icon` / `badge` / `label`) — a lookup table, a `const` map, a DB category with a colour | `select` **+ a render hint** (see "Presentational enums" below) |
60
61
  | `z.boolean()` | `toggle` (or `checkbox`) |
61
62
  | `z.string()` short (no/small `.max`) | `text input` |
62
63
  | `z.string()` long (`.max` ≥ ~200, or named `notes`/`description`/`body`) | `textarea` |
@@ -69,6 +70,25 @@ component binding, a form control already in code) over the heuristic when prese
69
70
  | `z.array(z.string())` from a known set | `multi-select` |
70
71
  | `z.object(...)` nested | a sub-group / sub-card |
71
72
 
73
+ ## Presentational enums (pre-empt the "how do I render it?" question)
74
+
75
+ When an enum's options are not bare strings but carry **display metadata** — a
76
+ category with a `color`, a status with an `icon`, an option with a human `label`
77
+ distinct from its value — capturing the values alone leaves Claude Design to guess
78
+ *how* to render them, which becomes a round-trip question. Instead, **detect the
79
+ extra fields and emit a render hint** in the Opzioni cell, so the directive is
80
+ explicit:
81
+
82
+ - Colour per option → `"<EnumName> (name + color) → pallino/badge colore per opzione; colore = .color"`.
83
+ - Icon per option → `"<EnumName> (name + icon) → icona per opzione; icona = .icon"`.
84
+ - Human label ≠ value → give both: `"value → «Label»"` per option.
85
+
86
+ Ground the metadata the same way as the enum itself (the lookup table / `const` map
87
+ / schema). If the option list is a runtime query, still note the presentational field
88
+ if the row shape exposes it (`"query runtime — ogni riga ha { name, color }"`). This
89
+ is a documented hint the extraction step fills automatically — it is **not** a `da
90
+ definire` and it is **not** a user question.
91
+
72
92
  ## Readonly detection
73
93
 
74
94
  Mark a field **readonly** (static text, no editable control) when it is not
@@ -46,10 +46,15 @@ delegate-or-else-inline contract as `/prd` → `/ds-new`.)
46
46
  per-screen routing table");
47
47
  - `mockup_analysis` from `## UI Design` if present (the skill reads its
48
48
  `layout / component_props / states / responsive` as input);
49
- - the `features.has_design_system` flag (the skill omits § 5 when `false`).
50
-
51
- `/ds-handoff` runs field extraction + the coverage gate + the mandatory template
52
- and returns the **rendered prompt** plus the **`field-inventory.md` path**.
49
+ - the `features.has_design_system` flag (the skill omits § 5 when `false`);
50
+ - **any delivery/decision preferences already surfaced in Discovery** (output
51
+ format, target canvas, a design decision the user already made) `/ds-handoff`
52
+ runs a **decision pass** (its Step 5.5) before emitting, and reconciles against
53
+ what you pass so it asks only the residual, never re-asking the known.
54
+
55
+ `/ds-handoff` runs field extraction + the coverage gate + the decision pass + the
56
+ mandatory template and returns the **rendered prompt** plus the
57
+ **`field-inventory.md` path**.
53
58
 
54
59
  **Graceful fallback** — if `/ds-handoff` is unavailable (Codex without it linked,
55
60
  or an older install): render a **coarse** brief inline from `screens_in_scope[]`
@@ -4,6 +4,23 @@ Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://sem
4
4
  Questo è il changelog INTERNO dello skeleton spedito (`primitive_version`), separato dal
5
5
  file `AGENTS.md` generato nel consumer e indipendente dal `VERSION` del framework.
6
6
 
7
+ ## 1.1.0 — 2026-07-01
8
+
9
+ - **Implementation-delegation MUST**: plan-and-delegate, never write substantial code
10
+ inline — **code/logic/tests → `coder`**, **UI → `ui-expert`** (dual-tool: Claude Task
11
+ `subagent_type` / Codex by-name); other agents route via `.claude/agents/REGISTRY.md`.
12
+ Now in the cross-tool SSOT so Codex sees it too (was only weakly in the CLAUDE.md stub).
13
+ - **Universal security hygiene MUST**: no hardcoded secrets, no exposed stack traces, no
14
+ PII in logs, validate/parse external inputs at the boundary.
15
+ - **Quality bar (SHOULD)**: stack-agnostic performance discipline (no unbounded/N+1 list
16
+ reads, Core Web Vitals) + baseline accessibility. Project-specific KPI numbers stay in
17
+ the overlay.
18
+ - **Git Workflow**: explicit worktree isolation — new branch → `/nw`; orchestrator never
19
+ runs `git switch`/`checkout -b`/`branch` on the shared main checkout.
20
+ - Distilled the UNIVERSAL subset of common project rules; stack-specific specifics
21
+ (database/ORM & migration policies, CSS-framework choices, exact KPI numbers, git
22
+ rituals) remain overlay content, never baked into the shipped skeleton.
23
+
7
24
  ## 1.0.0 — 2026-07-01
8
25
 
9
26
  - Primo skeleton SOTA cross-tool (framework v4.83.0). Sostituisce il bulk symlink di
@@ -1,4 +1,4 @@
1
- <!-- baldart-primitive: name=AGENTS primitive_version=1.0.0
1
+ <!-- baldart-primitive: name=AGENTS primitive_version=1.1.0
2
2
  This is the SHIPPED SKELETON. The writer (src/utils/root-primitives.js) strips
3
3
  this banner, resolves every {{ slot }} / {{> partial }} / {{#flag}} from
4
4
  baldart.config.yml (+ package.json/README), merges .baldart/overlays/AGENTS.md,
@@ -28,6 +28,12 @@ mechanics — this file remains the single source of truth for the protocol.
28
28
  (Claude Code: Task tool `subagent_type: codebase-architect`; Codex: the custom agent by
29
29
  name at `.codex/agents/codebase-architect.toml`). Only if NEITHER mechanism exists,
30
30
  degrade explicitly to inline retrieval (code-graph → LSP → Grep) and SAY SO.
31
+ - MUST delegate implementation to the domain agent — plan and delegate, do NOT write
32
+ substantial code inline: **code / logic / tests → `coder`**; **UI (components, pages,
33
+ styling, visual output) → `ui-expert`**. Same dual-tool invocation as `codebase-architect`
34
+ (Claude Code: Task tool `subagent_type`; Codex: custom agent by name). Every other agent
35
+ (code-reviewer, doc-reviewer, qa-sentinel, security-reviewer, …) routes via
36
+ `.claude/agents/REGISTRY.md`.
31
37
  - MUST NOT silently substitute a different agent when an invocation returns empty / times
32
38
  out / is denied — STOP, report verbatim, and wait. Never auto-route to a generic agent.
33
39
  - MUST NOT work on files another agent has claimed; parallel work only on independent areas.
@@ -43,6 +49,8 @@ mechanics — this file remains the single source of truth for the protocol.
43
49
  directly to `{{ git.trunk_branch }}` — all changes reach it via PR.
44
50
  - MUST get owner approval before force-push/reset or deleting an UNMERGED branch (create a
45
51
  `backup/<YYYYMMDD>-<reason>` tag first). Deleting an already-merged branch is routine.
52
+ - MUST NOT hardcode secrets / tokens / API keys (env vars only), expose internal stack
53
+ traces in responses, or log PII. Validate & parse every external / user input at the boundary.
46
54
  - MUST run the testing gates before DONE (see § Workflow Gates).
47
55
 
48
56
  **Feature-gated (active only when the flag is `true` in `baldart.config.yml`):**
@@ -72,7 +80,9 @@ mechanics — this file remains the single source of truth for the protocol.
72
80
  Branch naming: `{{ git.feature_prefix }}/<CARD-ID>-slug` (local), `codex/…` or `claude/…`
73
81
  (cloud agents), `hotfix/<ID>-slug` (production fixes). Branches are created by the
74
82
  orchestrator (`/nw`, `/new`) or the user — **never by the `coder` agent** (it implements on
75
- the branch it was spawned on). Stage explicit filenames only; never bundle unrelated changes.
83
+ the branch it was spawned on). For a NEW branch, prefer a git **worktree** (`/nw`): the
84
+ orchestrator MUST NOT run `git switch` / `checkout -b` / `branch` on the shared main
85
+ checkout (other sessions share it). Stage explicit filenames only; never bundle unrelated changes.
76
86
 
77
87
  ## Workflow Gates
78
88
 
@@ -83,6 +93,14 @@ run a full build every commit.
83
93
  **Pre-PR (once, before opening a PR):** full build (must pass) · unit tests (if they exist) ·
84
94
  E2E for critical-flow changes.
85
95
 
96
+ ## Quality bar (SHOULD)
97
+
98
+ - SHOULD respect performance budgets — avoid unbounded or N+1 data access on list paths
99
+ (bound + paginate queries, index hot lookups), and for web UIs keep Core Web Vitals
100
+ healthy (LCP / INP / CLS). Project-specific numeric targets live in the overlay.
101
+ - SHOULD meet baseline accessibility for interactive UI — keyboard navigation, sufficient
102
+ contrast, labelled inputs, alt text on informative images.
103
+
86
104
  ## Execution Modes
87
105
 
88
106
  | Mode | Branch | Validation |
@@ -4,6 +4,12 @@ Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://sem
4
4
  Changelog INTERNO dello stub spedito (`primitive_version`), separato dal `CLAUDE.md`
5
5
  generato nel consumer e indipendente dal `VERSION` del framework.
6
6
 
7
+ ## 1.1.0 — 2026-07-01
8
+
9
+ - Plan Mode delegation now names **both** domain agents — **code → `coder`**, **UI →
10
+ `ui-expert`** (was `coder` only) — plus `doc-reviewer` for full docs/SSOT. Mirrors the
11
+ new cross-tool delegation MUST in the AGENTS.md primitive.
12
+
7
13
  ## 1.0.0 — 2026-07-01
8
14
 
9
15
  - Primo stub Claude-native (framework v4.83.0). BALDART inizia a spedire `CLAUDE.md`.
@@ -1,4 +1,4 @@
1
- <!-- baldart-primitive: name=CLAUDE primitive_version=1.0.0
1
+ <!-- baldart-primitive: name=CLAUDE primitive_version=1.1.0
2
2
  SHIPPED SKELETON. The writer strips this banner, resolves {{ slot }}/{{#flag}} from
3
3
  baldart.config.yml, merges .baldart/overlays/CLAUDE.md, stamps a baldart-generated
4
4
  marker, and writes the result to the repo root.
@@ -19,8 +19,9 @@ SSOT, not restated here. Below are the **Claude-native mechanics only**.
19
19
  - Invoke `codebase-architect` before writing the plan — never plan blind.
20
20
  - Launch `plan-auditor` + `doc-reviewer` in parallel to review the plan, incorporate their
21
21
  feedback, and state inside the plan that the review gate was honored, BEFORE `ExitPlanMode`.
22
- - Wait for explicit user approval, then delegate implementation to the `coder` agent (via the
23
- Task tool). The `coder` writes code + minimal doc stubs only.
22
+ - Wait for explicit user approval, then delegate implementation to the domain agent via the
23
+ Task tool **code / logic / tests → `coder`**, **UI → `ui-expert`**. Each writes code +
24
+ minimal doc stubs only; full docs / SSOT sync go to `doc-reviewer`.
24
25
 
25
26
  ## User Interaction (Claude-native, ABSOLUTE)
26
27
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "baldart",
3
- "version": "4.83.0",
3
+ "version": "4.85.0",
4
4
  "description": "Claude Agent Framework - Reusable framework for coordinating AI agents and humans in software projects",
5
5
  "bin": {
6
6
  "baldart": "./bin/baldart.js"