acstack 0.50.3 → 0.51.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 (113) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/README.md +14 -7
  3. package/agents/codex/frontend-verifier.toml +89 -6
  4. package/agents/codex/task-checker.toml +83 -2
  5. package/agents/codex/task-executor.toml +83 -1
  6. package/agents/codex/test-writer.toml +77 -1
  7. package/agents/frontend-verifier.md +13 -6
  8. package/agents/task-checker.md +7 -2
  9. package/agents/task-executor.md +7 -1
  10. package/agents/test-writer.md +1 -1
  11. package/assets/terminal-workspace/config.example.yaml +1 -1
  12. package/assets/terminal-workspace/helpers/acstack-md +12 -4
  13. package/assets/terminal-workspace/helpers/acstack-open +10 -2
  14. package/assets/terminal-workspace/lib/apply-yazi.sh +25 -0
  15. package/cli/dist/index.js +10142 -9369
  16. package/cli/dist/index.js.map +4 -4
  17. package/cli/package.json +1 -1
  18. package/docs/config-reference.md +113 -14
  19. package/docs/dev-setups.md +4 -4
  20. package/docs/terminal-workspace-keys.md +1 -0
  21. package/docs/terminal-workspace.md +1 -1
  22. package/docs/workflows.md +22 -16
  23. package/examples/design-doc/acstack/README.md +273 -0
  24. package/examples/design-doc/acstack/acstack.yaml +4 -0
  25. package/examples/design-doc/acstack/cli.yaml +5 -0
  26. package/examples/design-doc/acstack/design.yaml +39 -0
  27. package/examples/design-doc/acstack/github.yaml +12 -0
  28. package/examples/design-doc/acstack/host.yaml +14 -0
  29. package/examples/design-doc/acstack/journey.md +85 -0
  30. package/examples/design-doc/acstack/publication.md +16 -0
  31. package/examples/design-doc/acstack/review-runtime.yaml +24 -0
  32. package/examples/design-doc/acstack/skills.yaml +22 -0
  33. package/examples/design-doc/acstack/store.yaml +11 -0
  34. package/examples/design-doc/acstack/user.yaml +15 -0
  35. package/examples/design-doc/acstack/viewer.yaml +13 -0
  36. package/hooks/ac-writing-style-reminder.sh +7 -18
  37. package/hooks/communication-standard.mjs +17 -0
  38. package/hooks/communication-standard.sh +6 -0
  39. package/hooks/context-pressure.sh +2 -2
  40. package/hooks/hooks.json +18 -0
  41. package/hooks/lib/communication-standard.mjs +16 -0
  42. package/hooks/project-data.sh +38 -0
  43. package/hooks/session-start-handoff.sh +21 -7
  44. package/hooks/session-start.sh +9 -2
  45. package/orchestrator/AGENTS.md +25 -14
  46. package/output-styles/ac-writing-style.md +75 -276
  47. package/package.json +2 -1
  48. package/pi/agents/frontend-verifier.md +89 -6
  49. package/pi/agents/task-checker.md +83 -2
  50. package/pi/agents/task-executor.md +83 -1
  51. package/pi/agents/test-writer.md +77 -1
  52. package/pi/extension.ts +70 -12
  53. package/profiles/fullstack-python.yaml +1 -1
  54. package/profiles/node-typescript.yaml +1 -1
  55. package/profiles/python.yaml +1 -1
  56. package/skills/archive/SKILL.md +53 -36
  57. package/skills/bootstrap/SKILL.md +6 -6
  58. package/skills/bridge/SKILL-VM.md +11 -2
  59. package/skills/bridge/SKILL-WINDOWS.md +3 -3
  60. package/skills/browser-verify/SKILL.md +14 -5
  61. package/skills/code-review/SKILL.md +8 -2
  62. package/skills/commit/SKILL.md +7 -6
  63. package/skills/compact-and-continue/SKILL.md +9 -8
  64. package/skills/design-doc/SKILL.md +235 -0
  65. package/skills/explore/SKILL.md +1 -1
  66. package/skills/grilling/SKILL.md +4 -4
  67. package/skills/handoff/SKILL.md +4 -4
  68. package/skills/host/SKILL.md +1 -1
  69. package/skills/host/detect-host.sh +2 -2
  70. package/skills/host/notes.md +2 -2
  71. package/skills/host/questions.md +1 -1
  72. package/skills/implement/SKILL.md +20 -13
  73. package/skills/implement/decision-log.md +9 -8
  74. package/skills/implement/design-pass.md +16 -2
  75. package/skills/map/SKILL.md +15 -71
  76. package/skills/map/alignment.md +18 -27
  77. package/skills/map/frontend.md +1 -1
  78. package/skills/map/materialising.md +74 -0
  79. package/skills/map/trackers/files.md +4 -6
  80. package/skills/pre-commit-review/SKILL.md +15 -9
  81. package/skills/pre-commit-review/auto-fix.md +1 -1
  82. package/skills/quick-fix/SKILL.md +1 -1
  83. package/skills/record-context/SKILL.md +6 -6
  84. package/skills/setup/SKILL.md +15 -50
  85. package/skills/setup/browser.md +2 -2
  86. package/skills/setup/first-run.md +19 -8
  87. package/skills/setup/report.md +3 -2
  88. package/skills/setup/row-fixes.md +56 -9
  89. package/skills/sync/SKILL.md +12 -11
  90. package/skills/terminal-workspace/SKILL.md +2 -1
  91. package/skills/test-conventions/SKILL.md +2 -2
  92. package/skills/visual-docs/SKILL.md +69 -235
  93. package/skills/writing/SKILL.md +29 -217
  94. package/skills/writing/examples.md +62 -129
  95. package/docs/adr/0001-ste-writing-standard.md +0 -16
  96. package/docs/adr/0002-version-gate-not-auto-bump.md +0 -35
  97. package/docs/adr/0003-handoff-ack-command.md +0 -19
  98. package/docs/adr/0004-dev-setup-per-host.md +0 -13
  99. package/docs/adr/0005-two-orchestrators-per-host.md +0 -25
  100. package/docs/adr/0006-document-opener-service.md +0 -89
  101. package/docs/adr/0007-lead-check-reads-the-transcript.md +0 -87
  102. package/docs/adr/0008-cli-audits-skill-interviews.md +0 -37
  103. package/docs/adr/0009-verify-the-write-not-the-writer.md +0 -51
  104. package/docs/adr/0010-promote-dev-to-main-by-fast-forward.md +0 -115
  105. package/docs/adr/0011-node-header-is-the-edge-encoding.md +0 -20
  106. package/docs/adr/0012-node-kind-is-a-closed-set-of-five.md +0 -31
  107. package/docs/adr/0013-the-diagram-renderer-is-pure.md +0 -23
  108. package/docs/adr/0014-reading-a-node-hides-its-generated-diagram.md +0 -29
  109. package/docs/adr/0015-a-node-id-links-to-its-issue-through-an-anchor.md +0 -37
  110. package/docs/adr/0016-the-map-root-carries-no-status-of-its-own.md +0 -21
  111. package/docs/adr/0017-call-impeccable-copy-only-its-questions.md +0 -13
  112. package/docs/adr/0018-alignment-packs-use-local-viewers.md +0 -11
  113. package/docs/adr/index.md +0 -18
package/cli/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "acstack-cli",
3
- "version": "0.50.3",
3
+ "version": "0.51.0",
4
4
  "description": "CLI for the ACStack agentic coding stack",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -1,8 +1,8 @@
1
1
  # Project configuration
2
2
 
3
- *Every key in `acstack/project.yaml`, the values it takes, its default, and what changes when you change it.*
3
+ *Every key in `.acstack/project.yaml`, the values it takes, its default, and what changes when you change it.*
4
4
 
5
- One file, `acstack/project.yaml`, holds every setting that belongs to a project.
5
+ 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
@@ -18,7 +18,7 @@ Three terms first.
18
18
 
19
19
  ```mermaid
20
20
  flowchart TD
21
- FILE["acstack/project.yaml<br/>(written by /acstack:setup)"] --> WF["workflow.*<br/>switches, maps, handoff"]
21
+ FILE[".acstack/project.yaml<br/>(written by /acstack:setup)"] --> WF["workflow.*<br/>switches, maps, handoff"]
22
22
  FILE --> RUN["commands.*, directories.*,<br/>test_markers, venv"]
23
23
  FILE --> FE["frontend.*<br/>dev server, browser"]
24
24
  WF --> SKILLS["commit, grilling, map,<br/>archive, handoff"]
@@ -44,7 +44,7 @@ flowchart TD
44
44
 
45
45
  *The setup skill writes the whole file. To change one key, run `acstack config set`.*
46
46
 
47
- - `acstack/project.yaml` sits in the project root, beside `acstack/domain-map.yaml`
47
+ - `.acstack/project.yaml` sits under the project root, beside `.acstack/domain-map.yaml`
48
48
  - `/acstack:setup` writes it
49
49
  - On a fresh project the skill detects the project type, then writes every key from a profile under `profiles/`
50
50
  - On a project that already has the file, the skill leads with the health check and offers a menu of changes
@@ -54,7 +54,8 @@ flowchart TD
54
54
  - The setup skill copies them from a profile
55
55
  - An omitted one names nothing at all
56
56
 
57
- Four commands read the file and change nothing.
57
+ These commands report configuration without changing settings.
58
+ CLI startup can repair the root Git ignore baseline before the command runs.
58
59
 
59
60
  | Command | What it prints |
60
61
  | --- | --- |
@@ -63,6 +64,104 @@ Four commands read the file and change nothing.
63
64
  | `acstack config list` | every key the file states |
64
65
  | `acstack design-gate` | whether a design review runs here, as `on` and exit 0 or one `off: <reason>` line per reason and exit 1 (section 3) |
65
66
 
67
+ ### Project data stays local by default
68
+
69
+ - All ACStack-owned project records live under `.acstack/`
70
+ - The root `.gitignore` controls tracking, independently for every part
71
+ - No configuration key controls tracking
72
+
73
+ | Part | Canonical path |
74
+ | --- | --- |
75
+ | Project configuration | `.acstack/project.yaml` |
76
+ | Domain map | `.acstack/domain-map.yaml` |
77
+ | Living specs | `.acstack/specs/` |
78
+ | Maps | `.acstack/maps/` |
79
+ | Authored design sources | `.acstack/designs/` |
80
+ | Archives | `.acstack/archive/` |
81
+ | Legacy change records | `.acstack/changes/` |
82
+ | Legacy review artifacts (retained for explicit import) | `.acstack/alignment-packs/` |
83
+ | Canonical design reviews and imported history | `.acstack/design-reviews/` |
84
+ | Architecture decisions | `.acstack/decisions/` |
85
+ | Cross-domain glossary | `.acstack/CONTEXT.md` |
86
+ | Browser connection | `.acstack/agent-browser.json` |
87
+ | Verification knowledge | `.acstack/verification/VERIFICATION-KNOWLEDGE.md` |
88
+ | Test baseline | `.acstack/.test-baseline` |
89
+ | Decision logs | `.acstack/decision-logs/` |
90
+ | Continuation anchor | `.acstack/HANDOFF.md` |
91
+ | Agent handoffs | `.acstack/handoffs/` |
92
+
93
+ - `/acstack:setup` creates `.acstack/`, then immediately runs `~/.claude/acstack/bin/acstack project-data ensure`
94
+ - Setup asks which parts to track with a multi-select question, with none selected by default
95
+ - CLI and host session startup run `project-data ensure` before checking configuration
96
+ - `ensure` needs no config when `.acstack/` exists and does nothing when no project data exists
97
+ - It installs a managed `/.acstack/**` baseline at the start of the root `.gitignore`
98
+ - Existing user rules follow the baseline, preserving their exceptions
99
+ - Bare filesystem creation cannot trigger a command
100
+ - The first ACStack CLI invocation or session startup enforces the baseline; ACStack runs no filesystem watcher
101
+ - Add native exceptions after existing rules, outside the managed baseline, to track selected parts
102
+ - The user can select configuration, specs, and architecture decisions independently
103
+
104
+ ```gitignore
105
+ # User rules after existing rules and the ACStack-managed baseline
106
+ !/.acstack/
107
+ !/.acstack/project.yaml
108
+ !/.acstack/specs/
109
+ !/.acstack/specs/**
110
+ !/.acstack/decisions/
111
+ !/.acstack/decisions/**
112
+ ```
113
+
114
+ - Reopen `.acstack/` before any selected part to override earlier whole-directory ignores
115
+ - A nested file also needs its parent directory reopened, for example `!/.acstack/verification/` before its file exception
116
+ - Git ignore rules do not untrack files already in the Git index
117
+ - ACStack never force-adds ignored files or changes the Git index to enforce this policy
118
+ - ACStack retires `workflow.alignment_packs` auto-generation, approval, and tracking settings; existing fields have no effect
119
+ - This includes `approval_gate` and `commit_generated_packs`
120
+ - Setup and config writes no longer offer them; ACStack never silently rewrites or deletes existing files
121
+ - Native Git ignore rules alone control tracking
122
+ - Map-linked design approval uses the exact source, saved comments, and contribution inputs, without a new workflow flag
123
+ - `workflow.design_review` still controls only the frontend design pass
124
+ - Installed tools under `~/.claude/acstack/bin/`, XDG configuration, and host-owned `.claude/` settings keep their existing locations
125
+ - Helper programs and user code under `frontend.helpers_dir` stay where they are
126
+ - Verification metadata always uses `.acstack/verification/VERIFICATION-KNOWLEDGE.md`
127
+
128
+ ### Explicit migration from the old layout
129
+
130
+ 1. Update installed ACStack tools before moving project data
131
+ 2. Stop old agent sessions and review processes; old CLI versions and hooks cannot read the new layout
132
+ 3. From the checkout to migrate, run `~/.claude/acstack/bin/acstack project-data migrate`
133
+ 4. Review the working-tree changes, then restart agents and reviews with the updated tools
134
+
135
+ - Migration preflights all moves and aborts on collisions without overwriting destination data
136
+ - It moves old `acstack/` project records, root `CONTEXT.md`, `.test-baseline`, and `agent-browser.json` into the canonical destinations
137
+ - It moves `docs/adr/` to `.acstack/decisions/` and old decision logs to `.acstack/decision-logs/`
138
+ - It moves verification knowledge, not arbitrary helper directories or their programs
139
+ - Previously tracked old paths become pending deletions; their new destinations stay local unless the user opts in
140
+ - Migration preserves local data and makes no Git index changes or automatic tracking exceptions
141
+ - Migrate each checkout explicitly; never move another checkout's data automatically
142
+ - Decision logs still belong to the main checkout at `<main checkout>/.acstack/decision-logs/`
143
+ - If that checkout remains on the legacy layout, stop and report an actionable migration error
144
+ - Do not create a partial `.acstack/` directory there as a workaround
145
+
146
+ ### Explicit import from retired map reviews
147
+
148
+ - ACStack removes legacy `map --map` and `align-viewer` without aliases
149
+ - Use `design-doc <entry>` for authored design review
150
+ - Use `node walk`, `node frontier`, and `node diagram` for map planning
151
+ - Author the new design before importing legacy feedback
152
+
153
+ ```sh
154
+ ~/.claude/acstack/bin/acstack design-review migrate <entry> \
155
+ --legacy-dir <path> --mapping <json-file> [--feedback <json-file>]
156
+ ```
157
+
158
+ - Choose a nonsymlink directory under `.acstack/alignment-packs/`
159
+ - Supply explicit target mappings; see the `design-doc` skill for mapping and reconciliation instructions
160
+ - Migration preserves source artifacts and decision logs unchanged
161
+ - Canonical `review.json` keeps imported feedback and approval history; historical approval never authorizes the current design
162
+ - Startup and archive never import automatically
163
+ - Design source, review evidence, imported history, and decision logs outlive temporary map nodes regardless of `workflow.maps.persist`
164
+
66
165
  ### 1.1. Which file a write lands in
67
166
 
68
167
  *The key decides, and the key alone.*
@@ -70,7 +169,7 @@ Four commands read the file and change nothing.
70
169
  - A `host.*` key describes the machine
71
170
  - It goes to the global config at `~/.config/acstack/config.json`
72
171
  - Every other key in this document describes the project
73
- - It goes to `acstack/project.yaml`
172
+ - It goes to `.acstack/project.yaml`
74
173
  - Section 10 covers the `host.*` keys
75
174
  - `acstack config get <key>` and `acstack config unset <key>` read the same key table and route the same way
76
175
 
@@ -152,7 +251,7 @@ So the result decides which path a write takes, and never the shape of the key.
152
251
 
153
252
  *A file ACStack itself produced always reads back.*
154
253
 
155
- - A project that holds `acstack/` and no `project.yaml` gets the file created
254
+ - A project that holds `.acstack/` and no `project.yaml` gets the file created
156
255
  - A block stating nothing takes a key underneath it, whether the file spells that block as a bare colon, as `null` or as `~`
157
256
  - That is the state `acstack config unset` leaves behind
158
257
  - The tool accepts its own output
@@ -210,7 +309,7 @@ Three refusals protect a file neither command can handle.
210
309
 
211
310
  | Key | Values | Default | What changes |
212
311
  | --- | --- | --- | --- |
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 |
312
+ | `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
313
  | `workflow.tdd.strict` | `true`, `false` | none | deprecated compatibility boolean; no sequencing effect, including explicit `true` |
215
314
  | `workflow.tdd.orchestrator_strict` | `true`, `false` | none | deprecated compatibility boolean; no delegation effect, including explicit `true` |
216
315
  | `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 |
@@ -271,7 +370,7 @@ A **map** is a graph of question nodes and work nodes. A **tracker** is the back
271
370
  | Key | Values | Default | What changes |
272
371
  | --- | --- | --- | --- |
273
372
  | `workflow.maps.tracker` | `github`, `files` | none | the `map`, `implement`, and `archive` skills read the matching backend document and use its operations |
274
- | `workflow.maps.persist` | `true`, `false` | `false` | `true` moves a cleared map's node files to `acstack/archive/[YYYY-MM-DD]-[name]/nodes/`; `false` deletes `acstack/maps/<name>/` |
373
+ | `workflow.maps.persist` | `true`, `false` | `false` | `true` moves a cleared map's node files to `.acstack/archive/[YYYY-MM-DD]-[name]/nodes/`; `false` deletes `.acstack/maps/<name>/` |
275
374
 
276
375
  - An absent `workflow.maps.tracker` means nobody has chosen yet
277
376
  - The `map` skill then picks at the moment it first writes a map's nodes down, confirms the choice with the user, and writes the key
@@ -423,7 +522,7 @@ Two limits are worth knowing.
423
522
  - `200_000` reads as 200,000
424
523
  - Exponent and float notation do not
425
524
  - `2e5` and `2.0` fall back to the default
426
- - The hook opens `acstack/project.yaml` relative to the working directory
525
+ - The hook opens `.acstack/project.yaml` relative to the working directory
427
526
  - A session running outside the project root therefore gets the defaults, whatever the file says
428
527
 
429
528
  ## 7. commands, directories, test_markers and venv
@@ -433,7 +532,7 @@ Two limits are worth knowing.
433
532
  | Key | Values | Default | What changes |
434
533
  | --- | --- | --- | --- |
435
534
  | `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 |
535
+ | `commands.test_collect` | a shell command, or `null` | from the profile | the verification owner compares counts with `.acstack/.test-baseline`; counts alone do not prove coverage |
437
536
  | `commands.build` | a shell command, or `null` | from the profile | the verification owner checks the build with it |
438
537
  | `commands.lint` | a shell command, or `null` | from the profile | the verification owner lints with it, usually with a fix flag |
439
538
  | `commands.typecheck` | a shell command, or `null` | from the profile | the verification owner type-checks with it |
@@ -461,7 +560,7 @@ Two limits are worth knowing.
461
560
  | `frontend.directory` | a path | `frontend/` | where the frontend lives |
462
561
  | `frontend.dev_server_url` | a URL | `http://localhost:3000` | the address the frontend-verifier opens |
463
562
  | `frontend.dev_server_check` | a shell command | a `curl` of the URL | how the frontend-verifier decides the dev server is up |
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 |
563
+ | `frontend.helpers_dir` | a path | `<frontend.directory>/tests/helpers/` | where helper programs live; verification metadata always lives at `.acstack/verification/VERIFICATION-KNOWLEDGE.md` |
465
564
  | `frontend.commands.dev` | a shell command | none | how the frontend-verifier starts the dev server; without it the verifier cannot start one itself |
466
565
  | `frontend.commands.build` | a shell command | from the profile | the frontend build the verification owner runs |
467
566
  | `frontend.commands.lint` | a shell command | from the profile | the frontend lint the verification owner runs |
@@ -480,7 +579,7 @@ The Chrome DevTools Protocol (CDP) is the wire protocol the verifier drives a br
480
579
  | --- | --- | --- | --- |
481
580
  | `frontend.browser.mode` | `remote`, `headless`, `local` | none | the mode `acstack config browser-mode` resolves for the frontend-verifier, weighed against the three host axes; it also picks the `cdp_port` default |
482
581
  | `frontend.browser.fallback` | `none`, `remote`, `headless`, `local` | none | only `none` acts: it forbids another mode from standing in when the host does not declare the preferred one |
483
- | `frontend.browser.cdp_port` | a whole number from 1 to 65535 | `19988` under `mode: remote`, `9555` otherwise | the port the frontend-verifier dials, and the port the `agent-browser-json` row of the check requires `agent-browser.json` to name |
582
+ | `frontend.browser.cdp_port` | a whole number from 1 to 65535 | `19988` under `mode: remote`, `9555` otherwise | the port the frontend-verifier dials, and the port the `agent-browser-json` row of the check requires `.acstack/agent-browser.json` to name |
484
583
 
485
584
  The two defaults come from two different browsers.
486
585
 
@@ -491,7 +590,7 @@ The two defaults come from two different browsers.
491
590
  The port default applies wherever the CLI needs a number.
492
591
 
493
592
  - `acstack config check` holds a project that states no `cdp_port` to the default its mode implies
494
- - It fails when `agent-browser.json` names a different port
593
+ - It fails when `.acstack/agent-browser.json` names a different port
495
594
  - `acstack config show` behaves the other way, printing only what the project states
496
595
  - "What did the project say" and "which port do we dial" are different questions
497
596
 
@@ -27,7 +27,7 @@ flowchart TD
27
27
  AXES --> OPT["Optional axes<br/>(preview, terminal workspace, element picker, Orca topology)"]
28
28
  ORCH -->|"pick the worktree tool"| WT["new-worktree, teardown-worktree"]
29
29
  BROW -->|"pick the browser"| FV["frontend-verifier"]
30
- PROJ["What this project prefers<br/>(frontend.browser.* in acstack/project.yaml)"] --> FV
30
+ PROJ["What this project prefers<br/>(frontend.browser.* in .acstack/project.yaml)"] --> FV
31
31
  OPT -.->|"nothing reads them yet"| CHK["acstack config check lists them"]
32
32
  ```
33
33
 
@@ -46,9 +46,9 @@ flowchart TD
46
46
  | `host.terminal_workspace` | `true`, `false` | no | global config | `/acstack:setup` offers the workspace once, and never asks again after this is set |
47
47
  | `host.element_picker` | `stagewise`, `orca-design-mode`, `none` | no | global config | nothing; check 5 lists it |
48
48
  | `host.orca.topology` | `local`, `remote` | no | global config | nothing; check 5 marks it inert unless `host.orchestrators.orca` is `true` |
49
- | `frontend.browser.mode` | `remote`, `headless`, `local` | no | `acstack/project.yaml` | the preference, weighed against the three host axes |
50
- | `frontend.browser.cdp_port` | a port number | no | `acstack/project.yaml` | `frontend-verifier`; defaults to `19988` for `remote` and `9555` otherwise |
51
- | `frontend.browser.fallback` | `none`, or any word | no | `acstack/project.yaml` | only `none` acts: it forbids a stand-in mode |
49
+ | `frontend.browser.mode` | `remote`, `headless`, `local` | no | `.acstack/project.yaml` | the preference, weighed against the three host axes |
50
+ | `frontend.browser.cdp_port` | a port number | no | `.acstack/project.yaml` | `frontend-verifier`; defaults to `19988` for `remote` and `9555` otherwise |
51
+ | `frontend.browser.fallback` | `none`, or any word | no | `.acstack/project.yaml` | only `none` acts: it forbids a stand-in mode |
52
52
 
53
53
  Where the file lives, and how the CLI reads a value:
54
54
 
@@ -74,6 +74,7 @@ Add `shift` to any of these to open it in a full tab instead of a popup.
74
74
  | Key | Does |
75
75
  |---|---|
76
76
  | `e` | edit in `$EDITOR` |
77
+ | `i` | inspect Markdown in Frogmouth (install with `pipx install frogmouth`; existing `i` bindings take precedence) |
77
78
  | `o` | open by rule, which for markdown is the reader |
78
79
  | `b` | open in the browser you are sitting at |
79
80
  | `D` | send the file to your laptop over Taildrop |
@@ -1562,7 +1562,7 @@ export ACSTACK_OPEN_CMD="ssh laptop open" # or any command taking a URL
1562
1562
  - It needs a tab armed by hand before every session
1563
1563
  - The tab it drives lives in a dedicated Chrome profile rather than your default browser
1564
1564
  - The opener is the answer for reading
1565
- - It is a separate service on purpose, per [ADR 0006](adr/0006-document-opener-service.md)
1565
+ - A separate service opens documents without depending on the relay or the browser automation session
1566
1566
 
1567
1567
  What it does is deliberately small:
1568
1568
 
package/docs/workflows.md CHANGED
@@ -21,7 +21,7 @@ flowchart TD
21
21
  F --> T
22
22
  T --> C["Commit<br/>(acstack:commit)"]
23
23
  C --> Y["Sync specs from the diff<br/>(domain-map.yaml)"]
24
- Y --> L[("Living specs<br/>acstack/specs/")]
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)"]
26
26
  A --> L
27
27
  ```
@@ -102,7 +102,7 @@ Nodes live in a tracker. That is the storage layer, and you can swap it.
102
102
  - The first line of every issue body carries all of that node's edges
103
103
  - One list call therefore returns the whole graph
104
104
  - A sub-issue and a dependency mirror those edges, so GitHub's own interface draws the map
105
- - Files under `acstack/maps/<name>/` are the fallback
105
+ - Files under `.acstack/maps/<name>/` are the fallback
106
106
  - Frontmatter holds the edges, so those files carry no header line
107
107
  - Frontier, claim, and resolve build on those four operations
108
108
  - No tracker implements them itself
@@ -152,9 +152,9 @@ Nodes live in a tracker. That is the storage layer, and you can swap it.
152
152
  - There is no question cap
153
153
  - The set of answerable questions bounds itself
154
154
  - **`record-context`** fires when a decision lands
155
- - It writes an ADR under `docs/adr/` only when the decision is hard to reverse *and* surprising *and* a real trade-off
156
- - It writes a glossary term when a term got settled, in root `CONTEXT.md` for cross-domain vocabulary
157
- - It writes a domain term in `acstack/specs/<domain>/CONTEXT.md` instead
155
+ - It writes an ADR under `.acstack/decisions/` only when the decision is hard to reverse *and* surprising *and* a real trade-off
156
+ - It writes a glossary term when a term got settled, in `.acstack/CONTEXT.md` for cross-domain vocabulary
157
+ - It writes a domain term in `.acstack/specs/<domain>/CONTEXT.md` instead
158
158
  - It can write both, or neither
159
159
  - ACStack generates the ADR index from the files
160
160
  - Nobody hand-edits it
@@ -194,9 +194,9 @@ flowchart LR
194
194
 
195
195
  `/acstack:commit` groups changes into MECE commits. MECE means mutually exclusive and collectively exhaustive: no change appears twice, and no change goes missing. Before writing them it does five things.
196
196
 
197
- 1. Reads `acstack/domain-map.yaml` to map each changed file to a domain.
197
+ 1. Reads `.acstack/domain-map.yaml` to map each changed file to a domain.
198
198
  2. Works out what the diff adds, modifies or removes, for each affected domain with a `spec.md`.
199
- 3. Writes those entries into the domain's spec and stages them in the same commit.
199
+ 3. Writes those entries into the domain's spec; it stages tracked specs and preserves ignored specs locally without force-adding them.
200
200
  4. Flags source files that match no domain.
201
201
  5. Checks the glossaries.
202
202
 
@@ -214,7 +214,7 @@ Four cases stop sync.
214
214
  - no file matching a domain
215
215
  - a change that touches only docs and config
216
216
 
217
- **Without `acstack/domain-map.yaml` this step does nothing, silently.**
217
+ **Without `.acstack/domain-map.yaml` this step does nothing, silently.**
218
218
 
219
219
  - `/acstack:setup` generates that file
220
220
  - `acstack config check` reports it as missing on a project set up before that existed
@@ -223,11 +223,16 @@ Four cases stop sync.
223
223
 
224
224
  *A map is working state, not a record you keep. Archive checks the decisions reached your specs, your decision notes, and your glossary, then deletes the nodes.*
225
225
 
226
- - `/acstack:archive` checks for a cleared map: empty frontier, no fog, no claims
227
- - It spot-checks that the specs, the decision notes and the glossary captured what the effort settled
226
+ - `/acstack:archive` checks all nodes, not just the frontier: no open questions, fog, or claims apart from the root
227
+ - A bound design requires completed feedback reconciliation and current exact-revision approval
228
+ - Archive checks living specs against implemented behavior, not proposals
229
+ - Archive applies `record-context`'s existing ADR and glossary criteria
230
+ - Archive records dropped scope, unresolved limits, and durable node provenance before disposal
231
+ - Design source, canonical review evidence, imported history, and decision logs survive regardless of `workflow.maps.persist`
232
+ - Archive never recursively deletes review artifacts or evidence-bearing handoffs
228
233
  - It then disposes of the nodes
229
234
  - It deletes them by default
230
- - It moves them to `acstack/archive/<date>-<name>/nodes/` when `workflow.maps.persist` is `true`
235
+ - It moves them to `.acstack/archive/<date>-<name>/nodes/` when `workflow.maps.persist` is `true`
231
236
  - Keeping nodes is off by default
232
237
  - A kept map is a second copy of every decision
233
238
  - The two drift apart
@@ -237,14 +242,14 @@ Four cases stop sync.
237
242
  - The user types `/acstack:archive`
238
243
  - `/acstack:map` hands off to it once every node resolves
239
244
  - The disposal step then asks you first
240
- - Legacy `acstack/changes/` directories from the pre-map workflow still archive the old way
245
+ - Legacy `.acstack/changes/` directories from the pre-map workflow still archive the old way
241
246
  - An upgrade therefore never strands work
242
247
 
243
248
  ## 7. Living specs
244
249
 
245
- *What the project keeps. ACStack deletes a map once every question resolves. `acstack/specs/` outlives it.*
250
+ *What the project keeps. ACStack deletes a map once every question resolves. `.acstack/specs/` outlives it.*
246
251
 
247
- - Specs live at `acstack/specs/<domain>/spec.md`, organised by the domains in `domain-map.yaml`
252
+ - Specs live at `.acstack/specs/<domain>/spec.md`, organised by the domains in `domain-map.yaml`
248
253
  - Each spec states numbered functional requirements (`FR-NNN`) in Given, When, Then form
249
254
  - They are cumulative
250
255
  - They describe only what the code already does
@@ -257,8 +262,9 @@ Two rules keep them honest.
257
262
  - Archive verifies a completed map left nothing behind
258
263
  - Both converge on the same files
259
264
  - **Fix it when you see it**
260
- - Any agent that finds a spec contradicting the code corrects the spec immediately
261
- - It rewrites wrong behaviour, appends missing requirements, and deletes stale references
265
+ - An agent that finds a contradiction corrects the spec or routes the correction to its owner
266
+ - A read-only reviewer reports the discrepancy to the completion owner
267
+ - The owner rewrites wrong behaviour, appends missing requirements, and deletes stale references
262
268
 
263
269
  `/acstack:bootstrap` generates the first set from an existing codebase. A project never starts from an empty directory.
264
270
 
@@ -0,0 +1,273 @@
1
+ # ACStack design review
2
+
3
+ ACStack guides design authoring, saves browser feedback, reconciles optional map contributions, and records exact-revision approval with retained evidence.
4
+
5
+ <!-- Generated from the entry YAML and its element files; regenerate with design-doc --markdown -->
6
+
7
+ ```mermaid
8
+ flowchart TD
9
+ element_user["Project developer<br/>actor"]
10
+ subgraph element_acstack["ACStack plugin"]
11
+ element_skills["Agent skills<br/>component · agent"]
12
+ element_host["Agent session setup<br/>component · agent"]
13
+ subgraph element_cli["CLI package"]
14
+ element_review-runtime["Review command and server<br/>component · cli, web"]
15
+ element_viewer["Browser review interface<br/>component · web"]
16
+ end
17
+ end
18
+ element_design-source["Authored design files<br/>store"]
19
+ element_github["GitHub<br/>external-system · web"]
20
+ element_user -->|"Requests design guidance from"| element_skills
21
+ element_user -->|"Optionally publishes the Markdown companion to"| element_github
22
+ element_skills -->|"Guides the agent to run"| element_review-runtime
23
+ element_host -->|"Registers"| element_skills
24
+ element_review-runtime -->|"Reads design source"| element_design-source
25
+ element_review-runtime <-->|"Exchanges the design and comments with"| element_viewer
26
+ ```
27
+
28
+ ## Review the design before implementation
29
+
30
+ ACStack saves design feedback, reconciles comments and optional map contributions, and records human approval of the exact reviewed inputs.
31
+
32
+ This example keeps the existing architecture: Agent skills guide the agent; the Review command and server validate source and save review evidence. The Browser review interface shows the design and collects feedback and approval. Review the responsibilities, containment, and labeled arrows before implementation.
33
+
34
+ ### Author, review, reconcile, and approve
35
+
36
+ 1. The developer asks the agent to prepare a design through the Agent skills registered by Agent session setup
37
+ 2. The agent writes the entry, element YAML, and supporting Markdown in one bounded directory tree
38
+ 3. The agent runs `acstack design-doc design.yaml --markdown /tmp/acstack-design-review.md` with an unused output path and keeps the server running
39
+ 4. The server validates source and serves the prepared graph with bundled browser assets; the browser never reads YAML directly
40
+ 5. The developer saves comments, chooses Send to agent, and pastes the copied prompt into the agent session
41
+ 6. The agent reads the saved review, revises source, and uses `acstack design-review status design.yaml` to inspect feedback and optional map contributions
42
+ 7. The agent explicitly reconciles each selected comment and current contribution, then resolves blocking human questions or marks dropped scope out of scope
43
+ 8. The agent reopens changed source for review; the human chooses Approve this revision once reconciliation is current
44
+ 9. The agent requires `approval.valid: true` from status before implementation, then runs the separate implementation checks
45
+ 10. At map closeout, archive verifies implemented functional requirements in living specs, architecture decision records (ADRs), and agreed glossary terms before disposing of temporary nodes
46
+
47
+ The developer can manually publish the generated Markdown companion to GitHub. Publication does not transfer browser comments or approval, and ACStack does not track that publication automatically.
48
+
49
+ ### Approval belongs to exact inputs
50
+
51
+ - Approval binds `sourceRevision`, `reviewRevision`, `commentsDigest`, and `mapInputsDigest`, not the rendered page alone
52
+ - Each selected comment and current contribution needs one explicit disposition: `applied`, `retained`, or `needs-human`, with a rationale
53
+ - Unresolved blocking decisions or a `needs-human` disposition prevent approval; comments alone never authorize implementation
54
+ - Source, saved feedback, or meaningful contribution changes reopen the gate; presentation regeneration alone preserves approval
55
+
56
+ - Use `design-review status` for the current tuple and contribution keys
57
+ - Follow `skills/design-doc/SKILL.md` for the reconciliation schema and `design-review reconcile <entry> --input <json-file>`
58
+ - Select earlier feedback with `--review-file <canonical-review.json>` when reconciling that history
59
+ - Original comments stay with their original version
60
+ - Previously selected histories remain review obligations after later source changes
61
+
62
+ This revised example is a new draft requiring fresh human approval.
63
+
64
+ ### Map binding is optional
65
+
66
+ This portable example has no map binding. A project can add `planning: {tracker: files | github, map: <name>}` and put `Design entry: <repository-relative-path>` in its map root. Node bodies supply explicit design contributions; the map does not become the architecture graph.
67
+
68
+ Bundled browser assets require no external fetch or design upload. Agent-side reads of a GitHub-bound map still need GitHub access. The diagram's GitHub arrow describes manual Markdown publication, not tracker synchronization.
69
+
70
+ ### Archive preserves evidence; legacy import is explicit
71
+
72
+ - Archive checks current approval and reconciliation before closing a bound map
73
+ - Archive verifies implemented requirements against source and verification evidence
74
+ - Archive records qualifying ADRs and glossary terms
75
+ - Archive retains design sources, canonical reviews, import history, original legacy artifacts, and decision logs independently of node disposal
76
+
77
+ - Use `node walk`, `node frontier`, and `node diagram` for planning; ACStack retires `map --map` and `align-viewer` without aliases
78
+ - Import legacy feedback only through `design-review migrate` with an explicit target mapping
79
+ - Treat imported approval as historical; imported comments require reconciliation and fresh exact-revision approval
80
+ - Startup and archive never migrate automatically
81
+
82
+ ### Local source and optional GitHub publication
83
+
84
+ - Authored design files are the local YAML and supporting Markdown read by the Review command and server
85
+ - GitHub hosts a published copy of the generated companion only when the Project developer chooses to share it
86
+ - Git ignore rules control ordinary tracking; they neither publish files nor prevent local browser review
87
+ - Both the Authored design files and GitHub drawers explain source ownership, published copies, and ignore rules
88
+
89
+ ### Containment and arrows keep their existing meaning
90
+
91
+ The ACStack plugin contains Agent skills, Agent session setup, and the CLI package. The CLI package contains the Review command and server and the Browser review interface. The Project developer, Authored design files, and GitHub remain outside the plugin.
92
+
93
+ - Each component is one entity, shown collapsed or expanded
94
+ - Nesting means containment; arrows connect responsible entities, never ancestors to descendants
95
+ - Read one-way arrows as actor, action, and target: the server reads source, and the developer optionally publishes Markdown
96
+ - The bidirectional review-session arrow covers the prepared graph, posted comments, and retrieved comments
97
+ - Concerns describe shared requirements without changing containment
98
+
99
+ ### Optional repository context
100
+
101
+ - Authoring, reconciliation, approval, and migration guidance: `skills/design-doc/SKILL.md`
102
+ - Local review and lifecycle commands: `cli/src/commands/design-doc.ts`
103
+ - Bounded source validation, graph, and Markdown generation: `cli/src/lib/design-doc.ts`
104
+ - Contributions and exact-input approval: `cli/src/lib/design-map.ts`, `cli/src/lib/design-lifecycle.ts`
105
+ - Saved review history and legacy imports: `cli/src/lib/design-review.ts`, `cli/src/lib/design-migration.ts`
106
+ - Closeout and evidence retention: `skills/archive/SKILL.md`
107
+
108
+ - Run the review command from this example directory with a built CLI
109
+ - Choose `--port <port>` if another review uses the default port
110
+ - Use an unused path for each Markdown export
111
+ - Keep the companion beside source when its relative links must work on GitHub
112
+ - New designs default to Git-ignored `.acstack/designs/`; this repository intentionally tracks this public example
113
+
114
+
115
+ ## Project developer
116
+
117
+ *Authors the design and reviews the exported artifact locally.*
118
+
119
+ - Identity: `user`
120
+ - Kind: actor
121
+ - Channels: none
122
+ - Source: [user.yaml](user.yaml)
123
+
124
+
125
+
126
+ ## ACStack plugin
127
+
128
+ *Ships agent skills, session setup, and a bundled CLI.*
129
+
130
+ - Identity: `acstack`
131
+ - Kind: component
132
+ - Channels: none
133
+ - Source: [acstack.yaml](acstack.yaml)
134
+
135
+
136
+
137
+ ## Agent skills
138
+
139
+ *Guide the agent through authoring and exporting a design for review.*
140
+
141
+ - Identity: `skills`
142
+ - Kind: component
143
+ - Channels: agent
144
+ - Source: [skills.yaml](skills.yaml)
145
+
146
+ ## Honest review status
147
+
148
+ - Requirement: An exported review artifact must not imply that a reviewer approved a map or implementation.
149
+ - Design response: Comments and exports are not approval. Approval requires reconciled feedback and contributions, resolved blocking questions, and the exact source, review, comments, and map-input tuple. Implementation checks remain separate.
150
+ - Applies to: skills, review-runtime, viewer
151
+
152
+ ## Agent session setup
153
+
154
+ *Registers ACStack skill commands and adds rules for planning, coding, and checking changes to the agent's session.*
155
+
156
+ - Identity: `host`
157
+ - Kind: component
158
+ - Channels: agent
159
+ - Source: [host.yaml](host.yaml)
160
+
161
+
162
+
163
+ ## CLI package
164
+
165
+ *Ships the review command, local server, and browser review interface.*
166
+
167
+ - Identity: `cli`
168
+ - Kind: component
169
+ - Channels: none
170
+ - Source: [cli.yaml](cli.yaml)
171
+
172
+
173
+
174
+ ## Review command and server
175
+
176
+ *Reads and validates authored YAML, serves the browser review interface, saves comments, and exports Markdown.*
177
+
178
+ - Identity: `review-runtime`
179
+ - Kind: component
180
+ - Channels: cli, web
181
+ - Source: [review-runtime.yaml](review-runtime.yaml)
182
+
183
+ ## Offline review
184
+
185
+ - Requirement: Reviewers can inspect the design without uploading project details or fetching browser assets.
186
+ - Design response: The review command and server read bounded local source files and embed validated graph data with bundled browser assets, without uploading the design. Agent-side reads of GitHub-bound maps still require network access.
187
+ - Applies to: review-runtime, viewer, design-source
188
+
189
+ ## Honest review status
190
+
191
+ - Requirement: An exported review artifact must not imply that a reviewer approved a map or implementation.
192
+ - Design response: Comments and exports are not approval. Approval requires reconciled feedback and contributions, resolved blocking questions, and the exact source, review, comments, and map-input tuple. Implementation checks remain separate.
193
+ - Applies to: skills, review-runtime, viewer
194
+
195
+ ## Browser review interface
196
+
197
+ *Receives the prepared design graph and syncs comments with the local server.*
198
+
199
+ - Identity: `viewer`
200
+ - Kind: component
201
+ - Channels: web
202
+ - Source: [viewer.yaml](viewer.yaml)
203
+
204
+ ## Offline review
205
+
206
+ - Requirement: Reviewers can inspect the design without uploading project details or fetching browser assets.
207
+ - Design response: The review command and server read bounded local source files and embed validated graph data with bundled browser assets, without uploading the design. Agent-side reads of GitHub-bound maps still require network access.
208
+ - Applies to: review-runtime, viewer, design-source
209
+
210
+ ## Honest review status
211
+
212
+ - Requirement: An exported review artifact must not imply that a reviewer approved a map or implementation.
213
+ - Design response: Comments and exports are not approval. Approval requires reconciled feedback and contributions, resolved blocking questions, and the exact source, review, comments, and map-input tuple. Implementation checks remain separate.
214
+ - Applies to: skills, review-runtime, viewer
215
+
216
+ ## Authored design files
217
+
218
+ *Holds the local YAML and supporting Markdown that the review server reads.*
219
+
220
+ - Identity: `design-source`
221
+ - Kind: store
222
+ - Channels: none
223
+ - Source: [store.yaml](store.yaml)
224
+
225
+ Authored design files define the design in the local checkout; GitHub hosts a published copy only if the developer chooses to share it.
226
+
227
+ - Local files drive the review
228
+ - The Review command and server read the local YAML and supporting Markdown to generate the browser view and Markdown companion
229
+ - Revise these source files when the design changes
230
+ - Local browser review and saved comments work without publishing design files to GitHub
231
+ - GitHub hosts a published copy
232
+ - The Project developer can commit and push the generated companion for others to read on GitHub
233
+ - The developer can publish the companion alone or include the authored source files
234
+ - GitHub does not replace the local files read by the review server or automatically receive its saved comments
235
+ - This diagram's publication arrow is separate from using GitHub issues as a map tracker
236
+ - Git ignore rules control tracking, not publication
237
+ - Ignore rules exclude matching untracked files from ordinary staging
238
+ - Removing an ignore rule does not stage, commit, or push anything
239
+ - Already tracked files remain tracked even if an ignore rule later matches them
240
+ - New project designs under `.acstack/` stay ignored by default; this public example is tracked separately
241
+
242
+
243
+ ## Offline review
244
+
245
+ - Requirement: Reviewers can inspect the design without uploading project details or fetching browser assets.
246
+ - Design response: The review command and server read bounded local source files and embed validated graph data with bundled browser assets, without uploading the design. Agent-side reads of GitHub-bound maps still require network access.
247
+ - Applies to: review-runtime, viewer, design-source
248
+
249
+ ## GitHub
250
+
251
+ *Hosts a published copy of the Markdown companion when the developer chooses to share it.*
252
+
253
+ - Identity: `github`
254
+ - Kind: external-system
255
+ - Channels: web
256
+ - Source: [github.yaml](github.yaml)
257
+
258
+ Authored design files define the design in the local checkout; GitHub hosts a published copy only if the developer chooses to share it.
259
+
260
+ - Local files drive the review
261
+ - The Review command and server read the local YAML and supporting Markdown to generate the browser view and Markdown companion
262
+ - Revise these source files when the design changes
263
+ - Local browser review and saved comments work without publishing design files to GitHub
264
+ - GitHub hosts a published copy
265
+ - The Project developer can commit and push the generated companion for others to read on GitHub
266
+ - The developer can publish the companion alone or include the authored source files
267
+ - GitHub does not replace the local files read by the review server or automatically receive its saved comments
268
+ - This diagram's publication arrow is separate from using GitHub issues as a map tracker
269
+ - Git ignore rules control tracking, not publication
270
+ - Ignore rules exclude matching untracked files from ordinary staging
271
+ - Removing an ignore rule does not stage, commit, or push anything
272
+ - Already tracked files remain tracked even if an ignore rule later matches them
273
+ - New project designs under `.acstack/` stay ignored by default; this public example is tracked separately