specpro-cli 0.1.0__py3-none-any.whl

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 (76) hide show
  1. specpro_cli/__init__.py +16 -0
  2. specpro_cli/assets/commands/specpro.analyze.md +1102 -0
  3. specpro_cli/assets/commands/specpro.checklist.md +335 -0
  4. specpro_cli/assets/commands/specpro.clarify.md +581 -0
  5. specpro_cli/assets/commands/specpro.constitution.md +488 -0
  6. specpro_cli/assets/commands/specpro.feature.md +115 -0
  7. specpro_cli/assets/commands/specpro.implement.md +1881 -0
  8. specpro_cli/assets/commands/specpro.manual-test.md +206 -0
  9. specpro_cli/assets/commands/specpro.plan.md +3284 -0
  10. specpro_cli/assets/commands/specpro.qc.md +1489 -0
  11. specpro_cli/assets/commands/specpro.scenarios.md +154 -0
  12. specpro_cli/assets/commands/specpro.specify.md +1449 -0
  13. specpro_cli/assets/commands/specpro.status.md +863 -0
  14. specpro_cli/assets/commands/specpro.tasks.md +1207 -0
  15. specpro_cli/assets/commands/specpro.test-implement.md +462 -0
  16. specpro_cli/assets/commands/specpro.test-plan.md +383 -0
  17. specpro_cli/assets/commands/specpro.user-manual.md +178 -0
  18. specpro_cli/assets/scripts/bash/check-anti-coupling.sh +293 -0
  19. specpro_cli/assets/scripts/bash/check-prerequisites.sh +176 -0
  20. specpro_cli/assets/scripts/bash/common.sh +88 -0
  21. specpro_cli/assets/scripts/bash/create-new-feature.sh +336 -0
  22. specpro_cli/assets/scripts/bash/qc-auto-fix.sh +121 -0
  23. specpro_cli/assets/scripts/bash/setup-plan.sh +60 -0
  24. specpro_cli/assets/scripts/bash/verify-cumulative-records.sh +203 -0
  25. specpro_cli/assets/scripts/bash/verify-deliverables-tracked.sh +147 -0
  26. specpro_cli/assets/scripts/bash/verify-deployment.sh +239 -0
  27. specpro_cli/assets/scripts/bash/verify-frontmatter-yaml.sh +63 -0
  28. specpro_cli/assets/scripts/bash/verify-ledger.sh +376 -0
  29. specpro_cli/assets/scripts/bash/verify-shapes.sh +1082 -0
  30. specpro_cli/assets/scripts/git-hooks/pre-commit +243 -0
  31. specpro_cli/assets/scripts/install-git-hooks.sh +67 -0
  32. specpro_cli/assets/scripts/powershell/check-anti-coupling.ps1 +249 -0
  33. specpro_cli/assets/scripts/powershell/check-prerequisites.ps1 +148 -0
  34. specpro_cli/assets/scripts/powershell/common.ps1 +95 -0
  35. specpro_cli/assets/scripts/powershell/create-new-feature.ps1 +229 -0
  36. specpro_cli/assets/scripts/powershell/qc-auto-fix.ps1 +110 -0
  37. specpro_cli/assets/scripts/powershell/setup-plan.ps1 +61 -0
  38. specpro_cli/assets/scripts/powershell/verify-cumulative-records.ps1 +133 -0
  39. specpro_cli/assets/scripts/powershell/verify-deliverables-tracked.ps1 +112 -0
  40. specpro_cli/assets/scripts/powershell/verify-deployment.ps1 +278 -0
  41. specpro_cli/assets/scripts/powershell/verify-frontmatter-yaml.ps1 +56 -0
  42. specpro_cli/assets/scripts/powershell/verify-ledger.ps1 +383 -0
  43. specpro_cli/assets/scripts/powershell/verify-shapes.ps1 +978 -0
  44. specpro_cli/assets/templates/agent-context-template.md +49 -0
  45. specpro_cli/assets/templates/assumptions-template.md +248 -0
  46. specpro_cli/assets/templates/checklist-template.md +40 -0
  47. specpro_cli/assets/templates/clarifications-template.md +155 -0
  48. specpro_cli/assets/templates/constitution-template.md +50 -0
  49. specpro_cli/assets/templates/feature-spec-template.md +66 -0
  50. specpro_cli/assets/templates/plan-overview-template.md +150 -0
  51. specpro_cli/assets/templates/plan-template.md +387 -0
  52. specpro_cli/assets/templates/protocol-golden-bytes-guide.md +195 -0
  53. specpro_cli/assets/templates/requirements-template.md +356 -0
  54. specpro_cli/assets/templates/spec-template.md +267 -0
  55. specpro_cli/assets/templates/tasks-template.md +252 -0
  56. specpro_cli/assets/templates/test-tasks-template.md +174 -0
  57. specpro_cli/cli/__init__.py +5 -0
  58. specpro_cli/cli/cmd_init.py +416 -0
  59. specpro_cli/cli/cmd_remove.py +122 -0
  60. specpro_cli/cli/entry.py +181 -0
  61. specpro_cli/integrations/__init__.py +36 -0
  62. specpro_cli/integrations/base.py +601 -0
  63. specpro_cli/integrations/claude/__init__.py +101 -0
  64. specpro_cli/integrations/copilot/__init__.py +153 -0
  65. specpro_cli/integrations/cursor_agent/__init__.py +51 -0
  66. specpro_cli/integrations/gemini/__init__.py +44 -0
  67. specpro_cli/integrations/opencode/__init__.py +48 -0
  68. specpro_cli/integrations/qodercli/__init__.py +54 -0
  69. specpro_cli/integrations/registry.py +88 -0
  70. specpro_cli/packaged/__init__.py +5 -0
  71. specpro_cli/packaged/sync.py +106 -0
  72. specpro_cli-0.1.0.dist-info/METADATA +117 -0
  73. specpro_cli-0.1.0.dist-info/RECORD +76 -0
  74. specpro_cli-0.1.0.dist-info/WHEEL +4 -0
  75. specpro_cli-0.1.0.dist-info/entry_points.txt +2 -0
  76. specpro_cli-0.1.0.dist-info/licenses/LICENSE +21 -0
@@ -0,0 +1,863 @@
1
+ ---
2
+ description: Display a comprehensive dashboard of project status, Lifecycle tracking, and quality metrics.
3
+ handoffs: []
4
+ writes: []
5
+ # Read-only: this command produces no artifact.
6
+ ---
7
+
8
+ ## User Input
9
+
10
+ ```text
11
+ $ARGUMENTS
12
+ ```
13
+
14
+ You **MUST** consider the user input before proceeding (if not empty).
15
+
16
+ **Rerun safety โ€” read-only** โš ๏ธ [settled 2026-09-13]:
17
+
18
+ This command **writes no project artifact**. It reads the artifacts and renders a dashboard. The shared rerun rule (*detect the artifact; absent โ†’ initial, present โ†’ incremental; overwriting requires explicit AND re-confirmed intent*) governs the commands that produce them.
19
+
20
+ The dashboard is derived output: it is never a source, and refreshing it never replaces anything.
21
+
22
+ > **Why a shared rule rather than per-command courtesy**: nine of the twelve non-implementation commands already had some protection, but each wrote it its own way, and three had none โ€” not by decision, but because the discipline had no shared carrier. The rule everywhere else is: **detect the artifact; absent โ†’ initial, present โ†’ incremental; overwriting requires explicit AND re-confirmed intent.** This command's read-only posture means it never triggers the third clause.
23
+
24
+
25
+ ### Scope Resolution ๐Ÿ†• (FR-063 / T050 ยท v0.23)
26
+
27
+ 1. **ไฝœ็”จๅŸŸๅˆคๅฎš**: ๅฝ“ๅ‰ๅทฅไฝœ็›ฎๅฝ•ไฝไบŽ `specs/fNNN-็ฎ€็งฐ/` ๅ†… โ‡’ **feature ไฝœ็”จๅŸŸ**(่ฏปๅ†™่Œƒๅ›ด = ๆœฌ feature ็›ฎๅฝ•,็”ฑ `check-prerequisites.sh` ็š„ไฝœ็”จๅŸŸๆ„Ÿ็Ÿฅ่งฃๆž);ไฝไบŽไป“ๅบ“ๆ นๆˆ– `specs/` ๆ น โ‡’ **ๆฏไฝœ็”จๅŸŸ**(่ฏปๅ†™ๆฏ่ง„ๆ ผ้“พ)ใ€‚feature ไฝœ็”จๅŸŸๅ†… MUST NOT ๅ†™ๆฏไบง็‰ฉโ€”โ€”ๅ”ฏไธ€ไพ‹ๅค–:**ๅ‘็Žฐ็™ป่ฎฐ**(ๅฐ่ดฆ่ทฏ็”ฑ,`[specify]`/`[plan]` ๅˆ†ๅŒบ)ใ€‚
28
+ 2. **ๆ–ฐไผš่ฏ้ฆ–ๆฌกๆ‰ง่กŒ**: ่‹ฅ `specs/features.md` ๅญ˜ๅœจไธ”ๅซ `active` ่กŒใ€่€Œ็”จๆˆทๆœชๆŒ‡ๆ˜Žไฝœ็”จๅŸŸ โ‡’ **่ฏข้—ฎ็”จๆˆท**ๅœจๆฏไฝœ็”จๅŸŸ่ฟ˜ๆ˜ฏๆŸไธช feature ๅ†…ๅทฅไฝœ,MUST NOT ่‡ช่กŒๆŒ‘้€‰ใ€‚
29
+ 3. ๆœฌๅ‘ฝไปค็š„ไบง็‰ฉ่ทฏๅพ„้šไน‹่งฃๆž:feature ไฝœ็”จๅŸŸไธ‹่ฝ `<feature ็›ฎๅฝ•>/`,ๆฏไฝœ็”จๅŸŸไธ‹่ฝ `specs/`ใ€‚
30
+
31
+ ## Outline
32
+
33
+ Goal: Provide a visual, comprehensive status dashboard showing all aspects of the specification-driven development workflow, including Lifecycle tracking, quality metrics, and progress indicators.
34
+
35
+ ---
36
+
37
+ ## Execution Steps
38
+
39
+ **Step 1: Setup**: Run `.specpro/scripts/bash/check-prerequisites.sh --json` from repo root and parse paths.
40
+
41
+ **Step 2: Load specification status**:
42
+
43
+ ```bash
44
+ # Load spec.md
45
+ FEATURE_SPEC="specs/spec.md"
46
+
47
+ # Extract version
48
+ # Format contract: version line is a bold text line `**Version**: X.Y.Z`
49
+ SPEC_VERSION=$(grep '^\*\*Version\*\*:' "$FEATURE_SPEC" | head -1 | awk '{print $2}')
50
+
51
+ # Extract update statistics
52
+ # โš ๏ธ **The User-Story heading is `### US1 - [Brief Title] (Priority: P1)`** โ€” see
53
+ # `templates/spec-template.md`. It was never `### User Story`, so this count was **0 on
54
+ # every spec built from the template** and the panel showed "0" for a file with 11 stories
55
+ # (T094/ISS-63). โš ๏ธ Same defect appears in `qc.md`'s `check_cp002` (count AND its
56
+ # line-number lookup) and in `specpro.specify.md`'s existing-spec statistics โ€” all four
57
+ # move together, or the next reader writes the predicate from whichever copy they find.
58
+ US_COUNT=$(grep -cE '^### US[0-9]+ ' "$FEATURE_SPEC" 2>/dev/null || true)
59
+ : "${US_COUNT:=0}"
60
+ # FR line format contract: indented bold list item (see spec-template).
61
+ # qc and status MUST stay consistent. Anchored on the trailing colon to
62
+ # avoid matching FR mentions in prose. Supports sub-numbers like FR-xxxA.
63
+ # โš ๏ธ `|| echo "0"` was WRONG even here, where the PATTERN is right: `grep -c` prints `0`
64
+ # AND exits 1, so the idiom produced the two-line string "0\n0". `|| true` + `:=` keeps the
65
+ # value a single number (T093/T094).
66
+ FR_COUNT=$(grep -cE '^[[:space:]]*- \*\*FR-[0-9]+[A-E]?\*\*:' "$FEATURE_SPEC" 2>/dev/null || true)
67
+ : "${FR_COUNT:=0}"
68
+ ```
69
+
70
+ **Step 3: Parse Lifecycle fields**:
71
+
72
+ ```markdown
73
+ Load spec.md and extract ALL Lifecycle fields:
74
+ - User Stories: ID, Title, Priority, Lifecycle: [specify] [plan] [tasks]
75
+ - Functional Requirements: ID, Title, Lifecycle: [specify] [plan] [tasks]
76
+ <!-- โš ๏ธ **Those two are the whole list** (`T249` / `ISS-225`): a third line here used to name
77
+ `Constitution Constraints: Text, Lifecycle: [specify] [plan] [tasks]`, and **that section
78
+ carries no `**Lifecycle**:` field** โ€” the template emits none, so the line described a
79
+ class this scan would look for and never find. Adjudication + evidence:
80
+ `commands/specpro.specify.md` โ†’ *Lifecycle Update Rules* (`T239` / `ISS-212`).
81
+ โš ๏ธ **Do not add it back**, and do not "fix" it by giving that section the field โ€”
82
+ nothing parses a constraint's lifecycle, so it would be a value with no consumer.
83
+ The counting below is **per segment** (specify / plan / tasks), not per class, so it is
84
+ unaffected by the removal. -->
85
+
86
+ โš ๏ธ CRITICAL: Use NEW status labels (create/update/delete/processed/deprecated):
87
+ - **specify**: create | update | delete | processed | deprecated
88
+ - **plan**: create | update | delete | processed | deprecated
89
+ - **tasks**: create | update | delete | processed | deprecated
90
+
91
+ Calculate statistics:
92
+ - Specify stage: How many items per specifyStatus (create, update, delete, processed, deprecated)
93
+ - Plan stage: How many items per planStatus (create, update, delete, processed, deprecated)
94
+ - Tasks stage: How many items per tasksStatus (create, update, delete, processed, deprecated)
95
+ - Overall completion: Percentage of items with planStatus = processed AND tasksStatus = processed
96
+ ```
97
+
98
+ **Step 4: Load quality checklist** (if exists):
99
+
100
+ ```bash
101
+ QUALITY_CHECKLIST="specs/checklists/requirements.md"
102
+
103
+ if [[ -f "$QUALITY_CHECKLIST" ]]; then
104
+ # Extract quality score
105
+ # โš ๏ธ **่ฏปๆธ…ๅ•็œŸๅฎžๆบๅธฆ็š„้‚ฃไธ‰ไธชๅญ—ๆฎต**๏ผˆ`T174`๏ผ‰๏ผšๆœฌ่Š‚ๆญคๅ‰่ฏป็š„ๆ˜ฏ `Overall Quality` ๅค–ๅŠ ไธ€ไธช
106
+ # `[0-9]/[0-9]` ็š„**ๅˆ†ๆ•ฐๅฝข** โ€”โ€” ่€Œ `templates/requirements-template.md` **ไปŽไธไบงๅ‡บ่ฟ™ไธชๅญ—ๆฎต**๏ผŒ
107
+ # ้‚ฃไธชๅฝข็Šถๅœจๆœฌไป“ๅบ“็š„ไปปไฝ•ๆธ…ๅ•ไธŠ้ƒฝๅŒน้…ไธๅˆฐใ€‚ๆธ…ๅ•็œŸๆญฃๆœ‰็š„ๆ˜ฏ๏ผš`**Status**: PASS|BLOCK`ใ€
108
+ # `**Total Items**`ใ€`**Passed**`ใ€`**Failed**`๏ผŒไปฅๅŠ้€ๆก็š„ `**Status**: x|โŠ˜ Skipped|โœ— Failed`ใ€‚
109
+ QUALITY_STATUS=$(grep -m1 -oE '\*\*Status\*\*: *[A-Z]+' "$QUALITY_CHECKLIST" | sed 's/.*: *//')
110
+ QUALITY_TOTAL=$(grep -m1 -oE '\*\*Total Items\*\*: *[0-9]+' "$QUALITY_CHECKLIST" | grep -oE '[0-9]+')
111
+ QUALITY_PASSED=$(grep -m1 -oE '\*\*Passed\*\*: *[0-9]+' "$QUALITY_CHECKLIST" | grep -oE '[0-9]+')
112
+ QUALITY_SCORE="${QUALITY_PASSED:-?}/${QUALITY_TOTAL:-?}"
113
+
114
+ # Count issues
115
+ # โš ๏ธ ๅคฑ่ดฅๆ•ฐๅ–ๆธ…ๅ•่‡ชๅทฑๅ†™็š„ `**Failed**`๏ผŒไธๅ– `โŒ FAIL` ๅญ—้ข๏ผˆ`T174`๏ผ‰โ€”โ€” ๅŽ่€…ๆฒกๆœ‰็”Ÿไบง่€…ใ€‚
116
+ FAIL_COUNT=$(grep -m1 -oE '\*\*Failed\*\*: *[0-9]+' "$QUALITY_CHECKLIST" | grep -oE '[0-9]+')
117
+ : "${FAIL_COUNT:=0}"
118
+ # โš ๏ธ **`โš ๏ธ WARNING` ่ฟ™ไธ€็ฑปๅœจๆธ…ๅ•้‡Œๆ นๆœฌไธๅญ˜ๅœจ**๏ผšๆจกๆฟๅชๆœ‰ PASS|BLOCK ไธŽ x|โŠ˜ Skipped|โœ— Failed
119
+ # ไธ‰็งๅ–ๅ€ผ๏ผŒๆฒกๆœ‰ warning ๆกฃใ€‚โ‡’ ้‚ฃไธช่ฎกๆ•ฐ**ๆฐธ่ฟœไธบ 0**๏ผŒ่€Œไธ€ไธชๆ’ไธบ 0 ็š„ๆŒ‡ๆ ‡่ฏป่ตทๆฅๅƒ"ๆฒกๆœ‰่ญฆๅ‘Š"ใ€‚
120
+ # โ‡’ ๅˆ ๆމๅฎƒ๏ผŒ่€Œไธๆ˜ฏไฟ็•™ไธ€ไธชๅชไผš่ฟ”ๅ›ž 0 ็š„ๆ•ฐ๏ผˆ`T174`๏ผ‰ใ€‚
121
+ else
122
+ QUALITY_SCORE="N/A"
123
+ FAIL_COUNT="0"
124
+ QUALITY_STATUS="(no checklist)"
125
+ fi
126
+ ```
127
+
128
+ **Step 5: Load contract coverage**:
129
+
130
+ ```bash
131
+ CONTRACTS_DIR="specs/contracts/"
132
+
133
+ if [[ -d "$CONTRACTS_DIR" ]]; then
134
+ # Count contracts by User Story
135
+ P1_CONTRACTS=$(find "$CONTRACTS_DIR" -name "*.md" -exec grep -l "Priority.*P1" {} \; 2>/dev/null | wc -l)
136
+ P2_CONTRACTS=$(find "$CONTRACTS_DIR" -name "*.md" -exec grep -l "Priority.*P2" {} \; 2>/dev/null | wc -l)
137
+ P3_CONTRACTS=$(find "$CONTRACTS_DIR" -name "*.md" -exec grep -l "Priority.*P3" {} \; 2>/dev/null | wc -l)
138
+
139
+ TOTAL_CONTRACTS=$(find "$CONTRACTS_DIR" -name "*.md" | wc -l)
140
+ else
141
+ P1_CONTRACTS=0
142
+ P2_CONTRACTS=0
143
+ P3_CONTRACTS=0
144
+ TOTAL_CONTRACTS=0
145
+ fi
146
+ ```
147
+
148
+ **Step 6: Load tasks status**:
149
+
150
+ ```bash
151
+ TASKS_FILE="specs/tasks.md"
152
+
153
+ if [[ -f "$TASKS_FILE" ]]; then
154
+ # Count total tasks
155
+ TOTAL_TASKS=$(grep -c "^- \[ \]" "$TASKS_FILE" 2>/dev/null || true)
156
+ : "${TOTAL_TASKS:=0}"
157
+ COMPLETED_TASKS=$(grep -c "^- \[x\]" "$TASKS_FILE" 2>/dev/null || true)
158
+ : "${COMPLETED_TASKS:=0}"
159
+
160
+ # Calculate completion percentage
161
+ if [[ $TOTAL_TASKS -gt 0 ]]; then
162
+ TASK_PERCENT=$((COMPLETED_TASKS * 100 / TOTAL_TASKS))
163
+ else
164
+ TASK_PERCENT=0
165
+ fi
166
+ else
167
+ TOTAL_TASKS=0
168
+ COMPLETED_TASKS=0
169
+ TASK_PERCENT=0
170
+ fi
171
+ ```
172
+
173
+ **Step 6.2: Load test tasks status** ๐Ÿ†• (if exists):
174
+
175
+ ```bash
176
+ TEST_TASKS_FILE="specs/test-tasks.md"
177
+
178
+ if [[ -f "$TEST_TASKS_FILE" ]]; then
179
+ TEST_TASKS_EXISTS=true
180
+
181
+ # Count high-level test tasks by prefix (INF/IT/CE/AE), EXCLUDING [DELETED] stale entries
182
+ REMAINING_TEST_TASKS=$(grep -E "^- \[ \] (INF|IT|CE|AE)-" "$TEST_TASKS_FILE" 2>/dev/null | grep -cv "\[DELETED\]" || true)
183
+ : "${REMAINING_TEST_TASKS:=0}"
184
+ COMPLETED_TEST_TASKS=$(grep -E "^- \[x\] (INF|IT|CE|AE)-" "$TEST_TASKS_FILE" 2>/dev/null | grep -cv "\[DELETED\]" || true)
185
+ : "${COMPLETED_TEST_TASKS:=0}"
186
+
187
+ # Completion percentage (over done + pending)
188
+ TEST_TASK_TOTAL=$((REMAINING_TEST_TASKS + COMPLETED_TEST_TASKS))
189
+ if [[ $TEST_TASK_TOTAL -gt 0 ]]; then
190
+ TEST_TASK_PERCENT=$((COMPLETED_TEST_TASKS * 100 / TEST_TASK_TOTAL))
191
+ else
192
+ TEST_TASK_PERCENT=0
193
+ fi
194
+
195
+ # Coverage matrix stats โ€” โš ๏ธ anchor the status column at END OF LINE (`| <status> |$`):
196
+ # the status column is the LAST cell of each matrix row. Plain substring matches FALSE-count
197
+ # layer cells (a pending-impl row has 4 layer cells reading "| pending-impl |"). The optional `( \(.*\))?`
198
+ # group absorbs annotated statuses like "not-started (decode sub-item pending)". Do NOT use `[^|]*$`-
199
+ # style classes here โ€” they over-match across cells.
200
+ MATRIX_FR_TOTAL=$(grep -cE "^\| FR-[0-9]+[A-E]? \|" "$TEST_TASKS_FILE" 2>/dev/null || true)
201
+ : "${MATRIX_FR_TOTAL:=0}"
202
+ MATRIX_FR_PENDING_IMPL=$(grep -cE "\| pending-impl \|$" "$TEST_TASKS_FILE" 2>/dev/null || true)
203
+ : "${MATRIX_FR_PENDING_IMPL:=0}"
204
+ MATRIX_FR_MANUAL=$(grep -cE "\| manual \|$" "$TEST_TASKS_FILE" 2>/dev/null || true)
205
+ : "${MATRIX_FR_MANUAL:=0}"
206
+ MATRIX_FR_NOT_APPLICABLE=$(grep -cE "\| not-applicable \|$" "$TEST_TASKS_FILE" 2>/dev/null || true)
207
+ : "${MATRIX_FR_NOT_APPLICABLE:=0}"
208
+ MATRIX_FR_DEPRECATED=$(grep -cE "\| deprecated \|$" "$TEST_TASKS_FILE" 2>/dev/null || true)
209
+ : "${MATRIX_FR_DEPRECATED:=0}"
210
+ MATRIX_FR_NOT_STARTED=$(grep -cE "\| not-started( \(.*\))? \|$" "$TEST_TASKS_FILE" 2>/dev/null || true)
211
+ : "${MATRIX_FR_NOT_STARTED:=0}"
212
+ MATRIX_FR_IN_PROGRESS=$(grep -cE "\| in-progress( \(.*\))? \|$" "$TEST_TASKS_FILE" 2>/dev/null || true)
213
+ : "${MATRIX_FR_IN_PROGRESS:=0}"
214
+ MATRIX_FR_COMPLETED=$(grep -cE "\| completed( \(.*\))? \|$" "$TEST_TASKS_FILE" 2>/dev/null || true)
215
+ : "${MATRIX_FR_COMPLETED:=0}"
216
+
217
+ # Active FRs = rows this workflow tracks to completion
218
+ # (excludes planning verdicts: pending-impl / manual / not-applicable / deprecated)
219
+ MATRIX_FR_ACTIVE=$((MATRIX_FR_TOTAL - MATRIX_FR_PENDING_IMPL - MATRIX_FR_MANUAL - MATRIX_FR_NOT_APPLICABLE - MATRIX_FR_DEPRECATED))
220
+ else
221
+ TEST_TASKS_EXISTS=false
222
+ fi
223
+
224
+ # ๐Ÿ†• Lightweight alerts for the Test Task Progress section (S5 โ€” status stays read-only;
225
+ # these are hints, not a health score; thresholds adjustable).
226
+ S5_WARN_PENDING_IMPL=false
227
+ S5_WARN_LAGGING=false
228
+ TESTPLAN_LAST_RUN="N/A"
229
+
230
+ if [[ "$TEST_TASKS_EXISTS" == "true" ]]; then
231
+ # Alert 1: large backlog of FRs planned but never implemented
232
+ if [[ $MATRIX_FR_PENDING_IMPL -gt 10 ]]; then
233
+ S5_WARN_PENDING_IMPL=true
234
+ fi
235
+
236
+ # Alert 2: execution-tracked FRs exist but the matrix has not been refreshed
237
+ # for more than 7 days. `find -mtime -7` (POSIX) = modified within 7 days;
238
+ # empty result โ†’ stale. test-tasks.md mtime doubles as "last test-plan run".
239
+ if [[ $((MATRIX_FR_NOT_STARTED + MATRIX_FR_IN_PROGRESS)) -gt 0 ]]; then
240
+ if [[ -z "$(find "$TEST_TASKS_FILE" -mtime -7 2>/dev/null)" ]]; then
241
+ S5_WARN_LAGGING=true
242
+ # โš ๏ธ ๅ…œๅบ•้“พๅฟ…้กปๅœจ**ๅŒไธ€่กŒๅ†…**๏ผˆๅฅ‘็บฆ่ง„ๅˆ™ไบŒ็š„่ฑๅ…็ป†ๅˆ™็ฌฌ 2 ๆก๏ผ‰๏ผš่ทจ่กŒ if/else ไธ็ฎ—
243
+ # ๅ…œๅบ•้“พใ€ไธ่ฑๅ… โ€”โ€” ่€Œ `stat -c` ๆ˜ฏ GNU ไธ“ๆœ‰๏ผŒmacOS ็š„ BSD `stat` ไธ่ฎคใ€‚
244
+ # `||` ็š„ไผ˜ๅ…ˆ็บงไฝŽไบŽ็ฎก้“๏ผŒๆ•…ๅณๅŠๆ˜ฏ `stat -c โ€ฆ | cut โ€ฆ` ไธ€ๆ•ดๆก๏ผˆๆญฃๆ˜ฏ่ฆ็š„๏ผ‰ใ€‚
245
+ TESTPLAN_LAST_RUN=$(stat -f '%Sm' -t '%Y-%m-%d' "$TEST_TASKS_FILE" 2>/dev/null || stat -c %y "$TEST_TASKS_FILE" 2>/dev/null | cut -d' ' -f1)
246
+ TESTPLAN_LAST_RUN=${TESTPLAN_LAST_RUN:-N/A}
247
+ fi
248
+ fi
249
+ fi
250
+ ```
251
+
252
+ **Step 6.5: Load analysis results** ๐Ÿ†• (if exists):
253
+
254
+ ```bash
255
+ ANALYSIS_DIR="specs/analysis/"
256
+
257
+ if [[ -d "$ANALYSIS_DIR" ]]; then
258
+ # Find most recent analysis
259
+ # Portable: `ls -t` instead of GNU-only `find -printf '%T+'`
260
+ LATEST_ANALYSIS=$(ls -t "$ANALYSIS_DIR"analysis-*.md 2>/dev/null | head -1)
261
+
262
+ if [[ -f "$LATEST_ANALYSIS" ]]; then
263
+ # Extract metrics from latest analysis
264
+ # Portable mtime โ€” โš ๏ธ **ๅ•่กŒ**ๅ…œๅบ•้“พ๏ผˆBSD ไผ˜ๅ…ˆใ€GNU ๅ…œๅบ•๏ผ‰ใ€‚่ทจ่กŒ็š„ if/else **ไธๆ˜ฏ**
265
+ # ๅ…œๅบ•้“พใ€ไธ่ฑๅ…๏ผˆๅฅ‘็บฆ่ง„ๅˆ™ไบŒ่ฑๅ…็ป†ๅˆ™็ฌฌ 2 ๆก๏ผ‰๏ผŒ่€Œ `stat -c` ๆ˜ฏ GNU ไธ“ๆœ‰ใ€‚
266
+ ANALYSIS_DATE=$(stat -f '%Sm' -t '%Y-%m-%d %H:%M:%S' "$LATEST_ANALYSIS" 2>/dev/null || stat -c %y "$LATEST_ANALYSIS" 2>/dev/null | cut -d'.' -f1)
267
+
268
+ # Parse JSON metrics snapshot
269
+ CRITICAL_COUNT=$(grep -o '"critical": [0-9]*' "$LATEST_ANALYSIS" | head -1 | grep -o '[0-9]*' || true)
270
+ : "${CRITICAL_COUNT:=0}"
271
+ HIGH_COUNT=$(grep -o '"high": [0-9]*' "$LATEST_ANALYSIS" | head -1 | grep -o '[0-9]*' || true)
272
+ : "${HIGH_COUNT:=0}"
273
+ MEDIUM_COUNT=$(grep -o '"medium": [0-9]*' "$LATEST_ANALYSIS" | head -1 | grep -o '[0-9]*' || true)
274
+ : "${MEDIUM_COUNT:=0}"
275
+ LOW_COUNT=$(grep -o '"low": [0-9]*' "$LATEST_ANALYSIS" | head -1 | grep -o '[0-9]*' || true)
276
+ : "${LOW_COUNT:=0}"
277
+ COVERAGE_PERCENT=$(grep -o '"coverage_percent": [0-9]*' "$LATEST_ANALYSIS" | head -1 | grep -o '[0-9]*' || true)
278
+ : "${COVERAGE_PERCENT:=0}"
279
+
280
+ # Test-First violations
281
+ TEST_FIRST_HIGH=$(grep -o '"high_risk": [0-9]*' "$LATEST_ANALYSIS" | head -1 | grep -o '[0-9]*' || true)
282
+ : "${TEST_FIRST_HIGH:=0}"
283
+ TEST_FIRST_MEDIUM=$(grep -o '"medium_risk": [0-9]*' "$LATEST_ANALYSIS" | head -1 | grep -o '[0-9]*' || true)
284
+ : "${TEST_FIRST_MEDIUM:=0}"
285
+
286
+ # Check for trend data (multiple analyses)
287
+ ANALYSIS_COUNT=$(find "$ANALYSIS_DIR" -name "analysis-*.md" -type f | wc -l)
288
+
289
+ # Load trend data if available
290
+ if [[ $ANALYSIS_COUNT -gt 1 ]]; then
291
+ # Extract trend table from latest analysis
292
+ TREND_TABLE=$(sed -n '/## Quality Trend/,/^\*\*Improvement\*\*/p' "$LATEST_ANALYSIS" | head -n -1)
293
+ else
294
+ TREND_TABLE=""
295
+ fi
296
+ else
297
+ ANALYSIS_DATE="N/A"
298
+ CRITICAL_COUNT="N/A"
299
+ HIGH_COUNT="N/A"
300
+ MEDIUM_COUNT="N/A"
301
+ LOW_COUNT="N/A"
302
+ COVERAGE_PERCENT="N/A"
303
+ TEST_FIRST_HIGH="N/A"
304
+ TEST_FIRST_MEDIUM="N/A"
305
+ TREND_TABLE=""
306
+ fi
307
+ else
308
+ ANALYSIS_DATE="No analysis run"
309
+ CRITICAL_COUNT="N/A"
310
+ HIGH_COUNT="N/A"
311
+ MEDIUM_COUNT="N/A"
312
+ LOW_COUNT="N/A"
313
+ COVERAGE_PERCENT="N/A"
314
+ TEST_FIRST_HIGH="N/A"
315
+ TEST_FIRST_MEDIUM="N/A"
316
+ TREND_TABLE=""
317
+ fi
318
+ ```
319
+
320
+ **Step 6.7: Derived dashboard metrics** ๐Ÿ†• (Overall Completion, artifact timestamps, recommended actions):
321
+
322
+ ```bash
323
+ PLAN_FILE="specs/plan.md"
324
+
325
+ # --- Overall Completion ---
326
+ # Per Implementation Notes formula: percentage of items with planStatus = processed
327
+ # AND tasksStatus = processed. Grounded format: every US/FR carries exactly one
328
+ # `**Lifecycle**:` line (indented bold line under its item), so the denominator is
329
+ # the count of Lifecycle lines and the numerator those carrying both plan:processed
330
+ # and tasks:processed.
331
+ LIFECYCLE_TOTAL=$(grep -cE '\*\*Lifecycle\*\*:' "$FEATURE_SPEC" 2>/dev/null || true)
332
+ : "${LIFECYCLE_TOTAL:=0}"
333
+ LIFECYCLE_DONE=$(grep -cE '\*\*Lifecycle\*\*:.*\[plan:processed\]\[tasks:processed\]' "$FEATURE_SPEC" 2>/dev/null || true)
334
+ : "${LIFECYCLE_DONE:=0}"
335
+ if [[ $LIFECYCLE_TOTAL -gt 0 ]]; then
336
+ OVERALL_PERCENT=$((LIFECYCLE_DONE * 100 / LIFECYCLE_TOTAL))
337
+ else
338
+ OVERALL_PERCENT=0
339
+ fi
340
+
341
+ # --- Per-stage counts for the Lifecycle Summary table (`T231` / `ISS-204` / user ruling 2026-09-20) ---
342
+ # โš ๏ธ **Read as STATE, from the one artifact that carries the fields** โ€” same discipline as Rule 1
343
+ # below (`T246`): `spec.md` is the only carrier, and the anchor is the field's own line start, so
344
+ # prose that merely *mentions* a marker is not counted.
345
+ LIFECYCLE_FIELD_STAGE='^[[:space:]]*\*\*Lifecycle\*\*:'
346
+ TOTAL=$LIFECYCLE_TOTAL
347
+ PLAN_PROCESSED=$(grep -cE "${LIFECYCLE_FIELD_STAGE}.*\[plan:processed\]" "$FEATURE_SPEC" 2>/dev/null || true)
348
+ : "${PLAN_PROCESSED:=0}"
349
+ PLAN_PENDING=$(grep -cE "${LIFECYCLE_FIELD_STAGE}.*\[plan:(create|update|delete)\]" "$FEATURE_SPEC" 2>/dev/null || true)
350
+ : "${PLAN_PENDING:=0}"
351
+ TASK_PROCESSED=$(grep -cE "${LIFECYCLE_FIELD_STAGE}.*\[tasks:processed\]" "$FEATURE_SPEC" 2>/dev/null || true)
352
+ : "${TASK_PROCESSED:=0}"
353
+ TASK_PENDING=$(grep -cE "${LIFECYCLE_FIELD_STAGE}.*\[tasks:(create|update|delete)\]" "$FEATURE_SPEC" 2>/dev/null || true)
354
+ : "${TASK_PENDING:=0}"
355
+ pct() { [ "${2:-0}" -gt 0 ] && echo $(( $1 * 100 / $2 )) || echo 0; }
356
+ PLAN_PCT=$(pct "$PLAN_PROCESSED" "$TOTAL")
357
+ TASK_PCT=$(pct "$TASK_PROCESSED" "$TOTAL")
358
+ # โš ๏ธ **The Spec row has no processed/pending pair, and that is a conclusion, not a gap** (`T246`):
359
+ # `[specify:โ€ฆ]` records **how an item entered** the spec (`FR-046`), and its terminal value
360
+ # `[specify:processed]` **has no writer anywhere in the toolchain** โ‡’ that segment cannot express
361
+ # "done" or "outstanding", so the row renders `N/A` with this reason. **Do not synthesise a number
362
+ # for it** โ€” a fabricated count reads exactly like a real one.
363
+ SPEC_PROCESSED="N/A"; SPEC_PENDING="N/A"; SPEC_PCT="N/A"
364
+ NEW_ITEMS_LIST=$(grep -cE "${LIFECYCLE_FIELD_STAGE}.*\[specify:create\]" "$FEATURE_SPEC" 2>/dev/null || true)
365
+ MODIFIED_ITEMS_LIST=$(grep -cE "${LIFECYCLE_FIELD_STAGE}.*\[specify:update\]" "$FEATURE_SPEC" 2>/dev/null || true)
366
+ DELETED_ITEMS_LIST=$(grep -cE "${LIFECYCLE_FIELD_STAGE}.*\[specify:delete\]" "$FEATURE_SPEC" 2>/dev/null || true)
367
+ DEPRECATED_ITEMS_LIST=$(grep -cE "${LIFECYCLE_FIELD_STAGE}.*deprecated\]" "$FEATURE_SPEC" 2>/dev/null || true)
368
+ : "${NEW_ITEMS_LIST:=0}"; : "${MODIFIED_ITEMS_LIST:=0}"
369
+ : "${DELETED_ITEMS_LIST:=0}"; : "${DEPRECATED_ITEMS_LIST:=0}"
370
+
371
+ # --- Last artifact update timestamps (Recent Activity) ---
372
+ # Portable mtime: BSD `stat -f` first, fall back to GNU `stat -c`
373
+ last_mtime() {
374
+ local f="$1"
375
+ if [[ ! -f "$f" ]]; then
376
+ echo "N/A"; return
377
+ fi
378
+ local ts
379
+ # โš ๏ธ **ๅ•่กŒ**ๅ…œๅบ•้“พ๏ผˆBSD ไผ˜ๅ…ˆใ€GNU ๅ…œๅบ•๏ผ‰โ€”โ€” ่ทจ่กŒ็š„ if/else ไธๆ˜ฏๅ…œๅบ•้“พใ€ไธ่ฑๅ…ใ€‚
380
+ ts=$(stat -f '%Sm' -t '%Y-%m-%d %H:%M' "$f" 2>/dev/null || stat -c %y "$f" 2>/dev/null | cut -d'.' -f1)
381
+ echo "${ts:-N/A}"
382
+ }
383
+ LAST_SPEC_UPDATE=$(last_mtime "$FEATURE_SPEC")
384
+ LAST_PLAN_UPDATE=$(last_mtime "$PLAN_FILE")
385
+ LAST_TASKS_UPDATE=$(last_mtime "$TASKS_FILE")
386
+
387
+ # --- Recommended Actions (Next Steps) ---
388
+ # Rule table: every matching rule contributes one action line; none match โ†’ "No pending actions".
389
+ RECOMMENDED_ACTIONS=""
390
+
391
+ # Rule 1: pending Lifecycle items โ€” read as STATE, from the ONE artifact that carries the fields
392
+ # โš ๏ธ **Three corrections, one finding** (`T246` / `ISS-219`, ๅฝขๆ€ 4 ็š„ๆดปๅฎžไพ‹). The rule used to
393
+ # count markers and got **73 on a fully-settled project**; the acceptance criterion it must meet
394
+ # is `spec.md` โ†’ US9 scenario 6 (a settled project MUST NOT be reported as pending, and a
395
+ # genuinely-unprocessed item MUST be).
396
+ # โ‘  **The fields live in `FEATURE_SPEC` only** โ€” the three segments sit on the spec items.
397
+ # Measured: `spec.md` 73 `**Lifecycle**:` lines ยท `plan.md` **0** ยท `tasks.md` 3 (and those
398
+ # three are PROSE inside task descriptions, not fields). The old form read each segment out
399
+ # of a different file โ‡’ `PLAN_PENDING_COUNT` was **structurally 0** โ€” it read a file that
400
+ # carries no field at all, and a zero from an empty scan is indistinguishable from a real 0.
401
+ # โ‘ก **Line-start anchor** (`^[[:space:]]*\*\*Lifecycle\*\*:`). Without it the scan counts any
402
+ # prose that *mentions* the field โ€” and this repository has such prose in both files (a task
403
+ # description quoting a defect, an acceptance scenario citing an example). A mention is not
404
+ # an item.
405
+ # โ‘ข **The `specify` segment is NOT a pending signal** โ€” `FR-046`: "ๆ ‡่ฎฐ่ฎฐๅฝ•็š„ๆ˜ฏใ€Œไธ€ไธชๆก็›ฎๆ€Žไนˆ
406
+ # ่ฟ›ๆฅ็š„ใ€๏ผŒไธๆ˜ฏใ€Œๅฎƒ็Žฐๅœจๅœจๅ“ชใ€". `[specify:create|update|delete]` records *entry mode*, so a
407
+ # predicate over it matches **every** item (measured 73/73), and its terminal value
408
+ # `[specify:processed]` has **no writer anywhere in the tree** โ‡’ that segment cannot express
409
+ # "pending". `plan` / `tasks` CAN: their terminal values are written by `/specpro-plan` and
410
+ # `/specpro-tasks` respectively. โš ๏ธ **Do not restore a `SPEC_PENDING_COUNT` term** โ€” a count
411
+ # over entry mode is not a count of anything owed.
412
+ LIFECYCLE_FIELD='^[[:space:]]*\*\*Lifecycle\*\*:'
413
+ PLAN_PENDING_COUNT=$(grep -cE "${LIFECYCLE_FIELD}.*\[plan:(create|update|delete)\]" "$FEATURE_SPEC" 2>/dev/null || true)
414
+ : "${PLAN_PENDING_COUNT:=0}"
415
+ TASKS_PENDING_COUNT=$(grep -cE "${LIFECYCLE_FIELD}.*\[tasks:(create|update|delete)\]" "$FEATURE_SPEC" 2>/dev/null || true)
416
+ : "${TASKS_PENDING_COUNT:=0}"
417
+ LIFECYCLE_PENDING=$((PLAN_PENDING_COUNT + TASKS_PENDING_COUNT))
418
+ if [[ $LIFECYCLE_PENDING -gt 0 ]]; then
419
+ RECOMMENDED_ACTIONS+="- Run \`/specpro-plan\` or \`/specpro-tasks\` to process $LIFECYCLE_PENDING pending Lifecycle item(s)
420
+ "
421
+ fi
422
+
423
+ # Rule 2: open quality checklist issues
424
+ if [[ ${FAIL_COUNT:-0} -gt 0 ]]; then
425
+ RECOMMENDED_ACTIONS+="- Resolve ${FAIL_COUNT} checklist issue(s) via \`/specpro-qc\`
426
+ "
427
+ fi
428
+
429
+ # Rule 3: no high-level test plan
430
+ if [[ "$TEST_TASKS_EXISTS" != "true" ]]; then
431
+ RECOMMENDED_ACTIONS+="- Run \`/specpro-test-plan\` to build the coverage matrix
432
+ "
433
+ fi
434
+
435
+ # Rule 4: analysis missing or stale (> 30 days). POSIX `-mtime` keeps this portable.
436
+ ANALYSIS_RECENT=""
437
+ if [[ -d "$ANALYSIS_DIR" ]]; then
438
+ ANALYSIS_RECENT=$(find "$ANALYSIS_DIR" -name "analysis-*.md" -mtime -30 2>/dev/null | head -1)
439
+ fi
440
+ if [[ -z "$ANALYSIS_RECENT" ]]; then
441
+ RECOMMENDED_ACTIONS+="- Run \`/specpro-analyze\` (last analysis missing or older than 30 days)
442
+ "
443
+ fi
444
+
445
+ [[ -z "$RECOMMENDED_ACTIONS" ]] && RECOMMENDED_ACTIONS="- No pending actions"
446
+ ```
447
+
448
+ **Step 7: Generate dashboard**:
449
+
450
+ ```markdown
451
+ ## ๐Ÿ“Š Project Status Dashboard
452
+
453
+ **Specification**: Version $SPEC_VERSION
454
+ **Last Updated**: $(date +%Y-%m-%d)
455
+ **Working Directory**: $(pwd)
456
+
457
+ ---
458
+
459
+ ### ๐Ÿ—๏ธ Feature Registry Overview (FR-018 ยท v0.23)
460
+
461
+ ่ฏปๅ– `specs/features.md`(็™ป่ฎฐๆ–‡ไปถ,feature ๆœบๅˆถๅ”ฏไธ€็™ป่ฎฐ่ฝฝไฝ“)ใ€‚**ๆฏไธช feature ็š„่ฟ›ๅบฆ็”ฑๅฎƒ่‡ชๅทฑ็š„ไบง็‰ฉๆŽจๅฏผ**(`specs/fNNN-็ฎ€็งฐ/` ๅ†… spec/plan/tasks ็š„ๅ‹พ้€‰ๆ€),ไธ่ฏปๆฏ่ง„ๆ ผ้“พ:
462
+
463
+ ```text
464
+ Feature Registry: N feature(s)
465
+ f001 <name> [active] spec โœ“ plan โœ“ tasks โ–“โ–“โ–“โ–‘ 12/18
466
+ f002 <name> [delivered] spec โœ“ plan โœ“ tasks โœ“ ไบคไป˜ๅฎŒๆˆ
467
+ โš ๏ธ ็ผบไปถ: f003 ็ผบ plan.md
468
+ โš ๏ธ ๅญคๅ„ฟ: specs/f004-x/ ็›ฎๅฝ•ๅญ˜ๅœจไฝ†ๆœช็™ป่ฎฐ
469
+ โš ๏ธ ๅคฑ่”: ็™ป่ฎฐๅซ f005 ไฝ†็›ฎๅฝ•ไธๅญ˜ๅœจ
470
+ ```
471
+
472
+ **ไธ‰็ฑปไธ€่‡ดๆ€งๅ‘็Žฐ**(FR-018,ๅŒๅ‘): โ‘  **ๅœจๅ†Œๆ— ็›ฎๅฝ•** ยท โ‘ก **ๆœ‰็›ฎๅฝ•ๆœชๅœจๅ†Œ** ยท โ‘ข **็ผบไปถ**(็ผบ spec/plan/tasks ไปปไธ€้กน)ใ€‚ไปปไธ€ๅ‘็Žฐ MUST ๅˆ—ๅ‡บๅนถๆ ‡ๆณจ,ไธ้™้ป˜ใ€‚
473
+
474
+ ---
475
+
476
+ ### ๐ŸŽฏ Overall Progress
477
+
478
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
479
+ โ”‚ Specification: Example Plugin Architecture โ”‚
480
+ โ”‚ Version: $SPEC_VERSION โ”‚
481
+ โ”‚ User Stories: $US_COUNT โ”‚
482
+ โ”‚ Functional Requirements: $FR_COUNT โ”‚
483
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
484
+
485
+ **Overall Completion**: $OVERALL_PERCENT%
486
+
487
+ ---
488
+
489
+ ### ๐Ÿ“ˆ Lifecycle Summary
490
+
491
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
492
+ โ”‚ Stage โ”‚ Total โ”‚ Processed โ”‚ Pending โ”‚ Percentage โ”‚
493
+ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
494
+ โ”‚ **Spec** โ”‚ $TOTAL โ”‚ $SPEC_PROCESSED โ”‚ $SPEC_PENDING โ”‚ $SPEC_PCT% โ”‚
495
+ โ”‚ **Plan** โ”‚ $TOTAL โ”‚ $PLAN_PROCESSED โ”‚ $PLAN_PENDING โ”‚ $PLAN_PCT% โ”‚
496
+ โ”‚ **Tasks** โ”‚ $TOTAL โ”‚ $TASK_PROCESSED โ”‚ $TASK_PENDING โ”‚ $TASK_PCT% โ”‚
497
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
498
+
499
+ **Legend**:
500
+ - **Total**: Number of items (User Stories + FRs)
501
+ - **Processed**: Items with specifyStatus/planStatus/tasksStatus = "processed"
502
+ - **Pending**: Items with specifyStatus/planStatus/tasksStatus = "create" or "update" or "delete"
503
+ - **Percentage**: Processed / Total * 100
504
+
505
+ ---
506
+
507
+ ### ๐Ÿ”€ Modified Items (Need Re-processing)
508
+
509
+ **New Items** (specifyStatus = create, planStatus/tasksStatus = create):
510
+ $NEW_ITEMS_LIST
511
+
512
+ **Modified Items** (specifyStatus/planStatus/tasksStatus = update):
513
+ $MODIFIED_ITEMS_LIST
514
+
515
+ **Deleted Items** (specifyStatus/planStatus/tasksStatus = delete):
516
+ $DELETED_ITEMS_LIST
517
+
518
+ **Action Required**:
519
+ ```
520
+ ```
521
+ $specpro.plan # Re-plan modified items
522
+ $specpro.tasks # Re-breakdown modified items
523
+ ```
524
+
525
+ ---
526
+
527
+ ### โš ๏ธ Deprecated Items
528
+
529
+ $DEPRECATED_ITEMS_LIST
530
+
531
+ ---
532
+
533
+ ### โœ… Quality Status
534
+
535
+ **Quality** (from `specs/checklists/requirements.md`): $QUALITY_STATUS โ€” $QUALITY_SCORE passed
536
+
537
+ **Issues**:
538
+ - โœ— Failed: $FAIL_COUNT (ๆธ…ๅ•็š„ `**Failed**` ๅญ—ๆฎต๏ผ›โš ๏ธ **ๆฒกๆœ‰ warning ๆกฃ** โ€”โ€” ๆจกๆฟๅชๆœ‰ไธ‰็งๅ–ๅ€ผ)
539
+
540
+ **Defect status** (FR-050 โ€” see the wording rule below the dashboard sections): [**ๆ— ๅทฒ็Ÿฅ็ผบ้™ท** โ€”
541
+ <N> shapes all exercised, 0 hits | <N> known instance(s) | โš ๏ธ **coverage incomplete** โ€” <M> shape(s)
542
+ could not be exercised at all, so that part is **unproven, NOT clean**]
543
+ โš ๏ธ The counts above measure the **artifacts**; this line is the only place the **tool's** defect status
544
+ is stated, and it may be written as ใ€Œๆ— ๅทฒ็Ÿฅ็ผบ้™ทใ€ **only** with the coverage declaration attached.
545
+
546
+ **Quality Checklist**: specs/checklists/requirements.md *(Produced by /specpro-qc)*
547
+
548
+ ---
549
+
550
+ **็ผบ้™ท็Šถๆ€็š„่กจ่ฟฐ่ง„ๅˆ™** โš ๏ธ [FR-050 โ€”โ€” ๆœฌๆฎตๅœจไธคไธชๅ‘ฝไปค้‡Œ**้€ๅญ—็›ธๅŒ**๏ผˆ`specpro.status.md` ยท `specpro.analyze.md`๏ผ‰๏ผ›ๆ”นไธ€ๅค„ MUST ๅŒ่ฝฎๆ”นๅฆไธ€ๅค„๏ผŒๅฆๅˆ™ๅฎƒๅฐฑๆ˜ฏๅฎƒๆ‰€้˜ฒ็š„้‚ฃ็งๅˆ†ๅ‰๏ผˆๅฝขๆ€ 3๏ผ‰]
551
+
552
+ **ไปปไฝ•ใ€Œๆœ‰ๆฒกๆœ‰็ผบ้™ทใ€็š„้™ˆ่ฟฐ MUST ่กจ่ฟฐไธบใ€Œๆ— ๅทฒ็Ÿฅ็ผบ้™ทใ€๏ผŒMUST NOT ่กจ่ฟฐไธบใ€Œๆ— ็ผบ้™ทใ€ใ€‚** ไธค่€…ๆ˜ฏไธๅŒ็š„ๆ–ญ่จ€๏ผŒๅชๆœ‰ๅ‰่€…ๅฏๆ ธ้ชŒ๏ผš
553
+
554
+ | ่กจ่ฟฐ | ๅฎƒๅฃฐ็งฐไป€ไนˆ | ๅฏๅฆๆ ธ้ชŒ |
555
+ |---|---|---|
556
+ | **ๆ— ๅทฒ็Ÿฅ็ผบ้™ท** | **็™ป่ฎฐ่กจไธญๆฏไธ€ไธชๅฝขๆ€้ƒฝๅทฒๅฏนๅฎƒ่ท‘่ฟ‡ๆฃ€ๅ‡บ๏ผŒไธ”ๅทฒ็Ÿฅๅฎžไพ‹ไธบ้›ถ** | โœ… ๅฏๆ ธ้ชŒ โ€”โ€” ้‡่ท‘ๆฃ€ๅ‡บๅณๅพ—็ป“่ฎบ |
557
+ | **ๆ— ็ผบ้™ท** | ไธ€ไธชๅ…ณไบŽ**ๆœช่ขซๆฃ€่ง†็š„้‚ฃไธ€้ƒจๅˆ†**็š„ๆ–ญ่จ€ | โŒ ไธๅฏๆ ธ้ชŒ โ€”โ€” ๆฒกๆœ‰ไบบๅฏนๅฎƒๅš่ฟ‡ๆต‹้‡ |
558
+
559
+ **ๅฎšไน‰ๅณๅˆคๆฎ**๏ผšๅชๆœ‰ๅฝ“**ๆฏไธ€ไธชๅฝขๆ€้ƒฝๅทฒ่ขซๆฃ€ๅ‡บ่ฟ‡**๏ผˆๆฒกๆœ‰ไธ€ไธช่ฝ `โŠ˜`๏ผ‰**ไธ”ๅ‘ฝไธญๆ•ฐไธบ้›ถ**ๆ—ถ๏ผŒๆ‰ๅฏไปฅ่กจ่ฟฐไธบใ€Œๆ— ๅทฒ็Ÿฅ็ผบ้™ทใ€๏ผ›ๅฆๅˆ™ MUST ๅ†™ๅ‡บๆœชๆฃ€่ง†็š„้‚ฃ้ƒจๅˆ†ใ€‚
560
+
561
+ โš ๏ธ **MUST ้š้™„่ฆ†็›–ๅฃฐๆ˜Ž**๏ผšไปปไฝ•็ผบ้™ท็Šถๆ€้™ˆ่ฟฐ MUST ๅฃฐๆ˜Ž**ๆ‰€่ฆ†็›–็š„่Œƒๅ›ด** โ€”โ€” ๅ“ชไบ›ๅฝขๆ€ๆฃ€ๅ‡บ่ฟ‡ใ€ๅ“ชไบ›**ๆฒก่ƒฝๆฃ€ๅ‡บ**๏ผˆ`โŠ˜`๏ผ‰ใ€‚โš ๏ธ **ใ€Œๆฒกๆœ‰ๆๅˆฐใ€ไธŽใ€Œๆฒกๆœ‰ๆฌ ่ดฆใ€ๆ˜ฏไธคๅฅไธๅŒ็š„่ฏ๏ผŒ่€Œๅ‰่€…ไธŽใ€Œๅฟ˜ไบ†็œ‹ใ€ๆ— ไปŽๅŒบๅˆ†**๏ผˆ`FR-036` ๅฏน่ฆ†็›–ไธปๅผ ๆ–ฝๅŠ ็š„ๆ˜ฏๅŒไธ€ๆก็บชๅพ‹๏ผš**ๅฃฐ็งฐ้€š่ฟ‡่€ŒๅŸบ็บฟๆœช่ฆ†็›–๏ผŒไธๆž„ๆˆ้€š่ฟ‡**๏ผ‰ใ€‚
562
+
563
+ โš ๏ธ **ๅทฅๅ…ทไพงๆŠฅๅ‘Š็”จ่‹ฑๆ–‡๏ผŒๅŒไธ€ๆ–ญ่จ€็…งๆญคๅฏนๅบ”**๏ผš`no known instance` โœ… / `no defects` ยท `defect-free` โŒใ€‚ไธคไธชๅฝขๆ€่ฏด็š„ๆ˜ฏ**ๅŒไธ€ไปถไบ‹**๏ผŒๅชๅœจ่ฏญ่จ€ไธŠไธๅŒ โ€”โ€” ่‹ฅๅช้’‰ไฝไธญๆ–‡้‚ฃไธ€ไพง๏ผŒ่‹ฑๆ–‡ๆŠฅๅ‘Šไผš**็…งๆ—งๅฃฐ็งฐใ€Œๆ— ็ผบ้™ทใ€่€Œๆฒกๆœ‰ไปปไฝ•ไธœ่ฅฟๆŠฅ้”™**๏ผˆๅฝขๆ€ 3๏ผ‰ใ€‚
564
+
565
+ **ๆœบๅˆถ๏ผˆๅฏๅค่ท‘็š„ๅฝขๆ€๏ผ‰**๏ผš`scripts/bash/verify-shapes.sh`๏ผˆPowerShell ๅฏน็ญ‰๏ผš`scripts/powershell/verify-shapes.ps1`๏ผ‰ๅฐฑๆ˜ฏ่ฟ™ๆกๅˆคๆฎ็š„่ฝฝไฝ“ โ€”โ€” ๆ”ถๅฐพๆŠฅๅ‘Š็ป™ๅ‡บ `N hit`๏ผˆๅทฒ็Ÿฅๅฎžไพ‹ๆ•ฐ๏ผ‰ไธŽ `M not executable`๏ผˆๆฒก่ท‘่ตทๆฅ็š„็ป„ๆ•ฐ๏ผ‰ใ€‚**ๅ‘ฝไธญๆ•ฐไธไธบ้›ถ โ‡’ ไธๅพ—่กจ่ฟฐไธบใ€Œๆ— ๅทฒ็Ÿฅ็ผบ้™ทใ€๏ผ›ๆœ‰ `โŠ˜` โ‡’ MUST ่ฟžๅธฆๅฃฐๆ˜Ž้‚ฃไธ€้ƒจๅˆ†ๆœช่ฏๅฎž๏ผŒ่€Œไธๆ˜ฏๅนฒๅ‡€ใ€‚**
566
+
567
+ ### ๐Ÿ” Cross-Artifact Analysis ๐Ÿ†•
568
+
569
+ **Last Analysis**: $ANALYSIS_DATE
570
+
571
+ **Issue Summary**:
572
+ - ๐Ÿ”ด CRITICAL: $CRITICAL_COUNT
573
+ - ๐ŸŸ  HIGH: $HIGH_COUNT
574
+ - ๐ŸŸก MEDIUM: $MEDIUM_COUNT
575
+ - ๐ŸŸข LOW: $LOW_COUNT
576
+
577
+ **Coverage**: $COVERAGE_PERCENT%
578
+
579
+ **Test-First Compliance** (Constitution Article IV):
580
+ - High-Risk Violations: $TEST_FIRST_HIGH
581
+ - Medium-Risk Violations: $TEST_FIRST_MEDIUM
582
+
583
+ **Analysis Directory**: specs/analysis/
584
+
585
+ **Actions**:
586
+ ```bash
587
+ # Run new analysis
588
+ /specpro-analyze
589
+
590
+ # Save for trend tracking
591
+ /specpro-analyze --persist
592
+
593
+ # Quick summary
594
+ /specpro-analyze --summary
595
+ ```
596
+
597
+ **Quality Trend** ๐Ÿ†• (if multiple analyses exist):
598
+ $TREND_TABLE
599
+
600
+ ---
601
+
602
+ ### ๐Ÿ“„ Contract Coverage
603
+
604
+ **Total Contracts**: $TOTAL_CONTRACTS
605
+
606
+ **Contracts by Priority** (generated counts):
607
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
608
+ โ”‚ Priority โ”‚ Generated โ”‚
609
+ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
610
+ โ”‚ P1 โ”‚ $P1_CONTRACTS โ”‚
611
+ โ”‚ P2 โ”‚ $P2_CONTRACTS โ”‚
612
+ โ”‚ P3 โ”‚ $P3_CONTRACTS โ”‚
613
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
614
+
615
+ > Required baseline not defined โ€” add a contract plan (required counts per priority)
616
+ > to plan.md to enable coverage % tracking.
617
+
618
+ **Contract Directory**: specs/contracts/
619
+
620
+ ---
621
+
622
+ ### โœ… Task Progress
623
+
624
+ **Total Tasks**: $TOTAL_TASKS
625
+ **Completed**: $COMPLETED_TASKS
626
+ **Remaining**: $((TOTAL_TASKS - COMPLETED_TASKS))
627
+
628
+ **Task Completion**: $TASK_PERCENT%
629
+
630
+ ```text
631
+ [โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘] $TASK_PERCENT%
632
+ ```
633
+
634
+ **Tasks File**: specs/tasks.md
635
+
636
+ ---
637
+
638
+ ### ๐Ÿงช Test Task Progress ๐Ÿ†•
639
+
640
+ <!-- Render this section only when specs/test-tasks.md exists.
641
+ If TEST_TASKS_EXISTS=false, show:
642
+ "> โ„น๏ธ No high-level test plan found (specs/test-tasks.md).
643
+ > Run `/specpro-test-plan` to generate the coverage matrix and integration / E2E test tasks."
644
+ and skip the stats below. -->
645
+
646
+ **Total Test Tasks**: $TEST_TASK_TOTAL (INF + IT + CE + AE)
647
+ **Completed**: $COMPLETED_TEST_TASKS
648
+ **Remaining**: $REMAINING_TEST_TASKS
649
+ <!-- โš ๏ธ ๅ˜้‡ๅไธŽๅ…ถๅซไน‰๏ผˆ`T174`๏ผ‰๏ผšๆœฌ่กŒๆญคๅ‰่ฏป็š„ๆ˜ฏ `TOTAL_TEST_TASKS`๏ผŒ่€Œๅฎƒ็š„ๅฎšไน‰**ๅชๆ•ฐ `- [ ]`**
650
+ โ‡’ ๅฎƒ่ฃ…็š„ๆ˜ฏ**ๅ‰ฉไฝ™**๏ผŒไธๆ˜ฏๆ€ป้‡๏ผˆๆ€ป้‡ๆ˜ฏ `TEST_TASK_TOTAL = ๅ‰ฉไฝ™ + ๅทฒๅฎŒๆˆ`๏ผ‰ใ€‚
651
+ ไธคไธช `**Remaining**` ็š„็ฎ—ๆณ•ๆœฌๆฅๅฐฑๆ˜ฏๅŒไธ€ไธชๆ„ๆ€๏ผˆ`$((ๆ€ป้‡ - ๅทฒๅฎŒๆˆ))` โ‰ก ๅ‰ฉไฝ™๏ผ‰๏ผŒ
652
+ ้”™็š„ๆ˜ฏ**ๅๅญ—**๏ผšๅๅญ—ๅไบ† โ‡’ ไธ‹ไธ€ไธช่ฏป็š„ไบบไผšๆŠŠๅฎƒๅฝ“ๆ€ป้‡็”จใ€‚ๅทฒๆ”นๅไธบ `REMAINING_TEST_TASKS`ใ€‚ -->
653
+
654
+ **Test Task Completion**: $TEST_TASK_PERCENT%
655
+
656
+ ```text
657
+ [โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘โ–‘] $TEST_TASK_PERCENT%
658
+ ```
659
+
660
+ **Coverage Matrix** (specs/test-tasks.md):
661
+ - FRs tracked: $MATRIX_FR_TOTAL | **Active** (execution-tracked): $MATRIX_FR_ACTIVE
662
+ - Execution states: not-started $MATRIX_FR_NOT_STARTED | in-progress $MATRIX_FR_IN_PROGRESS | completed $MATRIX_FR_COMPLETED
663
+ - Planning verdicts: pending-impl $MATRIX_FR_PENDING_IMPL | manual $MATRIX_FR_MANUAL | not-applicable $MATRIX_FR_NOT_APPLICABLE | deprecated $MATRIX_FR_DEPRECATED
664
+
665
+ **Test Tasks File**: specs/test-tasks.md
666
+ **Planned by**: /specpro-test-plan | **Executed by**: /specpro-test-implement
667
+
668
+ <!-- Lightweight alerts (S5): render ONLY the lines whose condition holds; skip both if none. -->
669
+ <!-- If S5_WARN_PENDING_IMPL == true:
670
+ โš ๏ธ $MATRIX_FR_PENDING_IMPL FRs awaiting implementation (pending-impl) โ€” consider an incremental /specpro-test-plan pass -->
671
+ <!-- If S5_WARN_LAGGING == true:
672
+ โš ๏ธ Test execution lagging (last run $TESTPLAN_LAST_RUN) โ€” re-run /specpro-test-implement to advance open FRs -->
673
+
674
+ ---
675
+
676
+ ### ๐Ÿ“… Recent Activity
677
+
678
+ **Last Plan Update**: $LAST_PLAN_UPDATE
679
+ **Last Tasks Update**: $LAST_TASKS_UPDATE
680
+ **Last Spec Update**: $LAST_SPEC_UPDATE
681
+
682
+ ---
683
+
684
+ ### ๐Ÿš€ Next Steps
685
+
686
+ Based on current status:
687
+
688
+ **Recommended Actions**:
689
+ $RECOMMENDED_ACTIONS
690
+
691
+ ---
692
+
693
+ ## Dashboard Legend
694
+
695
+ **Status Indicators**:
696
+ - โœ… **Complete**: All items processed
697
+ - โš ๏ธ **In Progress**: Some items pending
698
+ - โŒ **Blocking**: Issues need attention
699
+ - ๐Ÿ“Š **On Track**: Good progress
700
+
701
+ **Lifecycle Status Codes** (NEW - create/update/delete/processed/deprecated):
702
+ - **create**: New item, never processed
703
+ - **update**: Item changed since last processing (needs re-processing)
704
+ - **delete**: Item marked for deletion (will be removed)
705
+ - **processed**: Item successfully processed at this stage
706
+ - **deprecated**: Item removed from active development
707
+
708
+ **Lifecycle Stage Mapping**:
709
+ - **[specify]**: Specification stage (spec.md status)
710
+ - **[plan]**: Planning stage (plan.md status)
711
+ - **[tasks]**: Implementation stage (tasks.md status)
712
+
713
+ โš ๏ธ **The example must be a value combination that can actually occur** (`T247` / `ISS-220`). This used to read `[specify:processed][plan:update][tasks:create]` โ€” `processed` is **never written to the `specify` segment by anything** (measured: 0 occurrences across the tree, and the segments that DO reach `processed` are `plan` and `tasks`, written by `/specpro-plan` and `/specpro-tasks`). โ‡’ The example taught a shape the toolchain cannot produce, and a reader copying it would write a field nobody maintains.
714
+
715
+ **Example**: `**Lifecycle**: [specify:update][plan:processed][tasks:processed]`
716
+ - Specification: update (item content changed since it entered the spec)
717
+ - Planning: processed (design has caught up with that change)
718
+ - Tasks: processed (task breakdown has caught up too)
719
+
720
+ ---
721
+
722
+ **Generated**: $(date)
723
+ **Command**: /specpro-status
724
+ ```
725
+
726
+ **Step 8: Display dashboard**:
727
+ - Output the formatted dashboard
728
+ - Use markdown tables for structured data
729
+ - Use progress bars for visual completion
730
+ - Use emoji for quick scanning
731
+
732
+ ---
733
+
734
+ ## Examples
735
+
736
+ ### Example 1: New Project (No Processing)
737
+
738
+ ```markdown
739
+ ## ๐Ÿ“Š Project Status Dashboard
740
+
741
+ **Specification**: Version 0.1
742
+ **Last Updated**: 2026-02-07
743
+
744
+ ### ๐ŸŽฏ Overall Progress
745
+ **Overall Completion**: 0%
746
+
747
+ ### ๐Ÿ“ˆ Lifecycle Summary
748
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
749
+ โ”‚ Stage โ”‚ Total โ”‚ Processed โ”‚ Pending โ”‚
750
+ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
751
+ โ”‚ specify โ”‚ 161 โ”‚ 0 โ”‚ 161 (100%) โ”‚
752
+ โ”‚ plan โ”‚ 161 โ”‚ 0 โ”‚ 161 (100%) โ”‚
753
+ โ”‚ tasks โ”‚ 161 โ”‚ 0 โ”‚ 161 (100%) โ”‚
754
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
755
+
756
+ ### ๐Ÿ”€ Modified Items (Need Re-processing)
757
+ **New Items**: 161 (all items - specifyStatus=create)
758
+
759
+ **Recommended Actions**:
760
+ 1. Run /specpro-plan to start planning
761
+ 2. Run /specpro-tasks after planning complete
762
+ ```
763
+
764
+ ### Example 2: In Progress Project
765
+
766
+ ```markdown
767
+ ## ๐Ÿ“Š Project Status Dashboard
768
+
769
+ **Specification**: Version 1.1.1
770
+ **Last Updated**: 2026-02-07
771
+
772
+ ### ๐ŸŽฏ Overall Progress
773
+ **Overall Completion**: 97%
774
+
775
+ ### ๐Ÿ“ˆ Lifecycle Summary
776
+ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
777
+ โ”‚ Stage โ”‚ Total โ”‚ Processed โ”‚ Pending โ”‚
778
+ โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ผโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
779
+ โ”‚ specify โ”‚ 161 โ”‚ 161 โ”‚ 0 (0%) โ”‚
780
+ โ”‚ plan โ”‚ 161 โ”‚ 157 โ”‚ 4 (3%) โ”‚
781
+ โ”‚ tasks โ”‚ 161 โ”‚ 157 โ”‚ 4 (3%) โ”‚
782
+ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜
783
+
784
+ ### ๐Ÿ”€ Modified Items (Need Re-processing)
785
+ **New Items** (specifyStatus=create):
786
+ - FR-xxxA: [encoder implementation]
787
+ - FR-xxxB: [protocol extensions]
788
+ - FR-xxxC: [automatic sub-encoding]
789
+ - FR-xxxD: [performance tuning]
790
+
791
+ **Modified Items** (specifyStatus=update):
792
+ None
793
+
794
+ **Deleted Items** (specifyStatus=delete):
795
+ None
796
+
797
+ ### ๐Ÿš€ Next Steps
798
+ **Recommended**:
799
+ 1. Run /specpro-plan to process 4 new items (specifyStatus=create)
800
+ 2. Run /specpro-tasks to regenerate tasks
801
+ 3. Continue implementation
802
+ ```
803
+
804
+ ---
805
+
806
+ ## Use Cases
807
+
808
+ 1. **Quick Status Check**: Get instant overview of project progress
809
+ 2. **Before Planning**: See what needs to be planned
810
+ 3. **Before Implementation**: Verify all prerequisites are met
811
+ 4. **Team Meetings**: Share project status with team
812
+ 5. **Progress Tracking**: Monitor completion over time
813
+
814
+ ---
815
+
816
+ ## Integration with Other Commands
817
+
818
+ - **/specpro-status** โ†’ Display dashboard (this command)
819
+ - **/specpro-plan** โ†’ Update planStatus, see changes in dashboard
820
+ - **/specpro-tasks** โ†’ Update tasksStatus, see changes in dashboard
821
+ - **/specpro-specify** โ†’ Update all Lifecycle fields (specify/plan/tasks), see changes in dashboard
822
+ - **/specpro-analyze** โ†’ Run cross-artifact analysis, populate analysis section in dashboard ๐Ÿ†•
823
+
824
+ ---
825
+
826
+ ## Implementation Notes
827
+
828
+ **Parsing Lifecycle Fields** (NEW format):
829
+ - Use regex to extract: `**Lifecycle**: \[specify:(.*?)\]\[plan:(.*?)\]\[tasks:(.*?)\]`
830
+ โš ๏ธ **็ป„้—ดๆ— ็ฉบๆ ผ**๏ผˆ`T174`๏ผ‰๏ผšๆœฌ่Š‚ๆญคๅ‰ๅ†™็š„ๆ˜ฏ `\] \[` โ€”โ€” ่ฆๆฑ‚ไธ‰็ป„ไน‹้—ด**ๆœ‰็ฉบๆ ผ**๏ผŒ่€Œ `templates/spec-template.md`
831
+ ไธŽ `commands/specpro.specify.md` ๅ†™ๅ…ฅ็š„ๆ˜ฏ**็ดง้‚ป**ๅฝขๅผ `[specify:create][plan:create][tasks:create]` โ‡’ ้€ๅญ—ๆ‰ง่กŒๆ—ถ
832
+ ่ฟ™ไธชๆญฃๅˆ™**ๅœจๆœฌไป“ๅบ“็š„ๅ…จ้ƒจไบง็‰ฉไธŠ้ƒฝๅŒน้…ไธๅˆฐ**๏ผŒ่€ŒๅŒน้…ไธๅˆฐไธŽใ€Œ่ฏฅ้กนๆฒกๆœ‰ Lifecycle ๅญ—ๆฎตใ€ๅŒๅฝขใ€‚
833
+ โš ๏ธ **ไธŠ้ข้‚ฃๅฏนๅ–ๅ€ผไบŽ 2026-09-20 ๆ›ดๆญฃ**๏ผˆ`T243` / `ISS-216`๏ผ‰๏ผšๆœฌ่Š‚ๆญคๅ‰ๆŠŠ"็ดง้‚ปๅฝขๅผ"ไธพไพ‹ไธบ**ไธ‰ไธชๆฎตไธญๅŽไธคไธชไธบ็ฉบ**็š„ๅ†™ๆณ•๏ผŒ
834
+ ่€Œ้‚ฃๆ˜ฏ **`T143` ไฟฎๅคไน‹ๅ‰**็š„ๆจกๆฟๅฝขๆ€ โ€”โ€” ๅฎžๆต‹ `commands/specpro.specify.md` ๅ†™็š„ๆ˜ฏไธ‰ไธชๆฎต**้ƒฝๅ– `create`**๏ผˆ**6 ๅค„**๏ผ‰๏ผŒ
835
+ ็ฉบๅ€ผ **0 ๅค„**ใ€‚**่ฏฅๆณจ็š„่ง‚ๅฏŸ๏ผˆ"็ป„้—ดๆ— ็ฉบๆ ผ"๏ผ‰่‡ชๅง‹ๆˆ็ซ‹๏ผŒ้”™็š„ๅชๆ˜ฏๅฎƒๅผ•็š„ๅ–ๅ€ผใ€‚**
836
+ โš ๏ธ **ๆญคๅค„ๅˆปๆ„ไธๆŠŠ้‚ฃไธ‰ไธช็ฉบๆฎต็…งๆŠ„ๅ‡บๆฅ** โ€”โ€” `templates/spec-template.md` โ†’ `## Change Summary` ็š„่ง„ๅˆ™่ฏดๅพ—ๅพˆ็›ดๆŽฅ๏ผš
837
+ ใ€Œ**do not quote what was removed**, not even as a quotation in backticks โ€”โ€” a value sitting in prose is
838
+ **indistinguishable from a real Lifecycle field to any mechanical reader** (a `grep`, a leg count, a
839
+ propagation scan)ใ€ใ€‚**ๆœฌ่ฝฎ็ฌฌไธ€็‰ˆๆญฃๆ˜ฏ็…งๆŠ„ไบ†ๅฎƒ**๏ผŒ้šๅŽ่ขซ่‡ชๆŸฅๆŒ‰ๅŒไธ€ๆก่ง„ๅˆ™ๆ”นๆމใ€‚
840
+ - Group 1: specifyStatus (create | update | delete | processed | deprecated)
841
+ - Group 2: planStatus (create | update | delete | processed | deprecated)
842
+ - Group 3: tasksStatus (create | update | delete | processed | deprecated)
843
+
844
+ โš ๏ธ IMPORTANT: Single system-wide vocabulary โ€” create | update | delete | processed | deprecated.
845
+ No legacy verb labels exist anywhere in the toolchain (create is the only "new item" tag,
846
+ update the only "changed item" tag): the Lifecycle field is the only status carrier, and
847
+ Change Summary entries use the same tags (changed items only).
848
+ - **create**: New item
849
+ - **update**: Modified item (needs re-processing downstream)
850
+ - **delete**: Item to be deleted
851
+ - **processed**: Successfully processed at this stage
852
+ - **deprecated**: Removed from development
853
+
854
+ **Color Coding** (for terminal output):
855
+ - โœ… Green: Complete, on track
856
+ - โš ๏ธ Yellow: Warnings, in progress
857
+ - โŒ Red: Blocking issues
858
+ - ๐Ÿ“Š Blue: Information
859
+
860
+ **Performance**:
861
+ - Dashboard generation: <1 second
862
+ - Minimal I/O (read 4-5 files)
863
+ - No external dependencies