acstack 0.49.2 → 0.50.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.
Files changed (36) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +27 -35
  3. package/agents/codex/frontend-verifier.toml +8 -5
  4. package/agents/codex/task-checker.toml +43 -173
  5. package/agents/codex/task-executor.toml +18 -88
  6. package/agents/codex/test-writer.toml +18 -26
  7. package/agents/frontend-verifier.md +8 -5
  8. package/agents/task-checker.md +43 -173
  9. package/agents/task-executor.md +18 -88
  10. package/agents/test-writer.md +18 -26
  11. package/cli/dist/index.js +0 -2
  12. package/cli/dist/index.js.map +2 -2
  13. package/cli/package.json +1 -1
  14. package/docs/config-reference.md +31 -50
  15. package/docs/workflows.md +28 -66
  16. package/orchestrator/AGENTS.md +144 -271
  17. package/package.json +1 -1
  18. package/pi/agents/frontend-verifier.md +8 -5
  19. package/pi/agents/task-checker.md +43 -173
  20. package/pi/agents/task-executor.md +20 -88
  21. package/pi/agents/test-writer.md +18 -26
  22. package/skills/browser-verify/SKILL.md +2 -2
  23. package/skills/grilling/SKILL.md +9 -10
  24. package/skills/implement/SKILL.md +23 -90
  25. package/skills/implement/decision-log.md +1 -1
  26. package/skills/implement/design-pass.md +159 -21
  27. package/skills/map/SKILL.md +4 -7
  28. package/skills/pre-commit-review/SKILL.md +24 -24
  29. package/skills/pre-commit-review/auto-fix.md +1 -1
  30. package/skills/pre-commit-review/interactive.md +1 -1
  31. package/skills/quick-fix/SKILL.md +20 -22
  32. package/skills/setup/SKILL.md +2 -2
  33. package/skills/setup/first-run.md +3 -12
  34. package/skills/setup/report.md +5 -10
  35. package/skills/setup/row-fixes.md +3 -6
  36. package/skills/implement/relaxed-tdd.md +0 -28
package/cli/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "acstack-cli",
3
- "version": "0.49.2",
3
+ "version": "0.50.0",
4
4
  "description": "CLI for the ACStack agentic coding stack",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -6,13 +6,13 @@ One file, `acstack/project.yaml`, holds every setting that belongs to a project.
6
6
 
7
7
  - **It names what to run**: the test, build, lint, typecheck, and format commands
8
8
  - **It names where to look**: the source and test directories, and the frontend
9
- - **It names how strict to be**: whether tests come first, and whether the agent may write code itself
9
+ - **It configures required gates**: spec sync, frontend verification, and design review
10
10
  - **Every skill and every agent reads it** before it runs anything
11
11
  - **A key you leave out takes the default** this document gives it
12
12
 
13
13
  Three terms first.
14
14
 
15
- - **A key** is one dotted path into the file, such as `workflow.tdd.strict`
15
+ - **A key** is one dotted path into the file, such as `workflow.spec_sync`
16
16
  - **A default** is what ACStack does when the file states no value
17
17
  - **A rung** is one token count at which the context-pressure hook speaks up, asking the session to choose continuity or freshness
18
18
 
@@ -23,7 +23,7 @@ flowchart TD
23
23
  FILE --> FE["frontend.*<br/>dev server, browser"]
24
24
  WF --> SKILLS["commit, grilling, map,<br/>archive, handoff"]
25
25
  WF --> HOOK["hooks/context-pressure.sh"]
26
- RUN --> AGENTS["orchestrator, test-writer,<br/>task-executor, task-checker"]
26
+ RUN --> AGENTS["Completion owner<br/>and delegated agents"]
27
27
  FE --> FV["frontend-verifier"]
28
28
  HOST["~/.config/acstack/config.json<br/>host.* keys - see dev-setups.md"] --> FV
29
29
  ```
@@ -211,8 +211,8 @@ Three refusals protect a file neither command can handle.
211
211
  | Key | Values | Default | What changes |
212
212
  | --- | --- | --- | --- |
213
213
  | `workflow.spec_sync` | `true`, `false` | `true` | the `commit` skill runs spec sync before it commits, unless this says `false`; with `false` the living specs under `acstack/specs/` stop tracking the code |
214
- | `workflow.tdd.strict` | `true`, `false` | `true` | `false` runs the task-executor before the test-writer; all three phases still run, and the checker's gate changes with the key |
215
- | `workflow.tdd.orchestrator_strict` | `true`, `false` | `true` | `false` lets the coordinating session read and write code itself for small tasks, instead of handing every piece to a subagent |
214
+ | `workflow.tdd.strict` | `true`, `false` | none | deprecated compatibility boolean; no sequencing effect, including explicit `true` |
215
+ | `workflow.tdd.orchestrator_strict` | `true`, `false` | none | deprecated compatibility boolean; no delegation effect, including explicit `true` |
216
216
  | `workflow.frontend_verification` | `true`, `false` | `false` | the frontend-verifier runs only when this is `true`, the file configures a `frontend` block, and the change touched frontend files |
217
217
  | `workflow.design_review` | `true`, `false` | `false` | a design review runs on a UI change only when this is `true`; it needs the impeccable plugin installed and switched on, which `acstack config check` reports on |
218
218
 
@@ -239,33 +239,19 @@ How a boolean reads:
239
239
  - An impeccable older than major 4, or one whose version it cannot read, warns on stderr and stays on
240
240
  - `--json` prints the same answer as `{"on": ..., "reasons": [...], "impeccable": ...}`
241
241
 
242
- ### 3.1. What `workflow.tdd.strict` moves
242
+ ### 3.1. Deprecated TDD booleans
243
243
 
244
- *`workflow.tdd.strict` reorders the first two phases. It drops none of them.*
244
+ *Adaptive verification replaces the old sequencing and delegation guarantee.*
245
245
 
246
- - The default `true` runs test-writer, then task-executor, then task-checker
247
- - A `false` runs task-executor, then test-writer, then task-checker
248
- - All three agents run either way
249
- - Six files read the key: `orchestrator/AGENTS.md`, `skills/implement/SKILL.md`, `agents/test-writer.md`, `agents/task-executor.md`, `agents/task-checker.md`, and `skills/setup/SKILL.md`
250
- - Relaxed TDD, the name for `false`, means nobody writes the tests first
251
- - It does not mean the work goes unverified
252
- - The rule of a checker after every executor does not move
253
-
254
- Relaxed costs the test-writer part of its independence.
255
-
256
- - Under `true` it cannot read an implementation
257
- - None exists when it runs
258
- - Under `false` the implementation sits in the working tree beside it, and only its instructions keep it from reading that code
259
- - The two settings do not give equal independence, and `agents/test-writer.md` states the weaker guarantee as the cost of relaxed
260
-
261
- What the checker gates on moves with the key.
262
-
263
- - Under `true` the checker holds the task's new tests to failing before the executor and passing after
264
- - Under `false` the implementation came first
265
- - Nothing can show those tests failing without it
266
- - The checker then holds the new tests to existing and passing
267
- - It holds the full suite to passing
268
- - The test count to not dropping
246
+ - `workflow.tdd.strict` and `workflow.tdd.orchestrator_strict` remain known boolean keys for compatibility
247
+ - Neither key has an effective default or controls sequencing or delegation, including explicit `true`
248
+ - ACStack removes the former strict guarantee
249
+ - The CLI still supports get, set, list, and unset for either key
250
+ - Unrelated writes preserve existing values and comments
251
+ - Deprecation alone does not trigger automatic config migration
252
+ - New setup does not offer or generate either key
253
+ - `orchestrator/AGENTS.md` owns the shared Implementation discipline
254
+ - Explicit user requests for stronger process still apply
269
255
 
270
256
  ### 3.2. How the agent asks you a question
271
257
 
@@ -446,23 +432,21 @@ Two limits are worth knowing.
446
432
 
447
433
  | Key | Values | Default | What changes |
448
434
  | --- | --- | --- | --- |
449
- | `commands.test` | a shell command, or `null` | from the profile | the test-writer, task-executor, and task-checker run it; the task-checker fails a task whose tests do not pass |
450
- | `commands.test_collect` | a shell command, or `null` | from the profile | the task-checker counts tests with it and compares the count against `.test-baseline`; `null` skips the baseline check |
451
- | `commands.build` | a shell command, or `null` | from the profile | the task-checker verifies the build with it |
452
- | `commands.lint` | a shell command, or `null` | from the profile | the pipeline lints with it, usually with a fix flag |
453
- | `commands.typecheck` | a shell command, or `null` | from the profile | the pipeline type-checks with it |
454
- | `commands.format` | a shell command, or `null` | from the profile | the pipeline runs it over the files the work touched, immediately before the task-checker; `null` means no format step |
455
- | `directories.source` | a path | `src/` | where `/acstack:setup` explores to propose the domain map, and where the pipeline writes source |
456
- | `directories.tests` | a path | `tests/` | where the test-writer writes tests, and the one tree the task-executor may not touch |
435
+ | `commands.test` | a shell command, or `null` | from the profile | the verification owner runs the configured tests |
436
+ | `commands.test_collect` | a shell command, or `null` | from the profile | the verification owner compares counts with `.test-baseline`; counts alone do not prove coverage |
437
+ | `commands.build` | a shell command, or `null` | from the profile | the verification owner checks the build with it |
438
+ | `commands.lint` | a shell command, or `null` | from the profile | the verification owner lints with it, usually with a fix flag |
439
+ | `commands.typecheck` | a shell command, or `null` | from the profile | the verification owner type-checks with it |
440
+ | `commands.format` | a shell command, or `null` | from the profile | format touched files before final verification; `null` means no format step |
441
+ | `directories.source` | a path | `src/` | where `/acstack:setup` explores to propose the domain map, and where the implementer writes source |
442
+ | `directories.tests` | a path | `tests/` | where tests live; assigned separate test ownership governs who may edit them |
457
443
  | `test_markers.exclude` | comma-separated markers, or `null` | `null` for Node, `slow,integration` for Python | which markers a default test run leaves out, as in `pytest -m` |
458
444
  | `venv.activate` | a shell command, or `null` | `null` for Node, `source .venv/bin/activate` for Python | every agent prefixes each command with it when the file states one |
459
445
 
460
- - One rule places the format step under both TDD settings
461
- - It runs immediately before the task-checker
462
- - Under relaxed TDD it falls after the test-writer and formats the new tests too
463
- - A non-zero exit from `commands.format` gets reported, and never counts as a failed implementation
464
- - Formatting is not correctness
465
- - The task-checker runs afterwards, and its own gate decides whether the work passes
446
+ - Run configured formatting over touched files before final verification
447
+ - Report a non-zero formatting exit without treating it as evidence of incorrect behavior
448
+ - Verification follows formatting regardless of whether another agent runs it
449
+
466
450
  - `acstack config show` lists a `commands` entry only when its value is a non-empty string
467
451
  - A `null`, a number or a nested block does not name a command anyone could run
468
452
  - The listing leaves it out
@@ -479,9 +463,9 @@ Two limits are worth knowing.
479
463
  | `frontend.dev_server_check` | a shell command | a `curl` of the URL | how the frontend-verifier decides the dev server is up |
480
464
  | `frontend.helpers_dir` | a path | `<frontend.directory>/tests/helpers/` | where `VERIFICATION-KNOWLEDGE.md` lives; the `verification-knowledge` row of the check fails when the file is missing, and when the key states nothing |
481
465
  | `frontend.commands.dev` | a shell command | none | how the frontend-verifier starts the dev server; without it the verifier cannot start one itself |
482
- | `frontend.commands.build` | a shell command | from the profile | the frontend build the pipeline runs |
483
- | `frontend.commands.lint` | a shell command | from the profile | the frontend lint the pipeline runs |
484
- | `frontend.commands.test` | a shell command | from the profile | the frontend tests the pipeline runs |
466
+ | `frontend.commands.build` | a shell command | from the profile | the frontend build the verification owner runs |
467
+ | `frontend.commands.lint` | a shell command | from the profile | the frontend lint the verification owner runs |
468
+ | `frontend.commands.test` | a shell command | from the profile | the frontend tests the verification owner runs |
485
469
 
486
470
  - An explicit `frontend: null` reads the same as no block at all
487
471
  - The CLI counts a frontend only when the key holds something other than `null`
@@ -547,9 +531,6 @@ workflow:
547
531
  spec_sync: true
548
532
  grilling:
549
533
  questions: tool
550
- tdd:
551
- strict: true
552
- orchestrator_strict: true
553
534
  # /acstack:setup writes true for a project with a frontend.
554
535
  # An absent key reads as false. Section 3 says why.
555
536
  frontend_verification: true
package/docs/workflows.md CHANGED
@@ -5,7 +5,7 @@
5
5
  ACStack routes a request down one of three paths. Every path ends at a commit that updates your specs.
6
6
 
7
7
  - **The path depends on what is in your way**: nothing, a bug, or an unanswered question
8
- - **A clear request goes straight to the four TDD agents** (see section 4)
8
+ - **A clear request goes straight to implementation and adaptive verification** (see section 4)
9
9
  - **A bug goes to root-cause analysis first** (see section 2)
10
10
  - **A request with open questions becomes a to-do graph** you work through (see section 1)
11
11
  - **The rest of this document** is the detail behind one box of the diagram below
@@ -17,9 +17,9 @@ flowchart TD
17
17
  Q -->|"it is broken"| F["Root-cause fix<br/>(quick-fix)"]
18
18
  Q -->|"open decisions"| M["Map<br/>(chart, then work the frontier)"]
19
19
  M -->|"work nodes"| I
20
- I --> T["Build under TDD<br/>(4-phase pipeline)"]
21
- F --> C["Commit<br/>(acstack:commit)"]
22
- T --> C
20
+ I --> T["Verify the change<br/>(shared Implementation discipline)"]
21
+ F --> T
22
+ T --> C["Commit<br/>(acstack:commit)"]
23
23
  C --> Y["Sync specs from the diff<br/>(domain-map.yaml)"]
24
24
  Y --> L[("Living specs<br/>acstack/specs/")]
25
25
  M -->|"every question answered"| A["Archive<br/>(check the decisions landed,<br/>then delete the nodes)"]
@@ -31,7 +31,7 @@ flowchart TD
31
31
  | Map, the to-do graph | section 1 |
32
32
  | Implement | section 2 |
33
33
  | Asking and recording | section 3 |
34
- | Build under TDD | section 4 |
34
+ | Verify the change | section 4 |
35
35
  | Commit **and** sync | section 5 |
36
36
  | Archive | section 6 |
37
37
  | Living specs | section 7 |
@@ -121,11 +121,11 @@ Nodes live in a tracker. That is the storage layer, and you can swap it.
121
121
 
122
122
  - `/acstack:implement` claims `afk` work nodes from the frontier when a map exists
123
123
  - It treats the request itself as the work item when none does
124
- - Either way, parallel read-only codebase-search subagents run over the relevant code before anyone writes anything
124
+ - Either way, investigate relevant code directly or through useful delegation
125
125
  - The command resolves paths at claim time
126
126
  - A node describes behaviour
127
127
  - It can sit unstarted for weeks
128
- - The test-driven development (TDD) pipeline of section 4 runs to completion inside each claim
128
+ - The shared Implementation discipline applies inside each claim (see section 4)
129
129
  - A node only ever moves `open -> claimed -> resolved`
130
130
  - The agent releases the claim when work stalls
131
131
  - The node is plainly open again
@@ -146,7 +146,7 @@ Nodes live in a tracker. That is the storage layer, and you can swap it.
146
146
  - A round asks the whole frontier, every question whose prerequisites have resolved, numbered, each with a recommended answer
147
147
  - It then recomputes the frontier and repeats
148
148
  - Facts are the agent's job, never yours
149
- - It sends any question a look at the environment would answer to a subagent instead
149
+ - It investigates technical facts directly or through useful delegation
150
150
  - Presentation follows `workflow.grilling.questions`, the host's question tool by default
151
151
  - It falls back to inline prose past 4 questions, or for a question with no discrete options
152
152
  - There is no question cap
@@ -161,70 +161,32 @@ Nodes live in a tracker. That is the storage layer, and you can swap it.
161
161
  - **`writing`** holds the standard every durable artifact follows: node answers, ADRs, glossary entries, specs and handoffs
162
162
  - The words to avoid live in `skills/writing/vocabulary.md`
163
163
 
164
- ## 4. Build under TDD
164
+ ## 4. Verify the change
165
165
 
166
- *Four agents run in order. The rule that does the work: the test-writer never sees the implementation.*
166
+ *Choose checks that can detect realistic mistakes, then gather evidence before completion.*
167
167
 
168
168
  ```mermaid
169
169
  flowchart LR
170
- subgraph P["Order set by workflow.tdd.strict"]
171
- direction LR
172
- W["test-writer<br/>(requirements only)"]
173
- E["task-executor<br/>(cannot edit tests)"]
174
- W -.->|"strict: tests first"| E
175
- E -.->|"relaxed: code first"| W
176
- end
177
- P --> Fm["format<br/>(commands.format)"]
178
- Fm --> K["task-checker<br/>(PASS / FAIL)"]
179
- K -->|FAIL| E
180
- K -->|PASS| V["frontend-verifier<br/>(real browser)"]
181
- V -->|FAIL| E
170
+ A["Assess what breaks"] --> B["Choose checks and useful delegation"]
171
+ B --> C["Test and implement"]
172
+ C --> D["Verify evidence and required gates"]
173
+ D -->|insufficient or failed| B
174
+ D -->|pass| E["Report results and limits"]
182
175
  ```
183
176
 
184
- The separation is the mechanism, not a formality.
185
-
186
- - **test-writer** sees requirements and acceptance criteria, never the implementation plan
187
- - Tests then encode what should happen
188
- - The implementation cannot shape them
189
- - **task-executor** receives the failing tests and cannot modify anything in the test directory
190
- - It has to make the specification pass instead of editing it
191
- - **task-checker** is a binary gate
192
- - It runs the task's tests, then the full suite for regressions
193
- - It checks the test count against `.test-baseline` and audits mocks for circular assertions
194
- - It confirms the executor left the tests alone
195
- - **frontend-verifier** drives a real browser over the Chrome DevTools Protocol (CDP)
196
- - It takes before and after screenshots
197
- - It reports on that evidence
198
-
199
- Which phases run, and in what order:
200
-
201
- - A FAIL routes back to the executor with the reason
202
- - Phases 1 and 4 are conditional
203
- - You can skip test-writer for a config or docs change with no testable behaviour
204
- - The frontend-verifier runs under three conditions: `acstack/project.yaml` configures a frontend, frontend files changed, and verification is on
205
- - `workflow.tdd.strict: false` reverses phase 1 and phase 2
206
- - The order becomes task-executor, then test-writer, then task-checker
207
- - It drops no phase
208
- - All three agents run
209
- - Relaxed TDD means nobody writes the tests first, never that the work goes unverified
210
-
211
- Relaxed weakens one wall, the one this section calls the important one.
212
-
213
- - Under `false` the test-writer works beside an implementation it must not read, instead of one that does not exist yet
214
- - Its independence then rests on its instructions rather than on context isolation
215
- - That is the cost of relaxed TDD
216
- - The checker pays for it too
217
- - No run can show the new tests failing without the implementation
218
- - It holds them to existing and passing instead
219
-
220
- The format step sits immediately before phase 3.
221
-
222
- - The pipeline runs `commands.format` over the files the work touched
223
- - Under relaxed that puts the format step after the test-writer
224
- - The new tests get formatted too
225
- - A project whose `commands.format` is `null` gets no format step
226
- - A non-zero exit gets reported
227
- - It never counts as a failed implementation
177
+ - The authoritative policy lives in `orchestrator/AGENTS.md`, under Implementation discipline
178
+ - One agent can investigate, test, implement, and verify straightforward work
179
+ - Practical tests-first work remains preferred
180
+ - Another agent adds independent interpretation or review when useful or required by the shared policy
181
+ - Choosing separate test ownership prevents the implementer from weakening those tests
182
+ - Formatting and project-required completion checks still apply
183
+ - Frontend design checks run under `skills/implement/design-pass.md`, even without a delegated checker
184
+ - Configured real-browser verification runs on the final code after required gates pass
185
+ - Report commands, results, and blocked checks rather than phase narration
186
+ - Deprecated TDD booleans no longer control order or delegation, including explicit `true`
187
+ - Existing config remains readable without automatic rewriting
188
+ - New setup offers no replacement switches
189
+
228
190
 
229
191
  ## 5. Commit and sync specs
230
192