bigpowers 2.48.0 → 2.50.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/.pi/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.48.0",
3
+ "version": "2.50.0",
4
4
  "description": "72 skills — 72 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "keywords": [
6
6
  "pi-package"
@@ -9,19 +9,20 @@ description: Benchmark-gated skill evolution — consume bigpowers-benchmark rep
9
9
 
10
10
  ## Loop
11
11
 
12
- 1. **Establish baseline** — Run `run-benchmark <skill> --baseline`. If no definition exists at `specs/benchmarks/<skill>.yaml`, create one following `specs/benchmarks/SCHEMA.md` first. Save report path in `state.yaml`. If `specs/benchmarks/reports/BASELINE-<skill>.yaml` already exists, skip this step.
12
+ 1. **Regression gate** — Run `bash scripts/run-golden-suite.sh` to catch mechanical regressions (compliance, sync pipeline, size budget) before spending time on benchmark evals. If golden suite fails, fix regressions first — they are pre-requisites for any capability improvement.
13
+ 2. **Establish baseline** — Run `run-benchmark <skill> --baseline`. If no definition exists at `specs/benchmarks/<skill>.yaml`, create one following `specs/benchmarks/SCHEMA.md` first. Save report path in `state.yaml`. If `specs/benchmarks/reports/BASELINE-<skill>.yaml` already exists, skip this step.
13
14
 
14
- 2. **Identify gap** — Read the baseline report (`specs/benchmarks/reports/BASELINE-<skill>.yaml`). Find scenarios with `result: FAIL` or low `pass_at_k`. This is the measurable gap.
15
+ 3. **Identify gap** — Read the baseline report (`specs/benchmarks/reports/BASELINE-<skill>.yaml`). Find scenarios with `result: FAIL` or low `pass_at_k`. This is the measurable gap.
15
16
 
16
- 3. **`plan-work`** — Write a minimal change proposal targeting the failing scenarios. Include verify commands.
17
+ 4. **`plan-work`** — Write a minimal change proposal targeting the failing scenarios. Include verify commands.
17
18
 
18
- 4. **Edit** via `craft-skill` / direct SKILL.md edit; run `bash scripts/sync-skills.sh`.
19
+ 5. **Edit** via `craft-skill` / direct SKILL.md edit; run `bash scripts/sync-skills.sh`.
19
20
 
20
- 5. **Re-run benchmark** — `run-benchmark <skill>`. Compare new `pass_at_k` against baseline.
21
+ 6. **Re-run benchmark** — `run-benchmark <skill>`. Compare new `pass_at_k` against baseline.
21
22
  - **IMPROVED or STABLE** → advance to step 6.
22
23
  - **REGRESSION** (`new pass_at_k < baseline`) → revert the change and loop back to step 3.
23
24
 
24
- 6. **Record decision** — Write `specs/adr/NNNN-evolve-<skill>.md` with before/after `pass_at_k` scores. Update `session-state`.
25
+ 7. **Record decision** — Write `specs/adr/NNNN-evolve-<skill>.md` with before/after `pass_at_k` scores. Update `session-state`.
25
26
 
26
27
  ## Verify
27
28
 
@@ -11,19 +11,20 @@ model: opus
11
11
 
12
12
  ## Loop
13
13
 
14
- 1. **Establish baseline** — Run `run-benchmark <skill> --baseline`. If no definition exists at `specs/benchmarks/<skill>.yaml`, create one following `specs/benchmarks/SCHEMA.md` first. Save report path in `state.yaml`. If `specs/benchmarks/reports/BASELINE-<skill>.yaml` already exists, skip this step.
14
+ 1. **Regression gate** — Run `bash scripts/run-golden-suite.sh` to catch mechanical regressions (compliance, sync pipeline, size budget) before spending time on benchmark evals. If golden suite fails, fix regressions first — they are pre-requisites for any capability improvement.
15
+ 2. **Establish baseline** — Run `run-benchmark <skill> --baseline`. If no definition exists at `specs/benchmarks/<skill>.yaml`, create one following `specs/benchmarks/SCHEMA.md` first. Save report path in `state.yaml`. If `specs/benchmarks/reports/BASELINE-<skill>.yaml` already exists, skip this step.
15
16
 
16
- 2. **Identify gap** — Read the baseline report (`specs/benchmarks/reports/BASELINE-<skill>.yaml`). Find scenarios with `result: FAIL` or low `pass_at_k`. This is the measurable gap.
17
+ 3. **Identify gap** — Read the baseline report (`specs/benchmarks/reports/BASELINE-<skill>.yaml`). Find scenarios with `result: FAIL` or low `pass_at_k`. This is the measurable gap.
17
18
 
18
- 3. **`plan-work`** — Write a minimal change proposal targeting the failing scenarios. Include verify commands.
19
+ 4. **`plan-work`** — Write a minimal change proposal targeting the failing scenarios. Include verify commands.
19
20
 
20
- 4. **Edit** via `craft-skill` / direct SKILL.md edit; run `bash scripts/sync-skills.sh`.
21
+ 5. **Edit** via `craft-skill` / direct SKILL.md edit; run `bash scripts/sync-skills.sh`.
21
22
 
22
- 5. **Re-run benchmark** — `run-benchmark <skill>`. Compare new `pass_at_k` against baseline.
23
+ 6. **Re-run benchmark** — `run-benchmark <skill>`. Compare new `pass_at_k` against baseline.
23
24
  - **IMPROVED or STABLE** → advance to step 6.
24
25
  - **REGRESSION** (`new pass_at_k < baseline`) → revert the change and loop back to step 3.
25
26
 
26
- 6. **Record decision** — Write `specs/adr/NNNN-evolve-<skill>.md` with before/after `pass_at_k` scores. Update `session-state`.
27
+ 7. **Record decision** — Write `specs/adr/NNNN-evolve-<skill>.md` with before/after `pass_at_k` scores. Update `session-state`.
27
28
 
28
29
  ## Verify
29
30
 
package/CHANGELOG.md CHANGED
@@ -1,3 +1,17 @@
1
+ # [2.50.0](https://github.com/danielvm-git/bigpowers/compare/v2.49.0...v2.50.0) (2026-07-03)
2
+
3
+
4
+ ### Features
5
+
6
+ * **e31:** size budget, pre-merge mandate, evolve-skill integration ([#46](https://github.com/danielvm-git/bigpowers/issues/46)) ([fa1dd52](https://github.com/danielvm-git/bigpowers/commit/fa1dd52276d0b6476b892f6fd6eed77eac7c5d41))
7
+
8
+ # [2.49.0](https://github.com/danielvm-git/bigpowers/compare/v2.48.0...v2.49.0) (2026-07-03)
9
+
10
+
11
+ ### Features
12
+
13
+ * **e31:** golden suite runner — deterministic gate orchestrator ([#45](https://github.com/danielvm-git/bigpowers/issues/45)) ([e59ad3d](https://github.com/danielvm-git/bigpowers/commit/e59ad3d2d467c82bb9bf7517b8f07b897d7deb4b))
14
+
1
15
  # [2.48.0](https://github.com/danielvm-git/bigpowers/compare/v2.47.0...v2.48.0) (2026-07-03)
2
16
 
3
17
 
package/CLAUDE.md CHANGED
@@ -20,6 +20,17 @@ Stack: Markdown / Bash (documentation-based; skills integrate with Claude Code,
20
20
  | Typecheck | N/A (Markdown / Bash project) |
21
21
  | CI platform | GitHub Actions (`.github/workflows/publish.yml`, `sync-skills.yml`) |
22
22
  | Compliance | `npm run compliance` |
23
+ | Golden Suite | `bash scripts/run-golden-suite.sh` |
24
+
25
+ ### Pre-Merge Checklist
26
+
27
+ Before opening a PR or landing a branch, run:
28
+
29
+ ```bash
30
+ npm run compliance && bash scripts/run-golden-suite.sh
31
+ ```
32
+
33
+ If any gate fails, fix before merging. Run `--baseline` after any intentional increase in skill count or structure.
23
34
 
24
35
  ## Architecture
25
36
 
package/CONVENTIONS.md CHANGED
@@ -28,6 +28,17 @@ All changes to this repository MUST follow the [Conventional Commits 1.0.0](http
28
28
  - Never call GitHub REST API directly (curl, fetch, etc.)
29
29
  - Never create GitHub issues from automated workflows — produce local .md files in specs/ instead
30
30
 
31
+ ### Pre-Merge Golden Gate
32
+
33
+ Before merging any branch, run the deterministic golden suite:
34
+
35
+ ```bash
36
+ bash scripts/run-golden-suite.sh
37
+ ```
38
+
39
+ This runs compliance → G-04 self-test. If any gate fails, the merge is blocked.
40
+ Pin a fresh baseline with `--baseline` after major structure changes.
41
+
31
42
  ## Agent Workflow Mandates
32
43
 
33
44
  **AGENTS MUST NEVER BYPASS THE BIGPOWERS WORKFLOW.**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "bigpowers",
3
- "version": "2.48.0",
3
+ "version": "2.50.0",
4
4
  "description": "72 agent skills synthesizing 17 years of software engineering discipline into a prescriptive methodology for solo developers",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -0,0 +1,244 @@
1
+ #!/usr/bin/env bash
2
+ # run-golden-suite.sh — Deterministic golden suite runner
3
+ #
4
+ # Runs compliance → G-04 self-test in order, captures results,
5
+ # writes timestamped YAML report. Supports --dry-run and --baseline.
6
+ #
7
+ # Usage:
8
+ # bash scripts/run-golden-suite.sh # run all gates
9
+ # bash scripts/run-golden-suite.sh --dry-run # print plan only
10
+ # bash scripts/run-golden-suite.sh --baseline # run + pin baseline
11
+
12
+ set -euo pipefail
13
+
14
+ REPORT_DIR="specs/benchmarks/reports"
15
+ BASELINE_FILE="$REPORT_DIR/BASELINE-GOLDEN.yaml"
16
+ DRY_RUN=false
17
+ BASELINE_MODE=false
18
+ CHECK_SIZE=false
19
+
20
+ for arg in "$@"; do
21
+ case "$arg" in
22
+ --dry-run) DRY_RUN=true ;;
23
+ --baseline) BASELINE_MODE=true ;;
24
+ --check-size) CHECK_SIZE=true ;;
25
+ *) echo "Unknown flag: $arg"; echo "Usage: run-golden-suite.sh [--dry-run] [--baseline] [--check-size]"; exit 2 ;;
26
+ esac
27
+ done
28
+
29
+ # ── Gate definitions ──────────────────────────────────────────────────
30
+ # Each gate: name, command, optional: true (won't fail suite if missing)
31
+ GATES=(
32
+ "compliance:npm run compliance:false"
33
+ "g04-selftest:bash scripts/golden-g04-selftest.sh:true"
34
+ )
35
+
36
+ GREEN='\033[0;32m'
37
+ RED='\033[0;31m'
38
+ YELLOW='\033[0;33m'
39
+ NC='\033[0m'
40
+
41
+ # ── Dry run ───────────────────────────────────────────────────────────
42
+
43
+ if $DRY_RUN; then
44
+ echo "Golden Suite — DRY RUN"
45
+ echo "Gates (in order):"
46
+ for gate in "${GATES[@]}"; do
47
+ IFS=':' read -r name cmd optional <<< "$gate"
48
+ echo " - $name: $cmd"
49
+ done
50
+ echo "Report: $REPORT_DIR/GOLDEN-YYYY-MM-DD.yaml"
51
+ echo "OK (dry run)"
52
+ exit 0
53
+ fi
54
+
55
+ # ── Setup ─────────────────────────────────────────────────────────────
56
+
57
+ mkdir -p "$REPORT_DIR"
58
+
59
+ TODAY=$(date +%Y-%m-%d)
60
+ TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
61
+ GIT_COMMIT=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
62
+
63
+ if $BASELINE_MODE; then
64
+ REPORT_FILE="$BASELINE_FILE"
65
+ else
66
+ REPORT_FILE="$REPORT_DIR/GOLDEN-${TODAY}.yaml"
67
+ fi
68
+
69
+ # ── Run gates ─────────────────────────────────────────────────────────
70
+
71
+ PASS_COUNT=0
72
+ FAIL_COUNT=0
73
+ SKIP_COUNT=0
74
+ GATE_RESULTS=()
75
+
76
+ for gate in "${GATES[@]}"; do
77
+ IFS=':' read -r name cmd is_optional <<< "$gate"
78
+
79
+ echo -n "[$name] "
80
+
81
+ # Check if command exists (for scripts)
82
+ main_cmd=$(echo "$cmd" | awk '{print $1}')
83
+ if [[ "$main_cmd" == "bash" ]]; then
84
+ script_path=$(echo "$cmd" | awk '{print $2}')
85
+ if [[ ! -f "$script_path" ]]; then
86
+ if [[ "$is_optional" == "true" ]]; then
87
+ echo -e "${YELLOW}SKIP${NC} (script not yet implemented)"
88
+ GATE_RESULTS+=(" - name: $name")
89
+ GATE_RESULTS+=(" exit_code: skipped")
90
+ GATE_RESULTS+=(" duration_seconds: 0")
91
+ GATE_RESULTS+=(" status: skipped")
92
+ GATE_RESULTS+=(" note: script not found: $script_path")
93
+ (( SKIP_COUNT += 1 ))
94
+ continue
95
+ else
96
+ echo -e "${RED}FAIL${NC} (script not found: $script_path)"
97
+ GATE_RESULTS+=(" - name: $name")
98
+ GATE_RESULTS+=(" exit_code: 127")
99
+ GATE_RESULTS+=(" duration_seconds: 0")
100
+ GATE_RESULTS+=(" status: fail")
101
+ GATE_RESULTS+=(" error: script not found: $script_path")
102
+ (( FAIL_COUNT += 1 ))
103
+ continue
104
+ fi
105
+ fi
106
+ fi
107
+
108
+ # Run the gate and capture output
109
+ START_TIME=$(date +%s%N)
110
+ GATE_OUTPUT=$(eval "$cmd" 2>&1) && GATE_EXIT=$? || GATE_EXIT=$?
111
+ END_TIME=$(date +%s%N)
112
+ DURATION_MS=$(( (END_TIME - START_TIME) / 1000000 ))
113
+ DURATION_SEC=$(echo "scale=2; $DURATION_MS / 1000" | bc 2>/dev/null || echo "0")
114
+
115
+ if [[ "$GATE_EXIT" -eq 0 ]]; then
116
+ echo -e "${GREEN}PASS${NC} (${DURATION_SEC}s)"
117
+ GATE_RESULTS+=(" - name: $name")
118
+ GATE_RESULTS+=(" exit_code: 0")
119
+ GATE_RESULTS+=(" duration_seconds: $DURATION_SEC")
120
+ GATE_RESULTS+=(" status: pass")
121
+ (( PASS_COUNT += 1 ))
122
+ else
123
+ echo -e "${RED}FAIL${NC} (${DURATION_SEC}s, exit $GATE_EXIT)"
124
+ GATE_RESULTS+=(" - name: $name")
125
+ GATE_RESULTS+=(" exit_code: $GATE_EXIT")
126
+ GATE_RESULTS+=(" duration_seconds: $DURATION_SEC")
127
+ GATE_RESULTS+=(" status: fail")
128
+ (( FAIL_COUNT += 1 ))
129
+ fi
130
+ done
131
+
132
+ # ── Summary ───────────────────────────────────────────────────────────
133
+
134
+ TOTAL=$((PASS_COUNT + FAIL_COUNT + SKIP_COUNT))
135
+ if [[ "$FAIL_COUNT" -gt 0 ]]; then
136
+ OVERALL="fail"
137
+ else
138
+ OVERALL="pass"
139
+ fi
140
+
141
+ echo ""
142
+ echo "──────────────────────────────────────────"
143
+ echo -e "Suite: ${PASS_COUNT}/${TOTAL} passed"
144
+ if [[ "$SKIP_COUNT" -gt 0 ]]; then
145
+ echo -e " ${SKIP_COUNT} skipped (scripts not yet implemented)"
146
+ fi
147
+ echo -e "Overall: ${OVERALL}"
148
+ echo "Report: $REPORT_FILE"
149
+ echo "──────────────────────────────────────────"
150
+
151
+ # ── Write report ──────────────────────────────────────────────────────
152
+
153
+ PASS_RATE=$(echo "scale=2; $PASS_COUNT / $TOTAL" | bc 2>/dev/null || echo "0")
154
+
155
+ cat > "$REPORT_FILE" << YAML_EOF
156
+ timestamp: "$TIMESTAMP"
157
+ git_commit: "$GIT_COMMIT"
158
+ suite: "golden-deterministic"
159
+ mode: "$([ "$BASELINE_MODE" = true ] && echo 'baseline' || echo 'daily')"
160
+ gates:
161
+ $(printf '%s\n' "${GATE_RESULTS[@]}")
162
+ summary:
163
+ total: $TOTAL
164
+ passed: $PASS_COUNT
165
+ failed: $FAIL_COUNT
166
+ skipped: $SKIP_COUNT
167
+ pass_rate: $PASS_RATE
168
+ overall: "$OVERALL"
169
+ YAML_EOF
170
+
171
+ # ── Size budget (placeholder for e31s04) ──────────────────────────────
172
+
173
+ if $BASELINE_MODE; then
174
+ echo "" >> "$REPORT_FILE"
175
+ echo "# Skill byte counts (baseline for e31s04 size budget)" >> "$REPORT_FILE"
176
+ echo "skill_sizes:" >> "$REPORT_FILE"
177
+ for skill_md in skills/*/SKILL.md; do
178
+ skill_name=$(basename "$(dirname "$skill_md")")
179
+ skill_bytes=$(wc -c < "$skill_md" | tr -d ' ')
180
+ echo " $skill_name: $skill_bytes" >> "$REPORT_FILE"
181
+ done
182
+ echo "Baseline pinned: $REPORT_FILE"
183
+ fi
184
+
185
+ # ── Size budget check (e31s04) ───────────────────────────────────────
186
+
187
+ if $CHECK_SIZE; then
188
+ WARN_THRESHOLD=20
189
+ FAIL_THRESHOLD=50
190
+
191
+ if [[ ! -f "$BASELINE_FILE" ]]; then
192
+ echo "No baseline found. Run --baseline first."
193
+ exit 1
194
+ fi
195
+
196
+ echo ""
197
+ echo "Size Budget Check (+${WARN_THRESHOLD}% warn, +${FAIL_THRESHOLD}% fail):"
198
+ SIZE_WARNINGS=0
199
+ SIZE_FAILURES=0
200
+ NEW_SKILLS=0
201
+
202
+ for skill_md in skills/*/SKILL.md; do
203
+ skill_name=$(basename "$(dirname "$skill_md")")
204
+ current_bytes=$(wc -c < "$skill_md" | tr -d ' ')
205
+
206
+ # Get baseline size (best-effort grep from YAML)
207
+ baseline_bytes=$(grep "^ $skill_name:" "$BASELINE_FILE" 2>/dev/null | awk '{print $2}')
208
+
209
+ if [[ -z "$baseline_bytes" ]]; then
210
+ echo " ${YELLOW}NEW${NC} $skill_name: ${current_bytes}b (not in baseline)"
211
+ (( NEW_SKILLS += 1 )) || true
212
+ continue
213
+ fi
214
+
215
+ if [[ "$baseline_bytes" -eq 0 ]]; then
216
+ baseline_bytes=1 # avoid division by zero
217
+ fi
218
+
219
+ pct=$(( (current_bytes - baseline_bytes) * 100 / baseline_bytes ))
220
+
221
+ if [[ "$pct" -ge "$FAIL_THRESHOLD" ]]; then
222
+ echo " ${RED}FAIL${NC} $skill_name: ${current_bytes}b (+${pct}%)"
223
+ (( SIZE_FAILURES += 1 )) || true
224
+ elif [[ "$pct" -ge "$WARN_THRESHOLD" ]]; then
225
+ echo " ${YELLOW}WARN${NC} $skill_name: ${current_bytes}b (+${pct}%)"
226
+ (( SIZE_WARNINGS += 1 )) || true
227
+ else
228
+ echo " ${GREEN}OK${NC} $skill_name: ${current_bytes}b"
229
+ fi
230
+ done
231
+
232
+ echo ""
233
+ echo "Size summary: $SIZE_WARNINGS warnings, $SIZE_FAILURES failures, $NEW_SKILLS new"
234
+
235
+ if [[ "$SIZE_FAILURES" -gt 0 ]]; then
236
+ exit 1
237
+ fi
238
+ exit 0
239
+ fi
240
+
241
+ if [[ "$OVERALL" == "fail" ]]; then
242
+ exit 1
243
+ fi
244
+ exit 0
@@ -10,19 +10,20 @@ model: opus
10
10
 
11
11
  ## Loop
12
12
 
13
- 1. **Establish baseline** — Run `run-benchmark <skill> --baseline`. If no definition exists at `specs/benchmarks/<skill>.yaml`, create one following `specs/benchmarks/SCHEMA.md` first. Save report path in `state.yaml`. If `specs/benchmarks/reports/BASELINE-<skill>.yaml` already exists, skip this step.
13
+ 1. **Regression gate** — Run `bash scripts/run-golden-suite.sh` to catch mechanical regressions (compliance, sync pipeline, size budget) before spending time on benchmark evals. If golden suite fails, fix regressions first — they are pre-requisites for any capability improvement.
14
+ 2. **Establish baseline** — Run `run-benchmark <skill> --baseline`. If no definition exists at `specs/benchmarks/<skill>.yaml`, create one following `specs/benchmarks/SCHEMA.md` first. Save report path in `state.yaml`. If `specs/benchmarks/reports/BASELINE-<skill>.yaml` already exists, skip this step.
14
15
 
15
- 2. **Identify gap** — Read the baseline report (`specs/benchmarks/reports/BASELINE-<skill>.yaml`). Find scenarios with `result: FAIL` or low `pass_at_k`. This is the measurable gap.
16
+ 3. **Identify gap** — Read the baseline report (`specs/benchmarks/reports/BASELINE-<skill>.yaml`). Find scenarios with `result: FAIL` or low `pass_at_k`. This is the measurable gap.
16
17
 
17
- 3. **`plan-work`** — Write a minimal change proposal targeting the failing scenarios. Include verify commands.
18
+ 4. **`plan-work`** — Write a minimal change proposal targeting the failing scenarios. Include verify commands.
18
19
 
19
- 4. **Edit** via `craft-skill` / direct SKILL.md edit; run `bash scripts/sync-skills.sh`.
20
+ 5. **Edit** via `craft-skill` / direct SKILL.md edit; run `bash scripts/sync-skills.sh`.
20
21
 
21
- 5. **Re-run benchmark** — `run-benchmark <skill>`. Compare new `pass_at_k` against baseline.
22
+ 6. **Re-run benchmark** — `run-benchmark <skill>`. Compare new `pass_at_k` against baseline.
22
23
  - **IMPROVED or STABLE** → advance to step 6.
23
24
  - **REGRESSION** (`new pass_at_k < baseline`) → revert the change and loop back to step 3.
24
25
 
25
- 6. **Record decision** — Write `specs/adr/NNNN-evolve-<skill>.md` with before/after `pass_at_k` scores. Update `session-state`.
26
+ 7. **Record decision** — Write `specs/adr/NNNN-evolve-<skill>.md` with before/after `pass_at_k` scores. Update `session-state`.
26
27
 
27
28
  ## Verify
28
29
 
package/skills-lock.json CHANGED
@@ -108,7 +108,7 @@
108
108
  },
109
109
  "evolve-skill": {
110
110
  "description": "Benchmark-gated skill evolution — consume bigpowers-benchmark report, propose plan-work change, edit skill via craft-skill, re-run benchmark, record ADR. Use when a skill underperforms on benchmark or stocktake finds systemic gap.",
111
- "sha256": "d507a80d9ca3d328",
111
+ "sha256": "fc60347db8884afd",
112
112
  "path": "skills/evolve-skill/SKILL.md"
113
113
  },
114
114
  "execute-plan": {