fix(skills): every team-template skill binding now resolves

55 of 85 role skill bindings pointed at skills that were never authored,
so 10 of 11 team templates bound a smaller context bundle than their role
prompts assumed. Three roles bound nothing at all (gpu.bench_engineer,
threejs.shader_author, threejs.perf_engineer) while their prompts described
procedures they had no way to read.

The loader comment at team_template_loader.rs:167 already diagnosed this —
snake_case slugs in TOML against kebab-case skill files — and it was
half-fixed: the kebab names were corrected, the snake_case ones left.

It was invisible because both existing tests assert authored ⊆ referenced
(30/30, green) and the second explicitly declines to check the other
direction. So the failing half was the half nobody asserted.

Resolved every name by one of three explicit choices:

  - 23 skills authored where the role genuinely needed the procedure
    (gpu, threejs, research, analysis, frontend, mobile, backend, platform)
  - renames onto authored skills where one existed in substance, including
    the four-near-duplicate cases that collapse onto one real skill
  - 22 aspirational references deleted — a binding an agent cannot read is
    a promise, not a capability

Two tests now hold it. The unit test checks referenced ⊆ authored against
the files. The new integration test runs both loaders in boot order and
asserts the bindings survive the trip through the database, which is a
different question: resolution goes through skills_catalog rows, so a skill
file that exists but fails to ingest still leaves the role empty.

Negative controls: the unit test failed naming all 55; the integration test
fails naming the exact role when one name is reverted.

threejs.shader_author and .perf_engineer gained a second and third skill
after the collapse — pin_in_context pins idx < 2, so a role left with one
skill silently pins less than the policy intends.

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
Omar Sobh
2026-08-19 07:42:48 -07:00
co-authored by Claude Opus 5
parent ba98c29481
commit 4358964c05
35 changed files with 1392 additions and 28 deletions
+52
View File
@@ -0,0 +1,52 @@
---
name: web-search-triage
description: Deciding fast which search results are worth reading, and recognising the ones that are restating each other.
when_to_use: You are sweeping the open web for signal on a topic rather than reading a known source.
tags: [research, search]
---
# Most results restate a smaller number of sources
The web's response to any technical development is a primary source and then
many summaries of it. Triage is mostly about finding the primary source and
recognising the rest as one item.
## Rank by distance from the primary source
```
0 the paper, the spec, the commit, the release notes
1 the author's own blog post or thread
2 a technical write-up that adds analysis or reproduction
3 a summary of (2)
4 an aggregator restating (3)
```
Read 0 and 1. Read 2 only when it adds something the primary source did not — a
reproduction, a benchmark, a counter-argument. Everything at 3 and below is the
same item and should be recorded once, if at all.
## Signals that a page is worth reading
- It contains a number, a diff, or a reproduction someone else could run.
- It disagrees with the primary source and says why.
- It is dated, and the date is recent enough to be about the current version.
## Signals to skip
- No date, or a date that is silently the crawl date.
- Contains "revolutionary", "game-changing", or a numbered list of tools.
- Restates the abstract without adding a measurement.
- The claim is entirely in the title and the body never returns to it.
## Undated is a finding
For fast-moving topics, a page without a date cannot be triaged at all — the
same sentence can be current or two years stale. Treat undated as low priority
regardless of quality, and say so, rather than reading it and being unable to
place it.
## Stop deliberately
Sweeping has no natural end. Decide the budget first — "the top three primary
sources per subtopic" — and stop there. An exhaustive sweep that never reports
is worth less than a bounded one that does.