@ludecker/aaac 1.1.1 → 1.1.3

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.
Files changed (34) hide show
  1. package/README.md +5 -3
  2. package/package.json +1 -1
  3. package/src/cli.mjs +10 -9
  4. package/src/generators/generate-commands.mjs +17 -9
  5. package/src/run-engine/advance-phase.mjs +2 -2
  6. package/src/run-engine/gate-write.mjs +14 -2
  7. package/src/run-engine/init-run.mjs +41 -0
  8. package/src/run-engine/lib.mjs +33 -0
  9. package/src/run-engine/record-task.mjs +7 -1
  10. package/src/run-engine/stop-check.mjs +7 -1
  11. package/src/run-engine/verify-website-build.mjs +67 -30
  12. package/templates/cursor/aaac/capabilities/registry.json +14 -16
  13. package/templates/cursor/aaac/graph.project.yaml +4 -204
  14. package/templates/cursor/aaac/ontology.md +17 -32
  15. package/templates/cursor/aaac/project.config.json +4 -1
  16. package/templates/cursor/aaac/run/schema.json +3 -1
  17. package/templates/cursor/aaac/scripts/run-engine/advance-phase.mjs +2 -2
  18. package/templates/cursor/aaac/scripts/run-engine/gate-write.mjs +14 -2
  19. package/templates/cursor/aaac/scripts/run-engine/init-run.mjs +41 -0
  20. package/templates/cursor/aaac/scripts/run-engine/lib.mjs +33 -0
  21. package/templates/cursor/aaac/scripts/run-engine/record-task.mjs +7 -1
  22. package/templates/cursor/aaac/scripts/run-engine/stop-check.mjs +7 -1
  23. package/templates/cursor/aaac/scripts/run-engine/verify-website-build.mjs +67 -30
  24. package/templates/cursor/agents/playwright-check-run.md +8 -26
  25. package/templates/cursor/agents/release-git.md +2 -2
  26. package/templates/cursor/agents/unit-test-run.md +3 -7
  27. package/templates/cursor/rules/aaac-enforcement.mdc +2 -2
  28. package/templates/cursor/skills/shared/governance/implementation/SKILL.md +25 -396
  29. package/templates/cursor/skills/shared/testing/SKILL.md +2 -2
  30. package/templates/cursor/skills/shared/verbs/check/orchestrator/SKILL.md +1 -1
  31. package/templates/cursor/skills/shared/verification/SKILL.md +2 -2
  32. package/templates/docs/agentic_architecture.md +91 -166
  33. package/templates/docs/architecture.md +44 -2
  34. package/templates/docs/master_rules.md +26 -2
@@ -23,75 +23,85 @@ Ask: *What do I want?* Then type:
23
23
  | Part | Meaning | Example |
24
24
  |------|---------|---------|
25
25
  | Command | Kind of work | `update-module` |
26
- | Domain | Which area | `cms` |
27
- | Intent | Goal in plain language | `"Add featured hero toggle to home page"` |
26
+ | Domain | Which area (optional until you add domains) | `payments` |
27
+ | Intent | Goal in plain language | `"Add idempotency key to webhook handler"` |
28
28
 
29
- ### Ludecker domains
29
+ ### Command matrix (ships with every install)
30
30
 
31
- | Slug | Scope |
32
- |------|-------|
33
- | `cms` | `apps/website` — public site, CMS admin, content queries |
34
- | `ui` | `packages/ui` — design system, tokens, components |
35
- | `database` | `supabase/migrations` — schema, RLS, type mirrors |
36
- | `aaac` | `packages/aaac` — `@ludecker/aaac` npm package, CLI, templates, generators |
31
+ AAAC generates ~130 commands from **8 verbs × 12 objects**:
37
32
 
38
- ### Commands (Ludecker v1)
33
+ | Verb | Meaning | Example |
34
+ |------|---------|---------|
35
+ | `create` | Add something new | `/create-module api "Add rate limiter"` |
36
+ | `update` | Change existing | `/update-component ui "Extract Button variants"` |
37
+ | `fix` | Repair broken behavior | `/fix-module auth "Session expires on refresh"` |
38
+ | `review` | Readonly quality check | `/review-architecture system "Check layer boundaries"` |
39
+ | `check` | Readonly capability trace | `/check-module api "Can we add OAuth?"` |
40
+ | `test` | Run verification | `/test-module api "Contract tests for webhooks"` |
41
+ | `release` | Ship to production | `/release-app production "Ship v2.1.0"` |
42
+ | `remove` | Delete safely | `/remove-module legacy "Drop v1 export path"` |
43
+
44
+ **Exception commands** (dedicated orchestrators):
39
45
 
40
46
  | Command | When to use |
41
47
  |---------|-------------|
42
- | `update-module` | Change an existing bounded module (`cms`, `ui`, `database`, `aaac`) |
43
48
  | `update-doc` | Update architecture documentation (no code) |
44
- | `update-design` | UI / design-system changes (`cms` or `ui`) |
45
- | `create-feature` | Add a new capability in a domain |
46
- | `fix-module` | Fix broken module — **requires domain**; full fix swarm |
47
- | `fix-bug` | Same pipeline as `fix-module`; domain optional (`module-fix`, `bug-fix` aliases) |
48
49
  | `review-module` | Quality/architecture review (no code) |
49
- | `review-incident` | Investigate deploy or production issue |
50
- | `test-module` | Test and verify a module |
51
- | `test-function` | Test a user journey |
52
- | `release-app` | Phased release swarm (git Render) |
53
- | `publish-aaac` | Bump, smoke-test, and publish `@ludecker/aaac` to npm |
54
- | `write-article` | Research swarm CMS article persist |
55
-
56
- ### Manual commands (local dev)
57
-
58
- | Command | When to use |
59
- |---------|-------------|
60
- | `launch-ludecker` | Clean local dev server start |
61
- | `kill-ludecker` | Kill stale local port listeners |
50
+ | `review-incident` | Investigate production or deploy issue |
51
+ | `test-function` | Test a user journey end-to-end |
52
+ | `release-app` | Phased release swarm (git → deploy) |
53
+ | `fix-module` / `fix-bug` | Full fix swarm domain optional until you add resolvers |
54
+
55
+ ### Out of the box no setup after install
56
+
57
+ Install copies everything you need. Open the project in Cursor and run commands.
58
+
59
+ - ~130 slash commands and the full shared pipeline (discover → plan → execute → verify → report)
60
+ - Generic `master_rules.md` and `architecture.md` in your docs folder — **already filled in**, not empty stubs
61
+ - Hook scripts and Run lifecycle under `.cursor/`
62
+ - Generic capability registry (shared skills only)
63
+ - **No** project domains required; **no** app build gate until you opt in (`verify.enabled: false` in `project.config.json`)
64
+
65
+ You do **not** need to enable hooks manually, write rules, add domains, or configure a stack before your first command.
66
+
67
+ ### Optional — when you want more (any stack)
68
+
69
+ 1. Replace or extend `docs/master_rules.md` and `docs/architecture.md` with team-specific detail
70
+ 2. Add `domains/<slug>/update/` (orchestrator + inventory) — see Part 2
71
+ 3. Extend `graph.project.yaml` with resolvers and project skills
72
+ 4. Enable verify in `project.config.json` when you have a web app to gate:
73
+
74
+ ```json
75
+ {
76
+ "verify": {
77
+ "enabled": true,
78
+ "app_root": "apps/web",
79
+ "index_html": "apps/web/index.html",
80
+ "build": { "command": "pnpm", "args": ["--filter", "web", "build"] }
81
+ }
82
+ }
83
+ ```
62
84
 
63
- ### Examples
85
+ ### Examples (generic)
64
86
 
65
87
  ```text
66
- /update-module cms "Improve docs shell navigation"
67
- /update-module ui "Add dark mode token for muted text"
68
- /update-module aaac "Add --version flag to CLI"
69
- /fix-bug cms "CMS publish does not revalidate home page"
70
- /fix-bug aaac "init fails when target dir already exists"
71
- /test-module aaac "Run init smoke and aaac:generate diff check"
72
- /publish-aaac "Ship 1.0.1 with template sync"
73
- /update-doc architecture "Document AAAC agent topology"
74
- /review-module cms "Check size budgets and layer boundaries"
75
- /test-module cms "Run full module verification"
76
- /release-app production "Ship with typecheck"
77
- /write-article guide, How to use Commands in Cursor
78
- /launch-ludecker
88
+ /create-module billing "Add invoice PDF export"
89
+ /update-component ui "Tokenize spacing scale"
90
+ /fix-module api "Webhook signature validation fails on chunked bodies"
91
+ /review-module billing "Check SSOT for tax rates"
92
+ /test-function checkout "Guest can complete purchase"
93
+ /release-app staging "Deploy with migration"
94
+ /update-doc architecture "Document event bus boundaries"
79
95
  ```
80
96
 
81
- ### Deprecated (still work one release)
82
-
83
- | Old | New |
84
- |-----|-----|
85
- | `/ship-ludecker` | `/release-app` |
86
- | `/module-update` | `/update-module` |
87
- | `/architecture` | `/update-doc` |
88
- | `/swarm-check` | `/review-incident` or `/fix-bug` |
89
- | `/refactor` | `/review-module` |
90
-
91
97
  ### What you should not need to know
92
98
 
93
99
  skill, agent, subagent, tool, workflow, graph, orchestrator — infrastructure only.
94
100
 
101
+ ### Reference implementation
102
+
103
+ [Lüdecker](https://ludecker.com) dogfoods AAAC with `cms`, `ui`, `database`, and `aaac` domains. That overlay lives in the Lüdecker repo — not in the generic npm template.
104
+
95
105
  ---
96
106
 
97
107
  ## Part 2 — Appendix (maintainers)
@@ -120,7 +130,7 @@ Knowledge Layer → docs/
120
130
  | Lifecycle | **Work** phase configuration |
121
131
  | Gate stacks | **Approval** checkpoints |
122
132
  | Run | Primary execution object; decisions, log, checkpoints |
123
- | Domain orchestrators | Domain coordination |
133
+ | Domain orchestrators | Domain coordination (you add these) |
124
134
  | Shared pipeline skills | Phase execution |
125
135
  | Capability registry | object → capability → provider |
126
136
  | Object skills | Skill-type providers |
@@ -139,7 +149,7 @@ Intent → Command → Execution Graph → Result
139
149
 
140
150
  **Execution graph** = orchestrator + skills + agents + tools + rules + documentation.
141
151
 
142
- **SSOT:** [`.cursor/aaac/graph.yaml`](../.cursor/aaac/graph.yaml)
152
+ **SSOT:** [`.cursor/aaac/graph.yaml`](../.cursor/aaac/graph.yaml) (generated — edit `graph.project.yaml` instead)
143
153
 
144
154
  **Dispatch procedure:** [`.cursor/aaac/dispatch.md`](../.cursor/aaac/dispatch.md)
145
155
 
@@ -148,17 +158,32 @@ Intent → Command → Execution Graph → Result
148
158
  ```text
149
159
  .cursor/
150
160
  commands/ # thin routers (public)
151
- aaac/graph.yaml # wiring (private OS)
161
+ aaac/
162
+ graph.project.yaml # your overlay (resolvers, orchestrators)
163
+ graph.yaml # generated wiring
152
164
  domains/<slug>/update/
153
165
  orchestrator/ # what happens
154
166
  inventory/ # what exists
155
- skills/shared/ # framework (discovery, planning, execution, …)
156
- skills/ludecker/ # project-specific object skills
157
- skills/write-article/ # content swarm
167
+ skills/shared/ # framework pipeline
168
+ skills/<project>/ # your object-capability skills (optional)
158
169
  agents/ # subagent prompt specs
159
170
  policies/ # rules all skills inherit
160
171
  ```
161
172
 
173
+ ### Generic kernel vs project overlay
174
+
175
+ | Layer | Location | Owner |
176
+ |-------|----------|-------|
177
+ | Generic kernel | `@ludecker/aaac` npm templates | Package maintainers |
178
+ | Project overlay | `.cursor/aaac/graph.project.yaml`, `ontology.json`, `project.config.json` | Your repo |
179
+ | Domains | `.cursor/domains/<slug>/` | Your repo |
180
+
181
+ Regenerate after ontology or overlay edits:
182
+
183
+ ```bash
184
+ npx @ludecker/aaac@latest generate
185
+ ```
186
+
162
187
  ### Orchestrator vs inventory
163
188
 
164
189
  | | Orchestrator | Inventory |
@@ -166,21 +191,8 @@ Intent → Command → Execution Graph → Result
166
191
  | Question | What should happen? | What exists? |
167
192
  | Updates when | Workflow changes | After every code-changing `update-module` |
168
193
 
169
- Inventory documents constraints and file maps. **Dependency reasoning** uses [`.cursor/aaac/dependencies.yaml`](../.cursor/aaac/dependencies.yaml) via the `dependency_graph` phase — not inventory alone.
170
-
171
194
  ### Execution determinism (create / update / fix)
172
195
 
173
- Commands define *what* to load; **work lifecycle** defines phases of work; **gate stacks** define approval checkpoints; the **Run** holds state and observability.
174
-
175
- **Mature stack (composed on Run):**
176
-
177
- ```text
178
- Policies → Ontology → Graph → Create Run
179
- → Work: Discovery → Investigation → Planning
180
- → Gates: Validation → Impact → Deps → Fitness → Rollback
181
- → Work: Execute → Verify → Report
182
- ```
183
-
184
196
  **Work lifecycles** (SSOT: [`.cursor/aaac/lifecycle/lifecycle.json`](../.cursor/aaac/lifecycle/lifecycle.json)):
185
197
 
186
198
  | Verb | Work | Gate stack |
@@ -190,125 +202,38 @@ Policies → Ontology → Graph → Create Run
190
202
  | fix | discover → investigate_swarm → root_cause → plan → execute → verify → report | pre_execute |
191
203
  | release | execute → verify → report | release |
192
204
 
193
- **Gate stacks** (SSOT: [`.cursor/aaac/governance/gates.json`](../.cursor/aaac/governance/gates.json)) — approval, not work.
194
-
195
- Composed runtime in graph `verb_runtime`. Human approval at gate boundaries: Run `status: blocked`, `awaiting_approval: true`.
196
-
197
- **Confidence gates** — before execute, if any score is below threshold → `STOP, REQUEST CLARIFICATION`:
198
-
199
- | Dimension | Minimum |
200
- |-----------|---------|
201
- | architecture | 0.9 |
202
- | requirements | 0.8 |
203
- | scope | 0.8 |
204
-
205
- **Object maturity** — harder objects require more phases:
206
-
207
- | Level | Objects (examples) | Extra requirements |
208
- |-------|-------------------|-------------------|
209
- | protected | schema, migration, architecture | impact + deps + rollback |
210
- | critical | module, integration, app | impact + deps |
211
- | stable | feature, workflow | impact on fix |
212
- | evolving | component, function | lifecycle only |
213
-
214
- **Fitness functions** — [`.cursor/aaac/fitness-functions.yaml`](../.cursor/aaac/fitness-functions.yaml): api_first, design_system, accessibility, security, layer_boundaries, performance. Scored `pass` / `warning` / `fail` before execute.
215
-
216
- Lifecycle reference: [`.cursor/skills/shared/verbs/_lifecycle.md`](../.cursor/skills/shared/verbs/_lifecycle.md)
217
-
218
- ### Fix swarm (`/fix-module`, `/fix-bug`, `fix_mode`)
219
-
220
- Same rigor as `write-article` research — parallel Task subagents, one message per wave.
221
-
222
- | Phase | Agent specs | Count |
223
- |-------|-------------|-------|
224
- | discover | discovery-inventory, discovery-boundaries, discovery-ssot | 4–6 |
225
- | investigate_swarm | fix-repro, fix-code-path, fix-recent-changes, fix-test-failures, fix-regression-scope, fix-runtime-evidence, fix-inventory-confirm | **7** |
226
- | root_cause | parent + optional fix-hypothesis-validate | 0–1 |
227
- | verify (fix) | fix-repro-verify, unit-test-run, fallow-check-changed | **3** |
228
-
229
- Skills: [investigation/SKILL.md](../.cursor/skills/shared/investigation/SKILL.md), [testing/SKILL.md](../.cursor/skills/shared/testing/SKILL.md).
230
- Contracts: [fix-module.yaml](../.cursor/aaac/contracts/commands/fix-module.yaml), [fix-bug.yaml](../.cursor/aaac/contracts/commands/fix-bug.yaml).
231
-
232
- Resolver: `fix-domain-by-slug` (`fix-module`) and `fix-bug-by-slug` → `cms-fix-bug` | `ui-fix-bug` | `database-fix-bug` | `aaac-fix-bug`.
205
+ **Gate stacks** (SSOT: [`.cursor/aaac/governance/gates.json`](../.cursor/aaac/governance/gates.json))
233
206
 
234
207
  ### Capability registry
235
208
 
236
209
  Objects declare capabilities in ontology; providers resolve from [`.cursor/aaac/capabilities/registry.json`](../.cursor/aaac/capabilities/registry.json):
237
210
 
238
211
  ```text
239
- object → capability → provider (skill | mcp | expert)
212
+ object → capability → provider (skill | mcp)
240
213
  ```
241
214
 
242
- Graph `object_skills` includes skill-type providers only. MCP providers (e.g. `supabase-mcp` on `database-design`) are recorded on the Run.
243
-
244
- **Capability lifecycle (evidence-driven):** State belongs to the **capability**, not the provider. After each completed Run, `capability-evidence.mjs` aggregates per-run evidence into [`.cursor/aaac/state/capability-stats.json`](../.cursor/aaac/state/capability-stats.json) and evaluates deterministic promotion using [`.cursor/aaac/capabilities/promotion-rules.json`](../.cursor/aaac/capabilities/promotion-rules.json):
245
-
246
- ```text
247
- experimental → validated → trusted → canonical → deprecated
248
- ```
249
-
250
- Promotion uses accumulated metrics: `invocations`, `success_rate`, `rollback_rate`, `gate_failure_rate`, `avg_fitness`. `canonical` requires `manual_approval` (human override on the capability entry). Providers contribute evidence; governance changes state.
215
+ Replace generic shared-skill providers with project skills as you mature.
251
216
 
252
217
  ### Run (primary execution object)
253
218
 
254
219
  **SSOT:** [`.cursor/aaac/run/schema.json`](../.cursor/aaac/run/schema.json), [`.cursor/aaac/run/RUN.md`](../.cursor/aaac/run/RUN.md)
255
220
 
256
- Every command executes within a Run at `state/runs/{run_id}/run.json`:
257
-
258
- | Field | Purpose |
259
- |-------|---------|
260
- | `phase`, `pending`, `completed` | Where we are |
261
- | `decisions[]` | Why routes and gates |
262
- | `log[]` | Phase events |
263
- | `checkpoints[]` | Resume points |
264
- | `artifacts{}` | Plan, impact, report, … |
265
- | `awaiting_approval` | Human gate approval |
266
-
267
- Observability: [`.cursor/aaac/observability/telemetry.yaml`](../.cursor/aaac/observability/telemetry.yaml) — all telemetry on Run, no standalone logs.
268
-
269
- ### Contracts
270
-
271
- Command contracts: [`.cursor/aaac/contracts/commands/`](../.cursor/aaac/contracts/commands/). Skill contracts: [`.cursor/aaac/contracts/skills/`](../.cursor/aaac/contracts/skills/). Schema: [`.cursor/aaac/contract-schema.md`](../.cursor/aaac/contract-schema.md)
272
-
273
- ### Implementation governance
274
-
275
- Not a slash command. Loaded by `shared/execution` on code changes:
276
-
277
- [`.cursor/skills/shared/governance/implementation/SKILL.md`](../.cursor/skills/shared/governance/implementation/SKILL.md)
278
-
279
221
  ### Adding a product domain
280
222
 
281
223
  1. Add `domains/<slug>/update/` (inventory + orchestrator)
282
- 2. Add slug to `graph.yaml` resolvers — **no new command shape**
283
- 3. Regenerate: `node .cursor/aaac/generate-graph.mjs && node .cursor/aaac/generate-commands.mjs`
284
-
285
- ### Contracts
224
+ 2. Add resolver entries to `graph.project.yaml` — **no new command shape**
225
+ 3. Regenerate: `npx @ludecker/aaac@latest generate`
286
226
 
287
- Plugins may include `contract.yaml` beside `SKILL.md`. Central contracts: [`.cursor/aaac/contracts/`](../.cursor/aaac/contracts/). Schema: [`.cursor/aaac/contract-schema.md`](../.cursor/aaac/contract-schema.md)
227
+ See [module-authoring/SKILL.md](../.cursor/skills/shared/module-authoring/SKILL.md).
288
228
 
289
229
  ### Release swarm (`release-app`)
290
230
 
291
- Expert subagents run in **waves**, not one monolithic agent:
292
-
293
- | Wave | Agents | Notes |
294
- |------|--------|-------|
295
- | 0 | Preflight typecheck (optional) | From intent, e.g. "with tests" |
296
- | 1 | `release-git` | **Blocking** — must return `commit_sha` before wave 2 |
297
- | 2 | `release-render` | Poll `ludecker-website` until `live`; smoke-check `/` |
298
-
299
- Wiring: `graph.yaml` agents `release-*`. Orchestrator: [platform-release/orchestrator](../.cursor/skills/shared/platform-release/orchestrator/SKILL.md). DAG: [platform-release/SKILL.md](../.cursor/skills/shared/platform-release/SKILL.md).
231
+ Wave 1: `release-git` (blocking). Add deploy agents in your overlay (e.g. `release-render`, `release-k8s`) — generic template ships git only.
300
232
 
301
233
  ### Regenerating commands
302
234
 
303
235
  ```bash
304
- pnpm aaac:generate
305
- ```
306
-
307
- Or:
308
-
309
- ```bash
310
- node .cursor/aaac/generate-graph.mjs
311
- node .cursor/aaac/generate-commands.mjs
236
+ npx @ludecker/aaac@latest generate
312
237
  ```
313
238
 
314
239
  Ontology reference: [`.cursor/aaac/ontology.md`](../.cursor/aaac/ontology.md)
@@ -1,5 +1,47 @@
1
1
  # Architecture
2
2
 
3
- Describe your system map: layers, modules, data flow, and deployment.
3
+ This describes how your repo works with Agentic OS. It ships ready to use — edit only when you want project-specific detail.
4
4
 
5
- AAAC policies reference this file. Replace this stub with your project architecture.
5
+ ## Your project + Agentic OS
6
+
7
+ ```text
8
+ your-repo/
9
+ (your app code — any stack)
10
+ .cursor/ ← Agentic OS (commands, skills, agents, runs)
11
+ docs/ ← rules and architecture (this folder)
12
+ ```
13
+
14
+ Agentic OS does not replace your app. It sits beside your code and gives Cursor a structured way to create, update, fix, review, test, and release work.
15
+
16
+ ## How you work
17
+
18
+ You type a **command** and a short **intent**. The system runs a pipeline (discover → plan → execute → verify → report) and keeps agents on track.
19
+
20
+ ```text
21
+ /create-module billing "Add invoice export"
22
+ /fix-module api "Webhook fails on retries"
23
+ /review-architecture system "Check layer boundaries"
24
+ ```
25
+
26
+ You do not need to learn skills, agents, or orchestrators — those are internal.
27
+
28
+ ## Layers (generic)
29
+
30
+ | Layer | Does | Does not |
31
+ |-------|------|----------|
32
+ | UI | Render, user interaction | Business rules, direct database access |
33
+ | Domain | Rules, validation, invariants | UI markup, framework-specific rendering |
34
+ | Infrastructure | APIs, persistence, adapters | Business decisions |
35
+
36
+ ## What ships on install
37
+
38
+ - ~130 slash commands (create, update, fix, review, check, test, release, remove × modules, APIs, UI, etc.)
39
+ - Shared pipeline skills and subagent specs
40
+ - Run lifecycle and hook scripts under `.cursor/`
41
+ - Generic rules in this folder (ready without edits)
42
+
43
+ ## Optional later
44
+
45
+ Add domains under `.cursor/domains/<name>/` when you want deeper knowledge of a bounded area (payments, auth, CMS, etc.). Extend `.cursor/aaac/graph.project.yaml` to route commands to those domains. Enable build verification in `.cursor/aaac/project.config.json` when you have a web app to gate before release.
46
+
47
+ None of that is required to start.
@@ -1,5 +1,29 @@
1
1
  # Master rules
2
2
 
3
- Define your project’s non-negotiable architecture and implementation rules here.
3
+ These rules apply to every code change in this project. Agentic OS loads them automatically — you do not need to configure anything after install.
4
4
 
5
- AAAC orchestrators load this file via `.cursor/policies/master-rules.md`. Replace this stub with your team’s rules.
5
+ ## Core principles
6
+
7
+ 1. **One source of truth** — Each fact lives in one place. Do not duplicate constants, config, or state.
8
+ 2. **Clear layers** — UI renders and handles interaction. Domain logic holds business rules. Infrastructure talks to databases and APIs. Do not mix these roles in one file.
9
+ 3. **Predictable flow** — Data moves in one direction: input → logic → output. No hidden side effects.
10
+ 4. **Explicit errors** — Log and surface failures. Do not fail silently.
11
+ 5. **Clarity over cleverness** — Prefer readable code over shortcuts.
12
+
13
+ ## Implementation
14
+
15
+ - Pull values from config, env, or constants — not unexplained literals in components.
16
+ - Use shared styles or design tokens — not inline styles in UI code.
17
+ - One named component per file.
18
+ - Async work should be cancellable where possible and logged at boundaries.
19
+ - Add or update tests when behavior changes.
20
+
21
+ ## Modules
22
+
23
+ - Keep files focused: one job per module.
24
+ - Reuse and extend existing code before adding parallel implementations.
25
+ - Name things for intent, not implementation detail.
26
+
27
+ ## Optional later
28
+
29
+ When your project grows, you can replace or extend this file with team-specific rules. Until then, these defaults are enough.