@chinhae/atw-cli 0.2.10 → 0.3.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 (97) hide show
  1. package/README.md +29 -5
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +243 -123
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/commands/uninstall.d.ts.map +1 -1
  6. package/dist/commands/uninstall.js +18 -3
  7. package/dist/commands/uninstall.js.map +1 -1
  8. package/dist/commands/update.d.ts +0 -3
  9. package/dist/commands/update.d.ts.map +1 -1
  10. package/dist/commands/update.js +45 -0
  11. package/dist/commands/update.js.map +1 -1
  12. package/dist/configurators/index.d.ts +8 -0
  13. package/dist/configurators/index.d.ts.map +1 -1
  14. package/dist/configurators/index.js +19 -0
  15. package/dist/configurators/index.js.map +1 -1
  16. package/dist/migrations/manifests/0.3.0.json +3410 -0
  17. package/dist/templates/atw/config.yaml +4 -3
  18. package/dist/templates/atw/index.d.ts +2 -0
  19. package/dist/templates/atw/index.d.ts.map +1 -1
  20. package/dist/templates/atw/index.js +4 -0
  21. package/dist/templates/atw/index.js.map +1 -1
  22. package/dist/templates/atw/scripts/common/noob_mode.py +102 -0
  23. package/dist/templates/atw/scripts/common/session_context.py +7 -0
  24. package/dist/templates/atw/scripts/noob_mode.py +41 -0
  25. package/dist/templates/atw/scripts/tickets.py +66 -10
  26. package/dist/templates/atw/workflow.md +81 -17
  27. package/dist/templates/common/bundled-skills/atw-code-review/SKILL.md +4 -2
  28. package/dist/templates/common/bundled-skills/atw-codebase-design/DESIGN-IT-TWICE.md +1 -1
  29. package/dist/templates/common/bundled-skills/atw-diagnosing-bugs/SKILL.md +2 -2
  30. package/dist/templates/common/bundled-skills/atw-domain-modeling/{CONTEXT-FORMAT.md → GLOSSARY-FORMAT.md} +10 -10
  31. package/dist/templates/common/bundled-skills/atw-domain-modeling/SKILL.md +12 -12
  32. package/dist/templates/common/bundled-skills/atw-handoff/SKILL.md +1 -1
  33. package/dist/templates/common/bundled-skills/atw-implement/SKILL.md +6 -4
  34. package/dist/templates/common/bundled-skills/atw-implement-spec/SKILL.md +79 -0
  35. package/dist/templates/common/bundled-skills/atw-implement-spec/agents/openai.yaml +5 -0
  36. package/dist/templates/common/bundled-skills/atw-improve-codebase-architecture/SKILL.md +5 -5
  37. package/dist/templates/common/bundled-skills/atw-init-repo/SKILL.md +6 -4
  38. package/dist/templates/common/bundled-skills/atw-init-repo/references/domain.md +8 -8
  39. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw-local.md +5 -2
  40. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-atw.md +5 -2
  41. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-github.md +5 -4
  42. package/dist/templates/common/bundled-skills/atw-init-repo/references/issue-tracker-gitlab.md +2 -2
  43. package/dist/templates/common/bundled-skills/atw-init-repo/references/triage-labels.md +1 -1
  44. package/dist/templates/common/bundled-skills/atw-interview/SKILL.md +9 -1
  45. package/dist/templates/common/bundled-skills/atw-map/SKILL.md +5 -5
  46. package/dist/templates/common/bundled-skills/atw-noob-mode/SKILL.md +101 -0
  47. package/dist/templates/common/bundled-skills/atw-noob-mode/agents/openai.yaml +3 -0
  48. package/dist/templates/common/bundled-skills/atw-spec/SKILL.md +1 -1
  49. package/dist/templates/common/bundled-skills/atw-tdd/SKILL.md +2 -2
  50. package/dist/templates/common/bundled-skills/atw-tickets/SKILL.md +4 -4
  51. package/dist/templates/common/bundled-skills/atw-triage/SKILL.md +2 -2
  52. package/dist/templates/common/commands/continue.md +1 -1
  53. package/dist/templates/opencode/plugins/inject-workflow-state.js +29 -1
  54. package/dist/templates/shared-hooks/inject-subagent-context.py +29 -3
  55. package/dist/templates/shared-hooks/inject-workflow-state.py +27 -3
  56. package/dist/templates/shared-hooks/session-start.py +23 -0
  57. package/dist/templates/snow/SNOW.md +1 -1
  58. package/dist/utils/file-writer.d.ts.map +1 -1
  59. package/dist/utils/file-writer.js +29 -16
  60. package/dist/utils/file-writer.js.map +1 -1
  61. package/dist/utils/interactive-guard.d.ts +2 -2
  62. package/dist/utils/interactive-guard.js +2 -2
  63. package/dist/utils/lang.d.ts +14 -0
  64. package/dist/utils/lang.d.ts.map +1 -0
  65. package/dist/utils/lang.js +20 -0
  66. package/dist/utils/lang.js.map +1 -0
  67. package/dist/utils/optional-skills.d.ts +90 -0
  68. package/dist/utils/optional-skills.d.ts.map +1 -0
  69. package/dist/utils/optional-skills.js +266 -0
  70. package/dist/utils/optional-skills.js.map +1 -0
  71. package/dist/utils/template-fetcher.d.ts +6 -0
  72. package/dist/utils/template-fetcher.d.ts.map +1 -1
  73. package/dist/utils/template-fetcher.js +1 -1
  74. package/dist/utils/template-fetcher.js.map +1 -1
  75. package/package.json +2 -2
  76. package/dist/templates/common/bundled-skills/atw-merge/SKILL.md +0 -14
  77. package/dist/templates/common/bundled-skills/atw-merge/agents/openai.yaml +0 -3
  78. package/dist/templates/common/bundled-skills/dejargonizer/SKILL.md +0 -133
  79. package/dist/templates/common/bundled-skills/noob-mode/SKILL.md +0 -175
  80. package/dist/templates/common/bundled-skills/noob-mode/references/examples.md +0 -418
  81. package/dist/templates/common/bundled-skills/noob-mode/references/glossary.md +0 -368
  82. package/dist/templates/common/bundled-skills/oxy-explanation/SKILL.md +0 -80
  83. package/dist/templates/common/bundled-skills/oxy-learning-hub/SKILL.md +0 -179
  84. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/course.css +0 -1044
  85. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/course.js +0 -184
  86. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/lesson-template.html +0 -125
  87. package/dist/templates/common/bundled-skills/oxy-learning-hub/assets/summary-template.html +0 -659
  88. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/publishing.md +0 -64
  89. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/summary-mode.md +0 -96
  90. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/GLOSSARY-FORMAT.md +0 -30
  91. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/LEARNING-RECORD-FORMAT.md +0 -42
  92. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/MISSION-FORMAT.md +0 -50
  93. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching/RESOURCES-FORMAT.md +0 -40
  94. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/teaching-mode.md +0 -251
  95. package/dist/templates/common/bundled-skills/oxy-learning-hub/references/workspace.md +0 -112
  96. package/dist/templates/common/bundled-skills/oxy-learning-hub/scripts/validate_html.py +0 -200
  97. package/dist/templates/common/bundled-skills/show-me/SKILL.md +0 -127
@@ -18,7 +18,7 @@ It is skipped when no screenshots were passed, and the final report says so.
18
18
 
19
19
  **This skill only reports — it edits nothing.** Neither this skill nor either sub-agent writes to a source file: not to fix a finding, not to tidy something noticed in passing. They read the frozen patch and produce findings. Hand every finding back to whoever called the review — the user, or `/atw-implement` — and let the caller decide what changes. A reviewer that fixes what it found leaves no independent record of what was wrong, and the next review reads its own edits as the baseline.
20
20
 
21
- The issue tracker should have been provided to you. If `docs/agents/issue-tracker.md` is missing, tell the user to call the Skill tool for `atw-init-repo`, which asks which tracker this repo uses and writes that file.
21
+ The issue tracker should have been provided to you. If `docs/agents/issue-tracker.md` is missing, tell the user to run `/atw-init-repo`, which asks which tracker this repo uses and writes that file.
22
22
 
23
23
  ## Process
24
24
 
@@ -63,7 +63,7 @@ Look for the originating spec, in this order:
63
63
 
64
64
  ### 3. Identify the standards sources
65
65
 
66
- Anything in the repo that documents how code should be written, such as `CODING_STANDARDS.md` or `CONTRIBUTING.md`.
66
+ Search the repo for every file that documents how code should be written. When `CODING_STANDARDS.md` or `CONTRIBUTING.md` exists, it must be on the list.
67
67
 
68
68
  On top of whatever the repo documents, the Standards axis always carries the **smell baseline** below — a fixed set of Fowler code smells (_Refactoring_, ch.3) that applies even when a repo documents nothing. Two rules bind it:
69
69
 
@@ -112,6 +112,8 @@ If the spec is missing, skip the Spec sub-agent and note this in the final repor
112
112
 
113
113
  This sub-agent needs a model that can view images. If none is available, skip it and say in the final report that the Visual axis did not run.
114
114
 
115
+ Issue every sub-agent call together, in the foreground, and aggregate the reports they return.
116
+
115
117
  ### 5. Aggregate
116
118
 
117
119
  Present the reports under `## Standards` and `## Spec` headings — plus `## Visual` when that axis ran — verbatim or lightly cleaned. Do **not** merge or rerank findings — the axes are deliberately separate (see _Why two axes_).
@@ -27,7 +27,7 @@ Prompt each sub-agent with a separate technical brief (file paths, coupling deta
27
27
  - Agent 3: "Optimise for the most common caller — make the default case trivial."
28
28
  - Agent 4 (if applicable): "Design around ports & adapters for cross-seam dependencies."
29
29
 
30
- Include both [SKILL.md](SKILL.md) vocabulary and CONTEXT.md vocabulary in the brief so each sub-agent names things consistently with the architecture language and the project's domain language.
30
+ Include both [SKILL.md](SKILL.md) vocabulary and GLOSSARY.md vocabulary in the brief so each sub-agent names things consistently with the architecture language and the project's domain language.
31
31
 
32
32
  Each sub-agent outputs:
33
33
 
@@ -7,7 +7,7 @@ description: "用于排查顽固错误和性能退化的诊断循环。当用户
7
7
 
8
8
  A discipline for hard bugs. Skip phases only when explicitly justified.
9
9
 
10
- When exploring the codebase, read `CONTEXT.md` (if it exists) to get a clear mental model of the relevant modules, and check ADRs in the area you're touching.
10
+ When exploring the codebase, read `GLOSSARY.md` (if it exists) to get a clear mental model of the relevant modules, and check ADRs in the area you're touching.
11
11
 
12
12
  ## Redact
13
13
 
@@ -122,7 +122,7 @@ A correct seam is one where the test exercises the **real bug pattern** as it oc
122
122
  If a correct seam exists:
123
123
 
124
124
  1. Turn the minimised repro into a failing test at that seam.
125
- 2. Watch it fail.
125
+ 2. Watch it fail. If you forced the red by mutating code or a fixture, `diff` against a pristine copy to prove the mutation landed before you trust it.
126
126
  3. Apply the fix.
127
127
  4. Watch it pass.
128
128
  5. Re-run the Phase 1 feedback loop against the original (un-minimised) scenario.
@@ -1,4 +1,4 @@
1
- # CONTEXT.md Format
1
+ # GLOSSARY.md Format
2
2
 
3
3
  ## Structure
4
4
 
@@ -31,18 +31,18 @@ _Avoid_: Client, buyer, account
31
31
 
32
32
  ## Single vs multi-context repos
33
33
 
34
- **Single context (most repos):** One `CONTEXT.md` at the repo root.
34
+ **Single context (most repos):** One `GLOSSARY.md` at the repo root.
35
35
 
36
- **Multiple contexts:** A `CONTEXT-MAP.md` at the repo root lists the contexts, where they live, and how they relate to each other:
36
+ **Multiple contexts:** A `GLOSSARY-MAP.md` at the repo root lists the contexts, where they live, and how they relate to each other:
37
37
 
38
38
  ```md
39
- # Context Map
39
+ # Glossary Map
40
40
 
41
41
  ## Contexts
42
42
 
43
- - [Ordering](./src/ordering/CONTEXT.md) — receives and tracks customer orders
44
- - [Billing](./src/billing/CONTEXT.md) — generates invoices and processes payments
45
- - [Fulfillment](./src/fulfillment/CONTEXT.md) — manages warehouse picking and shipping
43
+ - [Ordering](./src/ordering/GLOSSARY.md) — receives and tracks customer orders
44
+ - [Billing](./src/billing/GLOSSARY.md) — generates invoices and processes payments
45
+ - [Fulfillment](./src/fulfillment/GLOSSARY.md) — manages warehouse picking and shipping
46
46
 
47
47
  ## Relationships
48
48
 
@@ -53,8 +53,8 @@ _Avoid_: Client, buyer, account
53
53
 
54
54
  The skill infers which structure applies:
55
55
 
56
- - If `CONTEXT-MAP.md` exists, read it to find contexts
57
- - If only a root `CONTEXT.md` exists, single context
58
- - If neither exists, create a root `CONTEXT.md` lazily when the first term is resolved
56
+ - If `GLOSSARY-MAP.md` exists, read it to find contexts
57
+ - If only a root `GLOSSARY.md` exists, single context
58
+ - If neither exists, create a root `GLOSSARY.md` lazily when the first term is resolved
59
59
 
60
60
  When multiple contexts exist, infer which one the current topic relates to. If unclear, ask.
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: atw-domain-modeling
3
- description: "构建并完善项目的领域模型。适用于讨论代码库术语、编写或编辑 CONTEXT.md 文件,以及记录或编辑 ADR 时。"
3
+ description: "构建并完善项目的领域模型。适用于讨论代码库术语、编写或编辑 GLOSSARY.md 文件,以及记录或编辑 ADR 时。"
4
4
  ---
5
5
 
6
6
  # ATW Domain Modeling
7
7
 
8
- Actively build and sharpen the project's domain model as you design. This is the *active* discipline — challenging terms, inventing edge-case scenarios, and writing the glossary and decisions down the moment they crystallise. (Merely *reading* `CONTEXT.md` for vocabulary is not this skill — that's a one-line habit any skill can do. This skill is for when you're changing the model, not just consuming it.)
8
+ Actively build and sharpen the project's domain model as you design. This is the *active* discipline — challenging terms, inventing edge-case scenarios, and writing the glossary and decisions down the moment they crystallise. (Merely *reading* `GLOSSARY.md` for vocabulary is not this skill — that's a one-line habit any skill can do. This skill is for when you're changing the model, not just consuming it.)
9
9
 
10
10
  ## File structure
11
11
 
@@ -13,7 +13,7 @@ Most repos have a single context:
13
13
 
14
14
  ```
15
15
  /
16
- ├── CONTEXT.md
16
+ ├── GLOSSARY.md
17
17
  ├── docs/
18
18
  │ └── adr/
19
19
  │ ├── 0001-event-sourced-orders.md
@@ -21,29 +21,29 @@ Most repos have a single context:
21
21
  └── src/
22
22
  ```
23
23
 
24
- If a `CONTEXT-MAP.md` exists at the root, the repo has multiple contexts. The map points to where each one lives:
24
+ If a `GLOSSARY-MAP.md` exists at the root, the repo has multiple contexts. The map points to where each one lives:
25
25
 
26
26
  ```
27
27
  /
28
- ├── CONTEXT-MAP.md
28
+ ├── GLOSSARY-MAP.md
29
29
  ├── docs/
30
30
  │ └── adr/ ← system-wide decisions
31
31
  ├── src/
32
32
  │ ├── ordering/
33
- │ │ ├── CONTEXT.md
33
+ │ │ ├── GLOSSARY.md
34
34
  │ │ └── docs/adr/ ← context-specific decisions
35
35
  │ └── billing/
36
- │ ├── CONTEXT.md
36
+ │ ├── GLOSSARY.md
37
37
  │ └── docs/adr/
38
38
  ```
39
39
 
40
- Create files lazily — only when you have something to write. If no `CONTEXT.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed.
40
+ Create files lazily — only when you have something to write. If no `GLOSSARY.md` exists, create one when the first term is resolved. If no `docs/adr/` exists, create it when the first ADR is needed.
41
41
 
42
42
  ## During the session
43
43
 
44
44
  ### Challenge against the glossary
45
45
 
46
- When the user uses a term that conflicts with the existing language in `CONTEXT.md`, call it out immediately. "Your glossary defines 'cancellation' as X, but you seem to mean Y — which is it?"
46
+ When the user uses a term that conflicts with the existing language in `GLOSSARY.md`, call it out immediately. "Your glossary defines 'cancellation' as X, but you seem to mean Y — which is it?"
47
47
 
48
48
  ### Sharpen fuzzy language
49
49
 
@@ -57,11 +57,11 @@ When domain relationships are being discussed, stress-test them with specific sc
57
57
 
58
58
  When the user states how something works, check whether the code agrees. If you find a contradiction, surface it: "Your code cancels entire Orders, but you just said partial cancellation is possible — which is right?"
59
59
 
60
- ### Update CONTEXT.md inline
60
+ ### Update GLOSSARY.md inline
61
61
 
62
- When a term is resolved, update `CONTEXT.md` right there. Don't batch these up — capture them as they happen. Use the format in [CONTEXT-FORMAT.md](./CONTEXT-FORMAT.md).
62
+ When a term is resolved, update `GLOSSARY.md` right there. Don't batch these up — capture them as they happen. Use the format in [GLOSSARY-FORMAT.md](./GLOSSARY-FORMAT.md).
63
63
 
64
- `CONTEXT.md` should be totally devoid of implementation details. Do not treat `CONTEXT.md` as a spec, a scratch pad, or a repository for implementation decisions. It is a glossary and nothing else.
64
+ `GLOSSARY.md` should be totally devoid of implementation details. Do not treat `GLOSSARY.md` as a spec, a scratch pad, or a repository for implementation decisions. It is a glossary and nothing else.
65
65
 
66
66
  ### Offer ADRs sparingly
67
67
 
@@ -5,7 +5,7 @@ argument-hint: "What will the next session be used for?"
5
5
  disable-model-invocation: true
6
6
  ---
7
7
 
8
- Write a handoff document summarising the current conversation so a fresh agent can continue the work. Save to the temporary directory of the user's OS - not the current workspace.
8
+ Write a handoff document summarising the current conversation so a fresh agent can continue the work. Save to the temporary directory of the user's OS (`$TMPDIR`, else `/tmp`; `%TEMP%` on Windows) - not the current workspace.
9
9
 
10
10
  Include a "suggested skills" section in the document, naming which skills the next agent should call the Skill tool for.
11
11
 
@@ -6,18 +6,20 @@ disable-model-invocation: true
6
6
 
7
7
  Implement the work described by the user in the spec or tickets.
8
8
 
9
- Use `/atw-tdd` where possible, at pre-agreed seams.
9
+ If the user passes a ticket reference, fetch it from the issue tracker and state its title before starting. If the reference is ambiguous, ask. If the tracker already marks a different ticket as in progress, stop and say so — don't switch tickets on your own.
10
+
11
+ Call the Skill tool with "atw-tdd" where possible, at pre-agreed seams.
10
12
 
11
13
  Run typechecking regularly, single test files regularly, and the full test suite once at the end.
12
14
 
13
- If the work changes what a user sees, build that part with `/atw-ui` — logic stays test-first, the UI is verified on real screens. Capture screenshots into the task directory's `screenshots/` for each UI acceptance criterion (screen, state, viewport in the file name), and look at them before calling the work done.
15
+ If the work changes what a user sees, build that part by calling the Skill tool with "atw-ui" — logic stays test-first, the UI is verified on real screens. Capture screenshots into the task directory's `screenshots/` for each UI acceptance criterion (screen, state, viewport in the file name), and look at them before calling the work done.
14
16
 
15
- Once done, use `/atw-code-review` to review the work. When screenshots were captured, pass their paths so the review runs its Visual axis.
17
+ Once done, call the Skill tool with "atw-code-review" to review the work. When screenshots were captured, pass their paths so the review runs its Visual axis.
16
18
 
17
19
  Work the findings before committing. Fix what the review raised, then re-run the tests it touched.
18
20
 
19
21
  **If the review surfaces a hard problem, stop** — the spec is wrong or self-contradictory, the fix needs a decision nobody has made, or it reaches outside this ticket's slice. Don't paper over it and don't silently widen the scope to absorb it. Say what the finding is and what it blocks, and get the decision from the user before writing more code. If the answer changes what the work is supposed to do, that change lands in the spec via the step below, not only in the code.
20
22
 
21
- Then use `/atw-update-spec` to fold what actually got built back into the spec. The next review's Spec axis compares code against the spec, so a spec that lags behind the code makes that axis meaningless.
23
+ Then call the Skill tool with "atw-update-spec" to fold what actually got built back into the spec. The next review's Spec axis compares code against the spec, so a spec that lags behind the code makes that axis meaningless.
22
24
 
23
25
  Commit your work to the current branch.
@@ -0,0 +1,79 @@
1
+ ---
2
+ name: atw-implement-spec
3
+ description: "把 atw-spec 和 atw-tickets 的产出一次性实现完:按工单的阻塞关系并行派出实现子代理,全部汇到同一条集成分支,最后统一审查。"
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ You have been provided a spec. This spec should have tickets associated with it, describing how to implement the spec.
8
+
9
+ The issue tracker should have been provided to you. If not, tell the user to run `/atw-init-repo`.
10
+
11
+ This skill runs on sub-agents. On a platform that cannot dispatch them, stop and tell the user to run `/atw-implement` once per ticket instead.
12
+
13
+ The goal is the entire spec implemented on a single **integration branch**, with every ticket resolved the way the issue tracker closes work.
14
+
15
+ The tickets are not a list of steps. They are a **task graph** with blocking relationships between them. This means there is always a **frontier** of tickets which are ready to be grabbed.
16
+
17
+ Communication to and from subagents should be sparse. Communicate primarily through **context pointers** — to the spec, tickets, research notes, and previous commits. Don't duplicate information already available via pointers.
18
+
19
+ **Implementer subagents** should be run in the background where possible for maximum concurrency. Where the platform runs sub-agents one at a time the run still completes, one ticket after another.
20
+
21
+ ## Ticket state
22
+
23
+ You are the only writer of ticket state. No subagent edits a ticket file, or anything else the tracker owns.
24
+
25
+ Mark a ticket in progress before dispatching its implementer, and done once its work has merged into the integration branch, using the tracker doc's ticket operations. On an ATW task directory (`.atw/scripts/tickets.py` exists):
26
+
27
+ ```bash
28
+ python3 .atw/scripts/tickets.py frontier # what can start now
29
+ python3 .atw/scripts/tickets.py claim <NN> --parallel # before dispatching its implementer
30
+ python3 .atw/scripts/tickets.py done <NN> # after its merge lands
31
+ ```
32
+
33
+ `--parallel` is what lets several tickets be in progress at once; a plain `claim` refuses the second one. Leave these ticket-state edits uncommitted while implementers are running — a new commit on the integration branch between an implementer's last merge and its landing costs it another merge — and commit them once, at close-out.
34
+
35
+ ## Steps
36
+
37
+ 1. Read the spec and tickets to understand the task graph.
38
+
39
+ 2. (optional) Use an **exploration subagent** to conduct any exploration required by the tickets — relevant codebase files or external documentation. It saves its markdown notes where the tracker doc puts research notes, or in a directory outside the repo when the tracker doc names no such place. This lets **implementer subagents** focus on implementation rather than exploration.
40
+
41
+ 3. Create the integration branch, named after the task. Commit the spec, the tickets, and any exploration notes saved in the repo to it first: a worktree holds only what git tracks, so an uncommitted ticket is invisible to its implementer. On an ATW task directory, record the branch with `python3 .atw/scripts/task.py set-branch <task-dir> <branch>`. If the issue tracker closes work through PRs, or the user asks for one, open a draft PR after the first merge in step 5 (a branch with no commits ahead of main can't open one), marked as closing the spec and tickets.
42
+
43
+ 4. Use **implementer subagents** to implement each frontier ticket, each in its own worktree on its own branch. Dispatch a general-purpose sub-agent with the brief below — not the `atw-implement-agent` role, which may not commit. Each implementer subagent:
44
+ - confirms its worktree is based on the integration branch before starting, and resets onto it if not;
45
+ - calls the Skill tool with "atw-tdd" to build the ticket;
46
+ - builds any part that changes what a user sees by calling the Skill tool with "atw-ui", and captures a screenshot into the task directory's `screenshots/` for each UI acceptance criterion (screen, state, viewport in the file name);
47
+ - commits to its own branch, and merges the integration branch tip into that branch before reporting done.
48
+
49
+ 5. Once an **implementer subagent** completes, merge its work to the integration branch with a **merger subagent**, then mark the ticket done.
50
+
51
+ 6. If this changes the **frontier** of available tickets, kick off more **implementer subagents** to work on the new tickets. This allows for maximum concurrency.
52
+
53
+ 7. Once all tickets are complete, call the Skill tool with "atw-code-review" on the integration branch, with the commit the branch started from as the fixed point and any captured screenshots passed for its Visual axis. Relay the review reports to the user as written. Fix all issues raised by the code review in a single **implementer subagent**. Then re-check **only the findings that were fixed**, once. Do not start a second full review, and do not loop: anything still open after that one re-check goes to the user.
54
+
55
+ 8. Call the Skill tool with "atw-update-spec" to fold what actually got built back into the spec, then commit — the ticket-state edits ride in this commit.
56
+
57
+ 9. If a draft PR exists, mark it ready for review. Otherwise, resolve each ticket the way the issue tracker closes work, and report the integration branch.
58
+
59
+ 10. Clean up all **implementer subagent** worktrees.
60
+
61
+ ## Implementer brief
62
+
63
+ Every dispatch prompt starts with `Active task: <task path>` when the repo runs the ATW task system, then states the role, then gives pointers — nothing more:
64
+
65
+ - "You are an implementer subagent dispatched by `/atw-implement-spec`. Do the work yourself; do not dispatch sub-agents, and do not run a code review — the orchestrator reviews the integration branch once, at the end."
66
+ - the integration branch name, and the worktree and branch to work in;
67
+ - pointers to the spec, its one ticket, the exploration notes, and the coding-standards files the review will hold the work to;
68
+ - the rules from step 4;
69
+ - "Do not edit any ticket file or tracker state. Stay inside this ticket's slice; if the ticket cannot be finished as written, stop and report why instead of widening it."
70
+
71
+ ## When to stop
72
+
73
+ Stop dispatching and report to the user — letting implementers already running finish, and keeping everything already merged — when:
74
+
75
+ - an implementer reports its ticket cannot be finished as written, or the spec is wrong or self-contradictory;
76
+ - a merge conflict cannot be resolved by the intent of both sides;
77
+ - the test suite cannot be made to pass on the integration branch.
78
+
79
+ Say what happened, which tickets are done, in progress, and untouched, and what decision is needed. Do not paper over it and do not rewrite a ticket to make it fit.
@@ -0,0 +1,5 @@
1
+ interface:
2
+ display_name: "ATW Implement Spec"
3
+ short_description: "一次性并行实现整份规格与工单"
4
+ policy:
5
+ allow_implicit_invocation: false
@@ -11,7 +11,7 @@ Surface architectural friction and propose **deepening opportunities** — refac
11
11
  This command is _informed_ by the project's domain model and built on a shared design vocabulary:
12
12
 
13
13
  - Call the Skill tool with "atw-codebase-design" for the architecture vocabulary (**module**, **interface**, **depth**, **seam**, **adapter**, **leverage**, **locality**) and its principles (the deletion test, "the interface is the test surface", "one adapter = hypothetical seam, two = real"). Use these terms exactly in every suggestion — don't drift into "component," "service," "API," or "boundary."
14
- - The domain language in `CONTEXT.md` gives names to good seams; ADRs in `docs/adr/` record decisions this command should not re-litigate.
14
+ - The domain language in `GLOSSARY.md` gives names to good seams; ADRs in `docs/adr/` record decisions this command should not re-litigate.
15
15
 
16
16
  ## Process
17
17
 
@@ -22,7 +22,7 @@ This command is _informed_ by the project's domain model and built on a shared d
22
22
  - If the user named a direction — a module, a subsystem, a pain point — take it, and skip the inference below.
23
23
  - Otherwise, walk back a good stretch of the commit history (`git log --oneline`) to find the codebase's hot spots — the files and areas that keep coming up — and let those paths pull your attention first. If the changes are scattered with no clear hot spot, widen the net.
24
24
 
25
- Read the project's domain glossary (`CONTEXT.md`) and any ADRs in the area you're touching first.
25
+ Read the project's domain glossary (`GLOSSARY.md`) and any ADRs in the area you're touching first.
26
26
 
27
27
  Then spawn a sub-agent to walk the codebase. Don't follow rigid heuristics — explore organically and note where you experience friction:
28
28
 
@@ -51,7 +51,7 @@ For each candidate, render a card with:
51
51
 
52
52
  End the report with a **Top recommendation** section: which candidate you'd tackle first and why.
53
53
 
54
- **Use CONTEXT.md vocabulary for the domain, and the `/atw-codebase-design` vocabulary for the architecture.** If `CONTEXT.md` defines "Order," talk about "the Order intake module" — not "the FooBarHandler," and not "the Order service."
54
+ **Use GLOSSARY.md vocabulary for the domain, and the `/atw-codebase-design` vocabulary for the architecture.** If `GLOSSARY.md` defines "Order," talk about "the Order intake module" — not "the FooBarHandler," and not "the Order service."
55
55
 
56
56
  **ADR conflicts**: if a candidate contradicts an existing ADR, only surface it when the friction is real enough to warrant revisiting the ADR. Mark it clearly in the card (e.g. a warning callout: _"contradicts ADR-0007 — but worth reopening because…"_). Don't list every theoretical refactor an ADR forbids.
57
57
 
@@ -65,7 +65,7 @@ Once the user picks a candidate, call the Skill tool with "atw-interview" to wal
65
65
 
66
66
  Side effects happen inline as decisions crystallize — call the Skill tool with "atw-domain-modeling" to keep the domain model current as you go:
67
67
 
68
- - **Naming a deepened module after a concept not in `CONTEXT.md`?** Add the term to `CONTEXT.md`. Create the file lazily if it doesn't exist.
69
- - **Sharpening a fuzzy term during the conversation?** Update `CONTEXT.md` right there.
68
+ - **Naming a deepened module after a concept not in `GLOSSARY.md`?** Add the term to `GLOSSARY.md`. Create the file lazily if it doesn't exist.
69
+ - **Sharpening a fuzzy term during the conversation?** Update `GLOSSARY.md` right there.
70
70
  - **User rejects the candidate with a load-bearing reason?** Offer an ADR, framed as: _"Want me to record this as an ADR so future architecture reviews don't re-suggest it?"_ Only offer when the reason would actually be needed by a future explorer to avoid re-suggesting the same thing — skip ephemeral reasons ("not worth it right now") and self-evident ones.
71
71
  - **Want to explore alternative interfaces for the deepened module?** Call the Skill tool with "atw-codebase-design" and use its design-it-twice parallel sub-agent pattern.
@@ -10,7 +10,7 @@ Scaffold the per-repo configuration the engineering skills assume:
10
10
 
11
11
  - **Issue tracker** — where issues live for this repo
12
12
  - **Triage labels** — the strings used for the five canonical triage roles
13
- - **Domain docs** — where `CONTEXT.md` and ADRs live, and the rules for reading them
13
+ - **Domain docs** — where `GLOSSARY.md` and ADRs live, and the rules for reading them
14
14
 
15
15
  The output is three files under `docs/agents/`, plus an `## Agent skills` block in the repo's agent instructions file. Five skills read them: `atw-spec`, `atw-tickets`, `atw-triage`, `atw-map`, `atw-code-review`. `atw-research` reads the tracker doc for where findings go.
16
16
 
@@ -24,7 +24,7 @@ Look at the current repo to understand its starting state. Read whatever exists;
24
24
 
25
25
  - `git remote -v` — is this a GitHub repo? GitLab? No remote at all?
26
26
  - `CLAUDE.md` and `AGENTS.md` at the repo root — does either exist? Is there already an `## Agent skills` section in either?
27
- - `CONTEXT.md` and `CONTEXT-MAP.md` at the repo root
27
+ - `GLOSSARY.md` and `GLOSSARY-MAP.md` at the repo root
28
28
  - `docs/adr/` and any `src/*/docs/adr/` directories
29
29
  - `docs/agents/` — does this skill's prior output already exist?
30
30
  - `.scratch/` — sign that a local-markdown issue tracker convention is already in use
@@ -58,9 +58,9 @@ Record the choice in `docs/agents/issue-tracker.md`. The GitHub and GitLab templ
58
58
 
59
59
  The defaults are the five canonical roles, each label string equal to its name: `needs-triage`, `needs-info`, `ready-for-agent`, `ready-for-human`, `wontfix`. On **yes**, write them as-is. Only if the user says no — usually because their tracker already uses other names (e.g. `bug:triage` for `needs-triage`) — collect the overrides so `atw-triage` applies existing labels instead of creating duplicates.
60
60
 
61
- **Section C — Domain docs.** Default to **single-context** — one `CONTEXT.md` + `docs/adr/` at the repo root. This fits almost every repo; write it without asking.
61
+ **Section C — Domain docs.** Default to **single-context** — one `GLOSSARY.md` + `docs/adr/` at the repo root. This fits almost every repo; write it without asking.
62
62
 
63
- Offer **multi-context** — a root `CONTEXT-MAP.md` pointing to per-context `CONTEXT.md` files — only when exploration found monorepo signals. Then confirm which layout they want.
63
+ Offer **multi-context** — a root `GLOSSARY-MAP.md` pointing to per-context `GLOSSARY.md` files — only when exploration found monorepo signals. Then confirm which layout they want.
64
64
 
65
65
  ### 3. Confirm and edit
66
66
 
@@ -101,6 +101,8 @@ The block:
101
101
  [one-line summary of layout — "single-context" or "multi-context"]. See `docs/agents/domain.md`.
102
102
  ```
103
103
 
104
+ When triage runs on GitHub or GitLab — the GitHub or GitLab tracker, or the ATW task directory + GitHub variant, where `atw-triage` works the repo's GitHub Issues — create each configured label the tracker lacks (`gh label create` / `glab label create`).
105
+
104
106
  Then write the docs files using the seed templates in this skill's `references/` directory as a starting point:
105
107
 
106
108
  - [issue-tracker-atw.md](./references/issue-tracker-atw.md) — ATW task directory + GitHub mirror
@@ -4,8 +4,8 @@ How the engineering skills should consume this repo's domain documentation when
4
4
 
5
5
  ## Before exploring, read these
6
6
 
7
- - **`CONTEXT.md`** at the repo root, or
8
- - **`CONTEXT-MAP.md`** at the repo root if it exists — it points at one `CONTEXT.md` per context. Read each one relevant to the topic.
7
+ - **`GLOSSARY.md`** at the repo root, or
8
+ - **`GLOSSARY-MAP.md`** at the repo root if it exists — it points at one `GLOSSARY.md` per context. Read each one relevant to the topic.
9
9
  - **`docs/adr/`** — read ADRs that touch the area you're about to work in. In multi-context repos, also check `src/<context>/docs/adr/` for context-scoped decisions.
10
10
 
11
11
  If any of these files don't exist, **proceed silently**. Don't flag their absence; don't suggest creating them upfront. The `atw-domain-modeling` skill (reached via `atw-askme-with-docs` and `atw-improve-codebase-architecture`) creates them lazily when terms or decisions actually get resolved.
@@ -16,31 +16,31 @@ Single-context repo (most repos):
16
16
 
17
17
  ```
18
18
  /
19
- ├── CONTEXT.md
19
+ ├── GLOSSARY.md
20
20
  ├── docs/adr/
21
21
  │ ├── 0001-event-sourced-orders.md
22
22
  │ └── 0002-postgres-for-write-model.md
23
23
  └── src/
24
24
  ```
25
25
 
26
- Multi-context repo (presence of `CONTEXT-MAP.md` at the root):
26
+ Multi-context repo (presence of `GLOSSARY-MAP.md` at the root):
27
27
 
28
28
  ```
29
29
  /
30
- ├── CONTEXT-MAP.md
30
+ ├── GLOSSARY-MAP.md
31
31
  ├── docs/adr/ ← system-wide decisions
32
32
  └── src/
33
33
  ├── ordering/
34
- │ ├── CONTEXT.md
34
+ │ ├── GLOSSARY.md
35
35
  │ └── docs/adr/ ← context-specific decisions
36
36
  └── billing/
37
- ├── CONTEXT.md
37
+ ├── GLOSSARY.md
38
38
  └── docs/adr/
39
39
  ```
40
40
 
41
41
  ## Use the glossary's vocabulary
42
42
 
43
- When your output names a domain concept (in an issue title, a refactor proposal, a hypothesis, a test name), use the term as defined in `CONTEXT.md`. Don't drift to synonyms the glossary explicitly avoids.
43
+ When your output names a domain concept (in an issue title, a refactor proposal, a hypothesis, a test name), use the term as defined in `GLOSSARY.md`. Don't drift to synonyms the glossary explicitly avoids.
44
44
 
45
45
  If the concept you need isn't in the glossary yet, that's a signal — either you're inventing language the project doesn't use (reconsider) or there's a real gap (note it for `atw-domain-modeling`).
46
46
 
@@ -66,11 +66,14 @@ python3 .atw/scripts/tickets.py list # all tickets + Impl state
66
66
  python3 .atw/scripts/tickets.py frontier # Impl: ready with all blockers done
67
67
  python3 .atw/scripts/tickets.py claim <NN> # → Impl: doing
68
68
  python3 .atw/scripts/tickets.py done <NN> # → Impl: done
69
+ python3 .atw/scripts/tickets.py claim <NN> --parallel # → Impl: doing, alongside others (`/atw-implement-spec` only)
69
70
  ```
70
71
 
71
72
  `claim` refuses tickets that aren't on the frontier, and the parser rejects blocker references that don't exist or form a cycle. `claim` also records `implementation_base_sha` and writes the ticket's path into `$TASK/check.jsonl`, which is what review sub-agents read to know which ticket is live; `done` withdraws that line.
72
73
 
73
- **Tickets run one at a time by default.** `claim` hard-rejects a second ticket while another is at `Impl: doing`, but that check is read-then-write — it is serial execution, not an atomic exclusive claim. Don't run two implementers against one task directory.
74
+ **Tickets run one at a time by default.** `claim` hard-rejects a second ticket while another is at `Impl: doing`, but that check is read-then-write — it is serial execution, not an atomic exclusive claim. Don't run two implementers against one task directory by hand.
75
+
76
+ **The one parallel path is `/atw-implement-spec`.** Its orchestrator claims with `--parallel`, which lets several tickets sit at `Impl: doing`, records `implementation_base_sha` once for the whole run, and writes no current-ticket line into `$TASK/check.jsonl` — there is no single live ticket. Only the orchestrator writes ticket state; each implementer works in its own worktree.
74
77
 
75
78
  ## Wayfinding operations
76
79
 
@@ -91,7 +94,7 @@ These stay at the repo root, unchanged:
91
94
 
92
95
  ```text
93
96
  docs/adr/ architecture decisions atw-domain-modeling
94
- CONTEXT.md domain glossary atw-domain-modeling
97
+ GLOSSARY.md domain glossary atw-domain-modeling
95
98
  .out-of-scope/ rejected-concept records atw-triage
96
99
  .atw/spec/ layered coding standards ATW's own spec flow
97
100
  ```
@@ -74,11 +74,14 @@ python3 .atw/scripts/tickets.py list # all tickets + Impl state
74
74
  python3 .atw/scripts/tickets.py frontier # Impl: ready with all blockers done
75
75
  python3 .atw/scripts/tickets.py claim <NN> # → Impl: doing
76
76
  python3 .atw/scripts/tickets.py done <NN> # → Impl: done
77
+ python3 .atw/scripts/tickets.py claim <NN> --parallel # → Impl: doing, alongside others (`/atw-implement-spec` only)
77
78
  ```
78
79
 
79
80
  `claim` refuses tickets that aren't on the frontier, and the parser rejects blocker references that don't exist or form a cycle. `claim` also records `implementation_base_sha` and writes the ticket's path into `$TASK/check.jsonl`, which is what review sub-agents read to know which ticket is live; `done` withdraws that line.
80
81
 
81
- **Tickets run one at a time by default.** `claim` hard-rejects a second ticket while another is at `Impl: doing`, but that check is read-then-write — it is serial execution, not an atomic exclusive claim. Don't run two implementers against one task directory.
82
+ **Tickets run one at a time by default.** `claim` hard-rejects a second ticket while another is at `Impl: doing`, but that check is read-then-write — it is serial execution, not an atomic exclusive claim. Don't run two implementers against one task directory by hand.
83
+
84
+ **The one parallel path is `/atw-implement-spec`.** Its orchestrator claims with `--parallel`, which lets several tickets sit at `Impl: doing`, records `implementation_base_sha` once for the whole run, and writes no current-ticket line into `$TASK/check.jsonl` — there is no single live ticket. Only the orchestrator writes ticket state; each implementer works in its own worktree.
82
85
 
83
86
  ## Wayfinding operations
84
87
 
@@ -101,7 +104,7 @@ These stay at the repo root, unchanged:
101
104
 
102
105
  ```text
103
106
  docs/adr/ architecture decisions atw-domain-modeling
104
- CONTEXT.md domain glossary atw-domain-modeling
107
+ GLOSSARY.md domain glossary atw-domain-modeling
105
108
  .out-of-scope/ rejected-concept records atw-triage
106
109
  .atw/spec/ layered coding standards ATW's own spec flow
107
110
  ```
@@ -5,8 +5,9 @@ Issues and specs for this repo live as GitHub issues. Use the `gh` CLI for all o
5
5
  ## Conventions
6
6
 
7
7
  - **Create an issue**: `gh issue create --title "..." --body "..."`. Use a heredoc for multi-line bodies.
8
- - **Read an issue**: `gh issue view <number> --comments`, filtering comments by `jq` and also fetching labels.
8
+ - **Read an issue**: `gh issue view <number> --json number,title,body,labels,comments`.
9
9
  - **List issues**: `gh issue list --state open --json number,title,body,labels,comments --jq '[.[] | {number, title, body, labels: [.labels[].name], comments: [.comments[].body]}]'` with appropriate `--label` and `--state` filters.
10
+ - **Make an issue a sub-issue of a parent**: `gh issue create --parent <parent> ...`, or `gh issue edit <parent> --add-sub-issue <child>` afterwards (`gh` 2.94+). Older `gh`: `gh api --method POST repos/<owner>/<repo>/issues/<parent>/sub_issues -F sub_issue_id=<child-db-id>` (database id, as in **Blocking** below). Without sub-issues, put `Part of #<parent>` at the top of the child body.
10
11
  - **Comment on an issue**: `gh issue comment <number> --body "..."`
11
12
  - **Apply / remove labels**: `gh issue edit <number> --add-label "..."` / `--remove-label "..."`
12
13
  - **Close**: `gh issue close <number> --comment "..."`
@@ -20,7 +21,7 @@ Infer the repo from `git remote -v` — `gh` does this automatically when run in
20
21
  When set to `yes`, PRs run through the same labels and states as issues, using the `gh pr` equivalents:
21
22
 
22
23
  - **Read a PR**: `gh pr view <number> --comments` and `gh pr diff <number>` for the diff.
23
- - **List external PRs for triage**: `gh pr list --state open --json number,title,body,labels,author,authorAssociation,comments` then keep only `authorAssociation` of `CONTRIBUTOR`, `FIRST_TIME_CONTRIBUTOR`, or `NONE` (drop `OWNER`/`MEMBER`/`COLLABORATOR`).
24
+ - **List external PRs for triage**: `gh api --paginate 'repos/{owner}/{repo}/pulls?state=open' --jq '.[] | select(.author_association | IN("OWNER","MEMBER","COLLABORATOR") | not) | {number, title, author: .user.login, author_association, labels: [.labels[].name]}'`.
24
25
  - **Comment / label / close**: `gh pr comment`, `gh pr edit --add-label`/`--remove-label`, `gh pr close`.
25
26
 
26
27
  GitHub shares one number space across issues and PRs, so a bare `#42` may be either — resolve with `gh pr view 42` and fall back to `gh issue view 42`.
@@ -31,14 +32,14 @@ Create a GitHub issue.
31
32
 
32
33
  ## When a skill says "fetch the relevant ticket"
33
34
 
34
- Run `gh issue view <number> --comments`.
35
+ Read it as in **Read an issue** above.
35
36
 
36
37
  ## Wayfinding operations
37
38
 
38
39
  Used by `atw-map`. The **map** is a single issue with **child** issues as tickets.
39
40
 
40
41
  - **Map**: a single issue labelled `atw-map:map`, holding the Notes / Decisions-so-far / Fog body. `gh issue create --label atw-map:map`.
41
- - **Child ticket**: an issue linked to the map as a GitHub sub-issue (`gh api` on the sub-issues endpoint). Where sub-issues aren't enabled, add the child to a task list in the map body and put `Part of #<map>` at the top of the child body. Labels: `atw-map:<type>` (`research`/`prototype`/`interview`/`task`). Once claimed, the ticket is assigned to the driving dev.
42
+ - **Child ticket**: an issue linked to the map as a GitHub sub-issue (see **Make an issue a sub-issue of a parent**). Where sub-issues aren't enabled, add the child to a task list in the map body and put `Part of #<map>` at the top of the child body. Labels: `atw-map:<type>` (`research`/`prototype`/`interview`/`task`). Once claimed, the ticket is assigned to the driving dev.
42
43
  - **Blocking**: GitHub's **native issue dependencies** — the canonical, UI-visible representation. Add an edge with `gh api --method POST repos/<owner>/<repo>/issues/<child>/dependencies/blocked_by -F issue_id=<blocker-db-id>`, where `<blocker-db-id>` is the blocker's numeric **database id** (`gh api repos/<owner>/<repo>/issues/<n> --jq .id`, _not_ the `#number` or `node_id`). GitHub reports `issue_dependencies_summary.blocked_by` (open blockers only — the live gate). Where dependencies aren't available, fall back to a `Blocked by: #<n>, #<n>` line at the top of the child body. A ticket is unblocked when every blocker is closed.
43
44
  - **Frontier query**: list the map's open children (`gh issue list --state open`, scoped to the map's sub-issues / task list), drop any with an open blocker (`issue_dependencies_summary.blocked_by > 0`, or an open issue in the `Blocked by` line) or an assignee; first in map order wins.
44
45
  - **Claim**: `gh issue edit <n> --add-assignee @me` — the session's first write.
@@ -6,7 +6,7 @@ Issues and specs for this repo live as GitLab issues. Use the [`glab`](https://g
6
6
 
7
7
  - **Create an issue**: `glab issue create --title "..." --description "..."`. Use a heredoc for multi-line descriptions. Pass `--description -` to open an editor.
8
8
  - **Read an issue**: `glab issue view <number> --comments`. Use `-F json` for machine-readable output.
9
- - **List issues**: `glab issue list -F json` with appropriate `--label` filters.
9
+ - **List issues**: `glab issue list -O json` with appropriate `--label` filters.
10
10
  - **Comment on an issue**: `glab issue note <number> --message "..."`. GitLab calls comments "notes".
11
11
  - **Apply / remove labels**: `glab issue update <number> --label "..."` / `--unlabel "..."`. Multiple labels can be comma-separated or by repeating the flag.
12
12
  - **Close**: `glab issue close <number>`. `glab issue close` does not accept a closing comment, so post the explanation first with `glab issue note <number> --message "..."`, then close.
@@ -41,6 +41,6 @@ Used by `atw-map`. The **map** is a single issue with **child** issues as ticket
41
41
  - **Map**: a single issue labelled `atw-map:map`, holding the Notes / Decisions-so-far / Fog body. `glab issue create --label atw-map:map`. (On GitLab tiers with native epics, an epic may hold the map instead; a labelled issue works everywhere.)
42
42
  - **Child ticket**: an issue carrying `Part of #<map>` at the top of its description and labels `atw-map:<type>` (`research`/`prototype`/`interview`/`task`). Once claimed, the ticket is assigned to the driving dev.
43
43
  - **Blocking**: GitLab's **native blocking link** — the canonical, UI-visible representation. Add it with the `/blocked_by #<n>` quick action, posted as a note (`glab issue note <child> --message "/blocked_by #<blocker>"`). Native blocking links are a Premium/Ultimate feature; on the free tier (or where unavailable) fall back to a `Blocked by: #<n>, #<n>` line at the top of the description. A ticket is unblocked when every blocker is closed.
44
- - **Frontier query**: `glab issue list -F json` scoped to the map's children, drop any with an open blocker — a native `blocked_by` link to an open issue (`glab api projects/:id/issues/:iid/links`), or an open issue in the `Blocked by` line — or an assignee; first in map order wins.
44
+ - **Frontier query**: `glab issue list -O json` scoped to the map's children, drop any with an open blocker — a native `blocked_by` link to an open issue (`glab api projects/:id/issues/<child-iid>/links`), or an open issue in the `Blocked by` line — or an assignee; first in map order wins.
45
45
  - **Claim**: `glab issue update <n> --assignee @me` — the session's first write.
46
46
  - **Resolve**: `glab issue note <n> --message "<answer>"`, then `glab issue close <n>`, then append a context pointer (gist + link) to the map's Decisions-so-far.
@@ -12,4 +12,4 @@ The skills speak in terms of five canonical triage roles. This file maps those r
12
12
 
13
13
  When a skill mentions a role (e.g. "apply the AFK-ready triage label"), use the corresponding label string from this table.
14
14
 
15
- Edit the right-hand column to match whatever vocabulary you actually use.
15
+ Edit the "Label in our tracker" column to match whatever vocabulary you actually use.
@@ -7,14 +7,22 @@ Interview the user relentlessly until you reach a shared understanding. Map this
7
7
 
8
8
  Work the tree in **rounds**. The **frontier** is every decision whose prerequisites are already settled — the questions you can ask _now_ without guessing at answers you haven't heard yet. Ask the whole frontier in one round: number each question and give your recommended answer. Then wait for the user's answers before the next round.
9
9
 
10
- Each question should be formatted like so:
10
+ Format a round like so:
11
11
 
12
12
  ```
13
13
  ❓ **Q1** - **<question title>**: <question body, might be multiple paragraphs, including multiple choices>
14
14
 
15
+ ➡️ <your recommended answer>
16
+
17
+ ---
18
+
19
+ ❓ **Q2** - **<question title>**: <question body, might be multiple paragraphs, including multiple choices>
20
+
15
21
  ➡️ <your recommended answer>
16
22
  ```
17
23
 
24
+ Word each question so "yes" accepts your recommended answer.
25
+
18
26
  Each round the user answers reshapes the tree — settled decisions push the frontier outward and unblock questions that depended on them. Recompute the frontier and ask the next round. A question whose answer depends on another question still open in this round belongs to a _later_ round, not this one.
19
27
 
20
28
  Finding _facts_ is your job, never the user's. When a frontier question needs a fact from the environment (filesystem, tools, etc.), dispatch a sub-agent to find it — don't ask the user for anything you could look up yourself. Don't block on it: a running exploration is an unsettled prerequisite, so only the questions downstream of it wait for the sub-agent to report — ask the rest of the frontier now. The _decisions_ are the user's — put each to them and wait.