Add the longitudinal layer to the benchmark core: a per-skill JSON-lines history that appends one summary line per run and trims oldest-first at fifty, two stacked net-margin trend ribbons (Efficacy and Regression, the latter leaving a gap for two-arm runs) with the current run ringed and a net/delta/green-count readout, and per-badge fragility chips that flag the narrowest passing case on each green axis so a barely-green skill cannot look robust. History persistence is opt-in via --history and is the core's only side effect. Without it the core stays a pure transform. Two committed fixtures (clean and fragile) and new fixture-test sections cover the append-and-trim, both ribbons including the two-arm gap, and the chips.
497 lines
12 KiB
JSON
497 lines
12 KiB
JSON
{
|
|
"skill": "clean-skill",
|
|
"generatedAt": "2026-07-24T10:00:00Z",
|
|
"temperature": 1.0,
|
|
"trialsPerCase": 5,
|
|
"arms": [
|
|
{
|
|
"id": "new",
|
|
"label": "New skill"
|
|
},
|
|
{
|
|
"id": "previous",
|
|
"label": "Previous version"
|
|
},
|
|
{
|
|
"id": "baseline",
|
|
"label": "No skill"
|
|
}
|
|
],
|
|
"comparisons": [
|
|
{
|
|
"id": "efficacy",
|
|
"label": "Efficacy",
|
|
"new": "new",
|
|
"against": "baseline",
|
|
"rule": "efficacy"
|
|
},
|
|
{
|
|
"id": "regression",
|
|
"label": "Regression",
|
|
"new": "new",
|
|
"against": "previous",
|
|
"rule": "regression"
|
|
}
|
|
],
|
|
"cases": [
|
|
{
|
|
"name": "narrowest",
|
|
"description": "narrowest scenario",
|
|
"softCriteria": [
|
|
"a good answer for narrowest"
|
|
],
|
|
"trials": [
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "new",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-narrowest-t0",
|
|
"previous": "OUT-previous-narrowest-t0",
|
|
"baseline": "OUT-baseline-narrowest-t0"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "new",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-narrowest-t1",
|
|
"previous": "OUT-previous-narrowest-t1",
|
|
"baseline": "OUT-baseline-narrowest-t1"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "new",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-narrowest-t2",
|
|
"previous": "OUT-previous-narrowest-t2",
|
|
"baseline": "OUT-baseline-narrowest-t2"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-narrowest-t3",
|
|
"previous": "OUT-previous-narrowest-t3",
|
|
"baseline": "OUT-baseline-narrowest-t3"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-narrowest-t4",
|
|
"previous": "OUT-previous-narrowest-t4",
|
|
"baseline": "OUT-baseline-narrowest-t4"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"name": "roomy",
|
|
"description": "roomy scenario",
|
|
"softCriteria": [
|
|
"a good answer for roomy"
|
|
],
|
|
"trials": [
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "new",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "new",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-roomy-t0",
|
|
"previous": "OUT-previous-roomy-t0",
|
|
"baseline": "OUT-baseline-roomy-t0"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "new",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-roomy-t1",
|
|
"previous": "OUT-previous-roomy-t1",
|
|
"baseline": "OUT-baseline-roomy-t1"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "new",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-roomy-t2",
|
|
"previous": "OUT-previous-roomy-t2",
|
|
"baseline": "OUT-baseline-roomy-t2"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "new",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-roomy-t3",
|
|
"previous": "OUT-previous-roomy-t3",
|
|
"baseline": "OUT-baseline-roomy-t3"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"hard": {
|
|
"ran": true,
|
|
"pass": true
|
|
},
|
|
"comparisons": {
|
|
"efficacy": {
|
|
"winner": "new",
|
|
"rationale": "fixture"
|
|
},
|
|
"regression": {
|
|
"winner": "tie",
|
|
"rationale": "fixture"
|
|
}
|
|
},
|
|
"outputs": {
|
|
"new": "OUT-new-roomy-t4",
|
|
"previous": "OUT-previous-roomy-t4",
|
|
"baseline": "OUT-baseline-roomy-t4"
|
|
},
|
|
"usage": {
|
|
"new": {
|
|
"input": 1000,
|
|
"output": 500,
|
|
"cacheCreation": 200,
|
|
"cacheRead": 300,
|
|
"turns": 3
|
|
},
|
|
"previous": {
|
|
"input": 900,
|
|
"output": 450,
|
|
"cacheCreation": 180,
|
|
"cacheRead": 270,
|
|
"turns": 3
|
|
},
|
|
"baseline": {
|
|
"input": 600,
|
|
"output": 300,
|
|
"cacheCreation": 0,
|
|
"cacheRead": 0,
|
|
"turns": 2
|
|
}
|
|
}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|