bigpowers 1.2.3 → 1.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.
- package/CHANGELOG.md +7 -0
- package/CLAUDE.md +5 -4
- package/CONVENTIONS.md +54 -12
- package/README.md +5 -5
- package/SKILL-INDEX.md +14 -11
- package/assess-impact/SKILL.md +2 -2
- package/build-epic/SKILL.md +42 -0
- package/change-request/SKILL.md +16 -16
- package/compose-workflow/SKILL.md +1 -1
- package/deepen-architecture/SKILL.md +6 -6
- package/define-success/SKILL.md +1 -1
- package/delegate-task/SKILL.md +4 -4
- package/develop-tdd/SKILL.md +5 -5
- package/dispatch-agents/SKILL.md +2 -2
- package/evolve-skill/SKILL.md +2 -2
- package/execute-plan/SKILL.md +22 -59
- package/fix-bug/SKILL.md +37 -0
- package/grill-with-docs/SKILL.md +1 -1
- package/inspect-quality/SKILL.md +5 -5
- package/investigate-bug/SKILL.md +2 -2
- package/kickoff-branch/SKILL.md +1 -1
- package/map-codebase/SKILL.md +4 -4
- package/migrate-spec/SKILL.md +18 -18
- package/model-domain/SKILL.md +7 -7
- package/orchestrate-project/SKILL.md +5 -8
- package/package.json +4 -2
- package/plan-release/SKILL.md +63 -39
- package/plan-work/SKILL.md +6 -6
- package/research-first/SKILL.md +3 -3
- package/run-planning/SKILL.md +24 -0
- package/scope-work/SKILL.md +6 -6
- package/scripts/bp-yaml-set.sh +9 -0
- package/scripts/bp-yaml-snapshot.sh +23 -0
- package/scripts/convert-legado.sh +153 -0
- package/scripts/enrich-epics-from-archive.sh +101 -0
- package/scripts/land-branch.sh +5 -1
- package/scripts/project-survey.sh +18 -9
- package/scripts/sync-bugs-registry.sh +53 -0
- package/scripts/sync-status-from-epics.sh +51 -0
- package/scripts/validate-specs-yaml.sh +41 -0
- package/scripts/yaml-tools.py +144 -0
- package/session-state/SKILL.md +59 -50
- package/setup-environment/SKILL.md +1 -1
- package/slice-tasks/SKILL.md +6 -6
- package/survey-context/SKILL.md +38 -27
- package/trace-requirement/SKILL.md +8 -8
- package/using-bigpowers/SKILL.md +10 -9
- package/validate-fix/SKILL.md +3 -3
- package/verify-work/SKILL.md +12 -17
- package/visual-dashboard/SKILL.md +25 -74
- package/visual-dashboard/scripts/cockpit.html +66 -0
- package/visual-dashboard/scripts/read-specs-status.cjs +123 -0
- package/visual-dashboard/scripts/server.cjs +40 -0
- package/write-document/SKILL.md +1 -1
- package/maintain-wiki/SKILL.md +0 -130
- package/profiles/obsidian-wiki.md +0 -120
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Minimal YAML helpers for bigpowers specs (no external deps)."""
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
import re
|
|
6
|
+
import sys
|
|
7
|
+
from pathlib import Path
|
|
8
|
+
from typing import Any
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def _parse_simple_yaml(text: str) -> dict[str, Any]:
|
|
12
|
+
"""Parse flat and one-level-nested YAML (no lists of objects)."""
|
|
13
|
+
root: dict[str, Any] = {}
|
|
14
|
+
stack: list[tuple[int, dict[str, Any]]] = [(0, root)]
|
|
15
|
+
for raw in text.splitlines():
|
|
16
|
+
if not raw.strip() or raw.strip().startswith("#"):
|
|
17
|
+
continue
|
|
18
|
+
indent = len(raw) - len(raw.lstrip())
|
|
19
|
+
line = raw.strip()
|
|
20
|
+
if ":" not in line:
|
|
21
|
+
continue
|
|
22
|
+
key, _, val = line.partition(":")
|
|
23
|
+
key = key.strip()
|
|
24
|
+
val = val.strip()
|
|
25
|
+
while stack and indent < stack[-1][0]:
|
|
26
|
+
stack.pop()
|
|
27
|
+
cur = stack[-1][1]
|
|
28
|
+
if val == "":
|
|
29
|
+
nxt: dict[str, Any] = {}
|
|
30
|
+
cur[key] = nxt
|
|
31
|
+
stack.append((indent + 2, nxt))
|
|
32
|
+
else:
|
|
33
|
+
if val in ("true", "false"):
|
|
34
|
+
cur[key] = val == "true"
|
|
35
|
+
elif val.startswith('"') and val.endswith('"'):
|
|
36
|
+
cur[key] = val[1:-1]
|
|
37
|
+
elif val.startswith("'") and val.endswith("'"):
|
|
38
|
+
cur[key] = val[1:-1]
|
|
39
|
+
else:
|
|
40
|
+
try:
|
|
41
|
+
if "." in val:
|
|
42
|
+
cur[key] = float(val)
|
|
43
|
+
else:
|
|
44
|
+
cur[key] = int(val)
|
|
45
|
+
except ValueError:
|
|
46
|
+
cur[key] = val
|
|
47
|
+
return root
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
def _dump_value(val: Any, indent: int) -> str:
|
|
51
|
+
sp = " " * indent
|
|
52
|
+
if isinstance(val, dict):
|
|
53
|
+
lines = []
|
|
54
|
+
for k, v in val.items():
|
|
55
|
+
if isinstance(v, dict):
|
|
56
|
+
lines.append(f"{sp}{k}:")
|
|
57
|
+
lines.append(_dump_value(v, indent + 2).rstrip())
|
|
58
|
+
elif isinstance(v, bool):
|
|
59
|
+
lines.append(f"{sp}{k}: {'true' if v else 'false'}")
|
|
60
|
+
elif isinstance(v, (int, float)):
|
|
61
|
+
lines.append(f"{sp}{k}: {v}")
|
|
62
|
+
else:
|
|
63
|
+
s = str(v).replace('"', '\\"')
|
|
64
|
+
lines.append(f'{sp}{k}: "{s}"')
|
|
65
|
+
return "\n".join(lines) + "\n"
|
|
66
|
+
return f"{sp}{val}\n"
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def dump_yaml(data: dict[str, Any]) -> str:
|
|
70
|
+
return _dump_value(data, 0)
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def set_path(path: Path, dotted_key: str, value: str) -> None:
|
|
74
|
+
text = path.read_text(encoding="utf-8") if path.exists() else ""
|
|
75
|
+
data = _parse_simple_yaml(text) if text.strip() else {}
|
|
76
|
+
parts = dotted_key.split(".")
|
|
77
|
+
cur: Any = data
|
|
78
|
+
for part in parts[:-1]:
|
|
79
|
+
if part not in cur or not isinstance(cur[part], dict):
|
|
80
|
+
cur[part] = {}
|
|
81
|
+
cur = cur[part]
|
|
82
|
+
last = parts[-1]
|
|
83
|
+
if value.lower() in ("true", "false"):
|
|
84
|
+
cur[last] = value.lower() == "true"
|
|
85
|
+
else:
|
|
86
|
+
try:
|
|
87
|
+
cur[last] = int(value)
|
|
88
|
+
except ValueError:
|
|
89
|
+
try:
|
|
90
|
+
cur[last] = float(value)
|
|
91
|
+
except ValueError:
|
|
92
|
+
cur[last] = value.strip('"').strip("'")
|
|
93
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
94
|
+
path.write_text(dump_yaml(data), encoding="utf-8")
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def validate_file(path: Path, required_keys: list[str]) -> list[str]:
|
|
98
|
+
errors: list[str] = []
|
|
99
|
+
if not path.exists():
|
|
100
|
+
return [f"missing: {path}"]
|
|
101
|
+
text = path.read_text(encoding="utf-8")
|
|
102
|
+
data = _parse_simple_yaml(text)
|
|
103
|
+
for key in required_keys:
|
|
104
|
+
parts = key.split(".")
|
|
105
|
+
cur: Any = data
|
|
106
|
+
for part in parts:
|
|
107
|
+
if not isinstance(cur, dict) or part not in cur:
|
|
108
|
+
errors.append(f"{path}: missing key '{key}'")
|
|
109
|
+
break
|
|
110
|
+
cur = cur[part]
|
|
111
|
+
return errors
|
|
112
|
+
|
|
113
|
+
|
|
114
|
+
def main() -> int:
|
|
115
|
+
if len(sys.argv) < 2:
|
|
116
|
+
print("usage: yaml-tools.py set <file> <dotted.key> <value>", file=sys.stderr)
|
|
117
|
+
return 2
|
|
118
|
+
cmd = sys.argv[1]
|
|
119
|
+
if cmd == "set":
|
|
120
|
+
_, _, file, key, val = sys.argv
|
|
121
|
+
set_path(Path(file), key, val)
|
|
122
|
+
return 0
|
|
123
|
+
if cmd == "validate":
|
|
124
|
+
root = Path(sys.argv[2]) if len(sys.argv) > 2 else Path("specs")
|
|
125
|
+
errors: list[str] = []
|
|
126
|
+
errors += validate_file(root / "state.yaml", ["active_flow"])
|
|
127
|
+
errors += validate_file(
|
|
128
|
+
root / "release-plan.yaml", ["release", "release.version", "epics"]
|
|
129
|
+
)
|
|
130
|
+
errors += validate_file(
|
|
131
|
+
root / "execution-status.yaml", ["development_status"]
|
|
132
|
+
)
|
|
133
|
+
if errors:
|
|
134
|
+
for e in errors:
|
|
135
|
+
print(e)
|
|
136
|
+
return 1
|
|
137
|
+
print("OK")
|
|
138
|
+
return 0
|
|
139
|
+
print(f"unknown command: {cmd}", file=sys.stderr)
|
|
140
|
+
return 2
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
if __name__ == "__main__":
|
|
144
|
+
sys.exit(main())
|
package/session-state/SKILL.md
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: session-state
|
|
3
3
|
model: haiku
|
|
4
|
-
description: Track implementation decisions and progress in specs/
|
|
4
|
+
description: Track implementation decisions and progress in specs/state.yaml to prevent context rot. Use at the start of a session to load context, and whenever a significant decision is made or a milestone is reached.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Session State
|
|
@@ -10,82 +10,91 @@ Track the current state of implementation, including decisions made, pending tas
|
|
|
10
10
|
|
|
11
11
|
## Goal
|
|
12
12
|
|
|
13
|
-
Maintain a single source of truth for the *current*
|
|
13
|
+
Maintain a single source of truth for the *current* session in `specs/state.yaml`. This complements long-term docs in `specs/plans/` and delivery detail in `specs/epics/` + `specs/release-plan.yaml`.
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
Legacy `specs/state.yaml` is deprecated — use `state.yaml` only.
|
|
16
16
|
|
|
17
|
-
|
|
17
|
+
## Handoff block (cold start)
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
When ending a session or before a context-heavy spawn, update `handoff` in `state.yaml`:
|
|
20
|
+
|
|
21
|
+
```yaml
|
|
22
|
+
handoff:
|
|
23
|
+
last_step_completed: "e02s01 verify-work passed"
|
|
24
|
+
open_decisions:
|
|
25
|
+
- "Use folder mode for e07 (>5 stories)"
|
|
26
|
+
required_reading:
|
|
27
|
+
- CONVENTIONS.md
|
|
28
|
+
- specs/epics/e02-verification/epic.yaml
|
|
29
|
+
next_skill: develop-tdd
|
|
25
30
|
```
|
|
26
31
|
|
|
27
32
|
## Strategic compaction
|
|
28
33
|
|
|
29
34
|
| Trigger | Action |
|
|
30
35
|
|---------|--------|
|
|
31
|
-
| Phase transition (Plan → Build → Verify) | Compact
|
|
36
|
+
| Phase transition (Plan → Build → Verify) | Compact handoff; archive verbose decisions to ADR |
|
|
32
37
|
| Context > 70% estimated | Run terse-mode for status only; move detail to specs/ |
|
|
33
|
-
| Before `dispatch-agents` wave |
|
|
38
|
+
| Before `dispatch-agents` wave | `state.yaml` only channel between spawns |
|
|
34
39
|
|
|
35
40
|
## Workflow
|
|
36
41
|
|
|
37
42
|
### 1. Initialize (Session Start)
|
|
38
43
|
|
|
39
|
-
If `specs/
|
|
44
|
+
If `specs/state.yaml` does not exist, or if starting a new major phase:
|
|
40
45
|
|
|
41
|
-
- [ ] Read `specs/
|
|
42
|
-
- [ ] Get git metadata: `git branch --show-current` and `git rev-parse HEAD`.
|
|
43
|
-
- [ ] Create `specs/
|
|
46
|
+
- [ ] Read `specs/release-plan.yaml` and `specs/requirements/SCOPE_LATEST.yaml`.
|
|
47
|
+
- [ ] Get git metadata: `git branch --show-current` and `git rev-parse --short HEAD`.
|
|
48
|
+
- [ ] Create `specs/state.yaml` with active flow, git, handoff, and epic cycle if in build.
|
|
44
49
|
|
|
45
50
|
### 2. Load (Context Refresh)
|
|
46
51
|
|
|
47
52
|
When starting a new session or after a significant context flush:
|
|
48
53
|
|
|
49
|
-
- [ ] Read `specs/
|
|
50
|
-
- [ ]
|
|
51
|
-
- [ ]
|
|
54
|
+
- [ ] Read `specs/state.yaml` to understand where the previous agent left off.
|
|
55
|
+
- [ ] Read `specs/execution-status.yaml` for story progress (do not infer from release-plan).
|
|
56
|
+
- [ ] Verify git matches `state.yaml` `git.branch` / `git.hash`.
|
|
52
57
|
|
|
53
58
|
### 3. Update (Decision Point/Milestone)
|
|
54
59
|
|
|
55
60
|
Whenever a significant decision is made or a milestone is reached:
|
|
56
61
|
|
|
57
|
-
- [ ]
|
|
58
|
-
- [ ] Update
|
|
59
|
-
- [ ]
|
|
60
|
-
- [ ]
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
62
|
+
- [ ] Patch via `bash scripts/bp-yaml-set.sh specs/state.yaml git.hash <hash>` (or edit directly).
|
|
63
|
+
- [ ] Update `handoff.open_decisions` with rationale.
|
|
64
|
+
- [ ] Update `epic_cycle` when advancing `ship-epic` steps.
|
|
65
|
+
- [ ] Record open questions under `handoff.open_decisions` or an ADR.
|
|
66
|
+
|
|
67
|
+
→ verify: `bash scripts/validate-specs-yaml.sh`
|
|
68
|
+
|
|
69
|
+
## File Format: specs/state.yaml
|
|
70
|
+
|
|
71
|
+
```yaml
|
|
72
|
+
active_flow: build_epic # planning | build_epic | fix_bug
|
|
73
|
+
active_epic_id: e02
|
|
74
|
+
active_story_id: e02s01 # required when epic mode: folder
|
|
75
|
+
active_bug_id: null # BUG-2026-06-01T143022 when fix_bug
|
|
76
|
+
release:
|
|
77
|
+
target_version: "3.0.0"
|
|
78
|
+
last_tag: null
|
|
79
|
+
last_publish: null
|
|
80
|
+
epic_cycle:
|
|
81
|
+
current_step: develop-tdd
|
|
82
|
+
next_skill: develop-tdd
|
|
83
|
+
completed_steps: [kickoff-branch]
|
|
84
|
+
bug_cycle:
|
|
85
|
+
current_step: null
|
|
86
|
+
completed_steps: []
|
|
87
|
+
git:
|
|
88
|
+
branch: feat/e02-verify
|
|
89
|
+
hash: abc1234
|
|
90
|
+
handoff:
|
|
91
|
+
last_step_completed: null
|
|
92
|
+
open_decisions: []
|
|
93
|
+
next_skill: survey-context
|
|
85
94
|
```
|
|
86
95
|
|
|
87
96
|
## Anti-Patterns
|
|
88
97
|
|
|
89
|
-
- **Duplicate Plan**: Don't
|
|
90
|
-
- **Stale State**: Forgetting to update `
|
|
91
|
-
- **
|
|
98
|
+
- **Duplicate Plan**: Don't copy `release-plan.yaml` or epic shards into `state.yaml`.
|
|
99
|
+
- **Stale State**: Forgetting to update `state.yaml` after a major refactor or decision.
|
|
100
|
+
- **Status in release-plan**: Story/epic status lives only in `execution-status.yaml`.
|
|
@@ -15,7 +15,7 @@ Idempotent prep so BUILD phase commands succeed on first run.
|
|
|
15
15
|
3. Install dependencies (`npm ci`, `bundle install`, etc.) — prefer lockfile installs.
|
|
16
16
|
4. Copy `.env.example` → `.env` if documented; never commit secrets.
|
|
17
17
|
5. Run smoke: lint + one fast test or `--version` on key tools.
|
|
18
|
-
6. Record versions in `specs/
|
|
18
|
+
6. Record versions in `specs/state.yaml` under Environment.
|
|
19
19
|
|
|
20
20
|
## Verify
|
|
21
21
|
|
package/slice-tasks/SKILL.md
CHANGED
|
@@ -1,22 +1,22 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: slice-tasks
|
|
3
|
-
description: Break a plan or PRD into
|
|
3
|
+
description: Break a plan or PRD into vertical-slice stories in specs/epics/ (replaces legacy TASKS.md). Use after scope-work or plan-release, before plan-work.
|
|
4
4
|
model: sonnet
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Slice Tasks
|
|
8
8
|
|
|
9
|
-
Produce `specs/
|
|
9
|
+
Produce **epic shard stories** in `specs/epics/eNN-*.yaml` — vertical slices, each independently deliverable and testable. Legacy `specs/epics/ (see slice-tasks)` is deprecated; use epics + `execution-status.yaml`.
|
|
10
10
|
|
|
11
11
|
## Process
|
|
12
12
|
|
|
13
|
-
1. Read `specs/
|
|
13
|
+
1. Read `specs/requirements/SCOPE_LATEST.yaml` and/or `specs/release-plan.yaml`.
|
|
14
14
|
2. Cut **tracer-bullet slices** (thin end-to-end paths first, then depth).
|
|
15
|
-
3. Each
|
|
16
|
-
4. Order by WSJF
|
|
15
|
+
3. Each story: `id` (e.g. `e03s01`), `title`, optional `depends-on` in task desc, `tasks[]` with `desc` + `verify`.
|
|
16
|
+
4. Order by WSJF in `release-plan.yaml` epic list.
|
|
17
17
|
|
|
18
18
|
> **HARD GATE** — No horizontal-only slices ("add all models") without a vertical path that proves integration.
|
|
19
19
|
|
|
20
20
|
## Verify
|
|
21
21
|
|
|
22
|
-
→ verify: `
|
|
22
|
+
→ verify: `grep -c 'id: e' specs/epics/*.yaml | awk '{if($1>0) print "OK"; else print "MISSING"}'`
|
package/survey-context/SKILL.md
CHANGED
|
@@ -14,23 +14,30 @@ Read the project's current state and give a phase map + next-skill recommendatio
|
|
|
14
14
|
|
|
15
15
|
If `CONVENTIONS.md` exists at the project root, read it first. It contains the rules all agents must follow in this project.
|
|
16
16
|
|
|
17
|
-
### 2. Read specs/
|
|
17
|
+
### 2. Read specs/ (YAML-first)
|
|
18
18
|
|
|
19
19
|
Scan the `specs/` directory if it exists:
|
|
20
20
|
|
|
21
21
|
```
|
|
22
22
|
specs/
|
|
23
|
-
├──
|
|
24
|
-
├──
|
|
25
|
-
├──
|
|
26
|
-
├──
|
|
27
|
-
├──
|
|
28
|
-
├──
|
|
29
|
-
├──
|
|
30
|
-
└──
|
|
23
|
+
├── state.yaml → session: active_flow, epic, git, handoff
|
|
24
|
+
├── release-plan.yaml → target version, WSJF epic index
|
|
25
|
+
├── execution-status.yaml → flat story/epic status
|
|
26
|
+
├── planning-status.yaml → discover-phase checklist (optional)
|
|
27
|
+
├── requirements/
|
|
28
|
+
│ ├── VISION_LATEST.yaml
|
|
29
|
+
│ ├── SCOPE_LATEST.yaml
|
|
30
|
+
│ └── GLOSSARY_LATEST.yaml
|
|
31
|
+
├── plans/ → TECH_STACK, TEST_PLAN, etc.
|
|
32
|
+
├── epics/ → eNN shards (flat yaml or eNN/stories/)
|
|
33
|
+
└── bugs/ → BUG-*.md + registry.yaml
|
|
31
34
|
```
|
|
32
35
|
|
|
33
|
-
For each file found, note:
|
|
36
|
+
For each YAML file found, note: exists? keys populated? `handoff.next_skill`?
|
|
37
|
+
|
|
38
|
+
Legacy markdown (`specs/archive/STATE.md`, `RELEASE-PLAN.md`) is **not** SoT if YAML exists.
|
|
39
|
+
|
|
40
|
+
→ verify: `bash scripts/validate-specs-yaml.sh 2>/dev/null || echo "YAML layout incomplete"`
|
|
34
41
|
|
|
35
42
|
### 3. Read CLAUDE.md
|
|
36
43
|
|
|
@@ -44,7 +51,7 @@ git log --oneline -5
|
|
|
44
51
|
git branch --show-current
|
|
45
52
|
```
|
|
46
53
|
|
|
47
|
-
Note: is there a feature branch active? Are there uncommitted changes?
|
|
54
|
+
Note: is there a feature branch active? Are there uncommitted changes? Do they match `specs/state.yaml` `git` block?
|
|
48
55
|
|
|
49
56
|
### 5. Map the lifecycle phase
|
|
50
57
|
|
|
@@ -52,33 +59,36 @@ Based on what you've found, identify which PMBOK phase this project is currently
|
|
|
52
59
|
|
|
53
60
|
| Phase | Signals |
|
|
54
61
|
|-------|---------|
|
|
55
|
-
| **Discover** | No
|
|
56
|
-
| **Design** |
|
|
57
|
-
| **Plan** |
|
|
62
|
+
| **Discover** | No `requirements/SCOPE_LATEST.yaml` yet, or only rough notes |
|
|
63
|
+
| **Design** | SCOPE exists but no `release-plan.yaml` |
|
|
64
|
+
| **Plan** | `release-plan.yaml` exists; on `main`/`master` branch |
|
|
58
65
|
| **Initiate** | On a feature branch; no code changes yet |
|
|
59
|
-
| **Execute** |
|
|
60
|
-
| **Verify** | Implementation done; run `verify-work` or `run-evals
|
|
61
|
-
| **Bug** | `specs/bugs/BUG-*.md`
|
|
66
|
+
| **Execute** | `state.yaml` `active_flow: build_epic`; epic shard in progress |
|
|
67
|
+
| **Verify** | Implementation done; run `verify-work` or `run-evals` |
|
|
68
|
+
| **Bug** | `state.yaml` `active_flow: fix_bug` or open `specs/bugs/BUG-*.md` |
|
|
62
69
|
| **Review** | All code written; no PR yet |
|
|
63
70
|
| **Integrate** | PR open; tests passing |
|
|
64
71
|
| **Sustain** | Ongoing; no active task |
|
|
65
72
|
|
|
73
|
+
Prefer `specs/state.yaml` `active_flow` and `handoff.next_skill` when present.
|
|
74
|
+
|
|
66
75
|
### 6. Suggest next skill
|
|
67
76
|
|
|
68
77
|
Based on the phase and state, recommend the most useful next step:
|
|
69
78
|
|
|
70
79
|
- **If in Plan/Bug phase and on `main`**: Suggest `kickoff-branch` next.
|
|
71
|
-
- **If in Initiate phase**: Suggest `develop-tdd` or `execute-plan`.
|
|
72
|
-
- **If in Execute phase**: Suggest `
|
|
73
|
-
- **If in Verify phase**: Suggest `verify-work` (UAT) or `run-evals
|
|
80
|
+
- **If in Initiate phase**: Suggest `develop-tdd` or `execute-plan` or `ship-epic`.
|
|
81
|
+
- **If in Execute phase**: Suggest `ship-epic` (resume) or `develop-tdd` for `active_story_id`.
|
|
82
|
+
- **If in Verify phase**: Suggest `verify-work` (UAT) or `run-evals`.
|
|
74
83
|
|
|
75
84
|
Example:
|
|
76
85
|
```
|
|
77
|
-
Phase:
|
|
78
|
-
Active branch:
|
|
79
|
-
|
|
86
|
+
Phase: Execute
|
|
87
|
+
Active branch: feat/e02-verify (state.yaml matches)
|
|
88
|
+
release-plan.yaml: v3.0.0, 10 epics
|
|
89
|
+
active_epic_id: e02
|
|
80
90
|
|
|
81
|
-
Suggested next:
|
|
91
|
+
Suggested next: ship-epic (resume e02s01 at develop-tdd)
|
|
82
92
|
```
|
|
83
93
|
|
|
84
94
|
Be specific — name the exact skill and why. If multiple options exist, list them in priority order.
|
|
@@ -87,8 +97,9 @@ Be specific — name the exact skill and why. If multiple options exist, list th
|
|
|
87
97
|
|
|
88
98
|
If something looks wrong:
|
|
89
99
|
- Broken tests in the baseline
|
|
90
|
-
- `specs/bugs/BUG-*.md`
|
|
91
|
-
-
|
|
92
|
-
-
|
|
100
|
+
- Open `specs/bugs/BUG-*.md` with no active fix branch
|
|
101
|
+
- Epic shards missing `verify:` on tasks
|
|
102
|
+
- `validate-specs-yaml.sh` fails
|
|
103
|
+
- Git hash in `state.yaml` stale vs `git rev-parse`
|
|
93
104
|
|
|
94
105
|
Report blockers first, before recommendations.
|
|
@@ -1,28 +1,28 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: trace-requirement
|
|
3
3
|
model: haiku
|
|
4
|
-
description: Link story IDs from specs/
|
|
4
|
+
description: Link story IDs from specs/release-plan.yaml + epic shards to the implementing code and tests. Produces specs/TRACEABILITY.md. Use when you want to verify coverage of a release plan, audit which stories are implemented, or find "dark" stories with no code.
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Trace Requirement
|
|
8
8
|
|
|
9
|
-
Build a traceability matrix from `specs/
|
|
9
|
+
Build a traceability matrix from `specs/release-plan.yaml + epic shards` to implementing code and tests. Surfaces gaps in both directions: stories with no code, and code with no story.
|
|
10
10
|
|
|
11
11
|
## Pre-flight
|
|
12
12
|
|
|
13
|
-
> **HARD GATE** — `specs/
|
|
13
|
+
> **HARD GATE** — `specs/release-plan.yaml + epic shards` must exist. If it doesn't, run `plan-release` first.
|
|
14
14
|
|
|
15
|
-
→ verify: `[ -f specs/
|
|
15
|
+
→ verify: `[ -f specs/release-plan.yaml + epic shards ] && echo "ready" || echo "BLOCKED: run plan-release first"`
|
|
16
16
|
|
|
17
|
-
Read `specs/
|
|
17
|
+
Read `specs/release-plan.yaml + epic shards` fully before proceeding.
|
|
18
18
|
|
|
19
19
|
## Process
|
|
20
20
|
|
|
21
21
|
### 1. Extract story IDs
|
|
22
22
|
|
|
23
|
-
From
|
|
23
|
+
From release-plan.yaml, collect all story IDs (e.g. `1.1`, `1.2`, `2.1`).
|
|
24
24
|
|
|
25
|
-
→ verify: `grep -o "Story [0-9]\+\.[0-9]\+" specs/
|
|
25
|
+
→ verify: `grep -o "Story [0-9]\+\.[0-9]\+" specs/release-plan.yaml + epic shards | sort -u`
|
|
26
26
|
|
|
27
27
|
### 2. Search for story tags in code
|
|
28
28
|
|
|
@@ -41,7 +41,7 @@ For each story ID:
|
|
|
41
41
|
- **Tested**: list test files that contain `// story: X.Y`
|
|
42
42
|
- **Dark**: story has no tag in any file — flag as unimplemented
|
|
43
43
|
|
|
44
|
-
For each tagged file with no matching story ID in
|
|
44
|
+
For each tagged file with no matching story ID in release-plan.yaml:
|
|
45
45
|
- **Orphan**: code exists but story was removed or never planned — flag for cleanup
|
|
46
46
|
|
|
47
47
|
### 4. Write specs/TRACEABILITY.md
|
package/using-bigpowers/SKILL.md
CHANGED
|
@@ -6,7 +6,7 @@ description: One-time bootstrap that introduces the bigpowers skills system, the
|
|
|
6
6
|
|
|
7
7
|
# Using bigpowers
|
|
8
8
|
|
|
9
|
-
Welcome to **bigpowers** — a lifecycle of **
|
|
9
|
+
Welcome to **bigpowers** — a lifecycle of **61** agent skills for production-ready, TDD-driven software by solo developers.
|
|
10
10
|
|
|
11
11
|
## Install
|
|
12
12
|
|
|
@@ -78,23 +78,24 @@ If you work alone and do not want PR ceremony every task:
|
|
|
78
78
|
|
|
79
79
|
You still use worktrees, protected `main`, and verification gates — only the integrate step changes.
|
|
80
80
|
|
|
81
|
-
##
|
|
81
|
+
## YAML cockpit and dashboard
|
|
82
82
|
|
|
83
|
-
|
|
83
|
+
Operational source of truth:
|
|
84
84
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
85
|
+
- `specs/state.yaml` — session, active epic/story, handoff
|
|
86
|
+
- `specs/release-plan.yaml` — release index and epic list
|
|
87
|
+
- `specs/epics/eNN-*.yaml` — stories and tasks with `verify`
|
|
88
|
+
- `specs/execution-status.yaml` — done/pending per story
|
|
88
89
|
|
|
89
|
-
|
|
90
|
+
Start the HTTP dashboard with `visual-dashboard` → `GET /api/status?projectDir=<abs>` and `GET /cockpit.html` for a read-only PM view.
|
|
90
91
|
|
|
91
92
|
## Key conventions
|
|
92
93
|
|
|
93
94
|
- **specs/ is your memory.** All domain docs, plans, and investigation outputs go in `specs/` at your project root.
|
|
94
95
|
- **Integrate:** team default is `gh pr` (team-pr); solo profile uses `land-branch.sh`. Never create GitHub issues from skills — use local Markdown files instead.
|
|
95
96
|
- **One skill, one thing.** If you're unsure which skill to call, call `survey-context` — it reads your current state and recommends the next step.
|
|
96
|
-
- **verify: every step.** Every task
|
|
97
|
-
- **
|
|
97
|
+
- **verify: every step.** Every epic task must have `verify: <runnable command>`. Evidence over claims.
|
|
98
|
+
- **61 skills.** See `SKILL-INDEX.md`; find skills with `search-skills`.
|
|
98
99
|
|
|
99
100
|
## After this
|
|
100
101
|
|
package/validate-fix/SKILL.md
CHANGED
|
@@ -59,7 +59,7 @@ For every bug fixed, add at least one prevention layer:
|
|
|
59
59
|
- [ ] At least one hardening mechanism added
|
|
60
60
|
- [ ] Hardening mechanism is tested
|
|
61
61
|
|
|
62
|
-
### 6. Update the bug file and
|
|
62
|
+
### 6. Update the bug file and registry.yaml
|
|
63
63
|
|
|
64
64
|
Find the most recent `specs/bugs/BUG-*.md` file and append the resolution:
|
|
65
65
|
|
|
@@ -74,10 +74,10 @@ Find the most recent `specs/bugs/BUG-*.md` file and append the resolution:
|
|
|
74
74
|
**Commit:** `fix(<scope>): <description>`
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
-
Also update the corresponding row in `specs/bugs/
|
|
77
|
+
Also update the corresponding row in `specs/bugs/registry.yaml`: set `status` to `fixed`, fill in `files_changed`, `approach`, `risk_level`, `commit_message`, and any other resolution fields.
|
|
78
78
|
|
|
79
79
|
- [ ] specs/bugs/BUG-*.md updated with resolution
|
|
80
|
-
- [ ] specs/bugs/
|
|
80
|
+
- [ ] specs/bugs/registry.yaml row updated with resolution fields
|
|
81
81
|
|
|
82
82
|
### 7. Behavioral Proof (HARD GATE)
|
|
83
83
|
|
package/verify-work/SKILL.md
CHANGED
|
@@ -1,39 +1,34 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: verify-work
|
|
3
|
-
description: Multi-phase UAT gate — cold-start smoke, build, typecheck, lint, tests, step-by-step manual verification, gaps-closure loop. Use after execute-plan or develop-tdd, before audit-code
|
|
3
|
+
description: Multi-phase UAT gate — cold-start smoke, build, typecheck, lint, tests, step-by-step manual verification, gaps-closure loop. Use after execute-plan or develop-tdd, before audit-code.
|
|
4
4
|
model: haiku
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Verify Work
|
|
8
8
|
|
|
9
|
-
> **HARD GATE** — No story is "done" until
|
|
10
|
-
|
|
11
|
-
> **HARD GATE** — Do NOT run
|
|
9
|
+
> **HARD GATE** — No story is "done" until manual UAT for the active story is confirmed with evidence.
|
|
10
|
+
>
|
|
11
|
+
> **HARD GATE** — Do NOT run on `main` or `master`. Use the feature branch from `kickoff-branch`.
|
|
12
12
|
|
|
13
13
|
Review answers "is the code good?"; Verify answers "does the built thing do what was promised?"
|
|
14
14
|
|
|
15
15
|
## Process
|
|
16
16
|
|
|
17
|
-
0. **Branch check**
|
|
18
|
-
|
|
19
|
-
```bash
|
|
20
|
-
BRANCH=$(git rev-parse --abbrev-ref HEAD)
|
|
21
|
-
# Must not be main or master — run kickoff-branch first
|
|
22
|
-
```
|
|
17
|
+
0. **Branch check** — must not be `main`/`master`.
|
|
23
18
|
|
|
24
|
-
1. Read
|
|
19
|
+
1. Read active story tasks and any **Verification Script** notes in `specs/epics/{active}.yaml` or story `.md` under `specs/epics/eNN/stories/`.
|
|
25
20
|
2. **Cold-start smoke** (if app): stop server, clear caches, boot from scratch.
|
|
26
|
-
3.
|
|
27
|
-
4. **Step-by-step UAT
|
|
28
|
-
5. **Gaps loop
|
|
21
|
+
3. Mechanical gates: build → typecheck → lint → tests (from `CLAUDE.md`).
|
|
22
|
+
4. **Step-by-step UAT** — one user-observable action at a time.
|
|
23
|
+
5. **Gaps loop** — failures → log → `plan-work` → re-verify.
|
|
29
24
|
|
|
30
25
|
## UAT dialogue
|
|
31
26
|
|
|
32
|
-
- Pass: user confirms
|
|
33
|
-
- Fail: capture expected vs actual; do not mark
|
|
27
|
+
- Pass: user confirms per step.
|
|
28
|
+
- Fail: capture expected vs actual; do not mark done in `execution-status.yaml`.
|
|
34
29
|
|
|
35
30
|
## Verify
|
|
36
31
|
|
|
37
|
-
→ verify: `grep -c
|
|
32
|
+
→ verify: `grep -c 'verify:' specs/epics/*.yaml | awk '{if($1>0) print "OK"; else print "MISSING"}'`
|
|
38
33
|
|
|
39
34
|
See [REFERENCE.md](REFERENCE.md) for cold-start and gaps template.
|