Skip to content

Commit 99b2617

Browse files
authored
Harden research-architect report verification (#78)
## Summary - fold the third live multi-model research run into `research-architect` 2.3.0 without promoting executor-specific quirks into universal rules - distinguish citation support, domain applicability, and usable evidence; classify exports as direct, resolvable, opaque, or absent - resolve numbered bibliographies, reject blind zero-citation scores, and preserve dated postmortem and executor-profile evidence ## Test plan - [x] `.venv/bin/python -m pytest tests/ -q` (760 passed) - [x] `python3 skills/skill-standardizer/scripts/test_skill_standardizer.py` - [x] `python3 skills/skill-evals/scripts/validate_skill_contract.py --skills-root skills --strict` - [x] `python3 skills/skill-evals/scripts/check_skill_versions.py --base origin/main` - [x] generated docs, manifest, harness adapters, and catalog `--check` commands - [x] `python3 scripts/slop_scan.py` - [x] effective-runtime probe against all three supplied research reports
2 parents da398fe + c6e1131 commit 99b2617

12 files changed

Lines changed: 615 additions & 47 deletions

File tree

docs/catalog/index.html

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

docs/project/BACKLOG.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -204,19 +204,19 @@ to a trigger, or move completed decisions and work to the Roadmap or decision hi
204204

205205
### research-architect: remaining deferred tooling
206206
- **What**: `scripts/diff_runs.py` and `references/rubric-library.md` remain
207-
deliberately deferred. (`scripts/score_report.py`, the third of the original
208-
trio, shipped in 2.2.0 once two real runs justified it.)
209-
- **Why it matters**: Across two runs there is exactly one confirmed
210-
discriminating rubric item (the per-tactic evidence floor, 2026-07-12).
211-
Building a rubric library on one data point would encode guesses — the mistake
212-
the deferral exists to avoid. `diff_runs.py` only pays off on multi-run plans
213-
and depends on M1 section alignment holding in practice.
214-
- **Next**: Seed `rubric-library.md` once 2–3 more runs identify rubric items
215-
that actually discriminate (items that always pass are dead weight and belong
216-
in the postmortem, not the library). Build `diff_runs.py` on top of
217-
`score_report.py`'s claim/citation extraction rather than duplicating it: align
218-
sections by the M1 fixed order, then surface confident specifics appearing in
219-
only one report as hallucination candidates.
207+
deliberately deferred. (`scripts/score_report.py` shipped in 2.2.0 and gained
208+
citation-coverage/applicability scoring in 2.3.0 after the third live run.)
209+
- **Why it matters**: Across three runs there are now two confirmed
210+
discriminating rubric patterns: the per-tactic evidence floor (2026-07-12)
211+
and complete benchmark metadata or an unusable verdict (2026-08-22). That is
212+
still thin for a reusable library. The third run also proved manual cross-run
213+
diffing valuable, but only one of three reports preserved M1's exact section
214+
structure and two exports had opaque claim-to-URL linkage.
215+
- **Next**: Seed `rubric-library.md` after one more cross-domain run identifies
216+
a reusable discriminating item. Build `diff_runs.py` only after another
217+
multi-run exercise establishes a tolerant alignment strategy for missing,
218+
added, and reordered sections; reuse `score_report.py`'s normalized citation
219+
coverage instead of assuming every export carries direct URLs.
220220

221221
### skills-health: many canonical dojo skills aren't installed globally, so they're unmeasurable
222222
- **What**: As of 2026-07-15, 26 of 57 canonical `skills/` are installed in none

docs/project/ROADMAP.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ standing membership record._
5555
| Add research-architect skill | Deep-research prompt engineering from composable skeleton blocks, pluggable execution routing, executor-independent report verification, postmortem memory; stakes-based trigger split with deep-research (bumped to 2.0.0 as its execution backend) |
5656
| Harden research orchestration from first live run | `research-architect` 2.0.0 formalizes verified multi-run synthesis as stage 9, moves postmortem to stage 10, closes nine stage-seam findings, and hardens prompt linting; `deep-research` 2.1.0 replaces self-declared credibility with conservative URL-host registry scoring and explainable provenance fields |
5757
| Act on the second live research run | `research-architect` 2.2.0 splits source ranking into reliability vs. edge-relevance × recency (one ranking biased "what works now" questions toward "already arbitraged away"), defaults stages 3/5/8 to fresh subagents, verifies nodes as they land, lints statistics seeded without a retrievable source, and adds `score_report.py` for the stage-8 structural pass — sampling weighted toward quantitative and attribution claims, the dominant failure mode across every executor profiled. Skeleton stayed net-zero on shipped instruction count (3 additions, 3 deletions). `deep-research` 2.2.0 registers on-chain explorers and code hosts, which previously scored as unknown domains. `skill-evals` 1.3.0 exempts append-only run memory from release-version checks |
58+
| Act on the third live research run | `research-architect` 2.3.0 catches real-but-wrong-domain citations, forbids claims about un-ingested artifacts, makes merge structure checkable, and separates citation support from applicability. `score_report.py` now classifies direct/resolvable/opaque/absent coverage, resolves explicit `[n]` bibliography markers, refuses false hit rates when an export loses claim-to-URL linkage, and reports a usable-citation rate. Dated profiles capture the three external web DR executors without promoting one-run quirks into universal workflow rules |
5859
| Preserve verified first-party research sources | `deep-research` 2.3.0 adds registry-owned root/subdomain matching for first-party model, coding-harness, protocol, and agent-framework documentation. Relevant verified priority sources no longer disappear solely because an aggregate lexical score falls below threshold; retained exceptions carry an explicit reason and confidence gap, while off-topic, duplicate, lookalike, and over-budget controls remain intact. |
5960
| Harden spec/plan validation from cross-repo dogfooding | `write-spec` and `write-plan` 2.1.0 require meaningful acceptance magnitudes when trivial output could pass, define behavior-preserving reference oracles on result-deciding edge inputs, and map fixes across the whole defect/property class. Narrow validator advisories flag obvious weak checks without becoming schema gates. `write-plan` now resolves linked specs and modified files from the consumer plan's Git root, with an explicit override and documented no-Git fallback. |
6061
| Design systems layer | Added `design-md` (Google `@google/design.md` CLI wrapper) and `design-critique` (closed 37-pattern slop catalog with structured findings) plus 5 Refero exemplars; sibling-skills footer convention disambiguates the four-skill design pipeline |

skills.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,7 @@
201201
"name": "research-architect",
202202
"description": "Engineer high-quality deep-research prompts and orchestrate their execution and verification. Use when the user wants to draft, improve, or critique a research prompt or brief; commission or plan a multi-source or multi-model research run; run research through external deep-research products (Claude/OpenAI/Gemini DR); or verify and score a research report that something else produced. Triggers on \"research prompt\", \"research brief\", \"commission research\", \"plan a research run\", \"verify this report\", \"research architect\". For a direct low-stakes lookup where the user just wants the answer, use deep-research instead.",
203203
"path": "skills/research-architect",
204-
"version": "2.2.2",
204+
"version": "2.3.0",
205205
"triggers": [
206206
"research prompt",
207207
"research brief",

skills/research-architect/CHANGELOG.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,24 @@
1+
## 2.3.0 - 2026-08-23
2+
3+
Acts on the 2026-08-22 coding-harnesses postmortem (three-run web DR merge).
4+
5+
- **A4 checks domain and population fit** before a benchmark, dataset, or study
6+
supports a major claim; real sources imported from adjacent domains no longer
7+
pass merely because they exist.
8+
- **A6 forbids characterizing un-ingested artifacts**, including contents,
9+
size, structure, and metadata. Two executors invented contradictory specifics
10+
about the same ZIP after admitting they could not open it.
11+
- **A9 rejects costless rubric escape hatches**, and M1 merge runs put exact
12+
section order plus summary/self-report presence into the shipped rubric.
13+
- **Stage 8 separates source support from applicability** and treats self-
14+
reported confidence as candor evidence rather than correctness evidence.
15+
- **`score_report.py` classifies citation coverage** as direct, resolvable,
16+
opaque, or absent; resolves explicit `[n]` bibliography markers; refuses
17+
false hit rates on blind exports; and reports support, domain-fit, and
18+
usable-citation rates.
19+
- Add dated profiles for Claude Opus 5, GPT-5.6-sol, and Gemini Flash 3.7 as
20+
external web DR executors.
21+
122
## 2.2.2 - 2026-08-14
223

324
- Anchor runnable script commands to <skill-dir> so they resolve outside a dojo checkout

skills/research-architect/SKILL.md

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
name: research-architect
33
description: Engineer high-quality deep-research prompts and orchestrate their execution and verification. Use when the user wants to draft, improve, or critique a research prompt or brief; commission or plan a multi-source or multi-model research run; run research through external deep-research products (Claude/OpenAI/Gemini DR); or verify and score a research report that something else produced. Triggers on "research prompt", "research brief", "commission research", "plan a research run", "verify this report", "research architect". For a direct low-stakes lookup where the user just wants the answer, use deep-research instead.
44
skill-type: workflow
5-
version: 2.2.2
5+
version: 2.3.0
66
triggers:
77
- research prompt
88
- research brief
@@ -198,28 +198,36 @@ nothing extra, pre-loads the cross-run diff, and can amend a still-pending
198198
node's prompt while amending is still cheap. Only step 3 genuinely needs all
199199
reports in hand.
200200

201-
1. **Structural pass (deterministic):** required sections present; summary
202-
block present; sample citations and fetch each — is the URL live, and does
203-
the page actually support the claim it's attached to? Record hit rate.
201+
1. **Structural pass (deterministic):** required sections present in exact
202+
order; parseable summary and complete A10 self-report (a–c) present; sample
203+
citations and fetch each — is the URL live, does it support the exact claim,
204+
and does its domain/population fit the report's use? Record support,
205+
applicability, and usable-citation rates.
204206
`scripts/score_report.py` does the mechanical half:
205207

206208
```bash
207209
python3 <skill-dir>/scripts/score_report.py worksheet report.md > 08-worksheet.json
208210
# each sampled check is one claim/citation pair: fetch its url, then fill
209-
# "verdicts" with supported / partial / unsupported / unreachable
211+
# "verdicts" (supported/partial/unsupported/unreachable) and
212+
# "applicability" (fit/adjacent/mismatch)
210213
python3 <skill-dir>/scripts/score_report.py score 08-worksheet.json
211214
```
212215

213216
Checks are per **claim/citation pair**, not per claim — a claim resting on
214217
three citations is three things to fetch, and one citation refuting it must
215218
not be hidden by another supporting it.
216219

220+
If `citation_coverage.status` is `opaque` or `absent`, do not report a hit
221+
rate. Obtain an export with retrievable links or map the citations manually;
222+
an empty sample from a blind instrument is not a clean result.
223+
217224
The sample is **weighted toward quantitative and source-attribution
218225
claims**: across every executor profiled so far, mutated numbers and
219226
mischaracterized findings are the dominant failure mode, and a uniform
220227
sample under-tests exactly where reports break. The script never fetches —
221228
deciding whether a page supports its claim is the judgment this stage
222229
exists for, and a "URL resolves" hit rate would be worse than none.
230+
Treat self-reported confidence as evidence of candor, never correctness.
223231
2. **Rubric pass (judgment):** spawn a fresh critique subagent — one that has
224232
not seen the drafting stages — to score the report against the shipped
225233
rubric, item by item, with evidence quotes. Pass/fail per item, not vibes.
@@ -244,8 +252,9 @@ the final synthesis and this stage is skipped.
244252

245253
From the report's self-report (block A10 for external reports; the packet's
246254
`self_report` field for local `deep-research` runs) plus verification results,
247-
record: which instructions were followed, ignored, or misread; citation hit
248-
rate; which rubric items discriminated (items that always pass are dead
255+
record: which instructions were followed, ignored, or misread; citation support,
256+
applicability, and usable-citation rates; which rubric items
257+
discriminated (items that always pass are dead
249258
weight). Then append durable lessons to two shared files:
250259

251260
- `references/postmortems.md` — dated lessons about the *skeleton and process*
@@ -290,8 +299,9 @@ the report.
290299
`docs/research/` in the repo the research serves).
291300
- The primary deliverables: one assembled, linted prompt per executor
292301
(`04-prompt-<executor>.md`), and after execution a verification verdict
293-
(`08-verification.md`) with citation hit rate and per-rubric-item scores; a
294-
multi-run plan also produces one decision-ready `09-synthesis.md`.
302+
(`08-verification.md`) with citation support, applicability, usable-citation,
303+
and per-rubric-item scores; a multi-run plan also produces one decision-ready
304+
`09-synthesis.md`.
295305
- Every report, regardless of executor, ends in the same summary block the
296306
`deep-research` skill emits (`key_findings` / `citations` /
297307
`confidence_gaps` / `next_queries`) — the interchange shape stage 8 consumes.
@@ -302,7 +312,7 @@ the report.
302312
shipping — zero unfilled slots, zero drafting comments, budget respected.
303313
- Stage 5 ran and deleted (not just added) instructions, or the router
304314
explicitly waived it as a quick run.
305-
- Stage 8 verdicts cite evidence: citation hit rate from real fetches,
315+
- Stage 8 verdicts cite evidence: support/applicability rates from real fetches,
306316
pass/fail per rubric item with quotes — never vibes.
307317
- Multi-run stage 9 synthesis contains only stage-8-accepted claims and
308318
preserves unresolved disagreements.
@@ -323,9 +333,10 @@ the report.
323333
memory; read at stages 2–5, append at stage 10. Append-only run memory:
324334
exempt from the repo's skill release-version check, so recording a lesson
325335
never costs a version bump.
326-
- `scripts/score_report.py` — stage-8 structural pass: `worksheet` extracts
327-
claims and citations and samples what to check; `score` computes the hit rate
328-
from your verdicts. Never fetches.
336+
- `scripts/score_report.py` — stage-8 structural pass: `worksheet` classifies
337+
citation coverage, extracts resolvable claim/citation pairs, and samples what
338+
to check; `score` computes support, applicability, and usable-citation rates.
339+
Never fetches.
329340
- `evals/golden-questions/` — frozen real-run drafting artifacts used as
330341
regression seeds. Still deferred until more runs justify them:
331342
`scripts/diff_runs.py` and `references/rubric-library.md`; until then, diff

skills/research-architect/references/executor-profiles.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@ Observed behavior of specific executors, appended at stage 10. Read at stages
44
2–4 to calibrate prompts and at stage 3 to seed scout expectations. Date every
55
entry — access and behavior drift.
66

7+
## Index
8+
9+
- [Claude Code terminal harness](#claude-code-terminal-harness-webfetchwebsearch--as-of-2026-07-12)
10+
- [Sonnet terminal executor](#sonnet-subagent-as-pipelineresearch-executor--as-of-2026-07-12)
11+
- [Gemini Deep Research](#gemini-deep-research-web--as-of-2026-07-12-one-full-run--verification)
12+
- [Claude Opus 5 web DR](#claude-opus-5-as-external-web-dr-executor--as-of-2026-08-22)
13+
- [GPT-5.6-sol web DR](#gpt-56-sol-as-external-web-dr-executor--as-of-2026-08-22)
14+
- [Gemini Flash 3.7 web DR](#gemini-flash-37-as-external-web-dr-executor--as-of-2026-08-22)
15+
716
## Claude Code terminal harness (WebFetch/WebSearch) — as of 2026-07-12
817

918
- X/Twitter: 402 on direct fetch. Reddit: hard-blocked on both `www` and
@@ -66,3 +75,42 @@ entry — access and behavior drift.
6675
base64 image data at the end of the export; strip before downstream
6776
processing. Citation markers are superscript numbers that survive export as
6877
bare digits mid-sentence.
78+
79+
## Claude Opus 5 as external web DR executor — as of 2026-08-22
80+
81+
- **Best primary sourcing and A10 candor of the three-run comparison.** It
82+
admitted search-budget exhaustion and an unopenable dataset rather than
83+
claiming full compliance.
84+
- **Strongest on operational specifics:** quota-exhaustion behavior, dated
85+
incident history, and vendor-conceded negatives.
86+
- **Observed failures:** artifact-metadata date drift; selective enumeration
87+
favoring its own vendor; and Recommendations/Caveats appended beyond a fixed
88+
section contract. Restate structural compliance in the rubric for merge runs.
89+
- Export carried no retrievable claim-to-URL mapping, so the citation worksheet
90+
must classify it as opaque and require manual mapping or a better export.
91+
92+
## GPT-5.6-sol as external web DR executor — as of 2026-08-22
93+
94+
- **Most methodologically skeptical of the three.** It downgraded the strongest
95+
benchmark with six stated reasons, caught a model mismatch in the compaction
96+
probe, and refused unsupported comparative rankings.
97+
- Parses an attached brief into an extracted-requirements table, providing a
98+
useful compliance signal. Numeric confidence was calibrated, and it volunteered
99+
the desk-research-only limitation.
100+
- **Observed failures:** artifact-metadata drift, verbosity, missing top-level
101+
sections, and opaque `citeturn...` markers after export. Obtain a link-preserving
102+
export or map citations manually before scoring.
103+
104+
## Gemini Flash 3.7 as external web DR executor — as of 2026-08-22
105+
106+
- **Highest surface polish, lowest reliability in this comparison.** All three
107+
refuted claims were its: an inverted compaction result, doubled task count, and
108+
a real benchmark imported from an unrelated domain with the magnitude changed.
109+
- Confidence was anti-correlated with accuracy: it rated the most-wrong section
110+
High and omitted A10(c).
111+
- Structural/export failures extended the 2026-07-12 profile: invalid requested
112+
summary shape, appended Works cited list, ambiguous bare-digit markers, and a
113+
broken base64 image reference.
114+
- **Routing:** do not use this executor alone for verification-heavy questions.
115+
It can serve as an adjudicative run only when Stage 8 independently verifies
116+
every claim used downstream.

0 commit comments

Comments
 (0)