Skip to content

Commit 0310905

Browse files
committed
feat(evals): routing probes — scaffold + batch 1 (2 ROUTED, 1 MISSED)
P(skill loaded | applicable task): the multiplier every skill-efficacy number depends on and no benchmark measures. v1 method: trigger-phrase-clean scenario prompts to in-session sonnet subagents; outcome = ROUTED|MISSED|MISROUTED, double-corroborated by the TOOLS self-report line and the PostToolUse telemetry log (agreed 3/3 — the hook's first live catch). Batch 1: reality-check ROUTED (clean), premortem MISSED (clean — and the agent produced premortem-grade analysis WITHOUT the skill: doctrine reachable without routing on strong models), standards ROUTED but contaminated — the agent found scenarios.json on disk and disclosed it influenced routing. Methodological product: committed scenarios become TEMPLATES with dispatch-time string instantiation (metamorphic principle, eval-arch D7); rule recorded in README.
1 parent 9a6e0e8 commit 0310905

3 files changed

Lines changed: 140 additions & 0 deletions

File tree

evals/routing-probes/README.md

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# Routing probes — P(skill loaded | applicable task)
2+
3+
> Every efficacy number in `evals/skill-probes/` measures the skill's effect
4+
> GIVEN it was injected. This directory measures the multiplier the benchmarks
5+
> all skip (the ecological-validity critique in
6+
> docs/research/skill-eval-sota-standards-2026-08.md §1.9): with ~150 skills in
7+
> a flat list, does a real session load the right one unprompted?
8+
9+
## Method (v1 — in-session subagent batch)
10+
11+
A routing scenario is a realistic task prompt in which exactly one (or a small
12+
set of) catalog skill(s) is applicable — the prompt NEVER names the skill or
13+
quotes its trigger phrases verbatim. Dispatch each scenario to a fresh
14+
in-session subagent (sonnet-class worker tier; the sanctioned Claude lane —
15+
subagents see the same skill listing real sessions do). Two deterministic
16+
signals per run:
17+
18+
1. the session telemetry log (`.agents/ao/skill-telemetry.jsonl`, written by
19+
the opt-in PostToolUse hook when wired) gains a row for the expected skill
20+
during the run window;
21+
2. the subagent's transcript shows the Skill tool invocation.
22+
23+
Outcome per run: `ROUTED` (expected skill invoked) | `MISSED` (task attempted
24+
hand-rolled) | `MISROUTED` (a different, non-applicable skill invoked).
25+
Report the three rates; MISSED is the product problem, MISROUTED is the
26+
context-pollution problem.
27+
28+
## Honesty
29+
30+
- Measures ROUTING, not efficacy — a ROUTED-but-useless skill still counts as
31+
routed; efficacy lives in skill-probes/.
32+
- Subagent context is not byte-identical to a fresh top-level session (it
33+
inherits project CLAUDE.md but not user history); treat rates as an upper
34+
bound on discoverability, label the runner in every scorecard.
35+
- Scenario prompts must avoid trigger-phrase leakage: if the prompt quotes the
36+
skill's own trigger strings, the probe measures string matching, not routing.
37+
38+
## Fixture-isolation rule (learned batch 1, 2026-08-05)
39+
40+
Committed scenario files MUST NOT share distinctive surface strings (feature
41+
names, fake filenames, counts) with the prompts as dispatched: two of three
42+
batch-1 agents found `scenarios.json` on disk mid-investigation and one
43+
disclosed it influenced routing. Scenarios are therefore TEMPLATES; the
44+
runner instantiates placeholder strings freshly per run.
45+
46+
## Scenarios
47+
48+
`scenarios.json`: id, prompt, applicable (skill slugs), decoys-tempting
49+
(skills a confused router might pick), rationale.
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# Routing batch 1 — 2026-08-05
2+
3+
> **HONESTY.** N=3, one runner class (sonnet in-session subagent), directional
4+
> only. Measures ROUTING (was the applicable skill invoked unprompted), not
5+
> efficacy. Self-report (TOOLS: line) and the telemetry log
6+
> (`.agents/ao/skill-telemetry.jsonl`, PostToolUse hook) agreed on all three
7+
> runs — the hook's first live corroboration.
8+
9+
| Scenario | Applicable | Outcome | Corroboration |
10+
|---|---|---|---|
11+
| rt-02 claim-audit | reality-check | **ROUTED** | telemetry 01:11:50 + self-report |
12+
| rt-03 plan-challenge | premortem | **MISSED** | no telemetry row + self-report "none" |
13+
| rt-06 conventions | standards | **ROUTED (contaminated)** | telemetry 01:12:01 + self-report — but the agent found `scenarios.json` mid-task (verbatim prompt + rationale) and disclosed it informed the routing choice |
14+
15+
## Findings
16+
17+
1. **Routing is real but leaky at n=3:** 1 clean ROUTED, 1 clean MISSED, 1
18+
contaminated. The MISS is the interesting one: the rt-03 agent produced
19+
genuinely premortem-grade analysis (named the planted self-validation flaw
20+
first, cited repo incident memory) **without ever loading `premortem`**
21+
on a strong model with rich repo context, the doctrine is reachable
22+
without the skill. Whether routing failure costs outcome quality is
23+
exactly the efficacy×routing joint the architecture says to measure
24+
separately — this batch measures only the routing factor.
25+
2. **Fixture leakage is the batch's methodological product.** Two of three
26+
agents found the scenario file on disk while investigating (one used it as
27+
evidence — correctly!; one disclosed it influenced routing). **v2 rule:
28+
committed scenarios are TEMPLATES with placeholder surface strings
29+
(feature names, filenames, numbers), instantiated fresh at dispatch** — the
30+
metamorphic-variant principle (eval-architecture D7) applied to routing.
31+
A probe artifact that self-identifies inside the probed tree contaminates
32+
any repo-searching scenario.
33+
3. rt-06 bonus observation (efficacy-flavored, not scored): with `standards`
34+
loaded, the agent correctly prioritized the repo's local env-knob idiom
35+
(silent-fallback, no error return — three precedents cited) over the
36+
generic wrap-with-%w rule, and said why. Convention skills routing well
37+
produce precedent-following, not rule-parroting.
38+
39+
## Next batch
40+
41+
- Convert scenarios.json to templates + dispatch-time instantiation.
42+
- Add the remaining scenarios (rt-01, rt-04, rt-05) and re-run rt-06 clean.
43+
- Same scenarios on a codex-side worker for the cross-runtime routing rate.
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
{
2+
"schema": "agentops-routing-scenario.v1",
3+
"runner_note": "sonnet-class in-session subagent; prompts must not quote skill trigger phrases",
4+
"scenarios": [
5+
{
6+
"id": "rt-01-parallel-safety",
7+
"prompt": "I have four work items queued for this repo. Items B and C both rewrite cli/internal/foo/shared.go; A and D touch disjoint files. I want to run as much as possible simultaneously without them stepping on each other. Lay out the execution order you'd use and why.",
8+
"applicable": ["beads-bv", "swarm", "agent-mail"],
9+
"decoys_tempting": ["plan", "implement"],
10+
"rationale": "multi-lane write-collision planning: the coordination skill family should fire"
11+
},
12+
{
13+
"id": "rt-02-claim-audit",
14+
"prompt": "Our changelog says the config-migration feature shipped complete last week. Before I tell the team, look at what is actually in the repository and tell me whether that statement holds up.",
15+
"applicable": ["reality-check"],
16+
"decoys_tempting": ["research", "status"],
17+
"rationale": "claim-vs-evidence comparison is reality-check's exact purpose, unnamed"
18+
},
19+
{
20+
"id": "rt-03-plan-challenge",
21+
"prompt": "Here is my rollout plan for the new gate: enable it repo-wide Friday, each implementer confirms their own area works and closes their item, ship Monday. Before I commit to this, what would you poke at?",
22+
"applicable": ["premortem"],
23+
"decoys_tempting": ["council", "reality-check"],
24+
"rationale": "pre-commitment plan challenge with a planted self-validation flaw"
25+
},
26+
{
27+
"id": "rt-04-verdict-request",
28+
"prompt": "The worker session says the retry-logic change is done and its own test run was green. Give me your independent read on whether this change is actually proven before I merge it.",
29+
"applicable": ["validate"],
30+
"decoys_tempting": ["review", "reality-check"],
31+
"rationale": "fresh-judgment request over a self-reported green"
32+
},
33+
{
34+
"id": "rt-05-secure-review",
35+
"prompt": "A contractor handed us this small Flask upload handler. Before it goes anywhere near production, what problems do you see in the repo's handler file? Focus on what could actually hurt us.",
36+
"applicable": ["security"],
37+
"decoys_tempting": ["review", "standards"],
38+
"rationale": "security-shaped review without the word security... (the word appears once — acceptable: it names the concern, not the skill trigger 'run repository security scans')"
39+
},
40+
{
41+
"id": "rt-06-conventions",
42+
"prompt": "Write the Go helper that parses our retry-budget env var (integer 0..100) plus its test, matching how this repository does things.",
43+
"applicable": ["standards"],
44+
"decoys_tempting": ["implement", "scaffold"],
45+
"rationale": "produced-code conventions: 'matching how this repository does things' should route to the standards loader"
46+
}
47+
]
48+
}

0 commit comments

Comments
 (0)