@chief-clancy/plan 0.1.0 → 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.
@@ -2,12 +2,18 @@
2
2
 
3
3
  ## Overview
4
4
 
5
- Fetch backlog tickets from the board, explore the codebase, and generate structured implementation plans. Plans are posted as comments on the ticket for human review. Does not implement anything — planning only. In **terminal mode**, use `/clancy:approve-plan` to promote plans. In **standalone mode** or **standalone+board mode**, install the full pipeline (`npx chief-clancy`) to promote plans.
5
+ Fetch backlog tickets from the board, explore the codebase, and generate structured implementation plans. In board mode, plans are posted as comments on the ticket for human review. With `--from`, plans from local brief files are saved to `.clancy/plans/`, with an optional board comment when credentials are available. Does not implement anything — planning only. In **terminal mode**, use `/clancy:approve-plan` to promote plans. In **standalone mode** or **standalone+board mode**, install the full pipeline (`npx chief-clancy`) to promote plans.
6
6
 
7
7
  ---
8
8
 
9
9
  ## Step 1 — Preflight checks
10
10
 
11
+ ### 0. Short-circuit on `--list`
12
+
13
+ If the `--list` flag is present in the arguments, skip the rest of Step 1 entirely (no installation detection, no `git fetch`, no docs check, no branch freshness prompt) and jump straight to Step 8 (Plan inventory). The inventory is filesystem-only and never needs board credentials, network access, or a clean working tree.
14
+
15
+ `--list` always wins over other flags: if `--list` is combined with `--from`, `--fresh`, a ticket key, or a batch number, the inventory is displayed and the other flags are ignored for this run.
16
+
11
17
  ### 1. Detect installation context
12
18
 
13
19
  Check for `.clancy/.env`:
@@ -74,6 +80,11 @@ If the user declines, stop. If they confirm, continue without docs context.
74
80
 
75
81
  Parse the arguments passed to the command:
76
82
 
83
+ - **`--from {path} [N]`** — From local brief file mode. Read a Clancy brief file and plan from its content. A bare integer after the path selects row N from the decomposition table (e.g. `--from brief.md 3` selects row 3). Without a number, defaults to the first unplanned row. Cannot be combined with a ticket reference (`Cannot use both a ticket reference and --from. Use one or the other.`). Cannot be combined with a batch number (`Cannot use batch mode with --from. Use --from with a brief file path.`). Validate the file:
84
+ - File does not exist: `File not found: {path}` Stop.
85
+ - File is empty: `File is empty: {path}` Stop.
86
+ - File > 50KB: Warn `Large file ({size}KB). Clancy will use the first ~50KB for context.` Truncate internally, continue.
87
+ - File is not a Clancy brief: must contain `## Problem Statement` or `## Ticket Decomposition`. If neither found: `File does not appear to be a Clancy brief. Use /clancy:brief to generate one, or /clancy:brief --from {path} to brief from a raw file.` Stop.
77
88
  - **No argument:** plan 1 ticket from the queue
78
89
  - **Numeric argument** (e.g. `/clancy:plan 3`): plan up to N tickets from the queue, cap at 10
79
90
  - **Specific ticket key:** plan a single ticket by key, with per-platform validation:
@@ -86,8 +97,13 @@ Parse the arguments passed to the command:
86
97
  [2] Plan 10 tickets (max batch)
87
98
  ```
88
99
  - **`--fresh`:** discard any existing plan and start over from scratch. This is NOT re-plan with feedback — it ignores existing plans entirely.
100
+ - **`--list`:** display the plan inventory (all files in `.clancy/plans/`) and stop. No plan is generated, no board API calls are made.
89
101
  - Arguments can appear in any order (e.g. `/clancy:plan --fresh PROJ-123` or `/clancy:plan PROJ-123 --fresh`)
90
102
 
103
+ ### --list flag handling
104
+
105
+ If `--list` is present, jump to Step 8 (Plan inventory) and stop — the short-circuit at the top of Step 1 also handles this case for runs that never reached Step 2. The flag works in any installation mode (standalone, standalone+board, terminal) — `--list` is filesystem-only and never touches the board. When combined with `--from`, `--fresh`, a ticket key, or a batch number, `--list` wins and the other arguments are ignored.
106
+
91
107
  If N > 10: `Maximum batch size is 10. Planning 10 tickets.`
92
108
 
93
109
  If N >= 5: display a confirmation (skip in AFK mode — `--afk` flag or `CLANCY_MODE=afk`):
@@ -98,12 +114,19 @@ Planning {N} tickets — each requires codebase exploration. Continue? [Y/n]
98
114
 
99
115
  ### Standalone board-ticket guard
100
116
 
117
+ Skip this guard entirely if `--list` was passed — the inventory step is filesystem-only and runs in any installation mode (the Step 1 short-circuit normally handles this, but state it here too so the guard never blocks `--list`).
118
+
119
+ **`--from` mode** bypasses the standalone board-ticket guard entirely — no board credentials are needed for local brief planning. `--list` bypasses the guard for the same reason: the inventory reads only `.clancy/plans/`. The guard evaluates the resolved input mode (ticket/batch/no-arg), not flags like `--afk`.
120
+
101
121
  If running in **standalone mode** (Step 1 detected no `.clancy/.env`) and the resolved input mode is **board ticket**, **batch mode**, or **no argument** (which defaults to queue fetch):
102
122
 
103
123
  ```
104
124
  Board credentials not found. To plan from board tickets:
105
125
  /clancy:board-setup — configure board credentials (standalone)
106
126
  npx chief-clancy — install the full pipeline
127
+
128
+ To plan from a local brief file:
129
+ /clancy:plan --from .clancy/briefs/{slug}.md
107
130
  ```
108
131
 
109
132
  Stop.
@@ -112,6 +135,105 @@ In **standalone+board mode**, board ticket and batch modes proceed normally —
112
135
 
113
136
  ---
114
137
 
138
+ ## Step 3a — Gather from local brief (--from mode only)
139
+
140
+ If `--from {path}` was set in Step 2, run this step **instead of** Steps 3, 3b, and 3c (all board-mode ticket fetching, existing plan detection via comments, and feedback loop). Skip all of them entirely — Step 3a handles its own existing plan check below.
141
+
142
+ ### Read and parse the brief file
143
+
144
+ Read the file at `{path}`. Extract the following sections:
145
+
146
+ - **Source** field (`**Source:**` line) — the source value (e.g. `[#50] Redesign settings page`, `"Add dark mode"`, `docs/rfcs/auth-rework.md`). Used for the plan header and display identifier.
147
+ - `## Problem Statement` — used as the ticket description equivalent for plan context. Optional — if missing, use the brief's overall content as context instead.
148
+ - `## Goals` — used alongside Problem Statement for plan context. Optional.
149
+ - `## Ticket Decomposition` — the decomposition table. Parse the table rows for row-level planning.
150
+
151
+ ### Parse decomposition table rows
152
+
153
+ Parse the `## Ticket Decomposition` table to extract plannable rows. A valid row must have at minimum a row number (column 1) and a title (column 2). Rows are 1-indexed, corresponding to the order of data rows in the decomposition table (excluding header and separator rows).
154
+
155
+ **Missing table:** If `## Ticket Decomposition` is missing or has no data rows, treat the entire brief as a single planning unit (row 1). Warn: `No decomposition table found in {path}. Planning the brief as a single item.`
156
+
157
+ **Malformed rows:** Skip malformed rows with a warning: `Skipping malformed row {line}`. If ALL rows are malformed, treat as missing table (single planning unit).
158
+
159
+ ### Row selection
160
+
161
+ Check for an existing `<!-- planned:1,2,3 -->` marker comment in the brief file. If no marker exists, no rows have been planned.
162
+
163
+ **Row validation:** If `--from path N` was specified, validate N:
164
+
165
+ - N must be a positive integer. If N <= 0 or not an integer: `Row number must be a positive integer.` Stop.
166
+ - N must exist in the decomposition table. If N > total rows: `Row {N} not found. The brief has {max} decomposition rows.` Stop.
167
+
168
+ When `--from` is present, a bare integer is always interpreted as a row number, never as a batch count.
169
+
170
+ **Row targeting:**
171
+
172
+ - If `--from path N` was specified in Step 2, select row N specifically. If row N is already in the planned marker, do not stop here — defer the "already planned" decision to the later "Existing local plan check," after the plan slug/path is known and the workflow can inspect the existing plan file for `## Feedback` and apply `--fresh` rules.
173
+ - Without a number, select the first unplanned row — the first row whose number is NOT in the planned set.
174
+ - If no number was specified and all rows are planned: `All decomposition rows have been planned. Use --fresh to re-plan a specific row.` Stop.
175
+
176
+ **`--fresh` with row selection:** When `--fresh` is used to re-plan a specific row, the row's existing plan file is overwritten. The planned marker is not modified — the row was already in the marker and stays there (no remove-and-re-add cycle needed).
177
+
178
+ **`--fresh` + `--afk`:** Re-plans all rows from scratch. Deletes all existing plan files for this brief, clears the planned marker entirely, then plans all rows sequentially.
179
+
180
+ **Multi-row mode:** `--from` with `--afk` plans all unplanned rows sequentially — loop through each unplanned row, running Steps 4-5a for each one. Without `--afk`, plan exactly one row (first unplanned, or the specified row) then stop.
181
+
182
+ ### Update planned marker
183
+
184
+ After planning each row, update the `<!-- planned:N -->` marker in the brief file:
185
+
186
+ - If no marker exists, append `<!-- planned:{row} -->` to the file. If the last `---` line in the file is a brief footer (trailing `---`), insert before it. Otherwise append at EOF.
187
+ - If a marker exists, update it: `<!-- planned:1,2,3 -->` → `<!-- planned:1,2,3,4 -->`.
188
+
189
+ **Concurrency note:** The planned marker is file-based and not concurrency-safe. Running multiple `--from` commands against the same brief simultaneously may produce duplicate plans.
190
+
191
+ Pass the selected row's context (title, description, size, dependencies) along with the brief's Problem Statement, Goals, and Source to Step 4 as the ticket context.
192
+
193
+ ### --from mode Step 4 adaptations
194
+
195
+ When running in `--from` mode, Steps 4a-4f have these adaptations:
196
+
197
+ - **Display identifier:** Use the slug (derived from brief filename) wherever board mode uses `{KEY}`. Progress display shows `[{slug}#{row}] {row title}` instead of `[{KEY}] {Title}`.
198
+ - **Step 4a (feasibility scan):** Run the scan normally (the brief content replaces the ticket description). If infeasible, skip — but do NOT post a "Clancy skipped" comment to any board (no board ticket). Use the canonical Step 6 log format, with `{slug}` in place of `{KEY}` for the identifier.
199
+ - **Step 4b (QA return detection):** Skip entirely in `--from` mode — there is no implementation history to check.
200
+ - **Step 4c-4e:** Run normally — codebase context, Figma, and exploration work the same regardless of input source.
201
+ - **Step 4f (generate plan):** Use the local plan header format (Source/Brief fields) instead of the board header format (Ticket field). See Step 5a for the header template.
202
+
203
+ ### Existing local plan check
204
+
205
+ Before planning each row, check for an existing plan file at `.clancy/plans/{slug}-{row-number}.md` where the slug is derived from the brief filename:
206
+
207
+ **Slug generation:** strip the `YYYY-MM-DD-` date prefix (pattern: 4 digits, dash, 2 digits, dash, 2 digits, dash) if present, then strip the `.md` extension. If no date prefix matches, use the full filename minus extension.
208
+
209
+ If an existing plan file is found, scan it for a `## Feedback` section. Match `## Feedback` as a heading at the start of a line (not inside code fences or backtick spans). The feedback section is appended by the user to request revisions.
210
+
211
+ | Condition | Behaviour |
212
+ | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- |
213
+ | No existing plan | Proceed to Step 4 |
214
+ | Existing plan + `--fresh` | Delete and overwrite the existing plan file. `--fresh` takes precedence over feedback — any `## Feedback` section is discarded. Proceed to Step 4. |
215
+ | Existing plan + `## Feedback` section | Revise: read existing plan + feedback, generate revised plan with `### Changes From Previous Plan` section |
216
+ | Existing plan + no feedback + no `--fresh` | Stop: `Already planned. Add a ## Feedback section to revise, or use --fresh to start over.` |
217
+
218
+ ### Read feedback for revision
219
+
220
+ When revising from feedback (auto-detected from a real `## Feedback` heading in the local plan file), read the entire `## Feedback` section content — from that heading until the next real `##` heading at the start of a line, outside fenced code blocks and inline backtick spans, or EOF. If multiple `## Feedback` sections exist (the user added more after a previous revision), concatenate all sections in order.
221
+
222
+ Pass this feedback to the plan generation step (Step 4f) as additional context, alongside the brief's Problem Statement, Goals, and the row context. The `## Feedback` section is the user's revision request — typically natural language describing what to change, what was missing, or what went wrong.
223
+
224
+ **Revision procedure:** When revising, the planner SHOULD:
225
+
226
+ - Skip Step 4a (feasibility scan) — the previous plan already passed feasibility
227
+ - Skip Step 4b (QA return detection) — N/A in `--from` mode
228
+ - Re-run Step 4c-4e (codebase context, Figma, exploration) only if the feedback explicitly references new files, components, or areas not covered by the previous plan. Otherwise reuse the existing exploration.
229
+ - Run Step 4f to regenerate the plan, addressing the feedback while preserving acceptance criteria and affected files that the feedback does not touch
230
+
231
+ **Feedback lifecycle:** The revised plan file overwrites the existing plan file completely. The `## Feedback` section is NOT carried forward into the new file — it is consumed by the revision and the audit trail lives in the `### Changes From Previous Plan` section (which quotes or summarises the feedback that was addressed).
232
+
233
+ **Row selection with feedback:** When selecting rows to plan in `--afk` multi-row mode, also include rows whose plan files contain a `## Feedback` section. The selection set is: (unplanned rows) ∪ (rows with feedback). For default row selection (no row N, no `--afk`), the first row needing attention is: first row with feedback if any, otherwise first unplanned row.
234
+
235
+ ---
236
+
115
237
  ## Step 3 — Fetch backlog tickets
116
238
 
117
239
  Detect board from `.clancy/.env` and fetch tickets from the **planning queue** (different from the implementation queue used by `/clancy:implement`).
@@ -733,9 +855,48 @@ _Generated by [Clancy](https://github.com/Pushedskydiver/chief-clancy). To reque
733
855
 
734
856
  ---
735
857
 
736
- ## Step 5 — Post plan as comment
858
+ ## Step 5 — Save / post plan
859
+
860
+ ### 5a. Local plan output (--from mode)
861
+
862
+ If planning from a local brief (`--from`), save the plan to a local file instead of posting to the board.
863
+
864
+ **Output path:** `.clancy/plans/{slug}-{row-number}.md`
865
+
866
+ Create `.clancy/plans/` directory if it does not exist.
867
+
868
+ The slug is the same one computed in Step 3a (brief filename minus date prefix and extension). The row number is the 1-indexed decomposition row being planned.
869
+
870
+ **Local plan header:** The plan uses the same `## Clancy Implementation Plan` template from Step 4f, but with local-specific header fields:
871
+
872
+ ```markdown
873
+ ## Clancy Implementation Plan
874
+
875
+ **Source:** {brief source field value}
876
+ **Brief:** {brief filename}
877
+ **Row:** #{row number} — {row title}
878
+ **Planned:** {YYYY-MM-DD}
879
+ ```
880
+
881
+ Replace the `**Ticket:** [{KEY}] {Title}` line from the board template with `**Source:**` and `**Brief:**` lines.
882
+
883
+ **Revision header (when revising from feedback):** If this is a revision (existing plan had `## Feedback`), insert `### Changes From Previous Plan` immediately after the local header block (after `**Planned:**`) and before `### Summary`. Same structure as the board template's revision section.
884
+
885
+ **Local plan footer:** Replace the board-specific footer with:
886
+
887
+ ```
888
+ _Generated by [Clancy](https://github.com/Pushedskydiver/chief-clancy). To request changes: add a ## Feedback section to this file, then re-run `/clancy:plan --from {path}` to revise. To start over: `/clancy:plan --fresh --from {path}`. To approve: install the full pipeline — npx chief-clancy._
889
+ ```
890
+
891
+ **Re-planning:** If `--fresh` was used, the existing plan file is overwritten (same slug + row number = same filename).
737
892
 
738
- **Guard:** Only run Step 5 when board credentials are available (terminal mode or standalone+board mode). In standalone mode (no `.clancy/.env`), skip this step entirely the plan is still generated and printed to stdout in Step 4.
893
+ **Board comment offer:** If board credentials ARE available (terminal mode or standalone+board mode), after saving the local file, offer to also post the plan as a comment on the source ticket (if the brief's Source field contains a ticket key). This is optional the local file is the primary output.
894
+
895
+ After saving, skip to Step 6 (log). Do not run Step 5b (board posting) for `--from` plans unless the user opts in above.
896
+
897
+ ### 5b. Post plan as comment (board mode)
898
+
899
+ **Guard:** Only run Step 5b when board credentials are available (terminal mode or standalone+board mode). In standalone mode (no `.clancy/.env`), skip this step entirely — the plan is still generated and printed to stdout in Step 4.
739
900
 
740
901
  ### Jira — POST comment
741
902
 
@@ -851,6 +1012,8 @@ curl -s \
851
1012
 
852
1013
  For each planned ticket, append to `.clancy/progress.txt` using the appropriate variant:
853
1014
 
1015
+ ### Board mode log entries
1016
+
854
1017
  | Outcome | Log entry |
855
1018
  | ------------------------------- | ------------------------------------------------------ |
856
1019
  | Normal | `YYYY-MM-DD HH:MM \| {KEY} \| PLAN \| {S/M/L}` |
@@ -858,12 +1021,28 @@ For each planned ticket, append to `.clancy/progress.txt` using the appropriate
858
1021
  | Comment post failed | `YYYY-MM-DD HH:MM \| {KEY} \| POST_FAILED \| {reason}` |
859
1022
  | Skipped (infeasible) | `YYYY-MM-DD HH:MM \| {KEY} \| SKIPPED \| {reason}` |
860
1023
 
1024
+ ### --from mode log entries
1025
+
1026
+ Use the slug as the identifier instead of a ticket key:
1027
+
1028
+ | Outcome | Log entry |
1029
+ | ------------------------------- | -------------------------------------------------------------- |
1030
+ | Normal | `YYYY-MM-DD HH:MM \| {slug}#{row} \| LOCAL_PLAN \| {S/M/L}` |
1031
+ | Revised (re-plan with feedback) | `YYYY-MM-DD HH:MM \| {slug}#{row} \| LOCAL_REVISED \| {S/M/L}` |
1032
+ | Skipped (infeasible) | `YYYY-MM-DD HH:MM \| {slug}#{row} \| SKIPPED \| {reason}` |
1033
+
1034
+ ### --list mode
1035
+
1036
+ `--list` display is not logged to `.clancy/progress.txt` — the inventory is read-only and does not change project state.
1037
+
861
1038
  ---
862
1039
 
863
1040
  ## Step 7 — Summary
864
1041
 
865
1042
  After all tickets are processed, display:
866
1043
 
1044
+ ### Board mode summary
1045
+
867
1046
  ```
868
1047
  Planned {N} ticket(s):
869
1048
 
@@ -879,6 +1058,82 @@ Plans written to your board. After review:
879
1058
  "Let me dust this for prints..."
880
1059
  ```
881
1060
 
1061
+ ### --from mode summary
1062
+
1063
+ Single row:
1064
+
1065
+ ```
1066
+ 🚨 Clancy — Plan
1067
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1068
+
1069
+ ✅ Saved to .clancy/plans/{slug}-{row-number}.md
1070
+
1071
+ To approve: install the full pipeline — npx chief-clancy
1072
+
1073
+ "Let me dust this for prints..."
1074
+ ```
1075
+
1076
+ Multi-row (`--afk`):
1077
+
1078
+ ```
1079
+ 🚨 Clancy — Plan
1080
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1081
+
1082
+ ✅ Row 1: {title} — Saved to .clancy/plans/{slug}-1.md
1083
+ ✅ Row 2: {title} — Saved to .clancy/plans/{slug}-2.md
1084
+ ⏭️ Row 3: {title} — already planned
1085
+
1086
+ To approve: install the full pipeline — npx chief-clancy
1087
+
1088
+ "Let me dust this for prints..."
1089
+ ```
1090
+
1091
+ ---
1092
+
1093
+ ## Step 8 — Plan inventory (`--list`)
1094
+
1095
+ If `--list` was passed (detected at the top of Step 1), display the local plan inventory and stop. This step is filesystem-only — no API calls, no board access, no `.clancy/.env` required.
1096
+
1097
+ Scan `.clancy/plans/` for all `.md` files. For each file, parse the local plan header (the block at the top of the file written by Step 5a) and capture these fields:
1098
+
1099
+ - **Plan ID** — the plan filename minus the `.md` extension (e.g. `add-dark-mode-2`). This is `{slug}-{row}` as written by Step 5a, where `{slug}` is the brief slug from Step 3a and `{row}` is the decomposition row number. Always present (it is the filename).
1100
+ - **Brief** — value of the `**Brief:**` line. The brief filename the plan was generated from. Display the literal `?` if the line is absent or empty after the colon.
1101
+ - **Row** — value of the `**Row:**` line (e.g. `#2 — Add toggle component`). Display `?` if absent or empty.
1102
+ - **Source** — value of the `**Source:**` line (the brief's Source field). Display `?` if absent or empty.
1103
+ - **Planned** — value of the `**Planned:**` line (the YYYY-MM-DD planned date). Display `?` if absent or unparseable as a date.
1104
+ - **Status** — for now this is always `Planned`. Reserved for `/clancy:approve-plan` (a future PR) which will write a sibling `.approved` marker file (e.g. `.clancy/plans/add-dark-mode-2.approved`). When that marker exists for a given plan, Status becomes `Approved`. The column is included in the listing today so the format will not change when approval markers ship.
1105
+
1106
+ A field is considered missing if the line is absent or its value is empty after the colon. Plans missing all expected fields are still listed (with `?` placeholders) so the user can find and clean them up.
1107
+
1108
+ **Sort:** by `**Planned**` date, newest first. Tie-break on same date by Plan ID, alphabetical ascending. Files with a missing or unparseable date sort last (after all dated plans), and tie-break among themselves by Plan ID alphabetical ascending. The sort must be deterministic across runs.
1109
+
1110
+ Display:
1111
+
1112
+ ```
1113
+ Clancy — Plans
1114
+ ================================================================
1115
+
1116
+ [1] add-dark-mode-2 2026-04-08 Planned Row #2 — Add toggle component Brief: 2026-04-01-add-dark-mode.md Source: #50
1117
+ [2] add-dark-mode-1 2026-04-07 Planned Row #1 — Wire theme context Brief: 2026-04-01-add-dark-mode.md Source: #50
1118
+ [3] customer-portal-3 2026-04-05 Planned Row #3 — Billing page Brief: 2026-03-28-customer-portal.md Source: PROJ-200
1119
+
1120
+ 3 local plan(s).
1121
+
1122
+ To revise: add a `## Feedback` section to the plan file, then re-run /clancy:plan --from <brief>.
1123
+ To start over: /clancy:plan --fresh --from <brief>.
1124
+ To approve: install the full pipeline — npx chief-clancy.
1125
+ ```
1126
+
1127
+ The first column in the listing is the Plan ID (filename without `.md`), not the brief slug.
1128
+
1129
+ If `.clancy/plans/` does not exist or contains no `.md` files:
1130
+
1131
+ ```
1132
+ No plans found. Run /clancy:plan --from .clancy/briefs/<brief>.md to create one.
1133
+ ```
1134
+
1135
+ Stop after display. The `--list` step never logs to `.clancy/progress.txt` and never modifies any file — it is purely a read-only inventory view of the local plans directory.
1136
+
882
1137
  ---
883
1138
 
884
1139
  ## Notes
@@ -891,3 +1146,6 @@ Plans written to your board. After review:
891
1146
  - All board API calls are best-effort — if a comment fails to post, print the plan to stdout as fallback
892
1147
  - When exploring the codebase, use Glob and Read for small tickets, parallel Explore subagents for larger ones
893
1148
  - The `## Clancy Implementation Plan` marker in comments is used by both `/clancy:plan` (to detect existing plans) and `/clancy:approve-plan` (to find the plan to promote)
1149
+ - `--from` mode is fully offline — no board credentials needed. Plans saved to `.clancy/plans/` as the source of truth
1150
+ - `--from` requires a Clancy brief (structured format with `## Problem Statement` or `## Ticket Decomposition`). For raw files, use `/clancy:brief --from {path}` first to generate a brief
1151
+ - `--list` is filesystem-only and short-circuits at the top of Step 1 — no installation context, network, board, or git checks run before the inventory displays