bigpowers 2.47.0 → 2.49.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 +1 -1
- package/CHANGELOG.md +19 -0
- package/package.json +1 -1
- package/scripts/golden-g04-selftest.sh +12 -12
- package/scripts/run-golden-suite.sh +186 -0
package/.pi/package.json
CHANGED
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
# [2.49.0](https://github.com/danielvm-git/bigpowers/compare/v2.48.0...v2.49.0) (2026-07-03)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Features
|
|
5
|
+
|
|
6
|
+
* **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))
|
|
7
|
+
|
|
8
|
+
# [2.48.0](https://github.com/danielvm-git/bigpowers/compare/v2.47.0...v2.48.0) (2026-07-03)
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* **e31:** rename pass/fail to g04_pass/g04_fail to avoid symbol collision ([34d0ce8](https://github.com/danielvm-git/bigpowers/commit/34d0ce89c4a26915786bd9b45379e7f2c289cc06))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Features
|
|
17
|
+
|
|
18
|
+
* **e31:** wire npm run compliance as pre-release CI gate ([#44](https://github.com/danielvm-git/bigpowers/issues/44)) ([cd40e33](https://github.com/danielvm-git/bigpowers/commit/cd40e3305a568f429c9221dd9cc360ee7139626d))
|
|
19
|
+
|
|
1
20
|
# [2.47.0](https://github.com/danielvm-git/bigpowers/compare/v2.46.0...v2.47.0) (2026-07-03)
|
|
2
21
|
|
|
3
22
|
|
package/package.json
CHANGED
|
@@ -19,8 +19,8 @@ NC='\033[0m' # No Color
|
|
|
19
19
|
PASS=0
|
|
20
20
|
FAIL=0
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
|
|
22
|
+
g04_pass() { echo -e "${GREEN}PASS${NC} $*"; PASS=$((PASS + 1)); }
|
|
23
|
+
g04_fail() { echo -e "${RED}FAIL${NC} $*"; FAIL=$((FAIL + 1)); }
|
|
24
24
|
|
|
25
25
|
# ── Task 1: Target directory existence ────────────────────────────────
|
|
26
26
|
|
|
@@ -32,9 +32,9 @@ TARGETS=(
|
|
|
32
32
|
|
|
33
33
|
for dir in "${TARGETS[@]}"; do
|
|
34
34
|
if [[ -d "$dir" ]]; then
|
|
35
|
-
|
|
35
|
+
g04_pass "directory exists: $dir"
|
|
36
36
|
else
|
|
37
|
-
|
|
37
|
+
g04_fail "directory not found: $dir"
|
|
38
38
|
fi
|
|
39
39
|
done
|
|
40
40
|
|
|
@@ -51,7 +51,7 @@ check_count() {
|
|
|
51
51
|
local pattern="${3:-*.md}"
|
|
52
52
|
|
|
53
53
|
if [[ ! -d "$dir" ]]; then
|
|
54
|
-
|
|
54
|
+
g04_fail "$label: directory not found (skipping count)"
|
|
55
55
|
return
|
|
56
56
|
fi
|
|
57
57
|
|
|
@@ -65,9 +65,9 @@ check_count() {
|
|
|
65
65
|
fi
|
|
66
66
|
|
|
67
67
|
if [[ "$count" -eq "$EXPECTED" ]]; then
|
|
68
|
-
|
|
68
|
+
g04_pass "$label: $count artifacts (expected $EXPECTED)"
|
|
69
69
|
else
|
|
70
|
-
|
|
70
|
+
g04_fail "$label: expected $EXPECTED artifacts, got $count"
|
|
71
71
|
fi
|
|
72
72
|
}
|
|
73
73
|
|
|
@@ -81,7 +81,7 @@ LOCKFILE="skills-lock.json"
|
|
|
81
81
|
INDEXFILE="SKILL-INDEX.md"
|
|
82
82
|
|
|
83
83
|
if [[ ! -f "$LOCKFILE" ]]; then
|
|
84
|
-
|
|
84
|
+
g04_fail "lockfile not found: $LOCKFILE"
|
|
85
85
|
else
|
|
86
86
|
# Parse lockfile: count top-level keys (skill names)
|
|
87
87
|
if command -v jq &>/dev/null; then
|
|
@@ -99,20 +99,20 @@ else
|
|
|
99
99
|
fi
|
|
100
100
|
|
|
101
101
|
if [[ ! -f "$INDEXFILE" ]]; then
|
|
102
|
-
|
|
102
|
+
g04_fail "index not found: $INDEXFILE"
|
|
103
103
|
else
|
|
104
104
|
# Count skill entries from SKILL-INDEX.md header (e.g., "**Skills:** 72")
|
|
105
105
|
index_count=$(grep '\*\*Skills:\*\*' "$INDEXFILE" 2>/dev/null | sed 's/.*\*\*Skills:\*\*[[:space:]]*//' | grep -oE '[0-9]+') || {
|
|
106
|
-
|
|
106
|
+
g04_fail "index parse error: $INDEXFILE"
|
|
107
107
|
index_count=""
|
|
108
108
|
}
|
|
109
109
|
fi
|
|
110
110
|
|
|
111
111
|
if [[ -n "${lock_count:-}" && -n "${index_count:-}" ]]; then
|
|
112
112
|
if [[ "$lock_count" -eq "$index_count" ]]; then
|
|
113
|
-
|
|
113
|
+
g04_pass "lockfile ($lock_count) matches SKILL-INDEX ($index_count)"
|
|
114
114
|
else
|
|
115
|
-
|
|
115
|
+
g04_fail "lockfile ($lock_count) != SKILL-INDEX ($index_count)"
|
|
116
116
|
fi
|
|
117
117
|
fi
|
|
118
118
|
|
|
@@ -0,0 +1,186 @@
|
|
|
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
|
+
|
|
19
|
+
for arg in "$@"; do
|
|
20
|
+
case "$arg" in
|
|
21
|
+
--dry-run) DRY_RUN=true ;;
|
|
22
|
+
--baseline) BASELINE_MODE=true ;;
|
|
23
|
+
*) echo "Unknown flag: $arg"; echo "Usage: run-golden-suite.sh [--dry-run] [--baseline]"; exit 2 ;;
|
|
24
|
+
esac
|
|
25
|
+
done
|
|
26
|
+
|
|
27
|
+
# ── Gate definitions ──────────────────────────────────────────────────
|
|
28
|
+
# Each gate: name, command, optional: true (won't fail suite if missing)
|
|
29
|
+
GATES=(
|
|
30
|
+
"compliance:npm run compliance:false"
|
|
31
|
+
"g04-selftest:bash scripts/golden-g04-selftest.sh:true"
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
GREEN='\033[0;32m'
|
|
35
|
+
RED='\033[0;31m'
|
|
36
|
+
YELLOW='\033[0;33m'
|
|
37
|
+
NC='\033[0m'
|
|
38
|
+
|
|
39
|
+
# ── Dry run ───────────────────────────────────────────────────────────
|
|
40
|
+
|
|
41
|
+
if $DRY_RUN; then
|
|
42
|
+
echo "Golden Suite — DRY RUN"
|
|
43
|
+
echo "Gates (in order):"
|
|
44
|
+
for gate in "${GATES[@]}"; do
|
|
45
|
+
IFS=':' read -r name cmd optional <<< "$gate"
|
|
46
|
+
echo " - $name: $cmd"
|
|
47
|
+
done
|
|
48
|
+
echo "Report: $REPORT_DIR/GOLDEN-YYYY-MM-DD.yaml"
|
|
49
|
+
echo "OK (dry run)"
|
|
50
|
+
exit 0
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# ── Setup ─────────────────────────────────────────────────────────────
|
|
54
|
+
|
|
55
|
+
mkdir -p "$REPORT_DIR"
|
|
56
|
+
|
|
57
|
+
TODAY=$(date +%Y-%m-%d)
|
|
58
|
+
TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
|
|
59
|
+
GIT_COMMIT=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
|
|
60
|
+
|
|
61
|
+
if $BASELINE_MODE; then
|
|
62
|
+
REPORT_FILE="$BASELINE_FILE"
|
|
63
|
+
else
|
|
64
|
+
REPORT_FILE="$REPORT_DIR/GOLDEN-${TODAY}.yaml"
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
# ── Run gates ─────────────────────────────────────────────────────────
|
|
68
|
+
|
|
69
|
+
PASS_COUNT=0
|
|
70
|
+
FAIL_COUNT=0
|
|
71
|
+
SKIP_COUNT=0
|
|
72
|
+
GATE_RESULTS=()
|
|
73
|
+
|
|
74
|
+
for gate in "${GATES[@]}"; do
|
|
75
|
+
IFS=':' read -r name cmd is_optional <<< "$gate"
|
|
76
|
+
|
|
77
|
+
echo -n "[$name] "
|
|
78
|
+
|
|
79
|
+
# Check if command exists (for scripts)
|
|
80
|
+
main_cmd=$(echo "$cmd" | awk '{print $1}')
|
|
81
|
+
if [[ "$main_cmd" == "bash" ]]; then
|
|
82
|
+
script_path=$(echo "$cmd" | awk '{print $2}')
|
|
83
|
+
if [[ ! -f "$script_path" ]]; then
|
|
84
|
+
if [[ "$is_optional" == "true" ]]; then
|
|
85
|
+
echo -e "${YELLOW}SKIP${NC} (script not yet implemented)"
|
|
86
|
+
GATE_RESULTS+=(" - name: $name")
|
|
87
|
+
GATE_RESULTS+=(" exit_code: skipped")
|
|
88
|
+
GATE_RESULTS+=(" duration_seconds: 0")
|
|
89
|
+
GATE_RESULTS+=(" status: skipped")
|
|
90
|
+
GATE_RESULTS+=(" note: script not found: $script_path")
|
|
91
|
+
(( SKIP_COUNT += 1 ))
|
|
92
|
+
continue
|
|
93
|
+
else
|
|
94
|
+
echo -e "${RED}FAIL${NC} (script not found: $script_path)"
|
|
95
|
+
GATE_RESULTS+=(" - name: $name")
|
|
96
|
+
GATE_RESULTS+=(" exit_code: 127")
|
|
97
|
+
GATE_RESULTS+=(" duration_seconds: 0")
|
|
98
|
+
GATE_RESULTS+=(" status: fail")
|
|
99
|
+
GATE_RESULTS+=(" error: script not found: $script_path")
|
|
100
|
+
(( FAIL_COUNT += 1 ))
|
|
101
|
+
continue
|
|
102
|
+
fi
|
|
103
|
+
fi
|
|
104
|
+
fi
|
|
105
|
+
|
|
106
|
+
# Run the gate and capture output
|
|
107
|
+
START_TIME=$(date +%s%N)
|
|
108
|
+
GATE_OUTPUT=$(eval "$cmd" 2>&1) && GATE_EXIT=$? || GATE_EXIT=$?
|
|
109
|
+
END_TIME=$(date +%s%N)
|
|
110
|
+
DURATION_MS=$(( (END_TIME - START_TIME) / 1000000 ))
|
|
111
|
+
DURATION_SEC=$(echo "scale=2; $DURATION_MS / 1000" | bc 2>/dev/null || echo "0")
|
|
112
|
+
|
|
113
|
+
if [[ "$GATE_EXIT" -eq 0 ]]; then
|
|
114
|
+
echo -e "${GREEN}PASS${NC} (${DURATION_SEC}s)"
|
|
115
|
+
GATE_RESULTS+=(" - name: $name")
|
|
116
|
+
GATE_RESULTS+=(" exit_code: 0")
|
|
117
|
+
GATE_RESULTS+=(" duration_seconds: $DURATION_SEC")
|
|
118
|
+
GATE_RESULTS+=(" status: pass")
|
|
119
|
+
(( PASS_COUNT += 1 ))
|
|
120
|
+
else
|
|
121
|
+
echo -e "${RED}FAIL${NC} (${DURATION_SEC}s, exit $GATE_EXIT)"
|
|
122
|
+
GATE_RESULTS+=(" - name: $name")
|
|
123
|
+
GATE_RESULTS+=(" exit_code: $GATE_EXIT")
|
|
124
|
+
GATE_RESULTS+=(" duration_seconds: $DURATION_SEC")
|
|
125
|
+
GATE_RESULTS+=(" status: fail")
|
|
126
|
+
(( FAIL_COUNT += 1 ))
|
|
127
|
+
fi
|
|
128
|
+
done
|
|
129
|
+
|
|
130
|
+
# ── Summary ───────────────────────────────────────────────────────────
|
|
131
|
+
|
|
132
|
+
TOTAL=$((PASS_COUNT + FAIL_COUNT + SKIP_COUNT))
|
|
133
|
+
if [[ "$FAIL_COUNT" -gt 0 ]]; then
|
|
134
|
+
OVERALL="fail"
|
|
135
|
+
else
|
|
136
|
+
OVERALL="pass"
|
|
137
|
+
fi
|
|
138
|
+
|
|
139
|
+
echo ""
|
|
140
|
+
echo "──────────────────────────────────────────"
|
|
141
|
+
echo -e "Suite: ${PASS_COUNT}/${TOTAL} passed"
|
|
142
|
+
if [[ "$SKIP_COUNT" -gt 0 ]]; then
|
|
143
|
+
echo -e " ${SKIP_COUNT} skipped (scripts not yet implemented)"
|
|
144
|
+
fi
|
|
145
|
+
echo -e "Overall: ${OVERALL}"
|
|
146
|
+
echo "Report: $REPORT_FILE"
|
|
147
|
+
echo "──────────────────────────────────────────"
|
|
148
|
+
|
|
149
|
+
# ── Write report ──────────────────────────────────────────────────────
|
|
150
|
+
|
|
151
|
+
PASS_RATE=$(echo "scale=2; $PASS_COUNT / $TOTAL" | bc 2>/dev/null || echo "0")
|
|
152
|
+
|
|
153
|
+
cat > "$REPORT_FILE" << YAML_EOF
|
|
154
|
+
timestamp: "$TIMESTAMP"
|
|
155
|
+
git_commit: "$GIT_COMMIT"
|
|
156
|
+
suite: "golden-deterministic"
|
|
157
|
+
mode: "$([ "$BASELINE_MODE" = true ] && echo 'baseline' || echo 'daily')"
|
|
158
|
+
gates:
|
|
159
|
+
$(printf '%s\n' "${GATE_RESULTS[@]}")
|
|
160
|
+
summary:
|
|
161
|
+
total: $TOTAL
|
|
162
|
+
passed: $PASS_COUNT
|
|
163
|
+
failed: $FAIL_COUNT
|
|
164
|
+
skipped: $SKIP_COUNT
|
|
165
|
+
pass_rate: $PASS_RATE
|
|
166
|
+
overall: "$OVERALL"
|
|
167
|
+
YAML_EOF
|
|
168
|
+
|
|
169
|
+
# ── Size budget (placeholder for e31s04) ──────────────────────────────
|
|
170
|
+
|
|
171
|
+
if $BASELINE_MODE; then
|
|
172
|
+
echo "" >> "$REPORT_FILE"
|
|
173
|
+
echo "# Skill byte counts (baseline for e31s04 size budget)" >> "$REPORT_FILE"
|
|
174
|
+
echo "skill_sizes:" >> "$REPORT_FILE"
|
|
175
|
+
for skill_md in skills/*/SKILL.md; do
|
|
176
|
+
skill_name=$(basename "$(dirname "$skill_md")")
|
|
177
|
+
skill_bytes=$(wc -c < "$skill_md" | tr -d ' ')
|
|
178
|
+
echo " $skill_name: $skill_bytes" >> "$REPORT_FILE"
|
|
179
|
+
done
|
|
180
|
+
echo "Baseline pinned: $REPORT_FILE"
|
|
181
|
+
fi
|
|
182
|
+
|
|
183
|
+
if [[ "$OVERALL" == "fail" ]]; then
|
|
184
|
+
exit 1
|
|
185
|
+
fi
|
|
186
|
+
exit 0
|