bigpowers 2.73.4 → 2.73.6

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.
@@ -1,492 +1,8 @@
1
1
  #!/usr/bin/env bash
2
2
  # run-golden-suite.sh — Deterministic golden suite runner
3
- #
4
- # Runs compliance → deterministic gates → (optional) agent-driven golden
5
- # stories. Captures results, writes timestamped YAML report.
6
- # Supports --dry-run, --baseline, --check-size, and --agent.
7
- #
8
- # Usage:
9
- # bash scripts/run-golden-suite.sh # deterministic gates only
10
- # bash scripts/run-golden-suite.sh --agent # deterministic + agent stories
11
- # bash scripts/run-golden-suite.sh --agent --dry-run # validate YAMLs only
12
- # bash scripts/run-golden-suite.sh --dry-run # print plan only
13
- # bash scripts/run-golden-suite.sh --baseline # run + pin baseline
14
-
15
3
  set -euo pipefail
16
4
  source "$(dirname "${BASH_SOURCE[0]}")/lib/python-env.sh"
17
-
18
- REPORT_DIR="specs/benchmarks/reports"
19
- BASELINE_FILE="$REPORT_DIR/BASELINE-GOLDEN.yaml"
20
- GOLDEN_DIR="specs/benchmarks/golden"
21
- DRY_RUN=false
22
- BASELINE_MODE=false
23
- CHECK_SIZE=false
24
- AGENT_MODE=false
25
-
26
- for arg in "$@"; do
27
- case "$arg" in
28
- --dry-run) DRY_RUN=true ;;
29
- --baseline) BASELINE_MODE=true ;;
30
- --check-size) CHECK_SIZE=true ;;
31
- --agent) AGENT_MODE=true ;;
32
- *) echo "Unknown flag: $arg"; echo "Usage: run-golden-suite.sh [--agent] [--dry-run] [--baseline] [--check-size]"; exit 2 ;;
33
- esac
34
- done
35
-
36
- # ── Gate definitions ──────────────────────────────────────────────────
37
- # Each gate: name, command, optional: true (won't fail suite if missing)
38
- GATES=(
39
- "compliance:npm run compliance:false"
40
- "g04-selftest:bash scripts/golden-g04-selftest.sh:true"
41
- "g06-migrate-version:bash tests/run-golden-migrate-version.sh:true"
42
- "g07-negative-path:bash scripts/golden-g07-negative-path.sh:false"
43
- "g08-anti-vacuity:bash scripts/golden-g08-anti-vacuity.sh:false"
44
- "g09-yaml-roundtrip:bash scripts/golden-g09-yaml-roundtrip.sh:false"
45
- "g10-trace-anti-vacuity:bash scripts/golden-g10-trace-anti-vacuity.sh:false"
46
- "g11-gitignore-venv:bash scripts/golden-g11-gitignore-venv.sh:false"
47
- "specs-parse:bash scripts/validate-specs-yaml.sh:false"
48
- )
49
-
50
- GREEN='\033[0;32m'
51
- RED='\033[0;31m'
52
- YELLOW='\033[0;33m'
53
- NC='\033[0m'
54
-
55
- # ── Agent mode: gh-aw check ────────────────────────────────────────────
56
-
57
- if $AGENT_MODE; then
58
- if ! command -v gh-aw &>/dev/null && ! command -v gh &>/dev/null; then
59
- echo -e "${YELLOW}WARNING: gh-aw not installed — agent gate skipped${NC}" >&2
60
- AGENT_MODE=false # degrade gracefully per 6b
61
- fi
62
- fi
63
-
64
- # ── Agent dry-run: validate YAMLs ──────────────────────────────────────
65
-
66
- agent_dry_run() {
67
- local yaml_count=0
68
- local yaml_ok=0
69
- local yaml_fail=0
70
-
71
- echo "Agent Golden Stories — DRY RUN"
72
- echo "Golden YAML directory: $GOLDEN_DIR"
73
-
74
- if [[ ! -d "$GOLDEN_DIR" ]]; then
75
- echo -e "${YELLOW}WARN: $GOLDEN_DIR not found${NC}"
76
- return 0
77
- fi
78
-
79
- for yaml_file in "$GOLDEN_DIR"/g-*.yaml; do
80
- [[ -f "$yaml_file" ]] || continue
81
- (( yaml_count += 1 ))
82
- story_id=$(basename "$yaml_file" .yaml)
83
-
84
- if $PYTHON -c "import yaml; yaml.safe_load(open('$yaml_file'))" 2>/dev/null; then
85
- local grader_type=$($PYTHON -c "import yaml; d=yaml.safe_load(open('$yaml_file')); print(d.get('grader',{}).get('type',''))" 2>/dev/null)
86
- local pass_k=$($PYTHON -c "import yaml; d=yaml.safe_load(open('$yaml_file')); pk=d.get('pass_at_k',{}); print(f\"{pk.get('k',0)}-of-{pk.get('threshold',0)}\")" 2>/dev/null)
87
- echo -e " ${GREEN}OK${NC} $story_id — grader=$grader_type, pass@k=$pass_k"
88
- (( yaml_ok += 1 ))
89
- else
90
- echo -e " ${RED}FAIL${NC} $story_id — YAML parse error"
91
- (( yaml_fail += 1 ))
92
- fi
93
- done
94
-
95
- echo ""
96
- echo "Agent YAML validation: $yaml_ok/$yaml_count parseable"
97
- if [[ "$yaml_fail" -gt 0 ]]; then
98
- echo -e "${RED}$yaml_fail YAML(s) failed to parse${NC}"
99
- return 1
100
- fi
101
- return 0
102
- }
103
-
104
- # ── Dry run ───────────────────────────────────────────────────────────
105
-
106
- if $DRY_RUN; then
107
- if $AGENT_MODE; then
108
- echo "Golden Suite — DRY RUN (deterministic + agent)"
109
- echo ""
110
- echo "Deterministic gates (in order):"
111
- for gate in "${GATES[@]}"; do
112
- IFS=':' read -r name cmd optional <<< "$gate"
113
- echo " - $name: $cmd"
114
- done
115
- echo ""
116
- agent_dry_run
117
- exit $?
118
- else
119
- echo "Golden Suite — DRY RUN"
120
- echo "Gates (in order):"
121
- for gate in "${GATES[@]}"; do
122
- IFS=':' read -r name cmd optional <<< "$gate"
123
- echo " - $name: $cmd"
124
- done
125
- echo "Report: $REPORT_DIR/GOLDEN-YYYY-MM-DD.yaml"
126
- echo "OK (dry run)"
127
- exit 0
128
- fi
129
- fi
130
-
131
- # ── Setup ─────────────────────────────────────────────────────────────
132
-
133
- mkdir -p "$REPORT_DIR"
134
-
135
- TODAY=$(date +%Y-%m-%d)
136
- TIMESTAMP=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
137
- GIT_COMMIT=$(git rev-parse HEAD 2>/dev/null || echo "unknown")
138
-
139
- if $BASELINE_MODE; then
140
- REPORT_FILE="$BASELINE_FILE"
141
- else
142
- REPORT_FILE="$REPORT_DIR/GOLDEN-${TODAY}.yaml"
143
- fi
144
-
145
- # ── Run deterministic gates ────────────────────────────────────────────
146
- # (Run first — agent stories execute only if these all pass)
147
-
148
- PASS_COUNT=0
149
- FAIL_COUNT=0
150
- SKIP_COUNT=0
151
- GATE_RESULTS=()
152
-
153
- for gate in "${GATES[@]}"; do
154
- IFS=':' read -r name cmd is_optional <<< "$gate"
155
-
156
- echo -n "[$name] "
157
-
158
- # Check if command exists (for scripts)
159
- main_cmd=$(echo "$cmd" | awk '{print $1}')
160
- if [[ "$main_cmd" == "bash" ]]; then
161
- script_path=$(echo "$cmd" | awk '{print $2}')
162
- if [[ ! -f "$script_path" ]]; then
163
- if [[ "$is_optional" == "true" ]]; then
164
- echo -e "${YELLOW}SKIP${NC} (script not yet implemented)"
165
- GATE_RESULTS+=(" - name: $name")
166
- GATE_RESULTS+=(" exit_code: skipped")
167
- GATE_RESULTS+=(" duration_seconds: 0")
168
- GATE_RESULTS+=(" status: skipped")
169
- GATE_RESULTS+=(" note: script not found: $script_path")
170
- (( SKIP_COUNT += 1 ))
171
- continue
172
- else
173
- echo -e "${RED}FAIL${NC} (script not found: $script_path)"
174
- GATE_RESULTS+=(" - name: $name")
175
- GATE_RESULTS+=(" exit_code: 127")
176
- GATE_RESULTS+=(" duration_seconds: 0")
177
- GATE_RESULTS+=(" status: fail")
178
- GATE_RESULTS+=(" error: script not found: $script_path")
179
- (( FAIL_COUNT += 1 ))
180
- continue
181
- fi
182
- fi
183
- fi
184
-
185
- # Run the gate and capture output
186
- START_TIME=$(date +%s%N)
187
- GATE_OUTPUT=$(eval "$cmd" 2>&1) && GATE_EXIT=$? || GATE_EXIT=$?
188
- END_TIME=$(date +%s%N)
189
- DURATION_MS=$(( (END_TIME - START_TIME) / 1000000 ))
190
- DURATION_SEC=$(echo "scale=2; $DURATION_MS / 1000" | bc 2>/dev/null || echo "0")
191
-
192
- if [[ "$GATE_EXIT" -eq 0 ]]; then
193
- echo -e "${GREEN}PASS${NC} (${DURATION_SEC}s)"
194
- GATE_RESULTS+=(" - name: $name")
195
- GATE_RESULTS+=(" exit_code: 0")
196
- GATE_RESULTS+=(" duration_seconds: $DURATION_SEC")
197
- GATE_RESULTS+=(" status: pass")
198
- (( PASS_COUNT += 1 ))
199
- else
200
- echo -e "${RED}FAIL${NC} (${DURATION_SEC}s, exit $GATE_EXIT)"
201
- GATE_RESULTS+=(" - name: $name")
202
- GATE_RESULTS+=(" exit_code: $GATE_EXIT")
203
- GATE_RESULTS+=(" duration_seconds: $DURATION_SEC")
204
- GATE_RESULTS+=(" status: fail")
205
- (( FAIL_COUNT += 1 ))
206
- fi
207
- done
208
-
209
- # ── Agent-driven golden stories (e42s04) ──────────────────────────────
210
-
211
- AGENT_PASS=0
212
- AGENT_FAIL=0
213
- AGENT_SKIP=0
214
- AGENT_FLAKE=0
215
- AGENT_TOTAL=0
216
- AGENT_RESULTS=()
217
- DETERMINISTIC_PASSED=false
218
-
219
- if [[ "$FAIL_COUNT" -eq 0 ]]; then
220
- DETERMINISTIC_PASSED=true
221
- fi
222
-
223
- if $AGENT_MODE && $DETERMINISTIC_PASSED; then
224
- echo ""
225
- echo "── Agent-Driven Golden Stories ──"
226
-
227
- if [[ ! -d "$GOLDEN_DIR" ]]; then
228
- echo -e "${YELLOW}WARN: $GOLDEN_DIR not found — agent stories skipped${NC}"
229
- AGENT_RESULTS+=(" status: skipped")
230
- AGENT_RESULTS+=(" reason: golden directory not found")
231
- (( AGENT_SKIP += 1 ))
232
- else
233
- for yaml_file in "$GOLDEN_DIR"/g-*.yaml; do
234
- [[ -f "$yaml_file" ]] || continue
235
- story_id=$(basename "$yaml_file" .yaml)
236
- echo -n "[$story_id] "
237
-
238
- # Read pass@k policy
239
- PASS_K=$($PYTHON -c "import yaml; d=yaml.safe_load(open('$yaml_file')); print(d.get('pass_at_k',{}).get('k',3))" 2>/dev/null || echo 3)
240
- PASS_THRESHOLD=$($PYTHON -c "import yaml; d=yaml.safe_load(open('$yaml_file')); print(d.get('pass_at_k',{}).get('threshold',2))" 2>/dev/null || echo 2)
241
-
242
- story_pass=0
243
- story_fail=0
244
- story_flake_count=0
245
-
246
- for ((attempt=1; attempt<=PASS_K; attempt++)); do
247
- # Invoke gh-aw for this golden story
248
- # In CI, the workflow file is pre-compiled. Locally, check if .lock.yml exists.
249
- LOCK_FILE=".github/workflows/e42-golden-deepseek.lock.yml"
250
- if [[ ! -f "$LOCK_FILE" ]]; then
251
- echo -e "${YELLOW}SKIP${NC} (no compiled workflow for $story_id)"
252
- break
253
- fi
254
-
255
- # gh-aw run would go here. For now, check if workflow exists and is valid.
256
- # The actual agent execution is triggered via gh workflow run in CI;
257
- # local runs validate YAML definitions only.
258
- if $PYTHON -c "
259
- import yaml
260
- d = yaml.safe_load(open('$yaml_file'))
261
- assert d.get('grader',{}).get('type') == 'code', 'grader must be code'
262
- assert d['grader'].get('command'), 'grader command required'
263
- assert d.get('pass_at_k',{}).get('k') == $PASS_K
264
- assert d['pass_at_k'].get('threshold') == $PASS_THRESHOLD
265
- " 2>/dev/null; then
266
- # Simulated: YAML valid → 1 pass
267
- (( story_pass += 1 ))
268
- else
269
- (( story_fail += 1 ))
270
- fi
271
- done
272
-
273
- if [[ "$story_pass" -eq 0 && "$story_fail" -eq 0 ]]; then
274
- echo -e "${YELLOW}SKIP${NC}"
275
- AGENT_RESULTS+=(" - id: $story_id")
276
- AGENT_RESULTS+=(" status: skipped")
277
- AGENT_RESULTS+=(" pass_at_k: \"0/$PASS_K\"")
278
- (( AGENT_SKIP += 1 ))
279
- elif [[ "$story_pass" -ge "$PASS_THRESHOLD" ]]; then
280
- flake_note=""
281
- if [[ "$story_fail" -gt 0 ]]; then
282
- flake_note=" (flake: $story_fail)"
283
- (( AGENT_FLAKE += story_fail ))
284
- fi
285
- echo -e "${GREEN}PASS${NC}${flake_note} (pass@k: $story_pass/$PASS_K)"
286
- AGENT_RESULTS+=(" - id: $story_id")
287
- AGENT_RESULTS+=(" status: pass")
288
- AGENT_RESULTS+=(" pass_at_k: \"$story_pass/$PASS_K\"")
289
- AGENT_RESULTS+=(" flake_count: $story_fail")
290
- (( AGENT_PASS += 1 ))
291
- else
292
- echo -e "${RED}FAIL${NC} (pass@k: $story_pass/$PASS_K, threshold $PASS_THRESHOLD)"
293
- AGENT_RESULTS+=(" - id: $story_id")
294
- AGENT_RESULTS+=(" status: fail")
295
- AGENT_RESULTS+=(" pass_at_k: \"$story_pass/$PASS_K\"")
296
- AGENT_RESULTS+=(" flake_count: $story_fail")
297
- (( AGENT_FAIL += 1 ))
298
- fi
299
- done
300
- fi
301
- elif $AGENT_MODE && ! $DETERMINISTIC_PASSED; then
302
- echo ""
303
- echo -e "${YELLOW}── Agent stories skipped: deterministic gates failed ──${NC}"
304
- AGENT_RESULTS+=(" status: skipped")
305
- AGENT_RESULTS+=(" reason: deterministic gates failed")
306
- fi
307
-
308
- # ── Combined summary ──────────────────────────────────────────────────
309
-
310
- TOTAL=$((PASS_COUNT + FAIL_COUNT + SKIP_COUNT))
311
- AGENT_TOTAL=$((AGENT_PASS + AGENT_FAIL + AGENT_SKIP))
312
-
313
- if [[ "$FAIL_COUNT" -gt 0 ]]; then
314
- OVERALL="fail"
315
- elif [[ "$AGENT_FAIL" -gt 0 ]]; then
316
- OVERALL="fail"
317
- else
318
- OVERALL="pass"
319
- fi
320
-
321
- echo ""
322
- echo "══════════════════════════════════════════"
323
- echo " GOLDEN SUITE VERDICT"
324
- echo "══════════════════════════════════════════"
325
- echo ""
326
- echo "Deterministic gates:"
327
- echo -e " ${PASS_COUNT}/${TOTAL} passed"
328
- if [[ "$SKIP_COUNT" -gt 0 ]]; then
329
- echo -e " ${SKIP_COUNT} skipped"
330
- fi
331
- if [[ "$FAIL_COUNT" -gt 0 ]]; then
332
- echo -e " ${RED}${FAIL_COUNT} failed${NC}"
333
- fi
334
-
335
- if $AGENT_MODE; then
336
- echo ""
337
- echo "Agent-driven stories:"
338
- echo -e " ${AGENT_PASS}/${AGENT_TOTAL} passed"
339
- if [[ "$AGENT_FAIL" -gt 0 ]]; then
340
- echo -e " ${RED}${AGENT_FAIL} failed${NC}"
341
- fi
342
- if [[ "$AGENT_SKIP" -gt 0 ]]; then
343
- echo -e " ${AGENT_SKIP} skipped"
344
- fi
345
- if [[ "$AGENT_FLAKE" -gt 0 ]]; then
346
- echo -e " ${YELLOW}${AGENT_FLAKE} flake(s) detected${NC} (absorbed by pass@k 2-of-3)"
347
- fi
348
- fi
349
-
350
- echo ""
351
- echo -e "Combined verdict: $([[ "$OVERALL" == "pass" ]] && echo -e "${GREEN}PASS${NC}" || echo -e "${RED}FAIL${NC}")"
352
- echo "Report: $REPORT_FILE"
353
- echo "══════════════════════════════════════════"
354
-
355
- # ── Write report ──────────────────────────────────────────────────────
356
-
357
- PASS_RATE=$(echo "scale=2; $PASS_COUNT / $TOTAL" | bc 2>/dev/null || echo "0")
358
- AGENT_PASS_RATE="n/a"
359
- if [[ "$AGENT_TOTAL" -gt 0 ]]; then
360
- AGENT_PASS_RATE=$(echo "scale=2; $AGENT_PASS / $AGENT_TOTAL" | bc 2>/dev/null || echo "0")
361
- fi
362
-
363
- cat > "$REPORT_FILE" << YAML_EOF
364
- timestamp: "$TIMESTAMP"
365
- git_commit: "$GIT_COMMIT"
366
- suite: "golden-combined"
367
- mode: "$([ "$BASELINE_MODE" = true ] && echo 'baseline' || echo 'daily')"
368
- deterministic:
369
- total: $TOTAL
370
- passed: $PASS_COUNT
371
- failed: $FAIL_COUNT
372
- skipped: $SKIP_COUNT
373
- pass_rate: $PASS_RATE
374
- gates:
375
- $(printf '%s\n' "${GATE_RESULTS[@]}")
376
- agent_stories:
377
- total: $AGENT_TOTAL
378
- passed: $AGENT_PASS
379
- failed: $AGENT_FAIL
380
- skipped: $AGENT_SKIP
381
- flake_count: $AGENT_FLAKE
382
- pass_rate: $AGENT_PASS_RATE
383
- summary:
384
- combined_verdict: "$OVERALL"
385
- YAML_EOF
386
-
387
- # ── OKF verification-report (e45s02) ────────────────────────────────────
388
- OKF_DIR="specs/verifications/reports"
389
- mkdir -p "$OKF_DIR"
390
- OKF_FILE="$OKF_DIR/GOLDEN-${TODAY}.okf.md"
391
- THRESHOLD=100
392
- GATE_STATUS="$OVERALL"
393
-
394
- cat > "$OKF_FILE" << OKF_EOF
395
- ---
396
- okf_kind: verification-report
397
- okf_version: "0.1"
398
- score: ${PASS_RATE}
399
- gate_status: "${GATE_STATUS}"
400
- threshold: ${THRESHOLD}
401
- total_pass: ${PASS_COUNT}
402
- total_fail: ${FAIL_COUNT}
403
- total_skip: ${SKIP_COUNT}
404
- generated_by: scripts/run-golden-suite.sh
405
- generated_at: "${TIMESTAMP}"
406
- git_commit: "${GIT_COMMIT}"
407
- ---
408
-
409
- # Golden Suite — ${TODAY}
410
-
411
- **Score:** ${PASS_RATE} (${PASS_COUNT}/${TOTAL} passed)
412
- **Gate:** ${GATE_STATUS} | **Threshold:** ${THRESHOLD}%
413
-
414
- See \`${REPORT_FILE}\` for the full YAML report.
415
- OKF_EOF
416
-
417
- echo "OKF report: $OKF_FILE"
418
-
419
- # ── Size budget (placeholder for e31s04) ──────────────────────────────
420
-
421
- if $BASELINE_MODE; then
422
- echo "" >> "$REPORT_FILE"
423
- echo "# Skill byte counts (baseline for e31s04 size budget)" >> "$REPORT_FILE"
424
- echo "skill_sizes:" >> "$REPORT_FILE"
425
- for skill_md in skills/*/SKILL.md; do
426
- skill_name=$(basename "$(dirname "$skill_md")")
427
- skill_bytes=$(wc -c < "$skill_md" | tr -d ' ')
428
- echo " $skill_name: $skill_bytes" >> "$REPORT_FILE"
429
- done
430
- echo "Baseline pinned: $REPORT_FILE"
431
- fi
432
-
433
- # ── Size budget check (e31s04) ───────────────────────────────────────
434
-
435
- if $CHECK_SIZE; then
436
- WARN_THRESHOLD=20
437
- FAIL_THRESHOLD=50
438
-
439
- if [[ ! -f "$BASELINE_FILE" ]]; then
440
- echo "No baseline found. Run --baseline first."
441
- exit 1
442
- fi
443
-
444
- echo ""
445
- echo "Size Budget Check (+${WARN_THRESHOLD}% warn, +${FAIL_THRESHOLD}% fail):"
446
- SIZE_WARNINGS=0
447
- SIZE_FAILURES=0
448
- NEW_SKILLS=0
449
-
450
- for skill_md in skills/*/SKILL.md; do
451
- skill_name=$(basename "$(dirname "$skill_md")")
452
- current_bytes=$(wc -c < "$skill_md" | tr -d ' ')
453
-
454
- # Get baseline size (best-effort grep from YAML)
455
- baseline_bytes=$(grep "^ $skill_name:" "$BASELINE_FILE" 2>/dev/null | awk '{print $2}')
456
-
457
- if [[ -z "$baseline_bytes" ]]; then
458
- echo " ${YELLOW}NEW${NC} $skill_name: ${current_bytes}b (not in baseline)"
459
- (( NEW_SKILLS += 1 )) || true
460
- continue
461
- fi
462
-
463
- if [[ "$baseline_bytes" -eq 0 ]]; then
464
- baseline_bytes=1 # avoid division by zero
465
- fi
466
-
467
- pct=$(( (current_bytes - baseline_bytes) * 100 / baseline_bytes ))
468
-
469
- if [[ "$pct" -ge "$FAIL_THRESHOLD" ]]; then
470
- echo " ${RED}FAIL${NC} $skill_name: ${current_bytes}b (+${pct}%)"
471
- (( SIZE_FAILURES += 1 )) || true
472
- elif [[ "$pct" -ge "$WARN_THRESHOLD" ]]; then
473
- echo " ${YELLOW}WARN${NC} $skill_name: ${current_bytes}b (+${pct}%)"
474
- (( SIZE_WARNINGS += 1 )) || true
475
- else
476
- echo " ${GREEN}OK${NC} $skill_name: ${current_bytes}b"
477
- fi
478
- done
479
-
480
- echo ""
481
- echo "Size summary: $SIZE_WARNINGS warnings, $SIZE_FAILURES failures, $NEW_SKILLS new"
482
-
483
- if [[ "$SIZE_FAILURES" -gt 0 ]]; then
484
- exit 1
485
- fi
486
- exit 0
487
- fi
488
-
489
- if [[ "$OVERALL" == "fail" ]]; then
490
- exit 1
491
- fi
492
- exit 0
5
+ GOLDEN_GENERATED_BY="scripts/run-golden-suite.sh"
6
+ GOLDEN_USAGE_NAME="run-golden-suite.sh"
7
+ source "$(dirname "${BASH_SOURCE[0]}")/lib/golden-suite-run.sh"
8
+ golden_suite_main "$@"