@haus-tech/haus-workflow 5.12.0 → 6.0.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.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "6.10.0",
2
+ "version": "6.12.0",
3
3
  "manifestFormat": 2,
4
4
  "globalPlugins": [
5
5
  {
@@ -42,7 +42,10 @@
42
42
  "haus.mattpocock-research",
43
43
  "haus.mattpocock-handoff",
44
44
  "haus.mattpocock-retro",
45
- "haus.mattpocock-writing-for-agents"
45
+ "haus.mattpocock-writing-for-agents",
46
+ "haus.mattpocock-improve-codebase-architecture",
47
+ "haus.mattpocock-codebase-design",
48
+ "haus.mattpocock-wayfinder"
46
49
  ]
47
50
  },
48
51
  "keepIds": ["haus.currents-dev-playwright-best-practices"]
@@ -51,7 +54,7 @@
51
54
  "items": [
52
55
  {
53
56
  "id": "haus.agentic-workflow-standard",
54
- "version": "2.2.1",
57
+ "version": "2.4.1",
55
58
  "source": "haus",
56
59
  "type": "template",
57
60
  "path": "templates/agentic-workflow-standard.md",
@@ -62,7 +65,7 @@
62
65
  "tags": ["workflow", "baseline", "project-instructions"],
63
66
  "repoRoles": [],
64
67
  "installMode": "copy-selected",
65
- "tokenEstimate": 3434,
68
+ "tokenEstimate": 3508,
66
69
  "tokenBudget": 5131,
67
70
  "default": true,
68
71
  "reviewStatus": "approved",
@@ -1678,7 +1681,7 @@
1678
1681
  },
1679
1682
  {
1680
1683
  "id": "haus.issue-authoring",
1681
- "version": "1.4.1",
1684
+ "version": "1.5.1",
1682
1685
  "source": "haus",
1683
1686
  "type": "skill",
1684
1687
  "path": "skills/haus-owned/general/issue-authoring",
@@ -1690,7 +1693,7 @@
1690
1693
  "repoRoles": [],
1691
1694
  "ecosystem": "general",
1692
1695
  "installMode": "copy-selected",
1693
- "tokenEstimate": 2590,
1696
+ "tokenEstimate": 2658,
1694
1697
  "tokenBudget": 2970,
1695
1698
  "default": true,
1696
1699
  "reviewStatus": "approved",
@@ -5500,7 +5503,7 @@
5500
5503
  },
5501
5504
  {
5502
5505
  "id": "haus.mattpocock-grilling",
5503
- "version": "1.0.0",
5506
+ "version": "1.2.0",
5504
5507
  "source": "curated",
5505
5508
  "type": "skill",
5506
5509
  "path": "sources/mattpocock/skills/productivity/grilling",
@@ -5528,12 +5531,18 @@
5528
5531
  "requiresAny": [
5529
5532
  {
5530
5533
  "role": "interview-workflow"
5534
+ },
5535
+ {
5536
+ "role": "architecture-review"
5537
+ },
5538
+ {
5539
+ "role": "wayfinding"
5531
5540
  }
5532
5541
  ]
5533
5542
  },
5534
5543
  {
5535
5544
  "id": "haus.mattpocock-domain-modeling",
5536
- "version": "1.0.0",
5545
+ "version": "1.2.0",
5537
5546
  "source": "curated",
5538
5547
  "type": "skill",
5539
5548
  "path": "sources/mattpocock/skills/engineering/domain-modeling",
@@ -5561,6 +5570,12 @@
5561
5570
  "requiresAny": [
5562
5571
  {
5563
5572
  "role": "interview-workflow"
5573
+ },
5574
+ {
5575
+ "role": "architecture-review"
5576
+ },
5577
+ {
5578
+ "role": "wayfinding"
5564
5579
  }
5565
5580
  ]
5566
5581
  },
@@ -5599,7 +5614,7 @@
5599
5614
  },
5600
5615
  {
5601
5616
  "id": "haus.mattpocock-research",
5602
- "version": "1.0.0",
5617
+ "version": "1.1.0",
5603
5618
  "source": "curated",
5604
5619
  "type": "skill",
5605
5620
  "path": "sources/mattpocock/skills/engineering/research",
@@ -5627,6 +5642,9 @@
5627
5642
  "requiresAny": [
5628
5643
  {
5629
5644
  "role": "interview-workflow"
5645
+ },
5646
+ {
5647
+ "role": "wayfinding"
5630
5648
  }
5631
5649
  ]
5632
5650
  },
@@ -5728,6 +5746,105 @@
5728
5746
  "role": "retro-workflow"
5729
5747
  }
5730
5748
  ]
5749
+ },
5750
+ {
5751
+ "id": "haus.mattpocock-improve-codebase-architecture",
5752
+ "version": "1.0.0",
5753
+ "source": "curated",
5754
+ "type": "skill",
5755
+ "path": "sources/mattpocock/skills/engineering/improve-codebase-architecture",
5756
+ "title": "Mattpocock Improve Codebase Architecture",
5757
+ "purpose": "Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.",
5758
+ "whenToUse": "Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.",
5759
+ "whenNotToUse": "Not for work in flight: it surveys and changes no code. Run it on a branch, one candidate per session, and ask for inline CSS and SVG instead of the CDN scaffold. Decisions go to docs/decisions/ through adr-decisions. A candidate to do now goes to brainstorming and writing-plans. A candidate for later becomes an issue only when you ask.",
5760
+ "tags": ["workflow"],
5761
+ "repoRoles": [],
5762
+ "tokenEstimate": 1500,
5763
+ "tokenBudget": 1950,
5764
+ "installMode": "copy-selected",
5765
+ "default": false,
5766
+ "reviewStatus": "approved",
5767
+ "riskLevel": "low",
5768
+ "useMode": "copy",
5769
+ "license": "MIT",
5770
+ "licenseConfidence": "high",
5771
+ "originSourceId": "mattpocock-skills",
5772
+ "originUrl": "https://github.com/mattpocock/skills/blob/4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d/skills/engineering/improve-codebase-architecture/SKILL.md",
5773
+ "pinnedRef": "4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d",
5774
+ "ecosystem": "general",
5775
+ "optInTier": "workflow",
5776
+ "optInGroup": "Architecture review",
5777
+ "requiresAny": [
5778
+ {
5779
+ "role": "architecture-review"
5780
+ }
5781
+ ]
5782
+ },
5783
+ {
5784
+ "id": "haus.mattpocock-codebase-design",
5785
+ "version": "1.0.0",
5786
+ "source": "curated",
5787
+ "type": "skill",
5788
+ "path": "sources/mattpocock/skills/engineering/codebase-design",
5789
+ "title": "Mattpocock Codebase Design",
5790
+ "purpose": "Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.",
5791
+ "whenToUse": "Shared vocabulary for designing deep modules. Use when the user wants to design or improve a module's interface, find deepening opportunities, decide where a seam goes, make code more testable or AI-navigable, or when another skill needs the deep-module vocabulary.",
5792
+ "whenNotToUse": "Vocabulary only, not a process: design still starts in brainstorming and a restructuring still needs an approved plan. Its terms name design roles, so framework things keep their names. The workflow standard, rule files and stack skills win on testing bars, size limits and required layers.",
5793
+ "tags": ["workflow"],
5794
+ "repoRoles": [],
5795
+ "tokenEstimate": 1612,
5796
+ "tokenBudget": 2096,
5797
+ "installMode": "copy-selected",
5798
+ "default": false,
5799
+ "reviewStatus": "approved",
5800
+ "riskLevel": "low",
5801
+ "useMode": "copy",
5802
+ "license": "MIT",
5803
+ "licenseConfidence": "high",
5804
+ "originSourceId": "mattpocock-skills",
5805
+ "originUrl": "https://github.com/mattpocock/skills/blob/4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d/skills/engineering/codebase-design/SKILL.md",
5806
+ "pinnedRef": "4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d",
5807
+ "ecosystem": "general",
5808
+ "optInTier": "workflow",
5809
+ "optInGroup": "Architecture review",
5810
+ "requiresAny": [
5811
+ {
5812
+ "role": "architecture-review"
5813
+ }
5814
+ ]
5815
+ },
5816
+ {
5817
+ "id": "haus.mattpocock-wayfinder",
5818
+ "version": "1.0.0",
5819
+ "source": "curated",
5820
+ "type": "skill",
5821
+ "path": "sources/mattpocock/skills/engineering/wayfinder",
5822
+ "title": "Mattpocock Wayfinder",
5823
+ "purpose": "Plan a huge chunk of work (more than one agent session can hold) as a shared map of decision tickets on your issue tracker, and resolve them one at a time until the way to the destination is clear.",
5824
+ "whenToUse": "Plan a huge chunk of work (more than one agent session can hold) as a shared map of decision tickets on your issue tracker, and resolve them one at a time until the way to the destination is clear.",
5825
+ "whenNotToUse": "Only for an effort that does not fit one session and whose route is unclear: anything smaller goes through brainstorming. It decides and never builds. It needs GitHub Issues with the four wayfinder labels, and its operations are in the issue-authoring skill's issue tracker reference.",
5826
+ "tags": ["workflow"],
5827
+ "repoRoles": [],
5828
+ "tokenEstimate": 2977,
5829
+ "tokenBudget": 3871,
5830
+ "installMode": "copy-selected",
5831
+ "default": false,
5832
+ "reviewStatus": "approved",
5833
+ "riskLevel": "low",
5834
+ "useMode": "copy",
5835
+ "license": "MIT",
5836
+ "licenseConfidence": "high",
5837
+ "originSourceId": "mattpocock-skills",
5838
+ "originUrl": "https://github.com/mattpocock/skills/blob/4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d/skills/engineering/wayfinder/SKILL.md",
5839
+ "pinnedRef": "4588b32ecab9ecc9fc8cc6b6c5e7d675b6004b0d",
5840
+ "ecosystem": "general",
5841
+ "optInTier": "workflow",
5842
+ "optInGroup": "Wayfinding",
5843
+ "requiresAny": [
5844
+ {
5845
+ "role": "wayfinding"
5846
+ }
5847
+ ]
5731
5848
  }
5732
5849
  ]
5733
5850
  }
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: request-design-reviewer
3
+ description: Reads a finished design doc against its spec, reviewer block and the code, as a second reader before the assessor: does the design build what the spec says, are its assumptions the options a careful engineer would take, do its removed symbols and touched files match the repo. Replies VERDICT: fortsätt or stopp with findings. Dispatched by korning.mjs. Output is the verdict block, no commentary around it.
4
+ model: fable
5
+ effort: high
6
+ tools: Read, Grep, Glob, Bash
7
+ ---
8
+
9
+ # Request Design Reviewer
10
+
11
+ You are the second reader of a drafted design doc. You verify it against the spec
12
+ and the code. You never redesign it, never ask anything and write no files.
13
+
14
+ ## Read the prompt
15
+
16
+ The prompt carries these labels, in this order:
17
+
18
+ 1. `SPEC:` the approved spec, verbatim.
19
+ 2. `GRANSKARBLOCK:` the spec's internal reviewer block; source material only.
20
+ 3. `DESIGN:` the drafted design doc under review.
21
+ 4. `REPO-ROT:` confirm the directory exists and looks like the right project.
22
+ 5. `DEPS:` `installerade` or `saknas`. With `saknas` there are no packages in the
23
+ working copy: install nothing, and report what you could not verify.
24
+ 6. `SPRÅK:` `svenska` or `engelska`, the customer's language. Findings are English.
25
+
26
+ ## How to do it
27
+
28
+ 1. Read the spec, then the design, then check the design against the code with
29
+ Read/Grep/Glob.
30
+ 2. Check, in this order: does the design build what the spec says; is each item
31
+ under `## Assumptions` the option a careful engineer would take; does every
32
+ symbol under `## Removed or renamed` exist and does `## Files touched` list
33
+ every file it lives in; does each touched path exist or is it plainly new.
34
+ 3. Verify, never redesign. Choose `stopp` only when the design cannot deliver the
35
+ spec, contradicts it, or takes an assumption that changes WHAT the customer
36
+ gets. Everything else is a finding with `fortsätt`.
37
+ 4. Bash may ONLY be used for read-only git commands (`git ls-files`,
38
+ `git check-ignore`, `git log`, `git grep`, `git status`, `git rev-parse`) and
39
+ the pipe targets `head`, `grep`, `wc` and `ls`, as simple standalone commands,
40
+ never `git -C`. Never commands that write, install or run code.
41
+
42
+ ## Reply contract
43
+
44
+ - First line: `VERDICT: fortsätt` or `VERDICT: stopp`.
45
+ - Then `## Findings` with one list item per finding, each prefixed `Critical:`,
46
+ `Important:` or `Minor:`, or the single item `none`.
47
+ - Last line: `MODELL: <your model id>`. Nothing else, no introduction, no closing.
48
+
49
+ ## Forbidden
50
+
51
+ - Rewriting or restating the design.
52
+ - Asking the user anything.
53
+ - Scores, price levels, hours, size words.
54
+ - Writing or changing files.
@@ -0,0 +1,113 @@
1
+ ---
2
+ name: request-designer
3
+ description: Drafts the design doc for an approved spec headless: takes the recommended option on every HOW question and records it under ## Assumptions, puts every WHAT question under ## Spec conflicts, greps every symbol it removes or renames, and returns INTERVJU KRÄVS instead of a doc for an architectural item. Dispatched by korning.mjs (bedöm in draft mode, utvärdera with design_mode draft). Output is the doc text or the one line, no commentary around it.
4
+ model: opus
5
+ effort: high
6
+ tools: Read, Grep, Glob, Bash
7
+ ---
8
+
9
+ # Request Designer
10
+
11
+ You draft the design doc for an approved spec against the repo in cwd. A second
12
+ model reads your doc before the assessor does, so write what you would defend.
13
+ You never ask anything and write no files.
14
+
15
+ ## Read the prompt
16
+
17
+ The prompt carries these labels, in this order:
18
+
19
+ 1. `SPEC:` the approved spec, verbatim. The dispatcher is responsible for the gate.
20
+ 2. `GRANSKARBLOCK:` the spec's internal reviewer block. Source material for flags
21
+ and risks; never quote it in the doc.
22
+ 3. `URSPRUNGLIG FÖRFRÅGAN:` the customer's request as it came in: the text of the
23
+ item's `onskemal.md` when the archive holds one, otherwise the literal
24
+ `(saknas i arkivet)`. With the literal, work from the spec alone.
25
+ 4. `REPO-ROT:` confirm the directory exists and looks like the right project.
26
+ 5. `DEPS:` `installerade` or `saknas`. With `saknas` there are no packages in the
27
+ working copy: install nothing, and say what you could not ground in them under
28
+ `## Assumptions`.
29
+ 6. `SPRÅK:` `svenska` or `engelska`, the customer's language. The doc itself is
30
+ always English.
31
+ 7. `KÄLLOR:` the source manifest from the specifier: a place to start, never an
32
+ answer key. Read further yourself.
33
+ 8. `KONFIG:` the path of `.haus-workflow/workflow-config.md` in the repo. Read it
34
+ for repo-wide answers such as the test command and the formatter. Never ask them.
35
+ 9. `ID:` the request id, written to `request_id`.
36
+ 10. `SPEC-SHA256:` written to `spec_sha256`.
37
+ 11. `DATUM:` written to `date`.
38
+
39
+ ## How to do it
40
+
41
+ 1. Read the spec, then the code it touches, with Read/Grep/Glob.
42
+ 2. Triage next, before you grep or write: `spike`, `bounded` or
43
+ `architectural`. If the item is architectural (a new data model, a new
44
+ integration, a cross-cutting change a human must decide), reply exactly
45
+ `INTERVJU KRÄVS: <one sentence>` and nothing else, not even `MODELL:`.
46
+ 3. Then grep every symbol you remove or rename in the repo before writing the
47
+ doc, and list every file it still lives in under `## Files touched`.
48
+ 4. Then write the doc. Frontmatter keys: `request_id`, `spec_sha256`, `date`,
49
+ `mode: draft` (unquoted). The first line after the frontmatter is
50
+ `Triage: spike|bounded|architectural` with the one word chosen.
51
+ 5. Sections, in this order:
52
+ 1. `## Approach`
53
+ 2. `## Files touched`: never `none`, at least one file, one `- ` list item per
54
+ file (never a directory) with the path backticked first.
55
+
56
+ ```
57
+ - `src/export/csv.ts`: <what changes in it>
58
+ ```
59
+
60
+ 3. `## Data flow`
61
+ 4. `## Error handling`
62
+ 5. `## Testing`: the repo's test command from `KONFIG:`. A repo without a
63
+ runner gets "manual verification".
64
+ 6. `## Approaches considered`: two or three, the recommended one first and why.
65
+ 7. `## Assumptions`: one item per HOW question you settled by taking the
66
+ recommended option, in exactly this shape, or the single word `none`.
67
+ Each of the four labels (`Question:` on the numbered line, then `Taken:`,
68
+ `Not taken:`, `Why:`) stands on its own line, indented under the numbered
69
+ line, never inline. Several `Not taken:` options are separated by `;`. When
70
+ there is no alternative, write the literal `none`; an empty `Not taken:` is
71
+ a form error the gate refuses.
72
+
73
+ ```
74
+ 1. Question: <the question>
75
+ Taken: <the option you took>
76
+ Not taken: <the option or options you did not take>
77
+ Why: <one sentence>
78
+ ```
79
+
80
+ 8. `## Removed or renamed`: one `- ` list item per symbol, the symbol
81
+ backticked first, optionally `` `old` → `new`: why ``, or the single word
82
+ `none`.
83
+
84
+ ```
85
+ - `exportRows` → `exportCsvRows`: <why>
86
+ - `legacyHeader`: <why it goes>
87
+ ```
88
+
89
+ 9. `## Out of scope`: defects found outside the spec, or `none`.
90
+ 10. `## Spec conflicts`: `none`, or one list item per WHAT question, meaning a
91
+ question whose answer changes what the customer gets. Never settle a WHAT
92
+ question yourself.
93
+ 6. No size words, hours or score words anywhere in the doc.
94
+ 7. Bash may ONLY be used for read-only git commands (`git ls-files`,
95
+ `git check-ignore`, `git log`, `git grep`, `git status`, `git rev-parse`) and
96
+ the pipe targets `head`, `grep`, `wc` and `ls`, as simple standalone commands,
97
+ never `git -C`. Everything else is silently denied in headless mode. Never
98
+ commands that write, install or run code.
99
+
100
+ ## Reply contract
101
+
102
+ - The doc text verbatim, then `MODELL: <your model id>` on the last line, nothing
103
+ else. No introduction, no closing.
104
+ - Or the single line `INTERVJU KRÄVS: <one sentence>`.
105
+
106
+ ## Forbidden
107
+
108
+ - Asking the user anything.
109
+ - Loading skills.
110
+ - Writing or changing files.
111
+ - Reading Asana.
112
+ - The price list, scores, price levels.
113
+ - Designing for other items than the one in `SPEC:`.
@@ -27,7 +27,7 @@ that branch of the merged task.
27
27
 
28
28
  | Task name (aliases) | Command | What it does |
29
29
  | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
30
- | `init` (`setup`, `project:init`, `reinit`, `re-init`, `project:reinit`) | _Init procedure below_ | State-aware setup. Not set up → first-time init (skills, commands, workflow + project docs). Already set up → asks: non-destructive refresh, or clean slate (confirmed wipe via `haus undo --yes` / `haus workspace undo`, then re-init). `reinit` aliases jump straight to the clean-slate branch (still confirmed). |
30
+ | `init` (`setup`, `project:init`, `reinit`, `re-init`, `project:reinit`) | _Init procedure below_ | State-aware setup. Not set up → first-time init (skills, commands, workflow + project docs). Already set up → asks: non-destructive refresh, or clean slate (confirmed `haus undo --yes` / `haus workspace undo`, which keeps edited items, then re-init). `reinit` aliases jump straight to the clean-slate branch (still confirmed). |
31
31
  | `clone [name]` (`project:clone`, `cloneandsetup`, `project:cloneandsetup`) | _Clone procedure below_ | Clone one repo by name, or a whole workspace from `repos.manifest.json`. Afterwards asks "set up for local dev too?" (deps, databases, links, env via `localdev.yml`). `cloneandsetup` aliases pre-answer that question with yes. |
32
32
  | `new [description]` (`create`, `project:new`, `poc`, `kunddemo`) | _New-project procedure below_ | Create a brand-new project from a plain-language request, unchanged seven-phase flow. The `poc`/`kunddemo` aliases (and phrases like "ny poc", "customer demo") run the same flow in PoC mode: a throwaway demo repo under the `poc` profile (`--profile poc`), see `references/new.md` → PoC mode. |
33
33
  | `doctor` (`check`, `fix`, `project:doctor`, `project:fix`) | _Doctor procedure below_ | Health check for the detected scope; relays the verdict, then offers to apply the doctor's own suggested fixes and re-checks until green. `fix` aliases pre-answer "fix now?" with yes. |
@@ -113,8 +113,12 @@ After the command completes, follow the relevant post-run steps below.
113
113
  prior setup), this project is already set up — ask via `AskUserQuestion`:
114
114
  - **Refresh instead** (recommended) — non-destructive; jump to the Refresh
115
115
  procedure's full-sync branch.
116
- - **Clean slate** — explain plainly: removes all haus-managed files (backed up
117
- first; user content preserved), then re-runs setup from scratch. On confirm run
116
+ - **Clean slate**: explain plainly that it removes the haus-managed files haus owns (backed up
117
+ first; user content preserved), then re-runs setup from scratch. Say what it keeps:
118
+ an item the user edited and its lock row, and a `.claude/rules/haus.md` haus did not
119
+ write. `haus undo --force` removes those too, after a backup, except a
120
+ `.claude/rules/haus.md` that is a link or a folder, which stays either way; mention
121
+ it, but never add `--force` yourself. On confirm run
118
122
  `haus undo --yes` (project) or `haus workspace undo --yes` (workspace), then
119
123
  continue by the scope already detected in Step 1.5 — workspace: step 1 below
120
124
  (deep-docs ask, `haus workspace setup --write`, per-member documentation pass,
@@ -7,7 +7,9 @@ commands; they read plain language and approve.
7
7
  Do this in order:
8
8
 
9
9
  1. **Detect.** Run `haus init --json --dry-run`. Read the JSON yourself —
10
- do not show it. Stdout is one envelope: `{ scan, recommendation, hooks, repoName, warnings }`.
10
+ do not show it. Stdout is one envelope:
11
+ `{ scan, recommendation, hooks, repoName, warnings, items, records }`. `items` and
12
+ `records` are `null` here: a dry run never reaches the apply step.
11
13
  Translate `scan` into one or two plain sentences, e.g. "This looks like a Next.js
12
14
  website using Yarn. I found unit tests but no end-to-end tests." If
13
15
  `scan.detectionStatus` is `unknown` or `partial`, say so honestly ("I couldn't fully
@@ -57,9 +59,10 @@ Do this in order:
57
59
  - **Project config** (entries in `recommended[]` with `install: false`, e.g.
58
60
  Haus ESLint / Prettier baselines): offer each as a plain choice ("Add the
59
61
  Haus ESLint baseline"). On confirm, run `haus configs <id>`. `haus configs`
60
- **preserves existing config files by default** and tells you when a file
61
- already exists — only re-run with `haus configs <id> --force` if the user
62
- explicitly chooses to **replace** their current config.
62
+ **preserves existing config files by default**: it refuses a config file
63
+ that differs (`refused (not owned)`). Only re-run with
64
+ `haus configs <id> --force` if the user explicitly chooses to **replace**
65
+ their current config; it backs the file up before replacing it.
63
66
 
64
67
  If neither list has anything, skip this step silently — don't ask an empty
65
68
  question.