@kudusov.takhir/ba-toolkit 4.0.1 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -11,6 +11,26 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
11
11
 
12
12
  ---
13
13
 
14
+ ## [4.0.3] — 2026-04-12
15
+
16
+ ### Fixed
17
+
18
+ - **Shell fallback scripts (`init.sh`, `init.ps1`) were missing three domains** added in v3.3.0 — `edtech`, `govtech`, `ai-ml`. Users who set up projects via the shell scripts only saw 10 domains instead of 13.
19
+ - **Shell fallback scripts generated an outdated AGENTS.md** — missing `/discovery` (stage 0), `/implement-plan` (stage 12), and the Utility Skills section. Stage numbering for `/principles` was `0` instead of `0a`. Both scripts now match the canonical template at `skills/references/templates/agents-template.md`.
20
+ - **`docs/TROUBLESHOOTING.md` listed only 9 of 12 domain reference files** — added `edtech`, `govtech`, `ai-ml` and clarified that `custom` has no reference file.
21
+ - **Removed orphaned `skills/{brief,srs,…}/` directory** — an empty folder with a literal brace-expansion string as its name, shipped in the npm package.
22
+
23
+ ---
24
+
25
+ ## [4.0.2] — 2026-04-12
26
+
27
+ ### Fixed
28
+
29
+ - **Skills invented their own project slug instead of reading the one `ba-toolkit init` wrote to `AGENTS.md`.** Reproduction: `ba-toolkit init --name "New Test App"` produced `**Slug:** new-test-app` in `AGENTS.md`, but a follow-up `/brief` saved `01_brief_knitted-socks.md` — slug picked from conversation context, not from the scaffold. Root cause: pipeline skills carried v3.x-era wording (`/brief`: *"slug — kebab-case, fixed here for the entire pipeline"*; `/principles`: *"extract the slug from the brief, otherwise ask the user"*; `/discovery`: *"derive from the project name"*) and never read the canonical slug from the managed block of `AGENTS.md` that v4.0 `init` writes. Downstream skills inherited the wrong slug from the brief filename and the project silently desynchronised. Fixed by adding `skills/references/slug-source.md` (the single rule + fallbacks + rationale) and an explicit "Slug source" directive in every pipeline and utility skill that emits a `{slug}` filename: `/brief`, `/discovery`, `/principles`, `/srs`, `/stories`, `/usecases`, `/ac`, `/nfr`, `/datadict`, `/research`, `/apicontract`, `/wireframes`, `/scenarios`, `/handoff`, `/implement-plan`, `/analyze`, `/trace`, `/risk`, `/sprint`, `/glossary`, `/estimate`, `/export`. Each now reads `**Slug:**` from `AGENTS.md` verbatim and refuses to invent a new one. `/discovery` is the one exception — it may still derive a slug if `AGENTS.md` does not yet exist (the brain-storm-before-init flow), and otherwise honours the scaffold value instead of renaming the project.
30
+ - **`ba-toolkit init` crashed on second run with "Input stream closed before all prompts could be answered."** When an existing install was detected after the domain/agent arrow-key menus, the "Replace existing BA Toolkit install?" prompt rejected immediately. Root cause: the raw-mode menu closes the shared readline interface, which sets a sticky `inputClosed` flag that was never reset when `ensureReadline()` recreated the interface for the next `prompt()`. Fixed by clearing the flag on interface recreation.
31
+
32
+ ---
33
+
14
34
  ## [4.0.1] — 2026-04-12
15
35
 
16
36
  ### Fixed
@@ -879,7 +899,9 @@ CI scripts that relied on the old behaviour (`init` creates files only, `install
879
899
 
880
900
  ---
881
901
 
882
- [Unreleased]: https://github.com/TakhirKudusov/ba-toolkit/compare/v3.10.1...HEAD
902
+ [Unreleased]: https://github.com/TakhirKudusov/ba-toolkit/compare/v4.0.3...HEAD
903
+ [4.0.3]: https://github.com/TakhirKudusov/ba-toolkit/compare/v4.0.2...v4.0.3
904
+ [4.0.2]: https://github.com/TakhirKudusov/ba-toolkit/compare/v4.0.1...v4.0.2
883
905
  [4.0.1]: https://github.com/TakhirKudusov/ba-toolkit/compare/v4.0.0...v4.0.1
884
906
  [4.0.0]: https://github.com/TakhirKudusov/ba-toolkit/compare/v3.13.1...v4.0.0
885
907
  [3.13.1]: https://github.com/TakhirKudusov/ba-toolkit/compare/v3.13.0...v3.13.1
package/bin/ba-toolkit.js CHANGED
@@ -193,6 +193,12 @@ let inputClosed = false;
193
193
 
194
194
  function ensureReadline() {
195
195
  if (sharedRl) return;
196
+ // Reset the sticky close flag — a previous interface may have been
197
+ // torn down by closeReadline() (e.g. before an arrow-key menu took
198
+ // over stdin in raw mode). Without this reset, the next prompt()
199
+ // after a menu would immediately reject with INPUT_CLOSED even
200
+ // though stdin is still perfectly usable.
201
+ inputClosed = false;
196
202
  sharedRl = readline.createInterface({ input: process.stdin, output: process.stdout });
197
203
  sharedRl.on('line', (line) => {
198
204
  if (waiters.length > 0) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kudusov.takhir/ba-toolkit",
3
- "version": "4.0.1",
3
+ "version": "4.0.3",
4
4
  "description": "AI-powered Business Analyst pipeline — 24 skills from concept discovery to a sequenced implementation plan an AI coding agent can execute, with one-command Notion + Confluence publish. Works with Claude Code, Codex CLI, Gemini CLI, Cursor, and Windsurf.",
5
5
  "keywords": [
6
6
  "business-analyst",
@@ -42,6 +42,8 @@ Supplement with domain-specific questions from the reference.
42
42
 
43
43
  ## Generation
44
44
 
45
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
46
+
45
47
  **File:** `05_ac_{slug}.md`
46
48
 
47
49
  The full per-AC field set lives at `references/templates/ac-template.md` and is the single source of truth. Each AC carries: ID (`AC-NNN-NN`), Type (positive / negative / boundary / performance / security), Given / When / Then, Linked US, Linked UC, Linked FR, Linked NFR (for performance/security ACs), Source (which business rule from `02_srs_{slug}.md` drove this AC), and Verification method (automated test / manual test / observed in production). The artifact also carries a US → AC coverage matrix at the bottom.
@@ -86,6 +86,8 @@ The 8 canonical categories cover the IEEE 830 §4.3 SRS quality attributes (corr
86
86
 
87
87
  ## Generation
88
88
 
89
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
90
+
89
91
  **File:** `00_analyze_{slug}.md`
90
92
 
91
93
  The full report layout lives at `references/templates/analyze-template.md` and is the single source of truth. Each finding carries: ID, Severity, Category (one of the 8 above), Location (artifact + element ID), Description, Recommendation, and **Owner** (which role is accountable for fixing the finding — assigned by `00_principles_*.md` §4 Definition of Ready ownership where applicable, otherwise by domain default).
@@ -47,6 +47,8 @@ Supplement with domain-specific questions from the reference.
47
47
 
48
48
  ## Generation
49
49
 
50
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
51
+
50
52
  **File:** `08_apicontract_{slug}.md`
51
53
 
52
54
  ```markdown
@@ -61,7 +61,9 @@ If a domain reference is loaded, supplement general questions with domain-specif
61
61
 
62
62
  ### 5. Generation
63
63
 
64
- **File:** `01_brief_{slug}.md` (slugkebab-case, fixed here for the entire pipeline).
64
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` at the project root (look in cwd first; if cwd is `output/`, check `../AGENTS.md`). Use that value verbatim do not invent or re-derive a slug from the project name. `ba-toolkit init` is the single source of truth; see [`../references/slug-source.md`](../references/slug-source.md) for fallback rules and rationale.
65
+
66
+ **File:** `01_brief_{slug}.md`
65
67
 
66
68
  ```markdown
67
69
  # Project Brief: {Project Name}
@@ -45,6 +45,8 @@ Supplement with domain-specific questions and mandatory entities from the refere
45
45
 
46
46
  ## Generation
47
47
 
48
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
49
+
48
50
  **File:** `07_datadict_{slug}.md`
49
51
 
50
52
  The full per-entity field set lives at `references/templates/datadict-template.md` and is the single source of truth. Each entity carries: name, **Source** (which FR/US introduced this entity), **Owner** (which team / role curates it), **Sensitivity** (Public / Internal / Confidential / PII / PCI / PHI), description, attribute table (with logical types, not DBMS-specific), relationships with cascade rules, **state machine** (if applicable), indexes (logical, not physical), retention policy, and notes. The artifact carries an FR → Entity coverage matrix at the bottom.
@@ -54,7 +54,9 @@ If a topic was already covered by inline context or the lead-in answer, skip it
54
54
 
55
55
  ### 5. Generation
56
56
 
57
- **File:** `00_discovery_{slug}.md` (slug kebab-case, derived from the project name; if the user has not yet picked a name, propose 2–3 candidates and let them choose).
57
+ **Slug:** if `AGENTS.md` exists at the project root with a `**Slug:**` line in its managed block, read that value verbatim and use it as `{slug}` — `ba-toolkit init` is the single source of truth. Do **not** propose a new slug, and do **not** rename the project the user already scaffolded. Only when `AGENTS.md` is absent (the user is brain-storming before running `ba-toolkit init`) may you derive a kebab-case slug from the project name; if the user has not yet picked a name, propose 2–3 candidates and let them choose. See [`../references/slug-source.md`](../references/slug-source.md) for the full rule.
58
+
59
+ **File:** `00_discovery_{slug}.md`
58
60
 
59
61
  ```markdown
60
62
  # Discovery: {Project Name}
@@ -87,6 +87,8 @@ This skill produces a **single-estimator analytical pass**. A senior BA running
87
87
 
88
88
  ## Output
89
89
 
90
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
91
+
90
92
  ### If scope ≤ 20 stories — update `03_stories_{slug}.md` in-place
91
93
 
92
94
  Add a `**Estimate:**` field to each US block and append the Estimation Summary table at the end of the file.
@@ -197,6 +197,8 @@ Compatible with Jira CSV import, Trello, Asana, Monday.com, and Google Sheets. I
197
197
 
198
198
  ## Output
199
199
 
200
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
201
+
200
202
  Save the export file to the output directory alongside the artifacts:
201
203
 
202
204
  ```
@@ -99,6 +99,8 @@ Identify terms used in requirements but not defined anywhere in the glossary or
99
99
 
100
100
  ## Generation
101
101
 
102
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
103
+
102
104
  Save `00_glossary_{slug}.md` to the output directory.
103
105
 
104
106
  ```markdown
@@ -24,6 +24,8 @@ Read `references/environment.md` from the `ba-toolkit` directory to determine th
24
24
 
25
25
  No interview. All content is derived from the existing artifacts. The full template lives at `references/templates/handoff-template.md` and is the single source of truth — including the full inventory of pipeline-stage and cross-cutting artifacts (`/discovery`, `/principles`, `/implement-plan`, `/sprint`, `/risk`, `/glossary`, `/trace`, `/analyze`, `/estimate`), the Brief Goal → FR / FR → NFR / FR → API forward-traceability tables, the ADR summary, and the formal Sign-off section.
26
26
 
27
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
28
+
27
29
  **File:** `11_handoff_{slug}.md`
28
30
 
29
31
  ```markdown
@@ -115,6 +115,8 @@ Within a phase, order tasks so each task's `dependsOn` list points only at tasks
115
115
 
116
116
  ### 7. Generation
117
117
 
118
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
119
+
118
120
  **File:** `12_implplan_{slug}.md`
119
121
 
120
122
  ```markdown
@@ -48,6 +48,8 @@ Supplement with domain-specific questions and mandatory categories from the refe
48
48
 
49
49
  ## Generation
50
50
 
51
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
52
+
51
53
  **File:** `06_nfr_{slug}.md`
52
54
 
53
55
  The full per-NFR field set lives at `references/templates/nfr-template.md` and is the single source of truth. Each NFR carries: ID (`NFR-NNN`), ISO 25010 characteristic, sub-characteristic, description, measurable metric, **acceptance threshold** (the bar that says "we passed"), verification method, source (which stakeholder, regulation, or FR drove this NFR), rationale, priority, and linked FRs / USs / Brief constraints. The artifact carries an FR → NFR coverage matrix and a per-characteristic priority summary at the bottom.
@@ -23,7 +23,7 @@ If `00_principles_*.md` already exists, load it and offer to:
23
23
  - Amend a specific section (`/revise [section]`).
24
24
  - Regenerate from scratch.
25
25
 
26
- If `01_brief_*.md` already exists, extract the slug and domain from it. Otherwise, ask the user for the project name (to derive the slug) and domain.
26
+ **Slug source.** Read the `**Slug:**` line from the managed block of `AGENTS.md` at the project root (cwd, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. `ba-toolkit init` is the single source of truth do not invent or re-derive a slug. If `AGENTS.md` is missing, warn the user to run `ba-toolkit init` first. See [`../references/slug-source.md`](../references/slug-source.md) for the full rule and fallbacks. The domain comes from the same managed block; if `01_brief_*.md` already exists, prefer the brief's domain over the scaffold default.
27
27
 
28
28
  ### 3. Interview
29
29
 
@@ -0,0 +1,30 @@
1
+ # Slug source — single rule
2
+
3
+ `ba-toolkit init` is the **single source of truth** for the project slug. It writes the slug into the managed block of `AGENTS.md` at the project root:
4
+
5
+ ```
6
+ <!-- ba-toolkit:begin managed -->
7
+ ...
8
+ **Slug:** new-test-app
9
+ ...
10
+ <!-- ba-toolkit:end managed -->
11
+ ```
12
+
13
+ Every skill that emits a file whose name contains `{slug}` (e.g. `01_brief_{slug}.md`, `02_srs_{slug}.md`, `00_analyze_{slug}.md`) **must read the slug from this line and use it verbatim**. Do not invent a slug, do not re-derive it from the project name, do not pick one based on conversation context.
14
+
15
+ ## How to read the slug
16
+
17
+ 1. Locate `AGENTS.md`. Look in `cwd` first; if `cwd` is `output/`, check `../AGENTS.md`.
18
+ 2. Find the managed block delimited by `<!-- ba-toolkit:begin managed -->` and `<!-- ba-toolkit:end managed -->`.
19
+ 3. Inside the block, parse the line that starts with `**Slug:**`. Strip whitespace. The remainder is the slug.
20
+ 4. Use that exact string as `{slug}` in every output filename for this run.
21
+
22
+ ## Fallbacks
23
+
24
+ - **No `AGENTS.md` at the project root.** The project was not scaffolded with `ba-toolkit init`. Stop and tell the user to run `ba-toolkit init` first. Do not invent a slug to keep going.
25
+ - **`AGENTS.md` exists but has no managed block** (legacy file the user authored manually). Look for `01_brief_*.md` in `output/`; the part between `01_brief_` and `.md` is the slug. If no brief file exists either, ask the user for the slug explicitly — do not invent one.
26
+ - **`AGENTS.md` managed block is present but the `**Slug:**` line is missing or empty.** Treat as a corrupted scaffold. Tell the user to re-run `ba-toolkit init` to repair `AGENTS.md`. Do not invent a slug.
27
+
28
+ ## Why
29
+
30
+ Before v4.0, `/brief` was the entry point and decided the slug. In v4.0, `ba-toolkit init` runs first and fixes the slug at scaffold time, so that `AGENTS.md` and the file names in `output/` are guaranteed to agree from the very first artifact. Skills that still derive a slug locally (from the project name or from conversation context) silently desynchronise the project: `AGENTS.md` says one thing, the artifact filenames say another, downstream skills pick up the wrong slug, and the user sees `01_brief_knitted-socks.md` next to `**Slug:** new-test-app`.
@@ -53,6 +53,8 @@ Supplement with domain-specific typical integrations from the reference.
53
53
 
54
54
  ## Generation
55
55
 
56
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
57
+
56
58
  **File:** `07a_research_{slug}.md`
57
59
 
58
60
  ```markdown
@@ -115,6 +115,8 @@ Assign each risk one of the four canonical treatment strategies (PMBOK 7 / ISO 3
115
115
 
116
116
  ## Generation
117
117
 
118
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
119
+
118
120
  Save `00_risks_{slug}.md` to the output directory.
119
121
 
120
122
  ```markdown
@@ -41,6 +41,8 @@ Read `references/environment.md` from the `ba-toolkit` directory to determine th
41
41
 
42
42
  ## Generation
43
43
 
44
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
45
+
44
46
  **File:** `10_scenarios_{slug}.md`
45
47
 
46
48
  The full per-scenario field set lives at `references/templates/scenarios-template.md` and is the single source of truth. Each scenario carries: ID (`SC-NNN`), Title, Persona (named with context), Type (happy / negative / edge / performance / security), Priority (P1 / P2 / P3), Entry point, Platform, **Source** (Linked US, Linked FR, Linked NFR), Linked AC, Steps table, Expected Outcome, Failure Conditions. The artifact carries a coverage matrix at the bottom showing US, AC scenario, FR, NFR, and WF coverage.
@@ -92,6 +92,8 @@ For each sprint, derive a one-sentence goal that describes the primary user-faci
92
92
 
93
93
  ## Generation
94
94
 
95
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
96
+
95
97
  Save `00_sprint_{slug}.md` to the output directory. The full layout lives at `references/templates/sprint-template.md` and is the single source of truth — including the per-story Persona column (per v3.5.0+ stories template), the net-velocity header, and the sprint-level Definition of Done.
96
98
 
97
99
  Sprint IDs are sequential (SP-00, SP-01, SP-02, …). SP-00 is reserved for setup/architecture sprint if requested.
@@ -14,7 +14,7 @@ Second step of the BA Toolkit pipeline. Generates an SRS adapted from IEEE 830.
14
14
 
15
15
  0. If `00_principles_*.md` exists in the output directory, load it and apply its conventions (artifact language, ID format, traceability requirements, Definition of Ready, quality gate threshold).
16
16
  1. Read `01_brief_*.md` from the output directory. If missing, warn and suggest running `/brief`.
17
- 2. Extract: slug, domain, business goals, functionality, stakeholders, constraints, glossary.
17
+ 2. Extract: domain, business goals, functionality, stakeholders, constraints, glossary. The slug comes from `AGENTS.md`, not from the brief filename — see [`../references/slug-source.md`](../references/slug-source.md).
18
18
  3. If a matching `references/domains/{domain}.md` file exists (currently: `saas`, `fintech`, `ecommerce`, `healthcare`, `logistics`, `on-demand`, `social-media`, `real-estate`, `igaming`, `edtech`, `govtech`, `ai-ml`), load it and apply its section `2. /srs`.
19
19
 
20
20
  ## Environment
@@ -38,6 +38,8 @@ Supplement with domain-specific questions and typical epics from the reference.
38
38
 
39
39
  ## Generation
40
40
 
41
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
42
+
41
43
  **File:** `03_stories_{slug}.md`
42
44
 
43
45
  The full template lives at `references/templates/stories-template.md` and is the single source of truth for the per-story field set. The fields are:
@@ -33,6 +33,8 @@ If the user invokes `/trace` with no inline hint, ask the following short calibr
33
33
 
34
34
  ## Generation
35
35
 
36
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
37
+
36
38
  **File:** `00_trace_{slug}.md`
37
39
 
38
40
  The full per-axis matrix layout lives at `references/templates/trace-template.md` and is the single source of truth. The artifact carries: a Forward Traceability matrix (FR → all downstream artifacts), a Reverse Traceability matrix (US, UC, AC, NFR, Entity, API, WF, SC, Task → FR), Coverage Gaps grouped by severity (Critical / High / Medium / Low per the principles thresholds), Coverage Statistics per artifact pair, and Recommended Actions sorted by severity.
@@ -41,6 +41,8 @@ Supplement with domain-specific questions and typical exceptional flows from the
41
41
 
42
42
  ## Generation
43
43
 
44
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
45
+
44
46
  **File:** `04_usecases_{slug}.md`
45
47
 
46
48
  The full per-UC field set lives at `references/templates/usecases-template.md` and is the single source of truth. Each UC carries: Goal in Context, Scope, Level, Primary Actor, Supporting Actors, Stakeholders & Interests, Pre-conditions, Trigger, Main Success Scenario (numbered table), Extensions / Alternative Flows, Exception Flows, Post-conditions (success guarantees + minimal guarantees), Source (linked US/FR), Linked WF, Linked AC. The artifact also carries a US → UC coverage matrix at the bottom.
@@ -41,6 +41,8 @@ Supplement with domain-specific questions and typical screens from the reference
41
41
 
42
42
  ## Generation
43
43
 
44
+ **Slug:** read the `**Slug:**` line from the managed block of `AGENTS.md` (project root, or `../AGENTS.md` if cwd is `output/`) and use it verbatim. See [`../references/slug-source.md`](../references/slug-source.md).
45
+
44
46
  **File:** `09_wireframes_{slug}.md`
45
47
 
46
48
  ```markdown