acstack 0.50.4 → 0.52.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 (111) 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/cli/dist/index.js +7187 -6402
  15. package/cli/dist/index.js.map +4 -4
  16. package/cli/package.json +1 -1
  17. package/docs/config-reference.md +113 -14
  18. package/docs/dev-setups.md +4 -4
  19. package/docs/terminal-workspace.md +1 -1
  20. package/docs/workflows.md +22 -16
  21. package/examples/design-doc/acstack/README.md +273 -0
  22. package/examples/design-doc/acstack/acstack.yaml +4 -0
  23. package/examples/design-doc/acstack/cli.yaml +5 -0
  24. package/examples/design-doc/acstack/design.yaml +39 -0
  25. package/examples/design-doc/acstack/github.yaml +12 -0
  26. package/examples/design-doc/acstack/host.yaml +14 -0
  27. package/examples/design-doc/acstack/journey.md +85 -0
  28. package/examples/design-doc/acstack/publication.md +16 -0
  29. package/examples/design-doc/acstack/review-runtime.yaml +24 -0
  30. package/examples/design-doc/acstack/skills.yaml +22 -0
  31. package/examples/design-doc/acstack/store.yaml +11 -0
  32. package/examples/design-doc/acstack/user.yaml +15 -0
  33. package/examples/design-doc/acstack/viewer.yaml +13 -0
  34. package/hooks/ac-writing-style-reminder.sh +7 -18
  35. package/hooks/communication-standard.mjs +17 -0
  36. package/hooks/communication-standard.sh +6 -0
  37. package/hooks/context-pressure.sh +2 -2
  38. package/hooks/hooks.json +18 -0
  39. package/hooks/lib/communication-standard.mjs +16 -0
  40. package/hooks/project-data.sh +38 -0
  41. package/hooks/session-start-handoff.sh +21 -7
  42. package/hooks/session-start.sh +9 -2
  43. package/orchestrator/AGENTS.md +25 -14
  44. package/output-styles/ac-writing-style.md +75 -276
  45. package/package.json +2 -1
  46. package/pi/agents/frontend-verifier.md +89 -6
  47. package/pi/agents/task-checker.md +83 -2
  48. package/pi/agents/task-executor.md +83 -1
  49. package/pi/agents/test-writer.md +77 -1
  50. package/pi/extension.ts +70 -12
  51. package/profiles/fullstack-python.yaml +1 -1
  52. package/profiles/node-typescript.yaml +1 -1
  53. package/profiles/python.yaml +1 -1
  54. package/skills/archive/SKILL.md +53 -36
  55. package/skills/bootstrap/SKILL.md +6 -6
  56. package/skills/bridge/SKILL-VM.md +11 -2
  57. package/skills/bridge/SKILL-WINDOWS.md +3 -3
  58. package/skills/browser-verify/SKILL.md +14 -5
  59. package/skills/code-review/SKILL.md +8 -2
  60. package/skills/commit/SKILL.md +7 -6
  61. package/skills/compact-and-continue/SKILL.md +9 -8
  62. package/skills/design-doc/SKILL.md +238 -0
  63. package/skills/explore/SKILL.md +1 -1
  64. package/skills/grilling/SKILL.md +4 -4
  65. package/skills/handoff/SKILL.md +4 -4
  66. package/skills/host/SKILL.md +1 -1
  67. package/skills/host/detect-host.sh +2 -2
  68. package/skills/host/notes.md +2 -2
  69. package/skills/host/questions.md +1 -1
  70. package/skills/implement/SKILL.md +20 -13
  71. package/skills/implement/decision-log.md +9 -8
  72. package/skills/implement/design-pass.md +16 -2
  73. package/skills/map/SKILL.md +15 -71
  74. package/skills/map/alignment.md +18 -27
  75. package/skills/map/frontend.md +1 -1
  76. package/skills/map/materialising.md +74 -0
  77. package/skills/map/trackers/files.md +4 -6
  78. package/skills/pre-commit-review/SKILL.md +15 -9
  79. package/skills/pre-commit-review/auto-fix.md +1 -1
  80. package/skills/quick-fix/SKILL.md +1 -1
  81. package/skills/record-context/SKILL.md +6 -6
  82. package/skills/setup/SKILL.md +15 -50
  83. package/skills/setup/browser.md +2 -2
  84. package/skills/setup/first-run.md +19 -8
  85. package/skills/setup/report.md +3 -2
  86. package/skills/setup/row-fixes.md +56 -9
  87. package/skills/sync/SKILL.md +12 -11
  88. package/skills/terminal-workspace/SKILL.md +1 -1
  89. package/skills/test-conventions/SKILL.md +2 -2
  90. package/skills/visual-docs/SKILL.md +69 -235
  91. package/skills/writing/SKILL.md +29 -217
  92. package/skills/writing/examples.md +62 -129
  93. package/docs/adr/0001-ste-writing-standard.md +0 -16
  94. package/docs/adr/0002-version-gate-not-auto-bump.md +0 -35
  95. package/docs/adr/0003-handoff-ack-command.md +0 -19
  96. package/docs/adr/0004-dev-setup-per-host.md +0 -13
  97. package/docs/adr/0005-two-orchestrators-per-host.md +0 -25
  98. package/docs/adr/0006-document-opener-service.md +0 -89
  99. package/docs/adr/0007-lead-check-reads-the-transcript.md +0 -87
  100. package/docs/adr/0008-cli-audits-skill-interviews.md +0 -37
  101. package/docs/adr/0009-verify-the-write-not-the-writer.md +0 -51
  102. package/docs/adr/0010-promote-dev-to-main-by-fast-forward.md +0 -115
  103. package/docs/adr/0011-node-header-is-the-edge-encoding.md +0 -20
  104. package/docs/adr/0012-node-kind-is-a-closed-set-of-five.md +0 -31
  105. package/docs/adr/0013-the-diagram-renderer-is-pure.md +0 -23
  106. package/docs/adr/0014-reading-a-node-hides-its-generated-diagram.md +0 -29
  107. package/docs/adr/0015-a-node-id-links-to-its-issue-through-an-anchor.md +0 -37
  108. package/docs/adr/0016-the-map-root-carries-no-status-of-its-own.md +0 -21
  109. package/docs/adr/0017-call-impeccable-copy-only-its-questions.md +0 -13
  110. package/docs/adr/0018-alignment-packs-use-local-viewers.md +0 -11
  111. package/docs/adr/index.md +0 -18
@@ -92,7 +92,7 @@ You have full context of the ACStack system. Use it naturally, don't force it.
92
92
  ### Check for context
93
93
 
94
94
  At the start, quickly check what exists – maps on the configured tracker
95
- (`ls acstack/maps/` on the files backend) and living specs
95
+ (`ls .acstack/maps/` on the files backend) and living specs
96
96
  (`~/.claude/acstack/bin/acstack list --specs --json`).
97
97
 
98
98
  ### When no map exists
@@ -65,7 +65,7 @@ session.
65
65
 
66
66
  ## Presentation
67
67
 
68
- `workflow.grilling.questions` in `acstack/project.yaml` picks the mode:
68
+ `workflow.grilling.questions` in `.acstack/project.yaml` picks the mode:
69
69
 
70
70
  | Value | Behaviour |
71
71
  | ---------------- | ------------------------------------------------------------------------------------ |
@@ -108,7 +108,7 @@ the tracker's `update` and `create` operations:
108
108
 
109
109
  2. Create a node for each new question the answer surfaced, with `answers`
110
110
  naming the node that surfaced it. Mark precise questions `open`; mark the
111
- rest `fog`. If fog does not change the alignment artifact, write the
111
+ rest `fog`. If fog does not change the design, write the
112
112
  evidence or event that reopens it.
113
113
 
114
114
  3. Invoke the `record-context` skill for each resolution – it decides whether
@@ -127,8 +127,8 @@ belong in git:
127
127
  ```markdown
128
128
  ## Answer
129
129
 
130
- Map nodes stay out of git. `acstack/maps/` goes in `.gitignore`, because a
131
- node is working state that the map throws away once it clears.
130
+ Map nodes stay local by default under `.acstack/maps/`.
131
+ The user can opt in through native root `.gitignore` exceptions.
132
132
 
133
133
  The durable output is the living specs, the architecture decision records and
134
134
  the glossary. The `record-context` skill extracts each one as a node
@@ -54,7 +54,7 @@ its answer looks wrong. It says why a child must stop, and what it checks.
54
54
  ## First: is this yours to invoke?
55
55
 
56
56
  If the user asked for a handoff, proceed. If you invoke it on your own
57
- initiative, first read `workflow.handoff.self_invoke` from `acstack/project.yaml`.
57
+ initiative, first read `workflow.handoff.self_invoke` from `.acstack/project.yaml`.
58
58
 
59
59
  If it is `false`, stop. Tell the user a handoff looks warranted and why. Ask
60
60
  permission.
@@ -102,8 +102,8 @@ it should run the command.
102
102
  | Map state and reading order | `~/.claude/acstack/bin/acstack node walk --map <name>` (reading order of the map) |
103
103
  | What can be worked next | `~/.claude/acstack/bin/acstack node frontier --map <name>` (what is workable now) |
104
104
  | Files in flight | `git status --short` and `git diff` |
105
- | Test baseline, last result | `.test-baseline`, then run the suite |
106
- | What the code does | the living specs in `acstack/specs/` |
105
+ | Test baseline, last result | `.acstack/.test-baseline`, then run the suite |
106
+ | What the code does | the living specs in `.acstack/specs/` |
107
107
 
108
108
  On GitHub, `--map` refuses – pipe `gh issue list` into `--stdin` per the
109
109
  map skill's `trackers/github.md`.
@@ -157,7 +157,7 @@ Its first line repeats the acknowledgement requirement verbatim, with
157
157
  Acknowledge before any other tool call. Run ~/.claude/acstack/bin/acstack handoff ack accept --file <this-file> "<one-line reason>", or ack decline --file <this-file> "<one-line reason>". The command writes <this-file>.ack, which the sender watches.
158
158
  ```
159
159
 
160
- This temp file is not `acstack/HANDOFF.md`, the `compact-and-continue` anchor.
160
+ This temp file is not `.acstack/HANDOFF.md`, the `compact-and-continue` anchor.
161
161
  Never put this line into that anchor, which has to start with `---` frontmatter.
162
162
 
163
163
  Head the rest with the same skeleton the `compact-and-continue` anchor uses. The
@@ -29,7 +29,7 @@ Three terms, before they get used:
29
29
  ## Why this is per machine, not per project
30
30
 
31
31
  The answers go to the ACStack CLI's global config, never to
32
- `acstack/project.yaml`. Read [`notes.md`](notes.md) when the user asks why.
32
+ `.acstack/project.yaml`. Read [`notes.md`](notes.md) when the user asks why.
33
33
 
34
34
  ## What this skill installs
35
35
 
@@ -246,8 +246,8 @@ project_root="$(git rev-parse --show-toplevel 2>/dev/null || true)"
246
246
  # verification, so we look for it at column zero only - `frontend:` nested under
247
247
  # some other key means something else entirely.
248
248
  has_frontend="false"
249
- if [ -n "$project_root" ] && [ -f "${project_root}/acstack/project.yaml" ]; then
250
- if grep -q '^frontend:' "${project_root}/acstack/project.yaml" 2>/dev/null; then
249
+ if [ -n "$project_root" ] && [ -f "${project_root}/.acstack/project.yaml" ]; then
250
+ if grep -q '^frontend:' "${project_root}/.acstack/project.yaml" 2>/dev/null; then
251
251
  has_frontend="true"
252
252
  fi
253
253
  fi
@@ -20,7 +20,7 @@ interface. That is a JSON file at `~/.config/acstack/config.json`, or under
20
20
  `$XDG_CONFIG_HOME` when you set that environment variable. Run
21
21
  `~/.claude/acstack/bin/acstack config path` to print the real location.
22
22
 
23
- They do not go in `acstack/project.yaml`.
23
+ They do not go in `.acstack/project.yaml`.
24
24
 
25
25
  Project concerns stay in `project.yaml`. In particular
26
26
  `frontend.browser.mode` stays there as the *project's preference*, while
@@ -77,7 +77,7 @@ git worktrees and say so. An environment variable for an orchestrator that was
77
77
  never declared is worth a warning, not a refusal.
78
78
 
79
79
  **The host declares, the project prefers.** `host.browser.*` says what this
80
- machine can do. `frontend.browser.mode` in `acstack/project.yaml` says what the
80
+ machine can do. `frontend.browser.mode` in `.acstack/project.yaml` says what the
81
81
  project would like.
82
82
 
83
83
  Today the only thing that compares the two is the ACStack command-line
@@ -22,7 +22,7 @@ What it reports, and what each field is evidence for:
22
22
  | `orca_topology.serve_unit_active` | A user-level service named exactly `orca` is running, which is the shape of a machine serving Orca to a viewer elsewhere. The name is an assumption: whatever provisions the server picks it, and nothing pins it yet. A unit installed under any other name reads here as "no server". The topology recommendation below then comes out `local` when this machine has Orca, and stays empty when it does not |
23
23
  | `claude_settings.orca_hooks_present` | `~/.claude/settings.json` mentions Orca somewhere. The match is a loose, case-insensitive search for that word anywhere in the file, so an unrelated path or permission entry containing it counts too – this is evidence that Orca has wired its hooks in, not proof |
24
24
  | `claude_settings.backup_exists` | `~/.claude/settings.json.bak` exists |
25
- | `project.root`, `project.has_frontend` | The git repository the current directory sits in, and whether its `acstack/project.yaml` configures a frontend |
25
+ | `project.root`, `project.has_frontend` | The git repository the current directory sits in, and whether its `.acstack/project.yaml` configures a frontend |
26
26
 
27
27
  Several sections also carry a `recommended` field. That is the script's
28
28
  mechanical reading of the evidence above it and nothing more. It is a starting
@@ -22,7 +22,7 @@ $ARGUMENTS
22
22
  ### 1. Find the work
23
23
 
24
24
  Check the configured tracker for maps (`workflow.maps.tracker` in
25
- `acstack/project.yaml`; the map skill's `trackers/` docs declare the
25
+ `.acstack/project.yaml`; the map skill's `trackers/` docs declare the
26
26
  operations – files backend shown below).
27
27
 
28
28
  **A map exists** (or `$ARGUMENTS` names one):
@@ -40,12 +40,10 @@ off the root.
40
40
 
41
41
  Before claiming one, check whether the map is ready to build from:
42
42
 
43
- - If any `fog` node changes the alignment artifact, stop and point the user at
44
- `/acstack:map`.
45
- - If `workflow.alignment_packs.approval_gate` is true and no reviewer approved
46
- the alignment artifact, stop and point the user at `/acstack:map`.
47
- - If a `fog` node needs later evidence and does not change the artifact, leave
48
- it on the map with its reopening trigger.
43
+ - If any `fog` node changes the design, stop and point the user at `/acstack:map`
44
+ - For a bound design, require `approval.valid: true` from `acstack design-review status <entry>`
45
+ - If approval is invalid, return to `/acstack:design-doc` for reconciliation and exact-revision approval
46
+ - If a `fog` node needs later evidence without changing the design, leave it with its reopening trigger
49
47
 
50
48
  If the frontier holds only `hitl` nodes – human in the loop, meaning a
51
49
  person must answer them – stop and point the user at `/acstack:map`. Those
@@ -57,7 +55,7 @@ small unit of work, and nothing has to declare it small.
57
55
 
58
56
  ### 2. Read project configuration
59
57
 
60
- Read `acstack/project.yaml` for build/test/lint commands and directory paths.
58
+ Read `.acstack/project.yaml` for build/test/lint commands and directory paths.
61
59
 
62
60
  ### 3. Create feature branch
63
61
 
@@ -104,6 +102,15 @@ Nodes describe behaviour, not paths. **Resolve paths at claim time**.
104
102
  Investigate relevant source, callers, tests, and docs directly or through useful delegation.
105
103
  Pass discovered paths and requirements to any delegated agents to avoid repeated searches.
106
104
 
105
+ - Before implementation, read the root node's `Design entry` reference when present
106
+ - Run `acstack design-review status <entry>`
107
+ - Require its `planning.tracker` and `planning.map` to match the active map before trusting its approval
108
+ - Stop on a missing or different binding; an approval for another map does not authorize this work
109
+ - Require `approval.valid: true`
110
+ - Reconcile feedback and contributions through `/acstack:design-doc` when approval is invalid
111
+ - Reopen review after source, saved comments, or contribution inputs change
112
+ - Keep unsettled requirements in design/map records; living specs describe verified implementation
113
+
107
114
  ### 5. Execute within the claim
108
115
 
109
116
  Apply the shared Implementation discipline to the claimed node or bare request.
@@ -118,11 +125,11 @@ Apply the shared Implementation discipline to the claimed node or bare request.
118
125
 
119
126
 
120
127
  **Decision log**: on afk nodes, append one row per decision point to
121
- `<main checkout>/acstack/.decisions/<name>.tsv`. A decision point is a fork chosen, a
128
+ `<main checkout>/.acstack/decision-logs/<name>.tsv`. A decision point is a fork chosen, a
122
129
  unit verified, a revert, or a blocker.
123
130
 
124
131
  Read `decision-log.md` before the first row. It holds how to find the main
125
- checkout, the columns, and the `.gitignore` the directory needs.
132
+ checkout, the columns, and the root ignore baseline.
126
133
 
127
134
  **Parallelism**: use teams when independent nodes benefit from parallel work.
128
135
  Assign non-overlapping files, and schedule shared-file changes sequentially.
@@ -147,14 +154,14 @@ decision landed. With a map, then:
147
154
  - Classify anything the work surfaced:
148
155
  - Agent-clearable fog gets research, tests, or a throwaway prototype.
149
156
  - Design-changing fog becomes a `hitl` node and returns to `/acstack:map`.
150
- - Local fog that does not change the artifact stays inside the claim notes.
151
- - Rebuild or rerun the alignment review when the work changes the artifact.
157
+ - Local fog that does not change the design stays inside the claim notes.
158
+ - Reopen design review when source, saved comments, or contribution inputs change.
152
159
  - Recompute the frontier – resolutions unblock nodes.
153
160
 
154
161
  ### 7. Build verification
155
162
 
156
163
  After each node (and before ending the session), run the commands from
157
- `acstack/project.yaml`: build, full test suite, lint and typecheck. All must
164
+ `.acstack/project.yaml`: build, full test suite, lint and typecheck. All must
158
165
  pass before claiming the next node.
159
166
 
160
167
  ### 8. Completion
@@ -19,7 +19,7 @@ gets no row.
19
19
  ## Where the log lives
20
20
 
21
21
  The log is one file per map, in the main checkout:
22
- `<main checkout>/acstack/.decisions/<name>.tsv`. The `<name>` is the map name
22
+ `<main checkout>/.acstack/decision-logs/<name>.tsv`. The `<name>` is the map name
23
23
  you pass to `--map`.
24
24
 
25
25
  Write it in the main checkout, never in a worktree. Removing a worktree
@@ -30,12 +30,13 @@ it. Find the main checkout from any worktree:
30
30
  main=$(dirname "$(git rev-parse --path-format=absolute --git-common-dir)")
31
31
  ```
32
32
 
33
- Nobody commits the log. When you first create the `acstack/.decisions/`
34
- directory, write `.gitignore` inside it, containing a single line:
35
-
36
- ```text
37
- *
38
- ```
33
+ - The root managed baseline ignores `.acstack/decision-logs/` by default
34
+ - Check the main checkout's layout before creating or writing the log
35
+ - If it still has legacy project records, stop with an actionable migration error
36
+ - Tell the user to update installed tools, stop old agents and reviews, and explicitly migrate that checkout before restarting
37
+ - Never move another checkout's records automatically or create a partial `.acstack/` there
38
+ - On an already migrated main checkout, run `~/.claude/acstack/bin/acstack project-data ensure` before writing the log
39
+ - Do not add a nested ignore file; native exceptions in the root `.gitignore` alone control tracking
39
40
 
40
41
  ## What a row holds
41
42
 
@@ -59,4 +60,4 @@ Never edit or delete a row. A wrong call gets a new row that supersedes it,
59
60
  and its `why` names the row it replaces.
60
61
 
61
62
  `/acstack:archive` reads the log before it closes the map. It hands lasting
62
- decisions to `record-context`, then deletes the log file.
63
+ decisions to `record-context` and retains the original log independently of `workflow.maps.persist`.
@@ -17,13 +17,22 @@ flowchart TD
17
17
 
18
18
  ## 0. Load design context before a UI edit (mandatory)
19
19
 
20
+ - Frontend content fills its component's available width with equal horizontal padding; text wraps only after filling that width
21
+ - Reuse the project's font family and a small type scale; equivalent text uses identical typography, with variations reserved for meaningful hierarchy
22
+ - Align related elements to shared edges or baselines; use consistent spacing and indentation to show their hierarchy
23
+ - Center status text and controls on the same row, including inside nested action groups; a centered parent does not align its children
24
+ - Use shared spacing tokens or repeated gaps and padding; avoid one-off offsets that conceal a layout error
25
+ - Reserve scrollbar space in scrollable panels so overflow never shifts text or changes line wrapping
26
+ - Render dropdown menus with shared project components and tokens, not browser-native option menus or per-screen copies
27
+ - Preserve keyboard navigation, screen-reader semantics, visible focus, dismissal, and viewport fit in shared dropdowns
28
+
20
29
  impeccable is a third-party design plugin. It holds the project's design context, meaning the files that state the design rules and the token definitions a UI file follows.
21
30
 
22
31
  Load that context before your first edit under `frontend.directory`. Load it once per task.
23
32
 
24
33
  **Check the design gate first**
25
34
 
26
- The design gate is the set of optional checks impeccable adds to acstack's pipeline. `workflow.design_review` in `acstack/project.yaml` turns the gate on. Ask acstack for the answer:
35
+ The design gate is the set of optional checks impeccable adds to acstack's pipeline. `workflow.design_review` in `.acstack/project.yaml` turns the gate on. Ask acstack for the answer:
27
36
 
28
37
  ```bash
29
38
  ~/.claude/acstack/bin/acstack design-gate --json
@@ -85,7 +94,7 @@ impeccable installs its own PostToolUse hook, a check Claude Code runs right aft
85
94
  - Follow the shared Implementation discipline in `orchestrator/AGENTS.md`
86
95
  - The verification owner gathers the file list, completes static checks, and handles the detector
87
96
  - A delegated task-checker may own this work, but its presence is optional
88
- - Read `acstack/project.yaml` before deriving paths
97
+ - Read `.acstack/project.yaml` before deriving paths
89
98
  - This pass requires a configured `frontend`
90
99
  - `frontend.directory` defaults to `frontend/` when omitted
91
100
  - If the project configures no frontend, warn that `frontend.directory` is missing and skip this pass
@@ -107,6 +116,11 @@ git status --porcelain -- <frontend.directory>
107
116
 
108
117
  ## 2. Run the design detector
109
118
 
119
+ - Verify shared edges, text baselines, control centers, gaps, and padding before running the detector
120
+ - Check nested groups as well as their parents; a shared row must not leave status text aligned to a button's top edge
121
+ - Check normal, pending, error, and narrow layouts; compare bounding boxes or text baselines in the browser rather than judging a screenshot alone
122
+ - Verify dropdowns reuse the shared component and project tokens before running the detector
123
+ - Check arrow keys, Home/End, Enter/Space, Escape, Tab, focus, and viewport fit when a shared dropdown changes
110
124
  - Check the design gate before running the detector
111
125
 
112
126
  ```bash
@@ -23,7 +23,7 @@ frontier, claim, resolve and walk.
23
23
  Two backends ship in this skill's directory: `trackers/github.md` for repos
24
24
  with GitHub auth, and `trackers/files.md` as the fallback.
25
25
 
26
- `workflow.maps.tracker` in `acstack/project.yaml` (`github` or `files`) records
26
+ `workflow.maps.tracker` in `.acstack/project.yaml` (`github` or `files`) records
27
27
  the project's choice. If the key names a backend, read the matching doc and use
28
28
  its operations. If the key is absent, pick at materialisation time – the moment
29
29
  you first write the map's nodes down.
@@ -33,7 +33,7 @@ choice with the user. Then write the key, so later sessions need not re-decide.
33
33
  ## Which mode
34
34
 
35
35
  One command runs two modes, and what already exists picks between them. Check
36
- the configured tracker for existing maps – `ls acstack/maps/` on the files
36
+ the configured tracker for existing maps – `ls .acstack/maps/` on the files
37
37
  backend, `gh label list --search "map:" --json name` on GitHub.
38
38
 
39
39
  If `$ARGUMENTS` names a map, or exactly one exists, work its frontier – the
@@ -51,7 +51,7 @@ still one map.
51
51
 
52
52
  2. **Load the frontend branch on a frontend destination.** `frontend.md`
53
53
  beside this skill holds five more rules. Read it when the destination
54
- touches `frontend.directory`, the path in `acstack/project.yaml` where the
54
+ touches `frontend.directory`, the path in `.acstack/project.yaml` where the
55
55
  frontend lives. Every other map skips it.
56
56
 
57
57
  3. **Open with a breadth-first grill.** Work the conversation frontier in
@@ -64,11 +64,18 @@ still one map.
64
64
  sharp. The test is whether you can *state* the question precisely, not
65
65
  whether you can answer it.
66
66
 
67
- 5. **Classify fog.** Read `alignment.md`. Blocking fog changes the alignment
68
- artifact. Deferred fog does not.
67
+ 5. **Classify fog.** Read `alignment.md`. Blocking fog changes the design.
68
+ Deferred fog does not.
69
69
 
70
70
  ### Progressive materialisation
71
71
 
72
+ Before deciding whether the map must persist:
73
+
74
+ - Invoke `/acstack:design-doc` for shared behavior, component boundaries, or data-flow decisions
75
+ - Apply that condition to conversation-only work as well as persisted maps
76
+ - Skip design documents when those decisions are absent, including pure copyediting
77
+ - When a design is required, require current design approval before implementation; changed source or contribution inputs reopen review
78
+
72
79
  The machinery appears only when it must persist. After the opening grill:
73
80
 
74
81
  - **No fog surfaced** – say so and proceed to the work
@@ -81,70 +88,7 @@ The test is mechanical. Will the fog outlive this session?
81
88
 
82
89
  ### Materialising
83
90
 
84
- Pick the tracker (see Tracker above), then create the nodes with its `create`
85
- operation. First the root:
86
-
87
- ```bash
88
- # files backend – github.md has the equivalent
89
- ~/.claude/acstack/bin/acstack node create --map <name> --title "<destination>" \
90
- --kind destination --label "<at most four words>" --summary "<one sentence>" \
91
- --body "<the destination, as settled>"
92
- ```
93
-
94
- - The root is the destination. Pass no `--status` flag, so it opens.
95
-
96
- The root's state follows its subtree. It stays open while any node below
97
- it is open, fog or claimed. `archive` resolves it when the map clears.
98
- Nothing else writes the root's status, and the frontier never returns it.
99
-
100
- - The root counts as pinned without the flag, and on GitHub it carries the
101
- `root-node` label. The walk returns pinned nodes in full at the start of
102
- every session, so every session orients to the root.
103
-
104
- - On GitHub, every node body opens with a header line that encodes its edges.
105
- `trackers/github.md` holds the format. The files backend writes none.
106
-
107
- - Every node carries a required `kind` and `label`, its short diagram name.
108
- Work nodes and the destination add a one-sentence business `--summary`.
109
- `trackers/files.md` holds the kinds, the caps, and the CLI's contract.
110
-
111
- - Every node body carries a diagram, two at most. A childless `notes` node is
112
- the one exception.
113
-
114
- `visuals.md` holds which visual each kind gets, where it sits in the body,
115
- and the rules a hand-drawn one follows. Read it before the first body.
116
-
117
- - Standing preferences for the effort become one resolved node. Style rules
118
- and constraints the grill surfaced go there. Create it with
119
- `--answers <root id> --kind notes --label "<at most four words>" --pinned`.
120
-
121
- - Every other surfaced question becomes a node. Give it `open` or `fog` per
122
- the fog test.
123
-
124
- Pass `--answers <id>` to name the node whose resolution surfaced it. That
125
- link is the node's provenance, the trail back to the root. Pass
126
- `--blocked-by` only where you genuinely cannot settle one node before
127
- another.
128
-
129
- - `mode` defaults to `hitl` – human in the loop, meaning a person answers it.
130
-
131
- A node earns `afk` – away from keyboard, meaning an agent settles it alone
132
- – only by containing no decision. Research earns it, and so does work
133
- whose questions are all settled. Get this wrong and an agent quietly
134
- decides something that was the human's.
135
-
136
- - Write every title and body per the `writing` skill.
137
- - Nodes describe behaviour, not file paths. A node can sit on the frontier for
138
- weeks while the codebase moves – you resolve the paths at claim time.
139
-
140
- - Draw every parent's diagram once every node exists, per Regenerating
141
- diagrams below. A parent draws its subtree, so nothing can draw one earlier.
142
- The root is a parent too, and it draws the whole map.
143
-
144
- - Apply `alignment.md` after diagrams are current. Build the artifact, run the
145
- review gate, and start implementation only after approval.
146
- - On the files backend, suggest adding `acstack/maps/` to `.gitignore`
147
- (`trackers/files.md` gives the reason).
91
+ Read [materialising.md](materialising.md) and follow its full procedure before creating map nodes.
148
92
 
149
93
  ## Working the frontier
150
94
 
@@ -200,12 +144,12 @@ the list, marked `skip: <reason>`.
200
144
  5. **After every resolution**, in order:
201
145
  - Invoke `record-context`
202
146
  - Create nodes for anything the resolution surfaced
203
- - Classify new fog by whether it changes the alignment artifact
147
+ - Classify new fog by whether it changes the design
204
148
  - Create the critique node when the resolved node changed the frontend,
205
149
  per `frontend.md`
206
150
  - Regenerate the diagram on the resolved node's parent (see Regenerating
207
151
  diagrams)
208
- - Rebuild or rerun the alignment review when the artifact changes
152
+ - Reopen design review when source, saved comments, or contribution inputs change
209
153
  - Recompute the frontier
210
154
 
211
155
  The regeneration comes after the new nodes exist. A surfaced node hangs
@@ -1,38 +1,29 @@
1
- # Alignment review
1
+ # Design review
2
2
 
3
- The alignment artifact is the human-readable end-state view that the CLI renders from the map.
3
+ Use an authored design for shared behavior, component boundaries, and data-flow decisions; map nodes track questions and work.
4
4
 
5
5
  ## Fog classes
6
6
 
7
- - Blocking fog changes the artifact
8
- - Deferred fog needs later evidence, or sits below the level the artifact must settle
9
- - Clear blocking fog before implementation starts
10
- - Leave deferred fog on the map with the evidence or event that reopens it
7
+ - Blocking fog changes the design
8
+ - Deferred fog needs later evidence or sits below the design's scope
9
+ - Clear blocking fog before implementation
10
+ - Record the evidence or event that reopens deferred fog
11
11
  - Never defer fog because asking feels inconvenient
12
12
 
13
13
  ## Review gate
14
14
 
15
- Build the artifact after diagrams are current:
16
-
17
- ```bash
18
- ~/.claude/acstack/bin/acstack map --map <name>
19
- ```
20
-
21
- The artifact is disposable. The map remains the source of truth.
22
-
23
- Run the review before implementation when `workflow.alignment_packs.approval_gate` is true:
24
-
25
- ```bash
26
- ~/.claude/acstack/bin/acstack align-viewer --map <name>
27
- ```
28
-
29
- If the review requests changes, read the feedback file the command prints.
30
- Update the map, regenerate the diagrams, and rerun the review.
31
-
32
- Start implementation only after the reviewer approves the artifact, or after the project disables the approval gate.
15
+ - Follow `/acstack:design-doc` to author the design, bind the map, and record node contributions
16
+ - Run `~/.claude/acstack/bin/acstack design-doc <entry>` for live review
17
+ - Reconcile saved feedback and current contributions through `design-review reconcile`
18
+ - Require `approval.valid: true` from `~/.claude/acstack/bin/acstack design-review status <entry>` before implementation
19
+ - Approval covers the exact source, saved comments, and map contribution inputs
20
+ - Reopen review when those inputs change; regenerating presentation alone preserves approval
21
+ - Use `node walk`, `node frontier`, and `node diagram` for planning views, not architecture generation
22
+ - ACStack removes legacy `map --map` and `align-viewer` without aliases
23
+ - Use explicit `design-review migrate` for legacy feedback (see `/acstack:design-doc`)
33
24
 
34
25
  ## New fog during implementation
35
26
 
36
- - If new fog changes the artifact, return to `/acstack:map`
37
- - If new fog does not change the artifact, keep working with a local note
38
- - Rebuild or rerun the review when implementation changes the artifact
27
+ - Return design-changing fog to `/acstack:map`
28
+ - Keep other fog with its reopening trigger
29
+ - Revise the authored design and repeat reconciliation and approval when review inputs change
@@ -4,7 +4,7 @@ A map whose destination changes the frontend carries five rules that no other
4
4
  map loads, and this file holds all five.
5
5
 
6
6
  `SKILL.md` decides when to read this file. The destination has to touch
7
- `frontend.directory`, the path in `acstack/project.yaml` where the frontend
7
+ `frontend.directory`, the path in `.acstack/project.yaml` where the frontend
8
8
  lives.
9
9
 
10
10
  Two plugins appear in the rules below.
@@ -0,0 +1,74 @@
1
+ # Materialising a map
2
+
3
+ Create map nodes with the selected tracker after charting requires persistence.
4
+
5
+ Read this procedure when [the map skill](SKILL.md#materialising) reaches materialisation, before creating any node.
6
+
7
+ Pick the tracker (see [Tracker](SKILL.md#tracker)), then create the nodes with its `create`
8
+ operation. First the root:
9
+
10
+ ```bash
11
+ # files backend – github.md has the equivalent
12
+ ~/.claude/acstack/bin/acstack node create --map <name> --title "<destination>" \
13
+ --kind destination --label "<at most four words>" --summary "<one sentence>" \
14
+ --body "<the destination, as settled>"
15
+ ```
16
+
17
+ - The root is the destination. Pass no `--status` flag, so it opens.
18
+
19
+ The root's state follows its subtree. It stays open while any node below
20
+ it is open, fog or claimed. `archive` resolves it when the map clears.
21
+ Nothing else writes the root's status, and the frontier never returns it.
22
+
23
+ - The root counts as pinned without the flag, and on GitHub it carries the
24
+ `root-node` label. The walk returns pinned nodes in full at the start of
25
+ every session, so every session orients to the root.
26
+
27
+ - On GitHub, every node body opens with a header line that encodes its edges.
28
+ [`trackers/github.md`](trackers/github.md) holds the format. The files backend writes none.
29
+
30
+ - Every node carries a required `kind` and `label`, its short diagram name.
31
+ Work nodes and the destination add a one-sentence business `--summary`.
32
+ [`trackers/files.md`](trackers/files.md) holds the kinds, the caps, and the CLI's contract.
33
+
34
+ - Every node body carries a diagram, two at most. A childless `notes` node is
35
+ the one exception.
36
+
37
+ [`visuals.md`](visuals.md) holds which visual each kind gets, where it sits in the body,
38
+ and the rules a hand-drawn one follows. Read it before the first body.
39
+
40
+ - Standing preferences for the effort become one resolved node. Style rules
41
+ and constraints the grill surfaced go there. Create it with
42
+ `--answers <root id> --kind notes --label "<at most four words>" --pinned`.
43
+
44
+ - Every other surfaced question becomes a node. Give it `open` or `fog` per
45
+ the fog test.
46
+
47
+ Pass `--answers <id>` to name the node whose resolution surfaced it. That
48
+ link is the node's provenance, the trail back to the root. Pass
49
+ `--blocked-by` only where you genuinely cannot settle one node before
50
+ another.
51
+
52
+ - `mode` defaults to `hitl` – human in the loop, meaning a person answers it.
53
+
54
+ A node earns `afk` – away from keyboard, meaning an agent settles it alone
55
+ – only by containing no decision. Research earns it, and so does work
56
+ whose questions are all settled. Get this wrong and an agent quietly
57
+ decides something that was the human's.
58
+
59
+ - Write every title and body per the `writing` skill.
60
+ - Nodes describe behaviour, not file paths. A node can sit on the frontier for
61
+ weeks while the codebase moves – you resolve the paths at claim time.
62
+
63
+ - Draw every parent's diagram once every node exists, per [Regenerating
64
+ diagrams](SKILL.md#regenerating-diagrams). A parent draws its subtree, so nothing can draw one earlier.
65
+ The root is a parent too, and it draws the whole map.
66
+
67
+ - When a design is required:
68
+ - Record `Design entry: <repository-relative-path>` in the root node body
69
+ - Bind the entry back to the map with `planning: {tracker: files | github, map: <name>}`
70
+ - Require `design-review status` to return that same `planning` binding before using its approval for this map
71
+ - Record proposals in the node body's `## Design contributions` section using the format in `/acstack:design-doc`
72
+ - Reconcile proposals and saved feedback explicitly; surface conflicts as decision nodes
73
+ - On the files backend, the root Git ignore rules exclude `.acstack/maps/` unless the user opts in
74
+ ([`trackers/files.md`](trackers/files.md) gives the reason).
@@ -1,16 +1,16 @@
1
1
  # Files tracker
2
2
 
3
3
  The fallback backend: no auth, works offline, works on any remote. One
4
- markdown file per node under `acstack/maps/<name>/`, managed by the ACStack
4
+ markdown file per node under `.acstack/maps/<name>/`, managed by the ACStack
5
5
  CLI. Nodes here are transient working state – scratch discarded once the map
6
6
  clears.
7
7
 
8
- Suggest adding `acstack/maps/` to `.gitignore` when you first create the
9
- map.
8
+ The root managed baseline ignores `.acstack/maps/` by default.
9
+ Native exceptions after that baseline let the user opt in to tracking any part.
10
10
 
11
11
  CLI path: `~/.claude/acstack/bin/acstack`
12
12
 
13
- To enumerate a project's maps: `ls acstack/maps/`.
13
+ To enumerate a project's maps: `ls .acstack/maps/`.
14
14
 
15
15
  ## The four operations
16
16
 
@@ -73,5 +73,3 @@ Both commands drop every diagram block a node body holds. A diagram block is
73
73
  the rendered map that sits between the `<!-- acstack:diagram -->` markers
74
74
  `node diagram` writes. `--visuals` prints the blocks. `--json` always carries
75
75
  the whole body.
76
-
77
- See `docs/adr/0014-reading-a-node-hides-its-generated-diagram.md` for why.