Software Research
What this does
Turns one software-engineering question into a verified, multi-perspective
deliverable. It picks a research mode, simulates that mode's expert lenses,
maps where they contradict, synthesizes an HTML briefing plus a Markdown or ADR
record, then adversarially verifies every claim against its primary source —
version-aware — before delivering. Run the full pipeline; do not shortcut a phase.
Portability
Self-contained. Built-in tools only (Agent general-purpose, Write, web
search/fetch inside agents) plus the files in this folder. Drop the folder into
any .claude/skills/ directory and it works.
Phase 0: Scope & detect the mode
- If
$ARGUMENTS has the question, use it; else ask what to research.
- Read
data/modes.csv. Match the question against each row's signals
(semicolon-delimited cues). Pick the best-matching mode_id.
- If two+ modes match with similar confidence, ask the user which mode
(offer the matching modes + one-line descriptions). Otherwise proceed.
- If nothing matches, use
deep-research (the fallback).
- State the chosen mode + your one-line interpretation of the question. The
user may override the mode.
- Identify the reader role (developer / tech-lead / architect) from context;
default
tech-lead.
- Derive a kebab-case
topic-slug for filenames.
- Gate 1 — confirm scope (one pause). Show a compact block and wait for the
user to confirm or redirect before spawning any agents:
Mode: <mode_id> — <one-line why this mode>
Question: <your one-line interpretation>
Reader: <developer | tech-lead | architect>
Lenses: <the N lens names about to run in parallel>
Outputs: <primary + secondary format, e.g. HTML briefing + MD>
Then: adversarial verification against primary sources.
Proceed? (or correct the mode / scope)
This is the one place to catch a wrong mode or misread scope cheaply — before
spending ~9-12 agents. Once confirmed, run Phases 1–3 autonomously (no more
pauses until Gate 2).
Phase 1: Parallel expert lenses
Open references/modes/{mode_id}.md — it contains the exact lens prompts for
this mode. Spawn that mode's lenses as general-purpose agents in a single
message so they run concurrently. Give every agent the SAME question frame plus:
- its lens prompt (from the mode file),
- the source hierarchy + verification expectations from
references/source-hierarchy.md (paste the tier list + all 7 rules — including
Rule 7: load-bearing claims must resolve to Tier 1–3, never a blog/Q&A),
- the instruction to return EXACTLY: (1) CORE POSITION in 2 sentences;
(2) STRONGEST EVIDENCE, 3-5 bullets, each with a concrete data point + a
primary-source URL and the version/date the claim applies to;
(3) THE ONE THING only this lens would say. Under 400 words. Real fetched
sources only — no invented studies, numbers, or URLs.
As each lens returns, append its brief to a working scratch file
software-research-reports/{topic-slug}.work.md (create it now) under a
## Lens: <name> heading. Writing briefs as they land means a crash mid-run
loses nothing — the run is resumable from what's already on disk. Set the
run-state block at the top of that file: stepsCompleted: [0, 1].
When all return, post a 2-3 line note in chat: convergence + sharpest
disagreement. Keep raw briefs out of chat.
❌ Common failures here:
- Citing a blog / SO answer / model memory as proof instead of climbing to the
primary source behind it (Rule 3 + Rule 7). The blog locates the fact; the
primary is the fact.
- Presenting an unversioned claim as current — "X does Y" with no version is
unverified (Rule 1).
- Letting one loud lens set the narrative before the others return; wait for all N.
Phase 2: Map the contradictions (inline, no agents)
From the briefs only, determine:
- Direct conflicts — name the specific clashing claims.
- Strongest vs weakest evidence — rank by source tier (Tier 1 primary/spec >
Tier 2 security/aggregator > Tier 3 registry > Tier 4 benchmark > Tier 5 survey).
- The resolving question — the single empirical test that settles the biggest conflict.
- Universal agreement — what every lens confirms (load-bearing finding).
- The blind spot — what NO lens addressed (missing 6th lens → frontier question).
Append this map to the scratch file under ## Contradiction map and bump the
run-state to stepsCompleted: [0, 1, 2]. The map is the raw material for the
synthesis; not a separate deliverable.
Phase 3: Synthesize the output(s)
Read the mode's primary_output and secondary_output from data/modes.csv.
Before writing any output, load references/report-structure.md. It defines the
concreteness contract (specific > generic: exact versions, real commands/config/
code, real numbers, tied to THE READER's stack — and a ban list of filler phrases) and
the 12-section deep spine. Detail is not optional padding: a report earns its length
by being practical and about the reader's situation, not a survey of the topic.
- For
html: clone assets/briefing-template.html; do not rebuild the CSS.
Fill every {{TOKEN}}. It has two layers: (a) the fast-scan layer up top —
verdict scoreboard, key findings, and (for option-comparison modes) the Side-by-Side
table — so the answer lands in five seconds; then (b) the 12-section deep body
(sections 06–16) that carries the full spine. Fill the deep sections per the
concreteness contract; render comparisons/numbers/flows with widgets, not prose.
- For
md: the full 12-section spine from references/report-structure.md —
introduction/methodology, landscape, implementation how-to, stack, integration,
performance, security, recommendation, roadmap, risks, methodology, and a closing
References appendix. This is the detailed report; make each section concrete. In the
References appendix every source is a clickable [title — version/date](url) Markdown
link (never a bare URL in a table cell — those don't reliably render as links).
- For
adr: clone assets/adr-template.md; fill the MADR sections (Context,
Decision Drivers, Considered Options, Decision Outcome, Consequences, Pros/Cons
per option, More Information) and the closing References section. Document
rejected options + why. The ADR stays a lean decision record — no 12-section spine —
but the concreteness contract still applies (name versions, cite specifics).
Write for a busy engineer, not a journal. Short sentences, plain words, lead
with the answer. Define any unavoidable term inline. If a reader needs a
dictionary to parse a finding, rewrite it.
Add a visualization when it earns its place. assets/widgets/ holds ~45 drop-in,
zero-dependency visual blocks (inline SVG / CSS / a little vanilla JS). Read
assets/widgets/README.md — it has the full catalog grouped by job (compare &
decide, numbers & evidence, explain how it works, sequence over time, org &
management, inline accents) plus a numbered "which visual to use" decision order.
Pick by what the content is, not by novelty; copy the file, replace its FILL:
markers. A few high-use anchors: comparison-matrix (options × criteria),
weighted-decision-matrix (ADR scoring), metric-bars (benchmark/cost/size),
evidence-confidence (per-finding trust), callout (gotchas/warnings),
verdict-card (the recommendation), and slider-metric (the one interactive
"drag it" widget — at most one per report).
Default to the zero-dependency widgets: they render instantly, work offline, print,
and can't be blanked by a CDN outage or a runtime handshake failing. For any
tree/graph/diagram the widgets use hand-placed coordinates — don't auto-layout.
Reach for a library only for what bespoke SVG is bad at: a standard flow/sequence/ER
diagram easier written as text → Mermaid (pinned, securityLevel:'strict'); real
quantitative data at scale → Chart.js; code snippets that need syntax coloring →
code-compare (it loads highlight.js pinned+SRI — include that block once per report,
set class="language-…" per snippet). Then pin the version + prefer SRI/inline over
a bare CDN <script>. If you let the model generate arbitrary widget JS rather than
filling a template, sandbox it (iframe sandbox="allow-scripts" without
allow-same-origin, CSP blocking connect-src) — generated markup is untrusted code
in the report's origin; SRI does not help there. Full rules in assets/widgets/README.md.
Write outputs to software-research-reports/ (create if needed):
- HTML →
{topic-slug}-briefing.html
- MD →
{topic-slug}.md; ADR → ADR-{topic-slug}.md
❌ Common failures here:
- Burying the recommendation under prose — the scoreboard and Bottom Line exist
so the reader gets the answer before the detail.
- Academic / oblique phrasing that reads as clever but doesn't inform.
- For an X-vs-Y question, skipping the comparison table (the reader wants the
side-by-side).
Phase 4: Adversarial verification (mandatory)
Gate 2 — confirm findings before verifying (one pause). With the draft
synthesized, post a tight list in chat: the recommendation, the 3–5 key findings,
and which claims are load-bearing (the recommendation rests on them). Ask the
user to confirm the finding set / flag anything to scrutinize harder. This is the
last cheap moment to redirect before spending verifier agents. Then run 4a–4c.
verify_depth comes from data/modes.csv (full = every citation; load-bearing
= the claims the recommendation rests on — still mandatory).
4a. Self-review (inline). Score each finding 1-10 for reliability (by source
tier, not confidence) and justify. Identify the weakest link + what would verify
it. Bias check: which lens dominated, what got underweighted. Name the missing
6th lens. Assign an honest overall grade.
4b. Verify citations (parallel agents). Spawn general-purpose agents in one
message, one per citation cluster (~4-6). Each prompt: independently verify the
claim against its PRIMARY source, applying all 7 rules in
references/source-hierarchy.md (version-bind; check current-version validity;
climb to primary; date-stamp; security via OSV/GHSA + version range; benchmarks
need reproducible methodology; load-bearing claims must resolve to Tier 1–3).
Return VERDICT = CONFIRMED / PARTIALLY CONFIRMED (list corrections) / UNVERIFIED /
FALSE / VERSION-STALE / UNVERIFIED-LOWTIER (a load-bearing claim backed only by
Tier 5–6 — no primary found), the corrected one-line citation with version+date,
and 2-4 specifics with the primary URL. Under 280 words.
4c. Apply corrections. Fix wrong figures/titles/dates/versions. Downgrade
confidence where evidence is thin; demote contested/preprint/version-stale AND
UNVERIFIED-LOWTIER claims into the contested sidebar (a load-bearing claim with no
primary backing must not stand as a finding). Fill the verification banner
(N checked · X corrected · Y demoted · Z version-stale) and per-citation status
tags. Populate the claim-safety guide (assert / caveat / avoid), the version-currency
note, and confirm every source appears in the References section. Bump the run-state
to stepsCompleted: [0, 1, 2, 3, 4].
❌ Common failures here:
- Skipping verification because the findings "look plausible" — plausible-but-wrong
is exactly what an LLM panel produces; the verifier is the guard.
- Leaving a load-bearing claim backed only by a blog/SO answer in the main findings
instead of demoting it (Rule 7 →
UNVERIFIED-LOWTIER).
- Verifier "confirming" from memory instead of fetching the primary source.
Output
- Deliverables: the post-verification HTML + MD/ADR in
software-research-reports/.
- Open the HTML with the platform opener: macOS
open <path>, Linux
xdg-open <path>, Windows start "" <path>. If unclear, print the path.
- Chat summary: file paths; verification tally; the one universal finding; the
recommendation + its load-bearing claim; the frontier question; the
claim-safety summary (safe to assert vs avoid). Keep it tight.
Notes & guardrails
- Web search is required. The lenses and verifiers depend on fetching live
primary sources. If web search/fetch is unavailable inside the agents, abort and
tell the user — never answer version- or security-sensitive software questions
from training data alone; a model's memory is Tier 6 and goes stale.
- Real research only. Every lens and citation traces to a real, fetched
primary source with a version/date. If a figure can't be verified, demote or
cut it; never paper over it.
- Prefer official docs over Q&A. A load-bearing claim must resolve to Tier 1–3
(official docs/specs, security DBs, registries). Blogs, Stack Overflow, Medium,
and model memory are signposts to find the primary — never proof on their own.
- Specific and practical, never generic. Name exact versions; show real commands/
config/code; use real numbers; tie every recommendation to the reader's stack, team,
and scale. Cut any sentence that describes a category instead of stating a fact
("offers robust support for…", "is widely used…", "can help improve performance…").
If a sentence wouldn't change what the reader does, delete it. Full contract +
good/bad example in
references/report-structure.md.
- Scratch file.
{topic-slug}.work.md holds lens briefs + the contradiction
map for resumability; it is a working artifact, not a deliverable. Leave it in
place (a resumed or re-run pass can reuse it); the deliverables are the HTML/MD/ADR.
- Version-aware. "X does Y" is only valid as "…in version N". Flag deprecated
or version-stale claims; never present stale info as current.
- The panel is author-built. Disclose it. Lens agreement is a strong
hypothesis, not field consensus.
- Reliability = source-tier evidence quality, not confidence.
- Cost. ~9-12 agents per run (lenses + verifiers). Expected. Don't fan wider
than the mode's lenses / one verifier per citation cluster.
- Design. Keep the HTML template CSS verbatim (clean white, Montserrat /
Roboto Mono, blue accent).
1---2name: software-research3description: Use when someone asks to research a software-engineering question through a verified, multi-perspective lens — "should we use X vs Y", "evaluate library/framework/database Z", "research whether we should adopt …", "write an ADR for …", "spike on …", or "migrate from X to Y / upgrade path". Runs a STORM-style pipeline specialized for software: auto-detects one of five research modes (library-eval, deep-research, architecture, spike, migration), spawns that mode's expert lenses in parallel, maps their contradictions, synthesizes an HTML briefing and a Markdown/ADR record, then adversarially verifies every claim against PRIMARY software sources (official docs, RFCs, GitHub releases, OSV/CVE, OpenSSF Scorecard, benchmarks) with version-awareness. Best for decisions where multiple viewpoints and version-correct, fact-checked claims matter; overkill for a quick API lookup. For non-software topics use deep-research; for a pure scored decision matrix use trade-off-analysis.4---5
6# Software Research
7
8## What this does
9
10Turns one software-engineering question into a verified, multi-perspective
11deliverable. It picks a research mode, simulates that mode's expert lenses,
12maps where they contradict, synthesizes an HTML briefing plus a Markdown or ADR
13record, then adversarially verifies every claim against its primary source —
14version-aware — before delivering. Run the full pipeline; do not shortcut a phase.
15
16## Portability
17
18Self-contained. Built-in tools only (`Agent` general-purpose, `Write`, web
19search/fetch inside agents) plus the files in this folder. Drop the folder into
20any `.claude/skills/` directory and it works.
21
22## Phase 0: Scope & detect the mode
23
241. If `$ARGUMENTS` has the question, use it; else ask what to research.
252. Read `data/modes.csv`. Match the question against each row's `signals`
26 (semicolon-delimited cues). Pick the best-matching `mode_id`.
27 - If two+ modes match with similar confidence, **ask the user which mode**
28 (offer the matching modes + one-line descriptions). Otherwise proceed.
29 - If nothing matches, use `deep-research` (the fallback).
303. State the chosen mode + your one-line interpretation of the question. The
31 user may override the mode.
324. Identify the **reader role** (developer / tech-lead / architect) from context;
33 default `tech-lead`.
345. Derive a kebab-case `topic-slug` for filenames.
356. **Gate 1 — confirm scope (one pause).** Show a compact block and wait for the
36 user to confirm or redirect before spawning any agents:
37 ```
38 Mode: <mode_id> — <one-line why this mode>
39 Question: <your one-line interpretation>
40 Reader: <developer | tech-lead | architect>
41 Lenses: <the N lens names about to run in parallel>
42 Outputs: <primary + secondary format, e.g. HTML briefing + MD>
43 Then: adversarial verification against primary sources.
44 Proceed? (or correct the mode / scope)
45 ```
46 This is the one place to catch a wrong mode or misread scope cheaply — before
47 spending ~9-12 agents. Once confirmed, run Phases 1–3 autonomously (no more
48 pauses until Gate 2).
49
50## Phase 1: Parallel expert lenses
51
52Open `references/modes/{mode_id}.md` — it contains the exact lens prompts for
53this mode. Spawn that mode's lenses as **`general-purpose` agents in a single
54message** so they run concurrently. Give every agent the SAME question frame plus:
55- its lens prompt (from the mode file),
56- the source hierarchy + verification expectations from
57 `references/source-hierarchy.md` (paste the tier list + all 7 rules — including
58 Rule 7: load-bearing claims must resolve to Tier 1–3, never a blog/Q&A),
59- the instruction to return EXACTLY: (1) CORE POSITION in 2 sentences;
60 (2) STRONGEST EVIDENCE, 3-5 bullets, each with a concrete data point + a
61 **primary-source URL** and **the version/date the claim applies to**;
62 (3) THE ONE THING only this lens would say. Under 400 words. Real fetched
63 sources only — no invented studies, numbers, or URLs.
64
65As each lens returns, append its brief to a working scratch file
66`software-research-reports/{topic-slug}.work.md` (create it now) under a
67`## Lens: <name>` heading. Writing briefs as they land means a crash mid-run
68loses nothing — the run is resumable from what's already on disk. Set the
69run-state block at the top of that file: `stepsCompleted: [0, 1]`.
70
71When all return, post a 2-3 line note in chat: convergence + sharpest
72disagreement. Keep raw briefs out of chat.
73
74❌ **Common failures here:**
75- Citing a blog / SO answer / model memory *as proof* instead of climbing to the
76 primary source behind it (Rule 3 + Rule 7). The blog locates the fact; the
77 primary *is* the fact.
78- Presenting an unversioned claim as current — "X does Y" with no version is
79 unverified (Rule 1).
80- Letting one loud lens set the narrative before the others return; wait for all N.
81
82## Phase 2: Map the contradictions (inline, no agents)
83
84From the briefs only, determine:
851. **Direct conflicts** — name the specific clashing claims.
862. **Strongest vs weakest evidence** — rank by source tier (Tier 1 primary/spec >
87 Tier 2 security/aggregator > Tier 3 registry > Tier 4 benchmark > Tier 5 survey).
883. **The resolving question** — the single empirical test that settles the biggest conflict.
894. **Universal agreement** — what every lens confirms (load-bearing finding).
905. **The blind spot** — what NO lens addressed (missing 6th lens → frontier question).
91
92Append this map to the scratch file under `## Contradiction map` and bump the
93run-state to `stepsCompleted: [0, 1, 2]`. The map is the raw material for the
94synthesis; not a separate deliverable.
95
96## Phase 3: Synthesize the output(s)
97
98Read the mode's `primary_output` and `secondary_output` from `data/modes.csv`.
99
100**Before writing any output, load `references/report-structure.md`.** It defines the
101**concreteness contract** (specific > generic: exact versions, real commands/config/
102code, real numbers, tied to THE READER's stack — and a ban list of filler phrases) and
103the **12-section deep spine**. Detail is not optional padding: a report earns its length
104by being practical and about the reader's situation, not a survey of the topic.
105
106- For `html`: clone `assets/briefing-template.html`; do not rebuild the CSS.
107 Fill every `{{TOKEN}}`. It has two layers: (a) the **fast-scan layer** up top —
108 verdict scoreboard, key findings, and (for option-comparison modes) the Side-by-Side
109 table — so the answer lands in five seconds; then (b) the **12-section deep body**
110 (sections 06–16) that carries the full spine. Fill the deep sections per the
111 concreteness contract; render comparisons/numbers/flows with widgets, not prose.
112- For `md`: the full **12-section spine** from `references/report-structure.md` —
113 introduction/methodology, landscape, implementation how-to, stack, integration,
114 performance, security, recommendation, roadmap, risks, methodology, and a closing
115 References appendix. This is the detailed report; make each section concrete. In the
116 References appendix every source is a clickable `[title — version/date](url)` Markdown
117 link (never a bare URL in a table cell — those don't reliably render as links).
118- For `adr`: clone `assets/adr-template.md`; fill the MADR sections (Context,
119 Decision Drivers, Considered Options, Decision Outcome, Consequences, Pros/Cons
120 per option, More Information) and the closing **References** section. Document
121 rejected options + why. The ADR stays a lean decision record — no 12-section spine —
122 but the concreteness contract still applies (name versions, cite specifics).
123
124**Write for a busy engineer, not a journal.** Short sentences, plain words, lead
125with the answer. Define any unavoidable term inline. If a reader needs a
126dictionary to parse a finding, rewrite it.
127
128**Add a visualization when it earns its place.** `assets/widgets/` holds ~45 drop-in,
129zero-dependency visual blocks (inline SVG / CSS / a little vanilla JS). **Read
130`assets/widgets/README.md`** — it has the full catalog grouped by job (compare &
131decide, numbers & evidence, explain how it works, sequence over time, org &
132management, inline accents) plus a numbered "which visual to use" decision order.
133Pick by what the content is, not by novelty; copy the file, replace its `FILL:`
134markers. A few high-use anchors: `comparison-matrix` (options × criteria),
135`weighted-decision-matrix` (ADR scoring), `metric-bars` (benchmark/cost/size),
136`evidence-confidence` (per-finding trust), `callout` (gotchas/warnings),
137`verdict-card` (the recommendation), and `slider-metric` (the one interactive
138"drag it" widget — at most one per report).
139
140Default to the zero-dependency widgets: they render instantly, work offline, print,
141and can't be blanked by a CDN outage or a runtime handshake failing. For any
142tree/graph/diagram the widgets use **hand-placed coordinates** — don't auto-layout.
143Reach for a library only for what bespoke SVG is bad at: a standard flow/sequence/ER
144diagram easier written as text → Mermaid (pinned, `securityLevel:'strict'`); real
145quantitative data at scale → Chart.js; **code snippets that need syntax coloring →
146`code-compare` (it loads highlight.js pinned+SRI — include that block once per report,
147set `class="language-…"` per snippet)**. Then pin the version + prefer SRI/inline over
148a bare CDN `<script>`. **If you let the model generate arbitrary widget JS rather than
149filling a template, sandbox it** (iframe `sandbox="allow-scripts"` without
150`allow-same-origin`, CSP blocking `connect-src`) — generated markup is untrusted code
151in the report's origin; SRI does not help there. Full rules in `assets/widgets/README.md`.
152
153Write outputs to `software-research-reports/` (create if needed):
154- HTML → `{topic-slug}-briefing.html`
155- MD → `{topic-slug}.md`; ADR → `ADR-{topic-slug}.md`
156
157❌ **Common failures here:**
158- Burying the recommendation under prose — the scoreboard and Bottom Line exist
159 so the reader gets the answer before the detail.
160- Academic / oblique phrasing that reads as clever but doesn't inform.
161- For an X-vs-Y question, skipping the comparison table (the reader wants the
162 side-by-side).
163
164## Phase 4: Adversarial verification (mandatory)
165
166**Gate 2 — confirm findings before verifying (one pause).** With the draft
167synthesized, post a tight list in chat: the recommendation, the 3–5 key findings,
168and which claims are **load-bearing** (the recommendation rests on them). Ask the
169user to confirm the finding set / flag anything to scrutinize harder. This is the
170last cheap moment to redirect before spending verifier agents. Then run 4a–4c.
171
172`verify_depth` comes from `data/modes.csv` (`full` = every citation; `load-bearing`
173= the claims the recommendation rests on — still mandatory).
174
175**4a. Self-review (inline).** Score each finding 1-10 for reliability (by source
176tier, not confidence) and justify. Identify the weakest link + what would verify
177it. Bias check: which lens dominated, what got underweighted. Name the missing
1786th lens. Assign an honest overall grade.
179
180**4b. Verify citations (parallel agents).** Spawn `general-purpose` agents in one
181message, one per citation cluster (~4-6). Each prompt: independently verify the
182claim against its PRIMARY source, applying all **7 rules** in
183`references/source-hierarchy.md` (version-bind; check current-version validity;
184climb to primary; date-stamp; security via OSV/GHSA + version range; benchmarks
185need reproducible methodology; **load-bearing claims must resolve to Tier 1–3**).
186Return VERDICT = CONFIRMED / PARTIALLY CONFIRMED (list corrections) / UNVERIFIED /
187FALSE / VERSION-STALE / **UNVERIFIED-LOWTIER** (a load-bearing claim backed only by
188Tier 5–6 — no primary found), the corrected one-line citation with version+date,
189and 2-4 specifics with the primary URL. Under 280 words.
190
191**4c. Apply corrections.** Fix wrong figures/titles/dates/versions. Downgrade
192confidence where evidence is thin; demote contested/preprint/version-stale AND
193`UNVERIFIED-LOWTIER` claims into the contested sidebar (a load-bearing claim with no
194primary backing must not stand as a finding). Fill the verification banner
195(`N checked · X corrected · Y demoted · Z version-stale`) and per-citation status
196tags. Populate the claim-safety guide (assert / caveat / avoid), the version-currency
197note, and confirm every source appears in the References section. Bump the run-state
198to `stepsCompleted: [0, 1, 2, 3, 4]`.
199
200❌ **Common failures here:**
201- Skipping verification because the findings "look plausible" — plausible-but-wrong
202 is exactly what an LLM panel produces; the verifier is the guard.
203- Leaving a load-bearing claim backed only by a blog/SO answer in the main findings
204 instead of demoting it (Rule 7 → `UNVERIFIED-LOWTIER`).
205- Verifier "confirming" from memory instead of fetching the primary source.
206
207## Output
208
2091. Deliverables: the post-verification HTML + MD/ADR in `software-research-reports/`.
2102. Open the HTML with the platform opener: macOS `open <path>`, Linux
211 `xdg-open <path>`, Windows `start "" <path>`. If unclear, print the path.
2123. Chat summary: file paths; verification tally; the one universal finding; the
213 recommendation + its load-bearing claim; the frontier question; the
214 claim-safety summary (safe to assert vs avoid). Keep it tight.
215
216## Notes & guardrails
217
218- **Web search is required.** The lenses and verifiers depend on fetching live
219 primary sources. If web search/fetch is unavailable inside the agents, abort and
220 tell the user — never answer version- or security-sensitive software questions
221 from training data alone; a model's memory is Tier 6 and goes stale.
222- **Real research only.** Every lens and citation traces to a real, fetched
223 primary source with a version/date. If a figure can't be verified, demote or
224 cut it; never paper over it.
225- **Prefer official docs over Q&A.** A load-bearing claim must resolve to Tier 1–3
226 (official docs/specs, security DBs, registries). Blogs, Stack Overflow, Medium,
227 and model memory are signposts to find the primary — never proof on their own.
228- **Specific and practical, never generic.** Name exact versions; show real commands/
229 config/code; use real numbers; tie every recommendation to the reader's stack, team,
230 and scale. Cut any sentence that describes a category instead of stating a fact
231 ("offers robust support for…", "is widely used…", "can help improve performance…").
232 If a sentence wouldn't change what the reader does, delete it. Full contract +
233 good/bad example in `references/report-structure.md`.
234- **Scratch file.** `{topic-slug}.work.md` holds lens briefs + the contradiction
235 map for resumability; it is a working artifact, not a deliverable. Leave it in
236 place (a resumed or re-run pass can reuse it); the deliverables are the HTML/MD/ADR.
237- **Version-aware.** "X does Y" is only valid as "…in version N". Flag deprecated
238 or version-stale claims; never present stale info as current.
239- **The panel is author-built.** Disclose it. Lens agreement is a strong
240 hypothesis, not field consensus.
241- **Reliability = source-tier evidence quality**, not confidence.
242- **Cost.** ~9-12 agents per run (lenses + verifiers). Expected. Don't fan wider
243 than the mode's lenses / one verifier per citation cluster.
244- **Design.** Keep the HTML template CSS verbatim (clean white, Montserrat /
245 Roboto Mono, blue accent).