yadflow 4.3.0 → 4.5.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 (48) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +4 -2
  3. package/bin/commands.mjs +3 -1
  4. package/bin/yad.mjs +80 -14
  5. package/cli/claims.mjs +16 -13
  6. package/cli/detect.mjs +2 -2
  7. package/cli/docs.mjs +1 -1
  8. package/cli/doctor.mjs +108 -3
  9. package/cli/epic-state.mjs +121 -24
  10. package/cli/epic.mjs +7 -5
  11. package/cli/manifest.mjs +3 -0
  12. package/cli/members.mjs +822 -0
  13. package/cli/next.mjs +21 -9
  14. package/cli/people.mjs +13 -3
  15. package/cli/platform.mjs +1 -1
  16. package/cli/pr-list.mjs +125 -0
  17. package/cli/protection.mjs +4 -4
  18. package/cli/recommend.mjs +301 -0
  19. package/cli/setup.mjs +3 -2
  20. package/cli/skill.mjs +263 -63
  21. package/cli/standup.mjs +709 -0
  22. package/cli/toolbox.mjs +433 -11
  23. package/cli/usage.mjs +18 -11
  24. package/cli/workspace.mjs +14 -5
  25. package/package.json +5 -3
  26. package/skills/sdlc/config.yaml +1 -1
  27. package/skills/sdlc/module-help.csv +1 -1
  28. package/skills/yad-backfill/SKILL.md +40 -7
  29. package/skills/yad-backfill/references/backfill.md +5 -4
  30. package/skills/yad-change/SKILL.md +1 -1
  31. package/skills/yad-checks/templates/checks/member-check.mjs +197 -0
  32. package/skills/yad-checks/templates/github/yad-product-checks.yml +15 -0
  33. package/skills/yad-checks/templates/gitlab/yad-product-checks.gitlab-ci.yml +9 -0
  34. package/skills/yad-connect-design/SKILL.md +16 -0
  35. package/skills/yad-connect-learning/SKILL.md +14 -0
  36. package/skills/yad-connect-repos/SKILL.md +34 -5
  37. package/skills/yad-connect-repos/references/code-context.md +5 -5
  38. package/skills/yad-connect-testing/SKILL.md +20 -0
  39. package/skills/yad-docs/SKILL.md +1 -1
  40. package/skills/yad-epic/references/state-schema.md +10 -2
  41. package/skills/yad-learn/SKILL.md +14 -0
  42. package/skills/yad-run/SKILL.md +7 -4
  43. package/skills/yad-run/references/run-loop.md +2 -1
  44. package/skills/yad-spec/SKILL.md +37 -6
  45. package/skills/yad-spec/references/spec-handoff.md +2 -2
  46. package/skills/yad-status/SKILL.md +3 -0
  47. package/skills/yad-test-cases/SKILL.md +20 -0
  48. package/skills/yad-ui/SKILL.md +36 -3
@@ -14,6 +14,34 @@ This is **setup/maintenance**, not a gated Shape step — it never touches `.sdl
14
14
  epic's approvals. It writes the project-wide registry, the per-repo context cache, and — in the code
15
15
  repo itself — a draft of that repo's risk map (Step 3b), which the team commits there through a PR.
16
16
 
17
+ ## When a tool is missing
18
+
19
+ <!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
20
+
21
+ No tool below is required. When one is missing, this skill still finishes, using the fallback written
22
+ beside it.
23
+
24
+ For Repomix, decide from yad's answer, not from a guess:
25
+ run `yad toolbox list --json` and read, in its `tools` list, the entry with the tool's `id`. Run it
26
+ where the tool will run: for work inside a code repo, add `--dir <that repo>`, so the tools installed
27
+ there are found.
28
+
29
+ - **The team's choices.** They come from the Product. If the answer's `product` is null, yad found no
30
+ Product, so a tool the team chose not to use still shows `used: true`. Tell the person that.
31
+ - **When yad cannot see the tool.** yad does not read every way a tool can be set up (an older install
32
+ may be missed). If the entry says `missing` but the check in the steps below finds the tool, use
33
+ it — but never when the entry says `used: false`.
34
+ - **When yad cannot answer** (yad is not installed here, or the command fails), use the check in the
35
+ steps below.
36
+
37
+ Tell the person which tools you used and which fallbacks, and why.
38
+
39
+ - **Repomix** (`repomix`). Use it when its entry has `used: true` and `status.state` is `installed` or `available`. Otherwise — not found, its plugin turned off in Claude Code, or the team chose not to use it (`yad toolbox remove repomix`) — use the fallback.
40
+ - Fallback — no Repomix pack. yad-connect-repos and yad-backfill put the same context together by hand, from the source tree and the recent git log, and the Shape steps read the code map.
41
+ - Record `source: repomix-unavailable`. It means the tool was not used, whatever the reason.
42
+
43
+ <!-- end: When a tool is missing -->
44
+
17
45
  ## Conventions
18
46
 
19
47
  - `{project-root}` resolves from the project working directory (the **Product**).
@@ -21,8 +49,9 @@ repo itself — a draft of that repo's risk map (Step 3b), which the team commit
21
49
  Impeccable, later) are installed/run **here** and target the connected code repos **by path**. The
22
50
  code repos themselves need no install for this. (The Build CI gates are the exception — they
23
51
  live inside each code repo; see `yad-checks`.)
24
- - **Repomix is a true CLI subprocess** (Phase 0 / RESEARCH-NOTES §3): `npx repomix@latest [flags]` —
25
- NOT a slash-command. It secret-scans by default (Secretlint).
52
+ - **Repomix is a true CLI subprocess** (Phase 0 / RESEARCH-NOTES §3): `npx repomix@1.18.1 [flags]` —
53
+ NOT a slash-command. Run exactly that version: it is the one yadflow vetted, and `@latest` would
54
+ take a release nobody checked. It secret-scans by default (Secretlint).
26
55
  - Registry: `{project-root}/.sdlc/repos.json` (project-wide, shared across all epics — NOT per-epic).
27
56
  - Per-repo cache: `{project-root}/.sdlc/code-context/<repo>/` holds `pack.md` + `code-map.md`.
28
57
 
@@ -84,12 +113,12 @@ Determine where the code is:
84
113
  ### Step 2 — Pack the repo (Repomix, the full cached context layer)
85
114
  From the code repo, run (flags from `config.yaml` `code_context.pack_flags`):
86
115
  ```
87
- npx repomix@latest --compress --include-logs --style markdown -o {project-root}/.sdlc/code-context/<repo>/pack.md
116
+ npx repomix@1.18.1 --compress --include-logs --style markdown -o {project-root}/.sdlc/code-context/<repo>/pack.md
88
117
  ```
89
118
  `--compress` (Tree-sitter structural compression) keeps it small and signal-dense; `--include-logs`
90
119
  adds recent git history; Secretlint secret-scans by default. **If a secret is reported, STOP and have
91
120
  it redacted before any AI reads the pack.** Pack the whole repo, or the source boundary from the
92
- project's constitution if one is defined. (If `npx repomix` is unavailable, degrade: hand-assemble the
121
+ project's constitution if one is defined. (If Repomix is not used — see **When a tool is missing** — degrade: hand-assemble the
93
122
  same context — the repo's source tree + recent git log — and record `source: repomix-unavailable`.)
94
123
 
95
124
  ### Step 3 — Build the code-map (the lightweight index layer)
@@ -231,7 +260,7 @@ the repo's default branch.
231
260
  The cached pack + map are the default. When a Shape phase needs an **area** not in the map, it may
232
261
  re-run Repomix **live**, scoped to that area:
233
262
  ```bash
234
- npx repomix@latest --compress --include "<area globs>" --style markdown -o -
263
+ npx repomix@1.18.1 --compress --include "<area globs>" --style markdown -o -
235
264
  ```
236
265
  Same CLI, invoked ad hoc — no registry write. A **stale repo** (HEAD ≠ `syncedHead`) is different: the
237
266
  phase **flags it and stops**, pointing the human at `yad repo refresh <repo>` (or `yad check --fix`) —
@@ -10,7 +10,7 @@ Run from the Product, targeting the connected repo (flags from `config.yaml`
10
10
  `code_context.pack_flags`):
11
11
 
12
12
  ```
13
- npx repomix@latest --compress --include-logs --style markdown \
13
+ npx repomix@1.18.1 --compress --include-logs --style markdown \
14
14
  -o {project-root}/.sdlc/code-context/<repo>/pack.md
15
15
  ```
16
16
 
@@ -20,8 +20,8 @@ npx repomix@latest --compress --include-logs --style markdown \
20
20
  - **Secretlint runs by default** — if a secret is reported, **STOP and redact** before any AI reads the
21
21
  pack. Never let a secret reach the model or the cache.
22
22
 
23
- Pack the whole repo, or the source boundary defined in the project's constitution. If `npx repomix` is
24
- unavailable, degrade: hand-assemble the same context (the repo's source tree + recent git log) and
23
+ Pack the whole repo, or the source boundary defined in the project's constitution. If Repomix is not
24
+ used (the skill's "When a tool is missing" section says how to tell), degrade: hand-assemble the same context (the repo's source tree + recent git log) and
25
25
  record `source: repomix-unavailable` in the registry entry.
26
26
 
27
27
  ## Layer 2 — the code-map (lightweight index, the default the brain reads)
@@ -73,7 +73,7 @@ When a Shape phase needs an area not captured in the code-map, it may re-pack th
73
73
  scoped to the area, without writing the cache:
74
74
 
75
75
  ```bash
76
- npx repomix@latest --compress --include "<area globs>" --style markdown -o -
76
+ npx repomix@1.18.1 --compress --include "<area globs>" --style markdown -o -
77
77
  ```
78
78
 
79
79
  This is for a one-off look at a specific area. **Staleness is a human decision, not an automatic
@@ -93,7 +93,7 @@ lands the removal + the managed `.gitignore` line in the same audit commit. The
93
93
  ## Why this stays DRY with backfill
94
94
 
95
95
  `yad-backfill` already documents the exact Repomix command, the Secretlint discipline, the
96
- `repomix: unavailable` degrade, and the "describe what exists, do not invent" prompt
96
+ `source: repomix-unavailable` degrade, and the "describe what exists, do not invent" prompt
97
97
  (`../yad-backfill/references/backfill.md`). This skill reuses all of it; the only differences are
98
98
  **scope** (repo-wide index vs one feature) and **output** (a lightweight code-map for the brain vs a
99
99
  human-approved feature spec). Backfill produces a *verified* spec that gates changes; connect produces a
@@ -16,6 +16,26 @@ tool is connected and its MCP is available, the `test architect` lens **generate
16
16
  into the connected repo(s) (or **links** an existing suite and reads it back); when nothing is
17
17
  connected, `yad-test-cases` runs artifacts-only exactly as before.
18
18
 
19
+ ## When a tool is missing
20
+
21
+ <!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
22
+
23
+ No tool below is required. When one is missing, this skill still finishes, using the fallback written
24
+ beside it.
25
+
26
+ Tell the person which tools you used and which fallbacks, and why.
27
+
28
+ - **Playwright MCP** (`playwright`, a connector). This skill connects it, by writing `.sdlc/testing.json` as the steps below say. The other skills follow that file, not yad's toolbox answer.
29
+ - Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
30
+ - **Cypress** (`cypress`, a connector). This skill connects it, by writing `.sdlc/testing.json` as the steps below say. The other skills follow that file, not yad's toolbox answer.
31
+ - Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
32
+ - **pytest** (`pytest`, a connector). This skill connects it, by writing `.sdlc/testing.json` as the steps below say. The other skills follow that file, not yad's toolbox answer.
33
+ - Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
34
+ - **Maestro** (`maestro`, a connector). This skill connects it, by writing `.sdlc/testing.json` as the steps below say. The other skills follow that file, not yad's toolbox answer.
35
+ - Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
36
+
37
+ <!-- end: When a tool is missing -->
38
+
19
39
  ## Conventions
20
40
 
21
41
  - `{project-root}` resolves from the project working directory (the **Product**).
@@ -120,7 +120,7 @@ Optionally record a `docs:` line in a `DOCS.md` index under the epic.
120
120
  - `action: generate` (default) — generate the source + manifest; stop. The CLI may npm-build to verify,
121
121
  but no publish.
122
122
  - `action: deploy` — drive **`yad docs deploy --epic <id>`**: it npm-builds the site (`npm ci && npm run
123
- build` as a subprocess, like `yad-spec` shelling `npx repomix`), ensures the Pages CI workflow is
123
+ build` as a subprocess, like `yad-spec` shelling out to Repomix), ensures the Pages CI workflow is
124
124
  present, and reports the deploy URL (publish happens via CI). **Degrades** to the local `dist/` path
125
125
  when no platform CLI / `target: "none"` (build-only). **A failed build exits 1**: if `npm ci` (or
126
126
  `npm install`, when the site has no lockfile) or `npm run build` fails, or the site was never generated, the command names the site and exits 1 —
@@ -119,6 +119,14 @@ binding that will never run: a value that is not a skill name (`YAD-CFG-006`), a
119
119
  does not know (`skills:unknown-step`) and a review gate, which `yad gate` drives (`skills:review-step`).
120
120
  It never rewrites the file.
121
121
 
122
+ A line can also apply to **one route only** (E51): `"profiles": { "spike": { "steps": { "epic":
123
+ "spike-skill" } } }`, written with `yad skill bind <step> <skill> --profile <route>`. The most specific
124
+ line wins — the epic's route (the `profile` its `state.json` records, as written; an epic that records
125
+ none uses the project-wide line, never a route guessed from its chain), then the project-wide `steps`,
126
+ then the catalogue. `yad skill list --epic <id>` shows one
127
+ epic's view; `yad doctor` also reports a route this release does not have (`skills:unknown-profile`)
128
+ and a step the route never walks (`skills:off-route`).
129
+
122
130
  **The kill switch and the Shape dials live in `.sdlc/automation.json` (E34)**, also a Product-level file,
123
131
  also absent by default:
124
132
 
@@ -762,8 +770,8 @@ no `steps`, just the state and its record:
762
770
  `yad next` reads these files too: once an epic is `ready-for-build`, `yad next <epic>` resolves each
763
771
  story/repo's `currentStep` into the next build sub-step and prints it with the remaining chain and the
764
772
  step's advance dial — so Build is guided, not just hinted at. The skill it names comes from
765
- `.sdlc/skills.json` when the project bound one (see "The one column a project overrides is the skill"
766
- above); unbound, the defaults are `spec`/`tasks` → `yad-spec`, `implement` → `yad-implement`,
773
+ `.sdlc/skills.json` when the project bound one — for the epic's route first, then project-wide (see
774
+ "The one column a project overrides is the skill" above); unbound, the defaults are `spec`/`tasks` → `yad-spec`, `implement` → `yad-implement`,
767
775
  `checks` → `yad-checks`, `engineer-review` → `yad-engineer-review`.
768
776
 
769
777
  ## `trust-log.json` (shard-then-fold)
@@ -22,6 +22,20 @@ This is a **cross-cutting, opt-in** skill (like `yad-status`, it runs any time).
22
22
  it does not move `currentStep`, never records an approval, and never touches `.sdlc/state.json`, the
23
23
  approvals ledger, or the contract lock. It writes only the local learning ledger + tutorial artifacts.
24
24
 
25
+ ## When a tool is missing
26
+
27
+ <!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
28
+
29
+ No tool below is required. When one is missing, this skill still finishes, using the fallback written
30
+ beside it.
31
+
32
+ Tell the person which tools you used and which fallbacks, and why.
33
+
34
+ - **DeepTutor** (`deeptutor`, a connector). Used when `.sdlc/learning.json` connects it. yad-connect-learning writes that file; follow it, not yad's toolbox answer.
35
+ - Fallback — harness-native tutoring: yad-learn has your agent read the project files directly.
36
+
37
+ <!-- end: When a tool is missing -->
38
+
25
39
  ## Conventions
26
40
 
27
41
  - `{project-root}` resolves from the project working directory (the **Product**).
@@ -72,15 +72,18 @@ it**: stop, report the recorded `record.reason`, and point at `yad unskip <epic>
72
72
  the lane is owed after all. **Never write a Build step as `skipped` or `deferred`**: a lane is skipped
73
73
  whole or not at all, and `yad doctor` reports a single step set aside.
74
74
 
75
- Also read **which skill runs each step** — `yad skill list --json`, whose `steps[]` gives each step id
76
- its `skills` array. That is the project's choice (`.sdlc/skills.json`, E6) and the engine's default
77
- when it has made none. Read it once here; it does not change during a run.
75
+ Also read **which skill runs each step** — `yad skill list --epic <epic> --json`, whose `steps[]` gives
76
+ each step id its `skills` array. Always pass `--epic`: a project may bind a step for one route only
77
+ (`profiles.<route>` in `.sdlc/skills.json`, E51), and that line wins for an epic on the route — the
78
+ plain `yad skill list` shows the project-wide answer, which may be the wrong skill for this epic. That
79
+ is the project's choice (`.sdlc/skills.json`, E6) and the engine's default when it has made none. Read
80
+ it once here; it does not change during a run.
78
81
 
79
82
  ### `action: run` — drive the loop
80
83
  Walk the steps for `repo` starting at `from`/`currentStep`. For each step:
81
84
 
82
85
  1. **Run the step's skill — use the list from Step 0, never a name written here.** Look the step id
83
- up in `yad skill list --json` and run every entry of its `skills` **in order**, each one seeing what
86
+ up in `yad skill list --epic <epic> --json` and run every entry of its `skills` **in order**, each one seeing what
84
87
  the one before it produced; the last output is the result. (`yad next <epic> --json` gives the same
85
88
  answer per lane once `build-state/<story>.json` is on disk, if you already have it open.) Which
86
89
  skill runs a step is the project's setting, so a hardcoded name here would make this loop do one
@@ -14,7 +14,8 @@ spec → tasks → implement → checks → engineer-review(locked)
14
14
  ```
15
15
 
16
16
  **These names are the engine's DEFAULTS, not a fixed wiring.** Which skill runs a step is the
17
- project's setting in `.sdlc/skills.json`, so the loop reads `yad skill list --json` once at Step 0 and
17
+ project's setting in `.sdlc/skills.json` — for every epic, or for one route only — so the loop reads
18
+ `yad skill list --epic <epic> --json` (that epic's route, E51) once at Step 0 and
18
19
  runs every entry of that step's `skills`, in order, when it is bound to more than one. Unbound: `spec` and `tasks` are the two legs of `yad-spec` (the heavy ceremony, then the atomic
19
20
  `tasks.md`), `implement` is one atomic task via `yad-implement`, and `checks` is
20
21
  `yad-checks (action: run)`. `engineer-review` is the human gate at `yad-engineer-review` — always a
@@ -14,10 +14,39 @@ when driven by the orchestrator (`yad-run`, Phase 4) it records a `spec`/`tasks`
14
14
  (Step 8) — but it never auto-advances a contract change or a Shape step.
15
15
 
16
16
  Spec Kit is driven as **harness slash-commands** (`/speckit.*`), not a subprocess CLI (Phase 0
17
- Deviation 3). When Spec Kit is not installed, the same files are hand-authored in Spec Kit's exact
18
- layout and the spec is marked `speckit: not-installed` — the workflow does not block on the tool. This
17
+ Deviation 3). When Spec Kit is not used (**When a tool is missing** below), the same files are
18
+ hand-authored in Spec Kit's exact layout and the spec is marked `speckit: not-installed` — the workflow
19
+ does not block on the tool. This
19
20
  is the same graceful-degradation pattern `yad-ui` uses for Impeccable.
20
21
 
22
+ ## When a tool is missing
23
+
24
+ <!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
25
+
26
+ No tool below is required. When one is missing, this skill still finishes, using the fallback written
27
+ beside it.
28
+
29
+ For Spec Kit, decide from yad's answer, not from a guess:
30
+ run `yad toolbox list --json` and read, in its `tools` list, the entry with the tool's `id`. Run it
31
+ where the tool will run: for work inside a code repo, add `--dir <that repo>`, so the tools installed
32
+ there are found.
33
+
34
+ - **The team's choices.** They come from the Product. If the answer's `product` is null, yad found no
35
+ Product, so a tool the team chose not to use still shows `used: true`. Tell the person that.
36
+ - **When yad cannot see the tool.** yad does not read every way a tool can be set up (an older install
37
+ may be missed). If the entry says `missing` but the check in the steps below finds the tool, use
38
+ it — but never when the entry says `used: false`.
39
+ - **When yad cannot answer** (yad is not installed here, or the command fails), use the check in the
40
+ steps below.
41
+
42
+ Tell the person which tools you used and which fallbacks, and why.
43
+
44
+ - **Spec Kit** (`spec-kit`). Use it when its entry has `used: true` and `status.state` is `installed` or `available`. Otherwise — not found, its plugin turned off in Claude Code, or the team chose not to use it (`yad toolbox remove spec-kit`) — use the fallback.
45
+ - Fallback — yad-spec writes the same spec files by hand, in Spec Kit's layout.
46
+ - Record `speckit: not-installed`. It means the tool was not used, whatever the reason.
47
+
48
+ <!-- end: When a tool is missing -->
49
+
21
50
  ## Conventions
22
51
 
23
52
  - `{project-root}` resolves from the project working directory — the **product** repo (epic
@@ -75,17 +104,19 @@ contract here. (On a route that HAS one; the short lanes do not — see below.)
75
104
  already exists, a commit that only DELETES it is allowed through, which is the way back out.)
76
105
 
77
106
  ### Step 4 — Detect Spec Kit
78
- Check for `/speckit.*` slash-commands and/or `demo-repos/<repo>/.specify/`. Record the result for
79
- Step 6's frontmatter (`speckit: installed | not-installed`).
107
+ Read Spec Kit's entry in `yad toolbox list --json --dir demo-repos/<repo>`, as **When a tool is
108
+ missing** says. If yad cannot answer, check for `/speckit.*` slash-commands and/or
109
+ `demo-repos/<repo>/.specify/`. Record the result for Step 6's
110
+ frontmatter (`speckit: installed | not-installed`).
80
111
 
81
112
  ### Step 5 — Run the heavy ceremony ONCE (or degrade)
82
- **Installed** — from inside `demo-repos/<repo>/`, drive, in order:
113
+ **Used** — from inside `demo-repos/<repo>/`, drive, in order:
83
114
  `/speckit.specify` → `/speckit.clarify` → `/speckit.plan` → `/speckit.analyze` →
84
115
  `/speckit.checklist` → `/speckit.tasks`. **Pin the feature to `<story>`** (do not accept an
85
116
  auto-slug). Seed `specify` from the story's acceptance criteria and the contract elements from Step 3.
86
117
  `/speckit.constitution` and `/speckit.implement` are **out of scope for Step A** (implement is Step B).
87
118
 
88
- **Not installed (degrade)** — hand-author the identical files in Spec Kit's layout under
119
+ **Not used (degrade)** — hand-author the identical files in Spec Kit's layout under
89
120
  `demo-repos/<repo>/specs/<story>/`: `spec.md`, `research.md`, `data-model.md`, `contracts/`,
90
121
  `plan.md`, `tasks.md`. The content is what a real Spec Kit run would produce, traceable to the story's
91
122
  acceptance criteria and the locked contract surface. `tasks.md` MUST be numbered atomic tasks (`T01…`),
@@ -2,7 +2,7 @@
2
2
 
3
3
  Step A (`yad-spec`) runs the **heavy Spec Kit ceremony once per story per repo** and writes the
4
4
  result into the story's code repo. This reference pins the exact commands, the files they produce, and
5
- how to hand-author the same files faithfully when Spec Kit is not installed — so Step B
5
+ how to hand-author the same files faithfully when Spec Kit is not used — so Step B
6
6
  (`yad-implement`, not built yet) can read them unchanged.
7
7
 
8
8
  ## The ceremony (run once, in order)
@@ -39,7 +39,7 @@ demo-repos/<repo>/specs/<story-id>/
39
39
  link.md # back-pointer to the story in the product repo (Step A adds this; not a Spec Kit file)
40
40
  ```
41
41
 
42
- ## Degradation rules (when Spec Kit is not installed)
42
+ ## Degradation rules (when Spec Kit is not used)
43
43
 
44
44
  Author each file by hand so it is **indistinguishable in shape** from a real Spec Kit run. The content
45
45
  comes from the story's acceptance criteria and the **locked contract surface** — never invented.
@@ -15,6 +15,9 @@ reads `.sdlc/` and `reviews/` and reports.
15
15
 
16
16
  ## On Activation
17
17
 
18
+ This skill reports on epics. For people — what each team member did since the previous working day,
19
+ what they are working on and what is waiting — point to `yad standup` (E132) instead of rebuilding it.
20
+
18
21
  ### Step 1 — Resolve the epic
19
22
  If no `EP-<slug>` was given, list the epics under `{project-root}/epics/` and ask which one (or
20
23
  report all if the user asked for an overview).
@@ -23,6 +23,26 @@ automation is materialized in the **testing tool connected via `yad-connect-test
23
23
  into it (or **links** an existing suite and reads it back); when none is connected, the step degrades to
24
24
  the Markdown artifact only — the testing tool is additive, exactly like the design tool.
25
25
 
26
+ ## When a tool is missing
27
+
28
+ <!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
29
+
30
+ No tool below is required. When one is missing, this skill still finishes, using the fallback written
31
+ beside it.
32
+
33
+ Tell the person which tools you used and which fallbacks, and why.
34
+
35
+ - **Playwright MCP** (`playwright`, a connector). Used when `.sdlc/testing.json` connects it. yad-connect-testing writes that file; follow it, not yad's toolbox answer.
36
+ - Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
37
+ - **Cypress** (`cypress`, a connector). Used when `.sdlc/testing.json` connects it. yad-connect-testing writes that file; follow it, not yad's toolbox answer.
38
+ - Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
39
+ - **pytest** (`pytest`, a connector). Used when `.sdlc/testing.json` connects it. yad-connect-testing writes that file; follow it, not yad's toolbox answer.
40
+ - Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
41
+ - **Maestro** (`maestro`, a connector). Used when `.sdlc/testing.json` connects it. yad-connect-testing writes that file; follow it, not yad's toolbox answer.
42
+ - Fallback — artifacts-only: yad-test-cases writes test-cases.md only.
43
+
44
+ <!-- end: When a tool is missing -->
45
+
26
46
  ## Conventions
27
47
 
28
48
  - `{project-root}` resolves from the project working directory.
@@ -12,7 +12,7 @@ screens and/or web pages — inside that tool (e.g. Figma), linked back from the
12
12
  passes to `yad-review-gate` (base rule: 1 distinct approver, who should not be the author).
13
13
 
14
14
  UI work is shaped by **Impeccable**, invoked as **harness slash-commands** (not a subprocess CLI) per
15
- the Phase 0 deviation. If Impeccable is not installed, the `ux-designer` lens authors the same outputs
15
+ the Phase 0 deviation. If Impeccable is not used (**When a tool is missing** below), the `ux-designer` lens authors the same outputs
16
16
  directly — the workflow does not block on the tool.
17
17
 
18
18
  The visual design is materialized in the **design tool connected via `yad-connect-design`**
@@ -21,6 +21,38 @@ The visual design is materialized in the **design tool connected via `yad-connec
21
21
  is connected, the step degrades to the Markdown artifacts only — the design tool is additive, exactly
22
22
  like Impeccable.
23
23
 
24
+ ## When a tool is missing
25
+
26
+ <!-- Written from yadflow's cli/toolbox.mjs (E87). Change the words there: a test holds this section to it. -->
27
+
28
+ No tool below is required. When one is missing, this skill still finishes, using the fallback written
29
+ beside it.
30
+
31
+ For Impeccable (the one tool here that is not a connector), decide from yad's answer, not from a guess:
32
+ run `yad toolbox list --json` and read, in its `tools` list, the entry with the tool's `id`. Run it
33
+ where the tool will run: for work inside a code repo, add `--dir <that repo>`, so the tools installed
34
+ there are found.
35
+
36
+ - **The team's choices.** They come from the Product. If the answer's `product` is null, yad found no
37
+ Product, so a tool the team chose not to use still shows `used: true`. Tell the person that.
38
+ - **When yad cannot see the tool.** yad does not read every way a tool can be set up (an older install
39
+ may be missed). If the entry says `missing` but the check in the steps below finds the tool, use
40
+ it — but never when the entry says `used: false`.
41
+ - **When yad cannot answer** (yad is not installed here, or the command fails), use the check in the
42
+ steps below.
43
+
44
+ Tell the person which tools you used and which fallbacks, and why.
45
+
46
+ - **Impeccable** (`impeccable`). Use it when its entry has `used: true` and `status.state` is `installed` or `available`. Otherwise — not found, its plugin turned off in Claude Code, or the team chose not to use it (`yad toolbox remove impeccable`) — use the fallback.
47
+ - Fallback — markdown-only UI design: yad-ui writes ui-design.md and DESIGN.md directly.
48
+ - Record `impeccable: not-installed`. It means the tool was not used, whatever the reason.
49
+ - **Figma** (`figma`, a connector). Used when `.sdlc/design.json` connects it. yad-connect-design writes that file; follow it, not yad's toolbox answer.
50
+ - Fallback — markdown-only: yad-ui writes ui-design.md and DESIGN.md only.
51
+ - **Pencil (pen.dev)** (`pencil`, a connector). Used when `.sdlc/design.json` connects it. yad-connect-design writes that file; follow it, not yad's toolbox answer.
52
+ - Fallback — markdown-only: yad-ui writes ui-design.md and DESIGN.md only.
53
+
54
+ <!-- end: When a tool is missing -->
55
+
24
56
  ## Conventions
25
57
 
26
58
  - `{project-root}` resolves from the project working directory.
@@ -84,7 +116,7 @@ Read the registry `{project-root}/.sdlc/repos.json` (`config.yaml` `code_context
84
116
  `epic.repos`**, load the code-map `{project-root}/.sdlc/code-context/<repo>/code-map.md` so the UI
85
117
  **reuses existing components and conventions** rather than inventing parallel ones. This complements
86
118
  Impeccable's `/impeccable document` (Step 3), which reads code directly for the design system — when
87
- Impeccable is absent, the code-map is the brain's view of what UI/components already exist.
119
+ Impeccable is not used, the code-map is the brain's view of what UI/components already exist.
88
120
 
89
121
  - **Greenfield-safe:** if `repos.json` is absent/empty, note "no repos connected" and proceed.
90
122
  - **Staleness:** if a repo's current HEAD ≠ its registry `syncedHead`, warn and suggest
@@ -102,7 +134,8 @@ Adopt the **ux-designer** lens. Drive Impeccable as slash-commands:
102
134
  `/impeccable document` generates the root `DESIGN.md` from existing code; `/impeccable extract` pulls
103
135
  components/tokens into the design system; `/impeccable craft` is shape-then-build for the new screens.
104
136
 
105
- **Graceful degradation:** if Impeccable is not installed (no `/impeccable …` commands available), the
137
+ **Graceful degradation:** if Impeccable is not used (**When a tool is missing** says how to tell; if
138
+ yad cannot answer, it is not used when no `/impeccable …` commands are available), the
106
139
  `ux-designer` lens authors `ui-design.md` and `DESIGN.md` directly, and you **note in `ui-design.md`
107
140
  that Impeccable was not used**. Do not run `npx impeccable skills install` as part of this step — tool
108
141
  installation is out of scope for Shape.