Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
3a55516
FIX-AS-01.01 — the saga state model: operation_id, pending/applied/un…
Sep 8, 2026
e8487fa
FIX-AS-01.02 — reconciliation and serialization: ask by key, CAS the …
Sep 9, 2026
4074cb8
FIX-AS-02.01 — zero is a value, not an absence: the first real spend …
Sep 9, 2026
8fe002d
FIX-AS-03.01 — similarity proposes, the contradiction gate disposes
Sep 9, 2026
37c0272
FIX-AS-03.02 — the temporal evidence lifecycle: nothing exempts the p…
Sep 9, 2026
bec2c24
FIX-AS-04.01 — the fake-edge test is typed: no payload is not no cons…
Sep 9, 2026
78f9192
FIX-SY-04.02 (cross-repo half) — the coordination note names the reso…
Sep 9, 2026
65402d3
FIX-AS-06.01 — the first release ships with an executable seed corpus
Sep 9, 2026
eee1ff2
FIX-AS-07.01 — the order ban keeps the mandatory happens-before
Sep 9, 2026
751eda0
FIX-AS-09.01 — extensible OTel fields, and total vs disjoint-bucket t…
Sep 9, 2026
3e37e17
FIX-AS-09.02 — disjoint billing buckets reconcile, no token charged t…
Sep 9, 2026
bb002c3
FIX-AS-11.01 — the approval grant contract: a boolean the model can s…
Sep 9, 2026
b36f14a
FIX-AS-11.02 — threat-model limits: the trifecta is not full security
Sep 9, 2026
9fa1f98
FIX-EV-01.23 — the outcome corpus: agent-evals no longer passes by name
Sep 9, 2026
643a36e
FIX-EV-01.24 — the outcome corpus: agent-harness no longer passes by …
Sep 9, 2026
fd8c49e
FIX-EV-01.25 — the outcome corpus: agent-interop no longer passes by …
Sep 9, 2026
37e493e
FIX-EV-01.26 — the outcome corpus: agent-orchestrator no longer passe…
Sep 9, 2026
09e295f
FIX-AS-05.01 — auditability is a property of the execution record, no…
Sep 9, 2026
39e7116
FIX-AS-08.01 — proportion intervals and trial units carry their assum…
Sep 9, 2026
5f22cb4
FIX-AS-08.02 — paired/clustered/unpaired separated; splits are spent …
Sep 9, 2026
0bce8e8
FIX-AS-10.01 — a regrade of an old output is not a check of the candi…
Sep 9, 2026
c2f4195
FIX-AS-12.01 — the MCP shipping example pins its SDK
Sep 9, 2026
13f2853
FIX-AS-13.01 — "long-running" is not a protocol choice
Sep 9, 2026
3fc5cf9
FIX-AS-14.01 — "no evals" no longer makes the whole audit unfalsifiable
Sep 9, 2026
71e8484
ci: the house audit MEASURES the token budget instead of estimating it
Sep 9, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion .github/workflows/validate.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ jobs:
- name: Structural validator
run: python3 test/validate.py

- name: Audit regressions (sherlock plan, one file per closed finding)
run: npm run test:audit

# Every negative self-test below plants a defect and REQUIRES a failure.
# A validator nobody has watched fail is not evidence that it works.

Expand Down Expand Up @@ -764,10 +767,13 @@ jobs:
uses: actions/checkout@v4
with:
repository: ssheleg/make-skill
ref: 991cbb415be3e856f05c974e631423df552883e3
ref: 5ca5c367ba24295d4dd99ff670dbef97234140e7
path: .skill-auditor
persist-credentials: false

- name: Install a real tokenizer (the budget is MEASURED, never estimated)
run: python3 -m pip install --quiet tiktoken

- name: Audit every shipped Agent Skill
run: |
python3 - <<'PY'
Expand Down
201 changes: 201 additions & 0 deletions evals/cases/agent-evals.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,201 @@
{
"contract": "outcome-case/1 (schemas/outcome-case.schema.json + test/outcome_harness.py in ssheleg/sshlg-skills)",
"note": "Outcome corpus for agent-evals (FIX-EV-01.23), anchored to the audit's own findings AS-06..AS-10. Judged on ARTIFACTS via the family harness: the runner records the actual output oracle verdict AND the raw result per case; with/without-skill arms are the harness's baseline contract. Nothing in the production skill was changed for grader convenience.",
"arms": {
"baseline": "same prompts, skill absent",
"current": "same prompts, skill installed"
},
"cases": [
{
"schema_version": "outcome-case/1",
"id": "AE-OUT-001-positive-greenfield-corpus",
"skill": "agent-evals",
"prompt": {
"text": "Design the first-release eval corpus for a greenfield agent feature with ZERO production traces: it must contain at least happy, adversarial and failure/retry trials, and an empty corpus or unexecuted observables must NOT close the gate (AS-06). Write corpus-plan.md naming the three trial kinds."
},
"environment": {
"model": "inherit",
"host": "any",
"case_digest": "9c9b2b8cc1279d8aad31920cef652d116b4dee56375afb17c931e7a98c4254fa"
},
"checks": {
"tool": [
{
"name": "python3 present",
"command": "python3 -c 'pass'"
}
],
"load_trace": {
"expect_loaded": [
"agent-evals"
],
"expect_not_loaded": []
},
"outcome": [
{
"name": "plan exists",
"kind": "artifact-exists",
"target": "corpus-plan.md"
},
{
"name": "adversarial trials are in the minimum (AS-06)",
"kind": "artifact-contains",
"target": "corpus-plan.md",
"expect": "adversarial"
}
]
}
},
{
"schema_version": "outcome-case/1",
"id": "AE-OUT-002-negative-routing",
"skill": "agent-evals",
"prompt": {
"text": "Explain in two sentences what a webhook is."
},
"environment": {
"model": "inherit",
"host": "any",
"case_digest": "a5da94aa03520bb6226ea88328a75ab6d7e3985c73a0e90a1379bf168fead57e"
},
"checks": {
"tool": [
{
"name": "python3 present",
"command": "python3 -c 'pass'"
}
],
"load_trace": {
"expect_loaded": [],
"expect_not_loaded": [
"agent-evals"
]
},
"outcome": [
{
"name": "no eval artifact appears",
"kind": "command-exit-0",
"target": "test ! -f corpus-plan.md"
}
]
}
},
{
"schema_version": "outcome-case/1",
"id": "AE-OUT-003-order-sensitivity",
"skill": "agent-evals",
"prompt": {
"text": "Write an order-sensitivity rubric for a tool-use trace: swapping two independent READ calls must pass, but swapping confirm/charge or acquire/write must FAIL the test; keep the negative example beside the rubric (AS-07). Write order-rubric.md."
},
"environment": {
"model": "inherit",
"host": "any",
"case_digest": "7e694bd8ee320239cc92768a4fd32705ddb1726aa4d2589d563fa4cf82c5f0b2"
},
"checks": {
"tool": [
{
"name": "python3 present",
"command": "python3 -c 'pass'"
}
],
"load_trace": {
"expect_loaded": [
"agent-evals"
],
"expect_not_loaded": []
},
"outcome": [
{
"name": "the causal pair fails on swap (AS-07)",
"kind": "artifact-contains",
"target": "order-rubric.md",
"expect": "confirm"
},
{
"name": "the negative example is kept beside the rubric (AS-07)",
"kind": "artifact-contains",
"target": "order-rubric.md",
"expect": "negative"
}
]
}
},
{
"schema_version": "outcome-case/1",
"id": "AE-OUT-004-noop-statistics-stay-honest",
"skill": "agent-evals",
"prompt": {
"text": "Given eval results with n=1 and n=3 trials, state the uncertainty honestly: no zero-width intervals at boundary p=0 or p=1 (AS-08). Do NOT redesign anything — write stats-note.md only."
},
"environment": {
"model": "inherit",
"host": "any",
"case_digest": "4bf7a16749ab1f193672bebe3d00e3a1ef517071fae7d44ff78cf60504b34e80"
},
"checks": {
"tool": [
{
"name": "python3 present",
"command": "python3 -c 'pass'"
}
],
"load_trace": {
"expect_loaded": [
"agent-evals"
],
"expect_not_loaded": []
},
"outcome": [
{
"name": "boundary n gives no zero uncertainty (AS-08)",
"kind": "artifact-contains",
"target": "stats-note.md",
"expect": "uncertainty"
}
]
}
},
{
"schema_version": "outcome-case/1",
"id": "AE-OUT-005-regrade-is-not-a-candidate-check",
"skill": "agent-evals",
"prompt": {
"text": "A gate re-checks an OLD answer while claiming to verify a NEW candidate: mutate the candidate to a knowingly wrong tool and show the gate result must change; a regrade of an old trace must be labelled as such, never as a candidate check (AS-10). Write regrade-note.md."
},
"environment": {
"model": "inherit",
"host": "any",
"case_digest": "f3df1644a20d9ee2cb326c3b55ae95ac5a4c83aa0dfc889d6f280713abf88b83"
},
"checks": {
"tool": [
{
"name": "python3 present",
"command": "python3 -c 'pass'"
}
],
"load_trace": {
"expect_loaded": [
"agent-evals"
],
"expect_not_loaded": []
},
"outcome": [
{
"name": "mutating the candidate changes the gate (AS-10)",
"kind": "artifact-contains",
"target": "regrade-note.md",
"expect": "mutat"
},
{
"name": "regrade of an old trace is labelled (AS-10)",
"kind": "artifact-contains",
"target": "regrade-note.md",
"expect": "regrade"
}
]
}
}
]
}
Loading
Loading