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.
- package/.claude-plugin/plugin.json +1 -1
- package/README.md +27 -35
- package/agents/codex/frontend-verifier.toml +8 -5
- package/agents/codex/task-checker.toml +43 -173
- package/agents/codex/task-executor.toml +18 -88
- package/agents/codex/test-writer.toml +18 -26
- package/agents/frontend-verifier.md +8 -5
- package/agents/task-checker.md +43 -173
- package/agents/task-executor.md +18 -88
- package/agents/test-writer.md +18 -26
- package/cli/dist/index.js +0 -2
- package/cli/dist/index.js.map +2 -2
- package/cli/package.json +1 -1
- package/docs/config-reference.md +31 -50
- package/docs/workflows.md +28 -66
- package/orchestrator/AGENTS.md +144 -271
- package/package.json +1 -1
- package/pi/agents/frontend-verifier.md +8 -5
- package/pi/agents/task-checker.md +43 -173
- package/pi/agents/task-executor.md +20 -88
- package/pi/agents/test-writer.md +18 -26
- package/skills/browser-verify/SKILL.md +2 -2
- package/skills/grilling/SKILL.md +9 -10
- package/skills/implement/SKILL.md +23 -90
- package/skills/implement/decision-log.md +1 -1
- package/skills/implement/design-pass.md +159 -21
- package/skills/map/SKILL.md +4 -7
- package/skills/pre-commit-review/SKILL.md +24 -24
- package/skills/pre-commit-review/auto-fix.md +1 -1
- package/skills/pre-commit-review/interactive.md +1 -1
- package/skills/quick-fix/SKILL.md +20 -22
- package/skills/setup/SKILL.md +2 -2
- package/skills/setup/first-run.md +3 -12
- package/skills/setup/report.md +5 -10
- package/skills/setup/row-fixes.md +3 -6
- package/skills/implement/relaxed-tdd.md +0 -28
package/cli/package.json
CHANGED
package/docs/config-reference.md
CHANGED
|
@@ -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
|
|
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.
|
|
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["
|
|
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` |
|
|
215
|
-
| `workflow.tdd.orchestrator_strict` | `true`, `false` |
|
|
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.
|
|
242
|
+
### 3.1. Deprecated TDD booleans
|
|
243
243
|
|
|
244
|
-
|
|
244
|
+
*Adaptive verification replaces the old sequencing and delegation guarantee.*
|
|
245
245
|
|
|
246
|
-
-
|
|
247
|
-
-
|
|
248
|
-
-
|
|
249
|
-
-
|
|
250
|
-
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
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
|
|
450
|
-
| `commands.test_collect` | a shell command, or `null` | from the profile | the
|
|
451
|
-
| `commands.build` | a shell command, or `null` | from the profile | the
|
|
452
|
-
| `commands.lint` | a shell command, or `null` | from the profile | the
|
|
453
|
-
| `commands.typecheck` | a shell command, or `null` | from the profile | the
|
|
454
|
-
| `commands.format` | a shell command, or `null` | from the profile |
|
|
455
|
-
| `directories.source` | a path | `src/` | where `/acstack:setup` explores to propose the domain map, and where the
|
|
456
|
-
| `directories.tests` | a path | `tests/` | where
|
|
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
|
-
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
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
|
|
483
|
-
| `frontend.commands.lint` | a shell command | from the profile | the frontend lint the
|
|
484
|
-
| `frontend.commands.test` | a shell command | from the profile | the frontend tests the
|
|
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
|
|
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["
|
|
21
|
-
F -->
|
|
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
|
-
|
|
|
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,
|
|
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
|
|
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
|
|
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.
|
|
164
|
+
## 4. Verify the change
|
|
165
165
|
|
|
166
|
-
*
|
|
166
|
+
*Choose checks that can detect realistic mistakes, then gather evidence before completion.*
|
|
167
167
|
|
|
168
168
|
```mermaid
|
|
169
169
|
flowchart LR
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
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
|
|
185
|
-
|
|
186
|
-
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
-
|
|
190
|
-
|
|
191
|
-
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
-
|
|
195
|
-
-
|
|
196
|
-
|
|
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
|
|