baldart 4.97.0 → 4.98.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 +21 -0
- package/VERSION +1 -1
- package/framework/.claude/skills/ds-edit/CHANGELOG.md +9 -0
- package/framework/.claude/skills/ds-edit/SKILL.md +10 -4
- package/framework/.claude/skills/ds-new/CHANGELOG.md +9 -0
- package/framework/.claude/skills/ds-new/SKILL.md +11 -7
- package/framework/agents/analysis-profiles.md +5 -2
- package/framework/templates/primitives/AGENTS.CHANGELOG.md +15 -0
- package/framework/templates/primitives/AGENTS.md +14 -5
- package/framework/templates/primitives/CLAUDE.CHANGELOG.md +11 -0
- package/framework/templates/primitives/CLAUDE.md +6 -2
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,27 @@ 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.98.0] - 2026-07-02
|
|
9
|
+
|
|
10
|
+
**Codebase understanding is tier-orthogonal — and every UI change grounds via `PROFILE=ui`, even a "quick" one.** A live Claude session took a small ad-hoc UI request ("modifichiamo al volo questa pagina su desktop e tablet, serve il back button sull'header") and went straight to `find`/`grep`/`Read` instead of spawning `codebase-architect` with `PROFILE=ui` — whereas Codex, on the same framework, routes the profile correctly. An adversarial pass (3 skeptics) **refuted the obvious diagnosis** ("Codex reads a stricter doc than Claude"): `CLAUDE.md` states AGENTS.md is loaded automatically alongside it, so Claude reads the *same* unconditional `codebase-architect` MUST that Codex reads — this was a Claude-side *misreading* of an already-universal rule, not a weaker rule. The real drivers, confirmed with `path:line`:
|
|
11
|
+
|
|
12
|
+
- **`CLAUDE.md` conflated "Light skips plan mode / delegation" with "Light skips understanding."** The architect + `PROFILE` bullet lived *only* inside the "For a Heavy task:" block, so a Light-task reader treated grounding as Heavy-only machinery. Fixed: the Plan Mode section now states the invocation is **tier-orthogonal** and applies to Light too; UI → `PROFILE=ui` always; only a genuine Trivial one-liner skips it. (CLAUDE primitive `1.3.0 → 1.4.0`.)
|
|
13
|
+
- **`AGENTS.md` § Change Tiers never carved understanding out of the tier-gated "heavy machinery" list**, so it got swept into the Light exemption by association. Fixed: § Non-negotiables now says the architect MUST applies **regardless of tier** (UI → `PROFILE=ui`, Trivial one-liner exempt, inline Grep is not a substitute); § Change Tiers explicitly excludes understanding from the tier-gated machinery; the Light bullet reiterates it grounds first when the change needs real understanding. (AGENTS primitive `1.6.0 → 1.7.0`.)
|
|
14
|
+
- **The "which profile, when" mapping for ad-hoc UI requests lived only in `/new` `implement.md`**, so a request *outside any skill* had no routing rule. Fixed in `agents/analysis-profiles.md`: the no-token inference rule #1 now catches generic UI work (component / page / header / layout / styling / responsive), not just a named mockup; and the § 3 routing table gains explicit rows for **ad-hoc UI change outside a skill → `ui`** and ad-hoc non-UI grounding → `feature`.
|
|
15
|
+
|
|
16
|
+
The hook-based enforcement one skeptic proposed (a `PreToolUse` gate that blocks edits until architect ran) was **rejected**: it can't distinguish a typo from a UI change, would block Trivial one-liners and follow-up edits, and reproduces the already-refuted "do-X-every-time gate without a ground truth" antipattern (v4.78.2). The Trivial exemption is preserved throughout, so genuine one-liners keep their fast path — no latency regression.
|
|
17
|
+
|
|
18
|
+
**MINOR** — shipped-primitive behavior clarification (regenerated into consumers on `baldart update`); no new surface, no config key, no install-layout change. **Codex parity: portable** — pure prose in the shared skeleton + the bulk-symlinked `agents/` module both runtimes read; AGENTS.md is the cross-tool SSOT (already correct, now unambiguous), CLAUDE.md is the Claude-native stub where the regression lived. **Not a `baldart.config.yml` key** → the schema-change propagation rule does NOT apply.
|
|
19
|
+
|
|
20
|
+
## [4.97.1] - 2026-07-02
|
|
21
|
+
|
|
22
|
+
**`/ds-new` + `/ds-edit`: locate/reuse-first is a deterministic registry lookup, never a search agent.** A live `/ds-edit` run went off-script — instead of the skill's deterministic spine (resolve the component spec → `ui-expert` source edit → `extract-one` → `serialize-spec` → `doc-reviewer` → `ds-gate`), the model improvised ad-hoc `general-purpose` agents to "find" the component and verify a formatter. Root cause: the skills said *what* to do ("resolve the existing component") but never forbade *how not to*. Reaffirmed (adversarially) that the v4.94.0 `codebase-architect` analysis profiles correctly do NOT belong in the `ds*` skills — those operate on a single, already-named element (no scope→registry fan-out), and `ds-new`'s reuse-first is a **deterministic signature detector** that an LLM `ui`-profile pass would only make fuzzier and duplicate; the `ui` profile lives in the *planning* skills (`/prd`, `/ui-design`, `/new`, `/ds-handoff`, `context-primer`) and, when it matters, already ran upstream before `/prd` delegates to `ds-new`/`ds-edit`.
|
|
23
|
+
|
|
24
|
+
- **`ds-edit` P1** now states explicitly: read `components/<Name>.md` directly and take its `source` — a plain file resolution, **never** a `general-purpose` / `Explore` / `codebase-architect` spawn (grep the exported symbol if only the source path is uncertain). Skill `1.0.0 → 1.1.0`.
|
|
25
|
+
- **`ds-new` step 1** now states explicitly: reuse-first stays the deterministic `ds-reuse-gate.js → signatureDuplicates` / `baldart ds-gate` detector, **never** routed through an LLM search/architect agent. Skill `1.0.0 → 1.1.0`.
|
|
26
|
+
|
|
27
|
+
**PATCH** — skill-body clarification, no new surface, no install-layout change, no behavior change to the deterministic spine. **Codex parity: portable** — pure prose in the shared skill bodies (both skills already degrade `ui-expert`/`doc-reviewer` delegation to TODO on Codex; this hardening is runtime-agnostic). **Not a `baldart.config.yml` key** → the schema-change propagation rule does NOT apply.
|
|
28
|
+
|
|
8
29
|
## [4.97.0] - 2026-07-02
|
|
9
30
|
|
|
10
31
|
**Change Tiers — a real Light lane, so ordinary edits stop triggering the heavy machinery.** The root primitives forced plan mode on *any* non-trivial task, a `plan-auditor` + `doc-reviewer` review gate on *every* non-trivial plan, mandatory delegation to a domain agent, and (amplified by project overlays) a worktree + backlog card whenever more than a few files were touched — so even a small direct edit spun up the full orchestration. Root cause: there were only two tiers (Trivial vs everything-else-is-Heavy); no genuine middle lane.
|
package/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
4.
|
|
1
|
+
4.98.0
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## 1.1.0 — 2026-07-02
|
|
6
|
+
|
|
7
|
+
- **P1 locate hardening.** Reso esplicito che lo step P1 è un lookup deterministico
|
|
8
|
+
diretto sul registro (`components/<Name>.md` → `source`) e che NON deve mai
|
|
9
|
+
spawnare un agente `general-purpose` / `Explore` / `codebase-architect` per
|
|
10
|
+
"trovare" il componente — l'unità è già nominata, non c'è fan-out da esplorare.
|
|
11
|
+
Chiude la deriva osservata in cui il modello improvvisava una ricerca ad-hoc al
|
|
12
|
+
posto dello spine deterministico della skill.
|
|
13
|
+
|
|
5
14
|
## 1.0.0 — 2026-07-01
|
|
6
15
|
|
|
7
16
|
- Baseline: versioning per-skill introdotto al framework v4.82.0.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ds-edit
|
|
3
3
|
effort: medium
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
description: >
|
|
6
6
|
Update ONE existing canonical design-system element correctly — the deliberate
|
|
7
7
|
edit twin of /ds-new. Classifies the change (resync the spec to changed source /
|
|
@@ -81,9 +81,15 @@ the target component + intended variant are pre-resolved.
|
|
|
81
81
|
## Pre-flight
|
|
82
82
|
|
|
83
83
|
- **P0 — gate.** `features.has_design_system: false` → REFUSE.
|
|
84
|
-
- **P1 — locate
|
|
85
|
-
|
|
86
|
-
|
|
84
|
+
- **P1 — locate (deterministic registry lookup — NEVER a search agent).** Read
|
|
85
|
+
`${paths.design_system}/components/<Name>.md` **directly** and take its `source`
|
|
86
|
+
field — the registry IS the index, so this is a plain file resolution. Do **not**
|
|
87
|
+
spawn a `general-purpose` / `Explore` / `codebase-architect` agent to "find" the
|
|
88
|
+
component: `ds-edit` operates on a single, already-named element, so there is no
|
|
89
|
+
fan-out to explore (the `ui` analysis profile is for scope→registry discovery in the
|
|
90
|
+
*planning* skills, not here). If the spec does NOT exist → STOP and suggest `/ds-new`
|
|
91
|
+
(this skill edits; it does not create). If only the `source` path is uncertain,
|
|
92
|
+
`grep` the exported symbol — still no agent.
|
|
87
93
|
- **P2 — classify the change** (the edit decision tree; ask the user when unclear):
|
|
88
94
|
- **resync** — the source already changed (props/variants/a11y); only the spec
|
|
89
95
|
needs to catch up. (Often you don't even need this skill — see "What this skill
|
|
@@ -2,6 +2,15 @@
|
|
|
2
2
|
|
|
3
3
|
Formato: [Keep a Changelog](https://keepachangelog.com/) · [SemVer](https://semver.org/).
|
|
4
4
|
|
|
5
|
+
## 1.1.0 — 2026-07-02
|
|
6
|
+
|
|
7
|
+
- **Reuse-first hardening.** Reso esplicito che lo step 1 reuse-first resta il
|
|
8
|
+
detector deterministico a firma (`ds-reuse-gate.js → signatureDuplicates` /
|
|
9
|
+
`baldart ds-gate`) e NON deve essere instradato attraverso un agente
|
|
10
|
+
`general-purpose` / `Explore` / `codebase-architect` (sostituirebbe il check a
|
|
11
|
+
firma con uno più fuzzy e duplicherebbe la Reuse Analysis che il profilo `ui`
|
|
12
|
+
possiede già nelle skill di planning). Simmetrico al P1 hardening di `ds-edit`.
|
|
13
|
+
|
|
5
14
|
## 1.0.0 — 2026-07-01
|
|
6
15
|
|
|
7
16
|
- Baseline: versioning per-skill introdotto al framework v4.82.0.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ds-new
|
|
3
3
|
effort: medium
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.1.0
|
|
5
5
|
description: >
|
|
6
6
|
Create ONE canonical design-system element — a component OR a token — end to
|
|
7
7
|
end with the full discipline: reuse-first research, (optional) scaffold, then
|
|
@@ -87,12 +87,16 @@ branch), the role/closure are pre-resolved — skip the reuse step (P1/step 1).
|
|
|
87
87
|
|
|
88
88
|
Each step is a delegation. Read the cited SSOT; do not paraphrase it.
|
|
89
89
|
|
|
90
|
-
1. **Reuse-first (BLOCKING
|
|
91
|
-
|
|
92
|
-
`design-system-protocol.md`.
|
|
93
|
-
|
|
94
|
-
ds-gate
|
|
95
|
-
|
|
90
|
+
1. **Reuse-first (BLOCKING — deterministic, NEVER a search agent).** Walk the
|
|
91
|
+
Component Discovery Cascade AND query the Selection Policy **by role**
|
|
92
|
+
(`INDEX.md` § Selection Policy), per `design-system-protocol.md`. The duplicate
|
|
93
|
+
check is the gate's own **deterministic detector** — `node -e` over
|
|
94
|
+
`src/utils/ds-reuse-gate.js → signatureDuplicates` (or `baldart ds-gate` once a
|
|
95
|
+
spec exists) — NOT an LLM pass: do **not** route reuse-first through a
|
|
96
|
+
`general-purpose` / `Explore` / `codebase-architect` agent (that would replace a
|
|
97
|
+
signature-based check with a fuzzier one and duplicate the Reuse Analysis the `ui`
|
|
98
|
+
profile already owns in the *planning* skills). Ask the user **only** on a real
|
|
99
|
+
fork (a suspected-duplicate, or a closed-family hit) — one consolidated
|
|
96
100
|
`AskUserQuestion`. On a clean match → **STOP and reuse the existing component**
|
|
97
101
|
(creating it anyway is the exact failure this skill prevents).
|
|
98
102
|
2. **Create (conditional).** *Scaffold mode* → DELEGATE `ui-expert` (Task tool):
|
|
@@ -29,8 +29,9 @@ instead of restating search strategy).
|
|
|
29
29
|
`### PROFILE: <name>` and Read ONLY that section (plus any `§ Shared block` it cites) —
|
|
30
30
|
never read this module end-to-end.
|
|
31
31
|
- **No token → deterministic inference**, in this exact priority order (first match wins):
|
|
32
|
-
1. prompt
|
|
33
|
-
registry / tokens
|
|
32
|
+
1. prompt concerns UI — a mockup / `links.design` / `component_bindings` / design-system
|
|
33
|
+
registry / tokens, OR building or changing a component, page, header, layout, styling,
|
|
34
|
+
or responsive/breakpoint behavior → `ui`
|
|
34
35
|
2. prompt asks blast-radius / affected surface / "what depends on" / refactor scope →
|
|
35
36
|
`impact`
|
|
36
37
|
3. prompt reports an error / crash / regression / "non funziona" → `bug`
|
|
@@ -188,6 +189,8 @@ payload should never rely on `full` — pass a token.
|
|
|
188
189
|
|
|
189
190
|
| Caller | Profile |
|
|
190
191
|
|---|---|
|
|
192
|
+
| ad-hoc UI change outside a skill (component / page / header / styling / responsive) | `ui` |
|
|
193
|
+
| ad-hoc pre-implementation grounding outside a skill (non-UI) | `feature` |
|
|
191
194
|
| `/new` implement.md Phase 1 step 3 · `new2.js` B7 | `ui` if card has non-empty `links.design` OR `links.design_src` (the `hasMockup` bit), else `feature` |
|
|
192
195
|
| `new-final-review.js` / `new-card-review.js` Phase Baseline · `/codexreview` Step 1 | `baseline` |
|
|
193
196
|
| `plan-auditor` FULL-mode grounding spawn | `impact` |
|
|
@@ -4,6 +4,21 @@ 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.7.0 — 2026-07-02
|
|
8
|
+
|
|
9
|
+
- **Codebase understanding is tier-orthogonal, and UI work always grounds via `PROFILE=ui`**:
|
|
10
|
+
the `codebase-architect` + profile MUST (§ Non-negotiables) now states explicitly that it
|
|
11
|
+
applies **regardless of tier** — a **Light** change still grounds first whenever acting
|
|
12
|
+
correctly needs understanding, and **any UI change routes `PROFILE=ui`** even for a small
|
|
13
|
+
tweak; only a genuine **Trivial** one-liner skips it, and an inline Grep is not a substitute.
|
|
14
|
+
§ Change Tiers now carves understanding **out** of the tier-gated "heavy machinery" list
|
|
15
|
+
(it precedes the tier decision), and the Light bullet reiterates "still grounds via
|
|
16
|
+
`codebase-architect` first when the change needs real understanding (UI → `PROFILE=ui`)".
|
|
17
|
+
Closes the gap where an ad-hoc "quick" UI edit (outside any skill) skipped the architect
|
|
18
|
+
because the reader conflated "Light skips plan mode / delegation" with "Light skips
|
|
19
|
+
understanding". Cross-tool: pure prose in the shared skeleton — portable (both runtimes read
|
|
20
|
+
the same MUST; this was a Claude-side misreading of an already-universal rule, now unambiguous).
|
|
21
|
+
|
|
7
22
|
## 1.6.0 — 2026-07-02
|
|
8
23
|
|
|
9
24
|
- **Change Tiers — a real Light lane between Trivial and Heavy**: new `## Change Tiers`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- baldart-primitive: name=AGENTS primitive_version=1.
|
|
1
|
+
<!-- baldart-primitive: name=AGENTS primitive_version=1.7.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,
|
|
@@ -30,8 +30,13 @@ mechanics — this file remains the single source of truth for the protocol.
|
|
|
30
30
|
profile**: `PROFILE=feature` (pre-implementation grounding) · `bug` (failure-path
|
|
31
31
|
tracing) · `impact` (blast radius / refactor scope) · `discovery` (planning / question
|
|
32
32
|
context) · `ui` (design-system / component scope) · `baseline` (review grounding over a
|
|
33
|
-
diff). Contract + per-profile scoping: `agents/analysis-profiles.md`.
|
|
34
|
-
|
|
33
|
+
diff). Contract + per-profile scoping: `agents/analysis-profiles.md`. This applies
|
|
34
|
+
**regardless of tier** (§ Change Tiers): a **Light** change still grounds first whenever
|
|
35
|
+
acting correctly needs understanding you don't already have, and **any UI change routes
|
|
36
|
+
`PROFILE=ui`** (design-system / component grounding) even for a small tweak. Only a genuine
|
|
37
|
+
**Trivial** one-liner — a typo or an obvious self-contained fix — skips it; starting with an
|
|
38
|
+
inline Grep is NOT a substitute when the change needs cross-file or design-system grounding.
|
|
39
|
+
Only if NEITHER invocation mechanism exists, degrade explicitly to inline retrieval
|
|
35
40
|
(code-graph → LSP → Grep) and SAY SO.
|
|
36
41
|
- MUST have any **Heavy** plan (see § Change Tiers) reviewed BEFORE presenting it for
|
|
37
42
|
approval — run `plan-auditor` + `doc-reviewer` (in parallel), incorporate their feedback,
|
|
@@ -99,13 +104,17 @@ mechanics — this file remains the single source of truth for the protocol.
|
|
|
99
104
|
Every change is one of three tiers. The tier — NOT raw file count — decides whether the heavy
|
|
100
105
|
machinery (plan mode, plan review, delegation, worktree, backlog card) applies. **When in
|
|
101
106
|
doubt, treat it as Light** and escalate only when a Heavy trigger is actually present.
|
|
107
|
+
**Codebase understanding (`codebase-architect` + the matching profile, § Non-negotiables) is
|
|
108
|
+
NOT part of this tier-gated machinery** — it precedes the tier decision and applies to Light
|
|
109
|
+
too; only a Trivial one-liner skips it, and any UI change always grounds via `PROFILE=ui`.
|
|
102
110
|
|
|
103
111
|
- **Trivial** — a one-liner, typo, or obvious bug with a clear fix. Just do it.
|
|
104
112
|
- **Light** — the default for most work. Any change that does **not** hit a Heavy trigger,
|
|
105
113
|
even if it spans several files within one coherent area. → Implement **directly on the
|
|
106
114
|
current branch**: no plan mode, no plan-review gate, no worktree, no backlog card. The
|
|
107
|
-
orchestrator may edit inline or delegate for volume
|
|
108
|
-
|
|
115
|
+
orchestrator may edit inline or delegate for volume, but **still grounds via
|
|
116
|
+
`codebase-architect` first** when the change needs real understanding (UI → `PROFILE=ui`).
|
|
117
|
+
Docs stay in sync and the pre-commit gates still run.
|
|
109
118
|
- **Heavy** — escalate ONLY when the change: introduces a new DB schema / migration; adds a
|
|
110
119
|
new external dependency; adds a new API contract / route or a new domain entity; is a wide
|
|
111
120
|
or cross-module refactor; or runs in parallel with other agents/sessions on shared files.
|
|
@@ -4,6 +4,17 @@ 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.4.0 — 2026-07-02
|
|
8
|
+
|
|
9
|
+
- **Break the "Light skips delegation → Light skips architect" conflation**: the Plan Mode
|
|
10
|
+
section now states that Light/Trivial changes skip plan mode / plan-review / mandatory
|
|
11
|
+
delegation but do **NOT** skip codebase understanding — the `codebase-architect` + `PROFILE`
|
|
12
|
+
invocation is **tier-orthogonal**, a Light change still grounds via it when acting correctly
|
|
13
|
+
needs understanding, and **every UI change grounds via `PROFILE=ui`**; only a genuine Trivial
|
|
14
|
+
one-liner skips it. This was the Claude-native locus of the bug: the architect bullet lived
|
|
15
|
+
only inside the "For a Heavy task:" block, so a Light-task reader treated it as Heavy-only.
|
|
16
|
+
Mirrors the AGENTS.md primitive 1.7.0 § Non-negotiables / § Change Tiers clarification.
|
|
17
|
+
|
|
7
18
|
## 1.3.0 — 2026-07-02
|
|
8
19
|
|
|
9
20
|
- Plan Mode scoped to **Heavy** changes (see `AGENTS.md` § Change Tiers): Light and Trivial
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<!-- baldart-primitive: name=CLAUDE primitive_version=1.
|
|
1
|
+
<!-- baldart-primitive: name=CLAUDE primitive_version=1.4.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.
|
|
@@ -16,7 +16,11 @@ SSOT, not restated here. Below are the **Claude-native mechanics only**.
|
|
|
16
16
|
|
|
17
17
|
Plan mode is for **Heavy** changes only (see `AGENTS.md` § Change Tiers). **Light** and
|
|
18
18
|
**Trivial** changes skip plan mode, the plan-review gate, and mandatory delegation — implement
|
|
19
|
-
them directly. When in doubt, treat it as Light.
|
|
19
|
+
them directly. When in doubt, treat it as Light. They do **NOT**, however, skip codebase
|
|
20
|
+
understanding: the `codebase-architect` + `PROFILE` invocation (`AGENTS.md` § Non-negotiables)
|
|
21
|
+
is **tier-orthogonal** — a Light change still grounds via it whenever acting correctly needs
|
|
22
|
+
understanding you don't already have, and **every UI change grounds via `PROFILE=ui`** even for
|
|
23
|
+
a small tweak. Only a genuine Trivial one-liner skips it. For a Heavy task:
|
|
20
24
|
|
|
21
25
|
- Enter plan mode (`EnterPlanMode`) before writing code.
|
|
22
26
|
- Invoke `codebase-architect` before writing the plan — never plan blind. Pass the
|