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.
- package/.pi/package.json +1 -1
- package/CHANGELOG.md +14 -0
- package/package.json +1 -1
- package/scripts/check-spec-version-gap.sh +37 -9
- package/scripts/lib/golden-suite-agent.sh +80 -0
- package/scripts/lib/golden-suite-gates.sh +105 -0
- package/scripts/lib/golden-suite-report.sh +157 -0
- package/scripts/lib/golden-suite-run.sh +79 -0
- package/scripts/lib/validate-okf-kinds.sh +272 -0
- package/scripts/run-golden-suite.sh +4 -488
- package/scripts/run-verification-gates.sh +4 -488
- package/scripts/validate-okf.sh +2 -318
|
@@ -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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
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 "$@"
|