chief-clancy 0.7.4 → 0.8.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.
@@ -87,11 +87,16 @@ Which Kanban board are you using?
87
87
  [1] Jira
88
88
  [2] GitHub Issues
89
89
  [3] Linear
90
- [4] My board isn't listed
90
+ [4] Shortcut
91
+ [5] Notion
92
+ [6] Azure DevOps
93
+ [7] My board isn't listed
91
94
 
92
- If the user selects [4], output the dead-end message and stop:
95
+ Auto-detection hint: silently check `.clancy/.env` for existing board env vars (`JIRA_BASE_URL`, `GITHUB_TOKEN`, `LINEAR_API_KEY`, `SHORTCUT_API_TOKEN`, `NOTION_DATABASE_ID`, `AZDO_ORG`). If detected, show: `Detected: {board} from your env vars. Use this? [Y/n]` — if yes, skip to Q2 for that board.
93
96
 
94
- Clancy currently supports Jira, GitHub Issues, and Linear out of the box.
97
+ If the user selects [7], output the dead-end message and stop:
98
+
99
+ Clancy currently supports Jira, GitHub Issues, Linear, Shortcut, Notion, and Azure DevOps out of the box.
95
100
 
96
101
  Your board isn't supported yet — but you can add it:
97
102
  · Open an issue: github.com/Pushedskydiver/clancy/issues
@@ -106,6 +111,32 @@ Do not scaffold anything after this message. Stop completely.
106
111
 
107
112
  ---
108
113
 
114
+ **Shortcut** — ask in this order:
115
+
116
+ 1. `Paste your Shortcut API token: (create one at app.shortcut.com/settings/account/api-tokens)`
117
+ 2. `What workflow should Clancy use? (press Enter to auto-detect)` — if blank, auto-detect the first workflow via `GET /api/v3/workflows`
118
+
119
+ Store as `SHORTCUT_API_TOKEN` and optionally `SHORTCUT_WORKFLOW` in `.clancy/.env`.
120
+
121
+ **Notion** — ask in this order:
122
+
123
+ 1. `Paste your Notion integration token: (create one at notion.so/my-integrations)`
124
+ 2. `What's your Notion database ID? (the 32-character hex string in your database URL)`
125
+ 3. `What property name represents the ticket status? [Status]`
126
+ 4. `What property name represents the assignee? [Assignee]`
127
+
128
+ Store as `NOTION_TOKEN`, `NOTION_DATABASE_ID`, and optionally `CLANCY_NOTION_STATUS` and `CLANCY_NOTION_ASSIGNEE` in `.clancy/.env`.
129
+
130
+ **Azure DevOps** — ask in this order:
131
+
132
+ 1. `What's your Azure DevOps organisation name? (e.g. your-org)`
133
+ 2. `What's your Azure DevOps project name?`
134
+ 3. `Paste your Azure DevOps personal access token: (needs Work Items Read & Write scope)`
135
+
136
+ Store as `AZDO_ORG`, `AZDO_PROJECT`, and `AZDO_PAT` in `.clancy/.env`.
137
+
138
+ ---
139
+
109
140
  ### Q2: Board-specific config
110
141
 
111
142
  Ask each question individually and wait for an answer before moving to the next.
@@ -497,6 +528,47 @@ If `n` or `N`: store `CLANCY_BRANCH_GUARD=false` in `.clancy/.env`.
497
528
 
498
529
  ---
499
530
 
531
+ ### Q3i (all boards): Quiet hours
532
+
533
+ Output:
534
+
535
+ ```
536
+ Pause AFK runs during specific hours? (e.g. business hours, overnight)
537
+
538
+ [1] Skip — no quiet hours
539
+ [2] Set quiet hours
540
+ ```
541
+
542
+ If [1] or enter: skip — no `CLANCY_QUIET_START` or `CLANCY_QUIET_END` written.
543
+ If [2]: ask:
544
+
545
+ ```
546
+ Quiet start time (HH:MM, 24h format, e.g. 22:00):
547
+ ```
548
+
549
+ Then:
550
+
551
+ ```
552
+ Quiet end time (HH:MM, 24h format, e.g. 06:00):
553
+ ```
554
+
555
+ Store as `CLANCY_QUIET_START` and `CLANCY_QUIET_END` in `.clancy/.env`.
556
+
557
+ ---
558
+
559
+ ### Q3j (all boards): Desktop notifications
560
+
561
+ Output:
562
+
563
+ ```
564
+ Send desktop notifications when tickets complete or errors occur? [Y/n]
565
+ ```
566
+
567
+ If yes or enter: store `CLANCY_DESKTOP_NOTIFY=true` in `.clancy/.env`.
568
+ If no: store `CLANCY_DESKTOP_NOTIFY=false` in `.clancy/.env`.
569
+
570
+ ---
571
+
500
572
  ### Q4: Base branch (auto-detect)
501
573
 
502
574
  Silently detect the base branch — do not ask unless detection fails:
@@ -456,6 +456,15 @@ MAX_ITERATIONS=5
456
456
  # Prevent accidental commits to the base branch (default: true)
457
457
  # CLANCY_BRANCH_GUARD=true
458
458
 
459
+ # ─── Optional: Quiet hours ───────────────────────────────────────────────────
460
+ # Pause AFK runs during these hours (24h format). Handles overnight windows.
461
+ # CLANCY_QUIET_START=22:00
462
+ # CLANCY_QUIET_END=06:00
463
+
464
+ # ─── Optional: Desktop notifications ─────────────────────────────────────────
465
+ # Native OS notifications on ticket completion or error (default: true)
466
+ # CLANCY_DESKTOP_NOTIFY=true
467
+
459
468
  # ─── Optional: Notifications ──────────────────────────────────────────────────
460
469
  # Webhook URL for Slack or Teams notifications on ticket completion
461
470
  # CLANCY_NOTIFY_WEBHOOK=https://hooks.slack.com/services/your/webhook/url
@@ -563,6 +572,148 @@ MAX_ITERATIONS=20
563
572
 
564
573
  # ─── Optional: Notifications ──────────────────────────────────────────────────
565
574
  # Webhook URL for Slack or Teams notifications on ticket completion
575
+ # ─── Optional: Quiet hours ───────────────────────────────────────────────────
576
+ # CLANCY_QUIET_START=22:00
577
+ # CLANCY_QUIET_END=06:00
578
+
579
+ # ─── Optional: Desktop notifications ─────────────────────────────────────────
580
+ # CLANCY_DESKTOP_NOTIFY=true
581
+
582
+ # ─── Optional: Notifications ──────────────────────────────────────────────────
583
+ # CLANCY_NOTIFY_WEBHOOK=https://hooks.slack.com/services/your/webhook/url
584
+ ```
585
+
586
+ ### Shortcut
587
+
588
+ ```
589
+ # Clancy — Shortcut configuration
590
+ # Copy this file to .env and fill in your values.
591
+ # Never commit .env to version control.
592
+
593
+ # ─── Shortcut ────────────────────────────────────────────────────────────────
594
+ SHORTCUT_API_TOKEN=your-api-token
595
+
596
+ # Optional: workflow name (default: auto-detect first workflow)
597
+ # SHORTCUT_WORKFLOW=Engineering
598
+
599
+ # ─── Git ──────────────────────────────────────────────────────────────────────
600
+ CLANCY_BASE_BRANCH=main
601
+
602
+ # ─── Loop ─────────────────────────────────────────────────────────────────────
603
+ MAX_ITERATIONS=5
604
+
605
+ # ─── Optional: Git host (PR creation) ───────────────────────────────────────
606
+ # GITHUB_TOKEN=ghp_your-token
607
+ # GITLAB_TOKEN=glpat-your-token
608
+ # BITBUCKET_USER=your-username
609
+ # BITBUCKET_TOKEN=your-app-password
610
+
611
+ # ─── Optional: Pipeline labels ────────────────────────────────────────────────
612
+ # CLANCY_LABEL_BRIEF="clancy:brief"
613
+ # CLANCY_LABEL_PLAN="clancy:plan"
614
+ # CLANCY_LABEL_BUILD="clancy:build"
615
+
616
+ # ─── Optional: Status transitions ────────────────────────────────────────────
617
+ # CLANCY_STATUS_IN_PROGRESS="In Progress"
618
+ # CLANCY_STATUS_DONE="Done"
619
+ # CLANCY_STATUS_REVIEW="In Review"
620
+
621
+ # ─── Optional: Quiet hours ───────────────────────────────────────────────────
622
+ # CLANCY_QUIET_START=22:00
623
+ # CLANCY_QUIET_END=06:00
624
+
625
+ # ─── Optional: Desktop notifications ─────────────────────────────────────────
626
+ # CLANCY_DESKTOP_NOTIFY=true
627
+
628
+ # ─── Optional: Notifications ──────────────────────────────────────────────────
629
+ # CLANCY_NOTIFY_WEBHOOK=https://hooks.slack.com/services/your/webhook/url
630
+ ```
631
+
632
+ ### Notion
633
+
634
+ ```
635
+ # Clancy — Notion configuration
636
+ # Copy this file to .env and fill in your values.
637
+ # Never commit .env to version control.
638
+
639
+ # ─── Notion ──────────────────────────────────────────────────────────────────
640
+ NOTION_TOKEN=your-integration-token
641
+ NOTION_DATABASE_ID=your-database-id-32-char-hex
642
+
643
+ # Optional: property name overrides (defaults shown)
644
+ # CLANCY_NOTION_STATUS=Status
645
+ # CLANCY_NOTION_ASSIGNEE=Assignee
646
+
647
+ # ─── Git ──────────────────────────────────────────────────────────────────────
648
+ CLANCY_BASE_BRANCH=main
649
+
650
+ # ─── Loop ─────────────────────────────────────────────────────────────────────
651
+ MAX_ITERATIONS=5
652
+
653
+ # ─── Optional: Git host (PR creation) ───────────────────────────────────────
654
+ # GITHUB_TOKEN=ghp_your-token
655
+ # GITLAB_TOKEN=glpat-your-token
656
+ # BITBUCKET_USER=your-username
657
+ # BITBUCKET_TOKEN=your-app-password
658
+
659
+ # ─── Optional: Pipeline labels ────────────────────────────────────────────────
660
+ # CLANCY_LABEL_BRIEF="clancy:brief"
661
+ # CLANCY_LABEL_PLAN="clancy:plan"
662
+ # CLANCY_LABEL_BUILD="clancy:build"
663
+
664
+ # ─── Optional: Quiet hours ───────────────────────────────────────────────────
665
+ # CLANCY_QUIET_START=22:00
666
+ # CLANCY_QUIET_END=06:00
667
+
668
+ # ─── Optional: Desktop notifications ─────────────────────────────────────────
669
+ # CLANCY_DESKTOP_NOTIFY=true
670
+
671
+ # ─── Optional: Notifications ──────────────────────────────────────────────────
672
+ # CLANCY_NOTIFY_WEBHOOK=https://hooks.slack.com/services/your/webhook/url
673
+ ```
674
+
675
+ ### Azure DevOps
676
+
677
+ ```
678
+ # Clancy — Azure DevOps configuration
679
+ # Copy this file to .env and fill in your values.
680
+ # Never commit .env to version control.
681
+
682
+ # ─── Azure DevOps ────────────────────────────────────────────────────────────
683
+ AZDO_ORG=your-organisation
684
+ AZDO_PROJECT=your-project
685
+ AZDO_PAT=your-personal-access-token
686
+
687
+ # ─── Git ──────────────────────────────────────────────────────────────────────
688
+ CLANCY_BASE_BRANCH=main
689
+
690
+ # ─── Loop ─────────────────────────────────────────────────────────────────────
691
+ MAX_ITERATIONS=5
692
+
693
+ # ─── Optional: Git host (PR creation) ───────────────────────────────────────
694
+ # GITHUB_TOKEN=ghp_your-token
695
+ # GITLAB_TOKEN=glpat-your-token
696
+ # BITBUCKET_USER=your-username
697
+ # BITBUCKET_TOKEN=your-app-password
698
+
699
+ # ─── Optional: Pipeline labels ────────────────────────────────────────────────
700
+ # CLANCY_LABEL_BRIEF="clancy:brief"
701
+ # CLANCY_LABEL_PLAN="clancy:plan"
702
+ # CLANCY_LABEL_BUILD="clancy:build"
703
+
704
+ # ─── Optional: Status transitions ────────────────────────────────────────────
705
+ # CLANCY_STATUS_IN_PROGRESS="Active"
706
+ # CLANCY_STATUS_DONE="Closed"
707
+ # CLANCY_STATUS_REVIEW="Resolved"
708
+
709
+ # ─── Optional: Quiet hours ───────────────────────────────────────────────────
710
+ # CLANCY_QUIET_START=22:00
711
+ # CLANCY_QUIET_END=06:00
712
+
713
+ # ─── Optional: Desktop notifications ─────────────────────────────────────────
714
+ # CLANCY_DESKTOP_NOTIFY=true
715
+
716
+ # ─── Optional: Notifications ──────────────────────────────────────────────────
566
717
  # CLANCY_NOTIFY_WEBHOOK=https://hooks.slack.com/services/your/webhook/url
567
718
  ```
568
719
 
@@ -681,6 +832,13 @@ MAX_ITERATIONS=20
681
832
  # Set to "false" to disable skip comments
682
833
  # CLANCY_SKIP_COMMENTS=true
683
834
 
835
+ # ─── Optional: Quiet hours ───────────────────────────────────────────────────
836
+ # CLANCY_QUIET_START=22:00
837
+ # CLANCY_QUIET_END=06:00
838
+
839
+ # ─── Optional: Desktop notifications ─────────────────────────────────────────
840
+ # CLANCY_DESKTOP_NOTIFY=true
841
+
684
842
  # ─── Optional: Notifications ──────────────────────────────────────────────────
685
843
  # Webhook URL for Slack or Teams notifications on ticket completion
686
844
  # CLANCY_NOTIFY_WEBHOOK=https://hooks.slack.com/services/your/webhook/url
@@ -35,6 +35,9 @@ Source `.clancy/.env` silently. Detect which board is configured:
35
35
  - `JIRA_BASE_URL` set → Jira
36
36
  - `GITHUB_TOKEN` set → GitHub Issues
37
37
  - `LINEAR_API_KEY` set → Linear
38
+ - `SHORTCUT_API_TOKEN` set → Shortcut
39
+ - `NOTION_DATABASE_ID` set → Notion
40
+ - `AZDO_ORG` set → Azure DevOps
38
41
 
39
42
  ---
40
43
 
@@ -58,6 +61,8 @@ General
58
61
  [G7] Fix retries {CLANCY_FIX_RETRIES:-2} self-healing attempts after verification failure
59
62
  [G8] Time limit {CLANCY_TIME_LIMIT:-30} per-ticket time limit in minutes (0 = disabled)
60
63
  [G9] Branch guard {on if CLANCY_BRANCH_GUARD=true or unset, off if false}
64
+ [G10] Quiet hours {CLANCY_QUIET_START–CLANCY_QUIET_END if set, else off}
65
+ [G11] Desktop notify {on if CLANCY_DESKTOP_NOTIFY=true or unset, off if false}
61
66
 
62
67
  {If Jira:}
63
68
  Jira
@@ -113,7 +118,7 @@ Integrations
113
118
  [I2] Playwright {enabled if PLAYWRIGHT_ENABLED=true, else off}
114
119
  [I3] Notifications {configured if CLANCY_NOTIFY_WEBHOOK set, else not set}
115
120
 
116
- [S] Switch board currently: {Jira / GitHub Issues / Linear}
121
+ [S] Switch board currently: {Jira / GitHub Issues / Linear / Shortcut / Notion / Azure DevOps}
117
122
  [D] Save as defaults save current settings for all future projects
118
123
  [X] Exit
119
124
 
@@ -278,6 +283,37 @@ If [2]: write `CLANCY_BRANCH_GUARD=false` to `.clancy/.env`.
278
283
 
279
284
  ---
280
285
 
286
+ ### [G10] Quiet hours
287
+
288
+ ```
289
+ Quiet hours — current: {CLANCY_QUIET_START–CLANCY_QUIET_END or "off"}
290
+ Pause AFK runs during these hours. Clancy sleeps until the end of the quiet window.
291
+
292
+ [1] Set quiet hours
293
+ [2] Off (no quiet hours)
294
+ [3] Cancel
295
+ ```
296
+
297
+ If [1]: prompt `Quiet start time (HH:MM, 24h format):` then `Quiet end time (HH:MM, 24h format):`. Validate HH:MM format (0-23:00-59). Write `CLANCY_QUIET_START` and `CLANCY_QUIET_END` to `.clancy/.env`.
298
+ If [2]: remove `CLANCY_QUIET_START` and `CLANCY_QUIET_END` from `.clancy/.env`.
299
+
300
+ ---
301
+
302
+ ### [G11] Desktop notifications
303
+
304
+ ```
305
+ Desktop notifications — current: {on/off}
306
+ Native OS notifications when tickets complete or errors occur.
307
+
308
+ [1] Enable (default)
309
+ [2] Disable
310
+ ```
311
+
312
+ If [1]: write `CLANCY_DESKTOP_NOTIFY=true` to `.clancy/.env`.
313
+ If [2]: write `CLANCY_DESKTOP_NOTIFY=false` to `.clancy/.env`.
314
+
315
+ ---
316
+
281
317
  ### [B1] Jira status filter (Jira only)
282
318
 
283
319
  ```
@@ -739,17 +775,18 @@ If [2]: remove `CLANCY_NOTIFY_WEBHOOK` from `.clancy/.env`.
739
775
 
740
776
  ### [S] Switch board
741
777
 
742
- Show which board is currently active, then offer the other two:
778
+ Show which board is currently active, then offer the others:
743
779
 
744
780
  ```
745
- Switch board — currently: {Jira / GitHub Issues / Linear}
781
+ Switch board — currently: {Jira / GitHub Issues / Linear / Shortcut / Notion / Azure DevOps}
746
782
 
747
783
  [1] {board A}
748
784
  [2] {board B}
749
- [3] Cancel
785
+ ...
786
+ [N] Cancel
750
787
  ```
751
788
 
752
- Only show the two boards that are not currently active. If the user picks Cancel, loop back to the menu without changing anything.
789
+ Only show the boards that are not currently active. If the user picks Cancel, loop back to the menu without changing anything.
753
790
 
754
791
  **Step 1: Collect new credentials**
755
792
 
@@ -775,6 +812,21 @@ Linear — ask in this order:
775
812
  1. `Paste your Linear API key: (create one at linear.app/settings/api)`
776
813
  2. `What's your Linear team ID? (find it at linear.app/settings/teams — click your team, copy the ID from the URL)`
777
814
 
815
+ Shortcut — ask in this order:
816
+ 1. `Paste your Shortcut API token: (create one at app.shortcut.com/settings/account/api-tokens)`
817
+ 2. `What workflow should Clancy use? (press Enter to auto-detect)`
818
+
819
+ Notion — ask in this order:
820
+ 1. `Paste your Notion integration token: (create one at notion.so/my-integrations)`
821
+ 2. `What's your Notion database ID? (32-character hex string from your database URL)`
822
+ 3. `Status property name? [Status]`
823
+ 4. `Assignee property name? [Assignee]`
824
+
825
+ Azure DevOps — ask in this order:
826
+ 1. `What's your Azure DevOps organisation name?`
827
+ 2. `What's your project name?`
828
+ 3. `Paste your Azure DevOps personal access token: (needs Work Items Read & Write scope)`
829
+
778
830
  **Step 2: Verify credentials**
779
831
 
780
832
  Verify the new credentials before making any changes — same checks as the init preflight and doctor workflow. Show the result:
@@ -814,6 +866,9 @@ If no: print `Cancelled. No changes made.` and loop back to the menu.
814
866
  - Jira: `JIRA_BASE_URL`, `JIRA_USER`, `JIRA_API_TOKEN`, `JIRA_PROJECT_KEY`, `CLANCY_JQL_STATUS`, `CLANCY_JQL_SPRINT`
815
867
  - GitHub: `GITHUB_TOKEN`, `GITHUB_REPO`
816
868
  - Linear: `LINEAR_API_KEY`, `LINEAR_TEAM_ID`
869
+ - Shortcut: `SHORTCUT_API_TOKEN`, `SHORTCUT_WORKFLOW`
870
+ - Notion: `NOTION_TOKEN`, `NOTION_DATABASE_ID`, `CLANCY_NOTION_STATUS`, `CLANCY_NOTION_ASSIGNEE`, `CLANCY_NOTION_LABELS`, `CLANCY_NOTION_PARENT`
871
+ - Azure DevOps: `AZDO_ORG`, `AZDO_PROJECT`, `AZDO_PAT`
817
872
  - Git host (all boards): `GITLAB_TOKEN`, `BITBUCKET_USER`, `BITBUCKET_TOKEN`, `CLANCY_GIT_PLATFORM`, `CLANCY_GIT_API_URL`, `CLANCY_STATUS_REVIEW`
818
873
  2. Write the new board credentials to `.clancy/.env`
819
874
  3. If switching to Jira: also ask the status filter question (same as init Q3) and write `CLANCY_JQL_STATUS` to `.clancy/.env`
@@ -161,9 +161,45 @@ This touches:
161
161
  It never modifies:
162
162
  - `.clancy/docs/` — codebase documentation
163
163
  - `.clancy/progress.txt` — progress log
164
- - `.clancy/.env` — credentials
165
164
  - `CLAUDE.md`
166
165
 
166
+ It may **append** to:
167
+ - `.clancy/.env` — adds missing env var defaults (see Step 4a)
168
+
169
+ ---
170
+
171
+ ## Step 4a — Backfill missing env var defaults
172
+
173
+ After the installer finishes, read `.clancy/.env` and check for missing pipeline label variables. These were introduced in v0.7.4 and won't exist in `.env` files from earlier installs.
174
+
175
+ **Check for and append if missing:**
176
+
177
+ ```
178
+ # Pipeline labels (added in v0.7.4)
179
+ CLANCY_LABEL_BRIEF=clancy:brief
180
+ CLANCY_LABEL_PLAN=clancy:plan
181
+ CLANCY_LABEL_BUILD=clancy:build
182
+ ```
183
+
184
+ For each variable:
185
+ 1. Read `.clancy/.env` content
186
+ 2. If the variable name does NOT appear anywhere in the file (not even commented out), append it with its default value
187
+ 3. If the variable already exists (even with a different value), leave it untouched
188
+
189
+ Add a blank line and a `# Pipeline labels (added in v0.7.4)` comment header before the new variables, but only if at least one variable was added.
190
+
191
+ **Display what was added (if any):**
192
+ ```
193
+ 📋 Added missing env var defaults to .clancy/.env:
194
+ CLANCY_LABEL_BRIEF=clancy:brief
195
+ CLANCY_LABEL_PLAN=clancy:plan
196
+ CLANCY_LABEL_BUILD=clancy:build
197
+
198
+ Customise these via /clancy:settings → L1/L2/L3
199
+ ```
200
+
201
+ If nothing was added, display nothing.
202
+
167
203
  ---
168
204
 
169
205
  ## Step 5 — Check for local patches
@@ -218,10 +218,11 @@ Platform-specific pre-creation lookups.
218
218
 
219
219
  ### GitHub
220
220
 
221
- **Pipeline label for children:** Determine the pipeline label based on planner role and flags:
222
- - `--skip-plan` flag → `CLANCY_LABEL_BUILD` (default: `clancy:build`)
223
- - Planner role enabled (`CLANCY_ROLES` includes `planner`) → `CLANCY_LABEL_PLAN` (default: `clancy:plan`)
224
- - Planner role NOT enabled → `CLANCY_LABEL_BUILD` (default: `clancy:build`)
221
+ **Pipeline label for children this is mandatory, always apply a pipeline label to every child ticket.** Determine which label to use:
222
+ - `--skip-plan` flag → use `CLANCY_LABEL_BUILD` from `.clancy/.env` if set, otherwise `clancy:build`
223
+ - Planner role enabled (`CLANCY_ROLES` includes `planner`) → use `CLANCY_LABEL_PLAN` from `.clancy/.env` if set, otherwise `clancy:plan`
224
+ - Planner role NOT enabled → use `CLANCY_LABEL_BUILD` from `.clancy/.env` if set, otherwise `clancy:build`
225
+ Ensure the label exists on the board (create it if missing), then add it to each child ticket.
225
226
 
226
227
  **Labels to apply per ticket:**
227
228
  - The pipeline label determined above (`CLANCY_LABEL_PLAN` or `CLANCY_LABEL_BUILD`) — replaces `CLANCY_LABEL` on children
@@ -272,9 +273,9 @@ Set CLANCY_BRIEF_ISSUE_TYPE in .clancy/.env.
272
273
  ```
273
274
  Stop.
274
275
 
275
- **Pipeline label for children:** Same logic as GitHub determine the pipeline label from `--skip-plan` flag and planner role.
276
+ **Pipeline label for children mandatory, same logic as GitHub.** Use `CLANCY_LABEL_PLAN` or `CLANCY_LABEL_BUILD` from `.clancy/.env` (defaults: `clancy:plan` / `clancy:build`). Always apply to every child ticket.
276
277
 
277
- **Labels:** Jira auto-creates labels — no pre-creation needed. Apply: the pipeline label (`CLANCY_LABEL_PLAN` or `CLANCY_LABEL_BUILD`), `clancy:afk` or `clancy:hitl`. `CLANCY_LABEL` is NOT applied to children when pipeline labels are active.
278
+ **Labels:** Jira auto-creates labels — no pre-creation needed. Apply: the pipeline label determined above, `clancy:afk` or `clancy:hitl`. `CLANCY_LABEL` is NOT applied to children when pipeline labels are active.
278
279
 
279
280
  **Components:** If `CLANCY_COMPONENT` is set, it maps to the Jira `components` field.
280
281
 
@@ -305,7 +306,7 @@ query {
305
306
  }
306
307
  ```
307
308
 
308
- **Pipeline label for children:** Same logic as GitHub/Jira determine the pipeline label from `--skip-plan` flag and planner role.
309
+ **Pipeline label for children mandatory, same logic as GitHub/Jira.** Use `CLANCY_LABEL_PLAN` or `CLANCY_LABEL_BUILD` from `.clancy/.env` (defaults: `clancy:plan` / `clancy:build`). Always apply to every child ticket.
309
310
 
310
311
  For each required label (the pipeline label, `component:{CLANCY_COMPONENT}`, `clancy:afk`, `clancy:hitl`): search by exact name. `CLANCY_LABEL` is NOT applied to children when pipeline labels are active. If not found in team labels, check workspace labels:
311
312
 
@@ -643,9 +644,9 @@ Created by Clancy on {YYYY-MM-DD}.
643
644
 
644
645
  ## Step 11a — Remove brief label from parent
645
646
 
646
- Only if a parent ticket exists AND all tickets were created successfully. Remove `CLANCY_LABEL_BRIEF` from the parent ticket. Best-effort — warn on failure, never stop.
647
+ Only if a parent ticket exists AND all tickets were created successfully. Remove the brief label from the parent ticket. Best-effort — warn on failure, never stop.
647
648
 
648
- Read `CLANCY_LABEL_BRIEF` from `.clancy/.env`. Default: `clancy:brief`.
649
+ Use `CLANCY_LABEL_BRIEF` from `.clancy/.env` if set, otherwise `clancy:brief`.
649
650
 
650
651
  ### GitHub
651
652
 
@@ -621,7 +621,7 @@ Continue — do not stop. The local file is the source of truth.
621
621
 
622
622
  Only for board-sourced briefs (ticket key was provided). Inline text and file briefs skip this step.
623
623
 
624
- Read `CLANCY_LABEL_BRIEF` from `.clancy/.env`. Default: `clancy:brief`. Read `CLANCY_LABEL_PLAN` and `CLANCY_LABEL_BUILD` for cleanup during re-briefs.
624
+ **This step is mandatory for board-sourced briefs — always apply the label.** Use `CLANCY_LABEL_BRIEF` from `.clancy/.env` if set. If not set, use `clancy:brief` as the default. Ensure the label exists on the board (create it if missing), then add it to the ticket. Also read `CLANCY_LABEL_PLAN` (default: `clancy:plan`) and `CLANCY_LABEL_BUILD` (default: `clancy:build`) for cleanup during re-briefs.
625
625
 
626
626
  ### Re-brief cleanup (`--fresh` flag)
627
627