Source: BMAD Recon Β·
bmad-recon.mdΒ· updated 2026-07-25 Β· π secret gistSynced verbatim from gist.github.com/bl9.
BMAD Deep Recon β Complete Guide
Covers PR #2611 (merged 23 Jul 2026) and docs/explanation/deep-recon.md. Written for someone with zero BMAD background, then applied to two concrete features: user recommendation and multilingual translation.
Reading order.
bmad-deep-recon-foundations.mdβ what every term means and where its name came from. Thenbmad-deep-recon-howto.mdβ concept-by-concept, exactly what you type and what comes back (plus how to apply the same techniques in plain Claude, without BMAD). Then this document β applied domains, epistemology, and task-driven walkthroughs.
Contents
- 0. The short, honest answer to "how useful is this?"
- 1. Background: BMAD concepts you need first
- 2. What PR #2611 actually changed
- 3. The three modes
- 4. Research types (the "packs")
- 5. How a native Run thinks
- 6. Why the reports hold up
- 7. The run folder, and research as a living asset
- 8. Where it sits in the BMAD lifecycle
- 9. Configuration
- 10. Research checkpoints across a feature's life
- 11. The full use-case catalog
- 12. Applied: a user recommendation feature
- 13. Deep dive: privacy and regulatory research
- 14. Deep dive: security and adversarial research
- 15. Deep dive: algorithm and technique-trend research
- 16. Applied: a multilingual translation feature
- 17. Deep dive: licensing, procurement and vendor risk
- 18. Best practices
- 19. Anti-patterns
- 20. Command cheat sheet
- 21. Transferable design lessons
- 22. The epistemology underneath all of this
- 23. Worked walkthroughs for software engineers
- Walkthrough A β Native Run: choosing an embedding model
- Walkthrough B β Draft β Process: the MT vendor landscape
- Walkthrough C β The compliance gate, done without fooling yourself
- Walkthrough D β Threat-modeling a ranking surface
- Walkthrough E β Refresh, three months later
- Walkthrough F β Deepen one dimension
- Walkthrough G β Headless refresh in CI
- Walkthrough H β The anti-walkthrough
- 23.9 Team integration patterns
- 23.10 Calibration β what to spend where
- 24. Sources
0. The short, honest answer to "how useful is this?"
Deep Recon is decision infrastructure, not feature-building infrastructure. It pays off only when the following are all true:
- You face a choice with real switching cost (a model, a vendor, an architecture, a metric definition, a locale strategy).
- The answer is not in your repo β it lives in vendor docs, benchmark papers, pricing pages, forum threads, standards documents.
- You will otherwise decide from the model's memory, which is stale and uncited.
It is not useful for:
- Writing the ranking service itself (that's
bmad-dev/ story workflows). - Anything answerable by reading your own codebase (that's
bmad-document-project). - Facts you already know cold.
Practical read for your two examples:
| Feature | Deep Recon value | Why |
|---|---|---|
| User recommendation (in an existing OpenSearch/HNSW stack) | High β but not where you'd guess | Index config, feature availability and latency budget are internal. The external decisions that matter are privacy and regulatory (Β§13), adversarial robustness (Β§14), offline-metric conventions, and licensing (Β§17). Embedding-model selection ranks below all of those, because it's the one you can cheaply A/B. |
| Multilingual translation | High | Vendor/model landscape moves fast, pricing is public and comparable, language-coverage and quality claims are published and contested, and locale/normalization rules are external standards. |
Rule of thumb: if you can write the decision as "X vs Y vs Z, and I'll be stuck with it for 12 months," Deep Recon is worth 20β40 minutes. If you can write it as "how do I implementβ¦", it isn't.
1. Background: BMAD concepts you need first
If you already know BMAD v6/v7, skip to Β§2.
1.1 What BMAD is
BMAD-METHOD ("Breakthrough Method for Agile AI-Driven Development") is an open-source framework that packages agentic software development into skills β structured markdown instruction sets an AI coding agent (Claude Code, Cursor, Copilot, etc.) loads on demand. It imposes a lifecycle: analysis β planning β architecture β implementation.
1.2 The vocabulary
| Term | Meaning |
|---|---|
| Skill | A directory containing SKILL.md (the entry point) plus supporting files. The unit of installation and invocation. Invoked as /bmad-<name>. |
SKILL.md | The router/entry file. Modern BMAD keeps it lean and defers detail to references/. Every token in SKILL.md is paid on every invocation. |
references/*.md | Procedure files loaded just-in-time, only when that branch is taken. This is the token-optimization pattern. |
customize.toml | Per-skill config. Merged through a layered resolver (see Β§9). |
| Agent | A skill with a persona (e.g. Mary the Analyst). Agents expose a menu of options that route to workflow skills. |
| Workflow | A multi-step skill. Older ones sharded into step-01β¦step-NN.md; newer ones use mode-based reference files. |
| Core skill vs module skill | src/core-skills/ ships to every install. src/bmm-skills/ ships only with the BMM (software dev) module. |
| Shim | A stub skill that forwards an old ID to a new one so existing habits don't break. |
| Subagent / assistant | A spawned sub-context with its own token budget, given a narrow brief, returning a digest. |
| Planning artifacts | The output folder where analysis/planning docs land, consumed by downstream skills. |
| Memlog | An append-only run log on disk that survives context loss β the durable record. |
1.3 Why "research" is a skill at all
Two failure modes drove it:
- Hallucinated grounding. Ask a model about market size or vendor pricing and it answers from training data β confidently, uncitably, and often 18 months stale.
- Uncaptured reasoning. Even when the research is good, it evaporates when the chat ends. Downstream planning has to re-derive it.
Deep Recon addresses both: no conclusion may rest on training data alone, and every engagement writes a durable cited research.md.
2. What PR #2611 actually changed
2.1 Consolidation
Three legacy skills β bmad-market-research, bmad-domain-research, bmad-technical-research β totalling ~5,136 lines of near-duplicate step files, were replaced by one skill, bmad-deep-recon, at roughly 650 lines. The three old names survive as v6 shims that forward with the corresponding type pre-set.
2.2 Relocation to core
The skill was moved from src/bmm-skills/1-analysis/ to src/core-skills/. Rationale: research is not code-project-specific (same precedent as brainstorming), so non-software and core-only installs get it too. On core-only installs, {planning_artifacts} falls back to {output_folder}. It also ships as a standalone marketplace plugin.
2.3 The v2 rework (the important part)
The first version was field-tested and found slow, token-heavy, and locally biased, with end-of-run verification degrading quality and subagent digests stranded in contexts that then died. The rework:
- Replaced the "acquisition mode" / engine-delegate registry with three modes: Draft, Process, Run.
- Added the research firewall.
- Went files-first β digests land on disk on arrival.
- Moved verification to landing time, not an end pass.
- Rescaled presets faster (standard is now 3 subagents / 8 sources / depth 2).
- Cut
SKILL.mdfrom ~3,989 to ~2,091 tokens by carving procedures intoreferences/.
2.4 Determinism kit
scripts/recon_kit.py (stdlib-only, PEP 723, unit-tested) owns work the model shouldn't hand-derive:
- Citation marker β appendix cross-check
- Memlog claim tally (
ref=/status=convention, last status wins) - Staleness re-check dates from per-class freshness windows
- Deterministic run-folder slugs across the draftβprocessβrefresh lifecycle
- Escaped/validated source-appendix HTML
This is the transferable lesson: anything mechanical and verifiable should be a script, not a prompt. Models are bad at counting and date math and excellent at judgment.
2.5 Security findings addressed in review
Worth knowing because the same mistakes appear in your own agent tooling:
| Finding | Fix |
|---|---|
{brief} interpolated inside a double-quoted shell template β $(), backticks, and quote-breaking could reach a command line, amplified by --dangerously-skip-permissions | Contract made file-based: briefs are written to {doc_workspace}/briefs/<dimension>.md, templates substitute {brief_file}. Researched/imported text never enters a command line. |
| HTML briefing rendered source URLs unvalidated | Allowlist to http(s) only; escape source-derived text before insertion |
| Refresh/Deepen reset verification status for out-of-scope claims | Statuses preserved outside the refresh scope |
user-voice pack ranked community posts above surveys | Triangulate instead; redact usernames, handles, emails, identifying URLs from verbatim quotes |
Parallel dimension writes raced on research.md | Explicit single-writer rule: digests return to the lead, which alone writes in plan order |
3. The three modes
| Mode | What happens | You supply |
|---|---|---|
| Draft | Composes a research prompt carrying the type pack's craft β pruned dimensions, freshness bars, source policy, a hard citation demand β tuned to the tool you name | One paste into ChatGPT / Gemini / Grok / Perplexity |
| Process | Files a finished report into imports/ untouched, extracts claims into digests behind the firewall, gap-checks against the pack, distills the standard cited summary with metadata frontmatter | The report, from any source |
| Run | Native research in session: plan gate β parallel fan-out β verification at landing β cited synthesis | Approval at one plan gate |
Choosing
| Situation | Mode |
|---|---|
| You already pay for a deep-research product and don't mind one round-trip | Draft β Process |
| You already have a report (analyst PDF, colleague's doc, whatever) | Process |
| You want results now, one sitting, no app switching | Run |
| Research needs internal sources or MCP tools only your session can reach | Run |
| Broad public sweep first, targeted follow-up second | Draft + Process, then a focused Run on the gaps |
The trade, stated plainly: hosted deep-research products crawl wider per dollar because you've already paid for the subscription; Run costs your tokens and minutes but stays in context and can use every tool your harness has. On a bare "research X" ask, Deep Recon states this trade once and remembers your preference for the session.
4. Research types (the "packs")
A type selects a pack: a ~25-line card of prioritized dimensions, source craft, and freshness rules. Deep Recon infers the type from your ask, or you name it.
| Type | Use when |
|---|---|
market | Sizing an opportunity, segments, pricing, go-to-market |
domain | Learning an industry or field: structure, players, rules, vocabulary |
technical | Evaluating a technology area, integration approaches, implementation reality |
competitive | Tearing down named competitors: offers, pricing, trajectory, sentiment |
user-voice | What users actually experience and want: reviews, communities |
academic-lit | Literature review, state of the art, grounding an approach in papers |
Custom types can be added via override TOML through bmad-customize.
Decision shape β a second, independent axis
- explore (default) β build understanding
- select β layers a weighted-matrix method over any type for a structured choose-between
Any type can end in a selection matrix. technical + select is the combination you'll use most for engineering decisions.
5. How a native Run thinks
Plan gate (decision, dimensions, topology, effort, time estimate)
β you approve
βΌ
Topology choice
βββ breadth-first ....... assistants split independent sub-questions
βββ depth-first ......... assistants take different angles on one question
βββ straightforward ..... one assistant, small budget
β
βΌ
Digests written to disk as each assistant returns
β
βΌ
Verify load-bearing claims as material lands
β
βΌ
Write the dimension's section (report grows in front of you)
β
βββ leads + budget remain? β follow the leads (next round)
βββ coverage or exhaustion β next dimension
β
βΌ
Synthesis: cross-dimension insights, recommendations, staleness map
β
βΌ
Mechanical citation check β research.md (+ optional HTML briefing)
5.1 The plan gate
The single hard stop. It shows the decision, the dimensions pruned to it, the topology, the knobs in force, and a realistic time estimate. Approve it and the run proceeds with light checkpoints rather than constant interrogation.
This is where you spend your attention. A bad plan gate produces a beautiful, well-cited, useless report.
5.2 Topology
Fan-out is a deliberate choice, not a default. Independent sub-questions get parallel assistants. One deep question gets several perspectives on the same material. A simple lookup gets one assistant with a handful of calls β ten agents on an easy question just burns tokens.
5.3 Effort presets
| Preset | Assistants | Sources / round | Rounds |
|---|---|---|---|
quick | 2 | 5 | 1 |
standard (default) | 3 | 8 | 2 |
deep | 6 | 12 | 3 |
Precedence: request > pinned knob > preset. Anything you say in the request overrides.
Rounds follow leads β contradictions and unexpected connections from round one become round two's assignments. A dimension stops early when its questions are answered or a full round surfaces nothing new.
5.4 Other run craft
- Per-assistant tool-call budgets β prevents one assistant from eating the whole run.
- Short-query craft with an evaluate-before-next-call loop β read the result before firing the next search.
- Shared source-quality card β answer engines (Perplexity et al.) count as one publisher; chase their citations to the primaries.
- Stop-and-write valve β commit what you have rather than spiraling.
6. Why the reports hold up
6.1 Two standing rules, inherited verbatim by every subagent
- No conclusions from training data. Model memory proposes questions and search strategy; every claim in the report traces to a source retrieved or imported during this engagement.
- The research firewall. Your project files and briefs shape what gets asked, never what gets found. Assistants receive only their assignment.
persistent_factsdefaults to empty. A run therefore cannot come back quietly confirming whatever your local context already believed.
The firewall is the single most important idea in the whole design. Confirmation bias is the default failure mode of agentic research: give an agent your architecture doc and ask it to research alternatives, and it will find that your architecture is excellent.
6.2 Citation discipline
Every claim carries a publisher, a publication date, and an access date. Inline [n] markers resolve to a source appendix. A mechanical cross-check at finalize confirms markers and appendix agree β script, not vibes.
6.3 Verification levels
| Level | Behavior |
|---|---|
normal (default) | Spot-checks the claims the recommendation actually rests on |
high | Cross-checks the pack's critical claim classes and red-teams major conclusions |
max | Checks everything; red-team pass at full breadth |
Verification runs as material lands, never as an end-of-run rewrite pass (the v1 lesson β a late pass degraded quality). The red-team pass is the single adversarial mechanism. An outcome adjusts a claim's status; it never licenses rewriting findings.
6.4 Freshness as part of truth
Each pack sets freshness windows per claim class. A market size from three years ago is reported as history, not as fact. This matters enormously in fast-moving areas β an MT quality benchmark from 2023 describes a world that no longer exists.
6.5 Files-first
Digests, extractions, and report sections hit the run folder the moment they exist. The conversation is a control channel, not storage. A run that dies mid-flight resumes from disk with nothing lost, and the report builds in front of you instead of behind a spinner.
7. The run folder, and research as a living asset
Each engagement gets one folder under your planning artifacts:
<planning_artifacts>/<run-slug>/
βββ imports/ # originals, untouched
βββ digests/ # extracted claims, behind the firewall
βββ briefs/ # per-dimension assignments (file-based, never shell-interpolated)
βββ memlog # append-only truth
βββ research.md # the canonical cited report
research.md always exists as the machine-readable report. The HTML briefing is its regenerable face β this is the v7 artifact protocol: memlog = truth, markdown = distillation under contract, HTML = face. output_format = auto | html | md | both; auto renders HTML for interactive runs and markdown only for headless or skill-invoked runs.
The report ends with a staleness map naming which claims age fastest and when to re-check. That map powers the lifecycle:
- Refresh β re-verifies only stale claims, appends a delta report (confirmed / changed / overturned), and warns you when an overturned claim feeds a downstream artifact.
- Deepen β drills into one dimension without re-running the rest.
The overturned-claim warning is the sleeper feature. If your PRD's rationale rests on a pricing claim that just changed, you find out.
8. Where it sits in the BMAD lifecycle
bmad-deep-recon β research.md (+ metadata frontmatter)
β
ββββ bmad-product-brief (reads the summary; never reprocesses the original)
ββββ bmad-prd
ββββ architecture / ADRs
Downstream skills consume the summary and metadata directly. That's the payoff of the fixed output shape β a PRD doesn't care whether the research came from Draft+Process or a native Run.
Entry points: /bmad-deep-recon, or through the Analyst agent (Mary), whose menu gained TS (select shape), CR (competitive), and UV (user-voice) alongside the existing research entry.
9. Configuration
9.1 Resolution layers
Per-skill config resolves through a layered merge:
_bmad/custom/{skill-name}.user.tomlβ personal, gitignored β wins_bmad/custom/{skill-name}.tomlβ team/org, committed- The skill's own
customize.tomlβ defaults
Merge rules: scalars override; tables deep-merge; arrays of tables keyed by code or id replace matching entries and append new ones; all other arrays append. There is no removal mechanism β you can't delete a base item, only override it (e.g. by code with a no-op) or fork the skill.
9.2 Deep Recon's knobs
| Key | Purpose |
|---|---|
validation | normal / high / max |
red_team | Adversarial pass; default off |
use_workflows | Whether to invoke other workflows |
subagent_models | Which model each assistant class uses |
output_format | auto / html / md / both |
external_sources | MCP research sources β shipped examples: Tavily, Perplexity Sonar, xAI X-Search |
| source policies | Preferred and banned sources |
| doc standards, handoffs | Downstream contract |
| custom types | Add your own packs |
Use /bmad-customize bmad-deep-recon rather than hand-authoring TOML.
10. Research checkpoints across a feature's life
Most teams treat research as a single event at the start of a project. It isn't. A feature passes through several gates, each with a different question, a different type pack, and a different cost of getting it wrong.
| # | Gate | The question | Type + shape | Cost of skipping |
|---|---|---|---|---|
| 0 | Validate | Do users actually want this? What already exists? | user-voice, competitive | You build something nobody asked for |
| 1 | Define success | How is this measured, and does the metric predict anything real? | academic-lit | You optimize a number that doesn't move the business |
| 2 | Build vs. buy | Is there a vendor? What's the exit cost? | competitive + select | Eighteen months rebuilding a commodity |
| 3 | Legal to ship? | Lawful basis, disclosure, residency, retention, transparency duties | domain | Redesign after legal review, or a regulator finds it |
| 4 | Attack surface | Abuse vectors, adversarial ML, supply chain | technical | Security review blocks launch; or it doesn't and you learn later |
| 5 | Licensing & procurement | Can we actually use this model/library/vendor? | domain / competitive | Chosen model turns out to be non-commercial; vendor has no DPA |
| 6 | Component selection | Which model, index, library, framework? | technical + select | Reversible, usually β the cheapest gate to get wrong |
| 7 | Failure modes | What broke for everyone else who shipped this? | technical | You rediscover known incidents in production |
| 8 | Cost at scale | What does this cost at 100Γ current volume? | technical | Unit economics collapse post-launch |
| 9 | Refresh | Did the ground move under a decision we already made? | refresh | Silent decision rot |
The pattern worth internalizing: almost everyone does gate 6 and skips gates 3, 4, and 5 β then discovers them during security and legal review, after the design is frozen and the sprint is committed. Gates 3β5 are cheap in week one and brutal in week ten. They're also the gates where external evidence matters most and where model memory is least reliable, which is exactly the profile Deep Recon is built for.
Gate 6 β the one everybody does β is the one where research adds the least, because you can usually just try both.
11. The full use-case catalog
The categories below are where Deep Recon earns its cost on feature work. Each maps to a type pack and a signal that tells you it's worth running.
| # | Use case | Type + shape | Run it when | Typical miss if skipped |
|---|---|---|---|---|
| 1 | Feature validation | user-voice | Before committing a quarter to a surface nobody complained about | Building a feature that solves a problem users don't have |
| 2 | Competitive teardown | competitive | A rival shipped the thing you're about to ship | Reinventing, or missing table-stakes behavior |
| 3 | Metric & eval methodology | academic-lit | Your metric will govern every future decision on the feature | Optimizing an offline metric with no online correlation |
| 4 | Component / model selection | technical + select | Switching cost is high (index format, embedding dim, framework) | Lock-in to a dying option |
| 5 | Build vs. buy | competitive + select | A credible vendor exists | Rebuilding a commodity, or buying an unexitable dependency |
| 6 | Privacy & data protection | domain | Any personal data, profiling, or automated decisioning β see Β§13 | Redesign after legal review; regulatory exposure |
| 7 | Security, abuse & adversarial ML | technical | The feature is user-facing, user-influenced, or model-driven β see Β§14 | Shipping a manipulable ranking surface |
| 8 | Licensing & IP | domain | Any third-party model, dataset, or copyleft library β see Β§17 | Discovering the model is non-commercial after integration |
| 9 | Procurement & vendor assurance | competitive | Vendor will process your data β see Β§17 | Legal blocks a vendor you already built against |
| 10 | Standards & interop | technical | Language tags, encodings, collation, protocols, schemas | Subtly wrong behavior in locales you don't test |
| 11 | Accessibility & inclusive design | technical / domain | New UI surface, especially multilingual | WCAG failures found at audit; RTL and text-expansion breakage |
| 12 | Fairness, bias & transparency duties | academic-lit + domain | Ranking or recommending to people at scale | Popularity-bias spirals; unmet transparency obligations |
| 13 | Algorithm & technique trends | academic-lit | You suspect the state of the art moved β see Β§15 | Building on a technique the field has quietly abandoned |
| 14 | Failure-mode / postmortem research | technical | Before designing anything with a known-hard failure mode | Rediscovering others' incidents in your own production |
| 15 | Cost modeling at scale | technical | Per-request inference, egress, or storage costs dominate | Unit economics that only fail at volume |
| 16 | Dependency health & maintenance risk | technical | Adopting a library or model you'll depend on for years | Adopting an abandoned project with a bus factor of one |
| 17 | Observability & eval tooling | technical + select | You need to measure a system you can't easily inspect | No way to tell whether the feature is working |
| 18 | Migration & deprecation risk | technical | Your current stack component has a sunset signal | Forced migration on someone else's timeline |
11.1 Underrated advantages of running research as a skill rather than ad-hoc chat
Beyond the findings themselves:
- It's a durable team artifact.
research.mdwith provenance frontmatter outlives the chat, the sprint, and the engineer. New joiners read why the decision was made instead of asking. - It's audit evidence. Publisher + publication date + access date on every claim is precisely the shape compliance functions want. In a regulated environment, "we evaluated these options against these criteria on this date, here are the sources" is materially valuable on its own.
- It settles disagreements on evidence rather than seniority. A cited weighted matrix is harder to argue with than an opinion, and easier to change when the evidence changes.
- It's negotiation leverage. A sourced pricing and feature comparison is a real input to a vendor conversation.
- It parallelizes. Draft mode fires the expensive crawl into a subscription tool while you keep working; Process folds the result back in.
- It's automatable. The headless JSON contract means a quarterly refresh can run in CI, not on someone remembering.
- It inoculates against your own agentic pipelines. If you're building AI features, "no conclusions from training data" and the firewall are the disciplines you'll want in your own retrieval systems anyway. Deep Recon is a working reference implementation.
- It forces the decision to be written down. Half the value arrives at the plan gate, before a single search runs, because you had to state what you're actually deciding and under what constraints.
12. Applied: a user recommendation feature
Much of this feature is internal work β but the external parts are not the ones most engineers expect. Privacy and security carry more research value here than model selection does.
12.1 Decisions that genuinely need external evidence
| Decision | Type + shape | Dimensions to insist on at the plan gate |
|---|---|---|
| Embedding model for item/user vectors | technical + select | Multilingual coverage, dimensionality vs. index cost, MTEB/BEIR retrieval numbers with dataset caveats, license, inference cost, self-host vs. API |
| Cross-encoder reranker vs. MMR-only diversity | technical + select | Latency at your p99 budget, quality delta on public rerank benchmarks, serving cost, staleness of published numbers |
| ANN index choice / HNSW parameterization defaults | technical | Recall-vs-latency curves published by index maintainers, memory footprint at your cardinality, filtered-search behavior |
| Offline metric conventions | academic-lit | NDCG@k vs. MRR vs. Recall@k in the recsys literature, position-bias correction, offlineβonline correlation evidence |
| Cold-start strategy | academic-lit or domain | Published approaches, reported lift, honest failure reports |
| What users complain about in "recommended for you" surfaces | user-voice | Filter-bubble complaints, repetition, staleness, opacity |
| Lawful basis, retention, erasure, transparency duties | domain | See Β§13 β the highest-value research on this feature |
| Manipulation, poisoning and inference attacks | technical | See Β§14 β shilling, embedding inversion, membership inference |
| Popularity bias and fairness obligations | academic-lit + domain | Measured popularity-bias effects, mitigation cost in NDCG, disclosure duties |
| Embedding model / reranker licensing | domain | Field-of-use restrictions, commercial-use thresholds, dataset provenance |
12.2 Decisions that should not go to research
- Your index mapping, shard layout, refresh interval β read your cluster.
- Which features exist in your event stream β read your schema.
- Bucketing/assignment for A/B β that's design, not evidence.
- "How do I implement MMR" β you know this; it's twelve lines.
12.3 A worked plan-gate framing
Decision: pick the embedding model for the recommendation retrieval stage, deployable on our existing OpenSearch/HNSW infrastructure, for the next ~12 months.
Constraints: must handle our language mix; β€200 ms p99 for the retrieval stage; self-hostable preferred; index memory budget is a hard ceiling.
Candidates to include (not to confirm): [3β5 named], plus any strong option the research surfaces.
Type: technical, select shape. Effort: deep. Validation: high.
Freshness bar: benchmark claims older than 12 months are reported as history.
Note the phrasing "to include, not to confirm." Naming candidates without that framing quietly asks the run to justify your shortlist.
12.4 What good output looks like
- A weighted matrix with your constraints as the weights, not generic ones.
- Every benchmark number carrying its dataset, date, and who ran it β vendor-run numbers flagged as such.
- An explicit "what we could not determine" section (Process mode gap-checks for exactly this).
- A staleness map that says, in effect: re-check the model landscape in 4 months; the license terms in 12.
13. Deep dive: privacy and regulatory research
Not legal advice. This produces an evidence base for a conversation with privacy counsel, not a substitute for one. The value is that you arrive at that conversation with cited primary sources and specific questions instead of vague anxiety.
13.1 Why this is the strongest case for Deep Recon
Privacy research satisfies every condition that makes the skill worth its cost, simultaneously:
- Entirely external. Statutes, regulator guidance, enforcement decisions, case law. None of it is in your repo, and none of it is inferable from your architecture.
- Jurisdiction-plural. A Toronto-built product with EU users sits under PIPEDA, Quebec Law 25, GDPR, and the DSA at once β and they don't agree on consent, notice, or automated decisioning.
- Fast-moving in exactly the layer that matters. Statute text is stable; regulator guidance and enforcement posture are not, and it's the guidance that determines whether your design passes.
- Load-bearing and expensive to reverse. You can swap an embedding model next sprint. You cannot swap a lawful basis after you've collected two years of data under it.
- The worst possible case for model memory. Legal reform moves constantly and a confidently-stated stale claim here is far more damaging than a stale benchmark. The
no conclusions from training datarule is doing real work.
That last point is not hypothetical. Canadian federal privacy and AI reform has been through multiple bill cycles; I would not assert its current status from memory, and neither should any model you're relying on. That uncertainty is the argument for running the research, not a reason to skip it.
13.2 Split it into two engagements, not one
The common mistake is one sprawling "GDPR for recommender systems" run. That's two different decisions with two different source policies, and merging them produces a report that's shallow on both.
Run A β domain type: what the rules actually require
Dimensions to insist on at the plan gate:
- Lawful basis for profiling-based recommendation. Consent vs. legitimate interest, and specifically the contexts where legitimate interest has been rejected by regulators. Include the balancing-test documentation expectations.
- GDPR Art. 22 threshold. When does ranking become "automated decision-making producing legal or similarly significant effects"? Ordinary content ranking usually doesn't; ranking that gates access, pricing, or opportunity may.
- Art. 15 access and Art. 20 portability. What must you be able to show a user about their own profile? This has direct schema consequences.
- Art. 17 erasure scope. Does the right reach a trained model and derived embeddings, or only the raw interaction log? Regulator positions differ and have moved.
- Purpose limitation and secondary use. Interaction data collected for one surface being reused to train a ranker for another is a live issue.
- DSA recommender-system obligations. Parameter transparency, and the requirement to offer a non-profiling option β plus the thresholds that determine whether they apply to you at all.
- EU AI Act. Recommenders are generally not Annex III high-risk, but transparency duties and GPAI obligations can still attach if you're using a foundation model in the pipeline. Get the classification question answered explicitly rather than assumed.
- Quebec Law 25 automated-decision notice. Stricter than PIPEDA on this point and routinely missed by teams who "did GDPR."
- PIPEDA and Canadian reform status. Current, not remembered.
- US state law patchwork. Where sensitive-inference and opt-out-of-profiling provisions bite.
- Children's and minors' data. Separate, stricter, and often triggers age-assurance obligations.
- Cross-border transfer posture. Applies to embedding inference calls, which teams frequently forget are transfers.
Run B β technical type: how to actually satisfy the above
- Right-to-erasure vs. HNSW reality. Vector indexes don't truly delete β you get a soft delete plus eventual segment merge. What's the real deletion latency, is it bounded, and does a bounded-but-slow deletion satisfy the requirement? This is a genuine engineering-meets-law question with published discussion.
- Are user embeddings personal data? Increasingly treated as yes. If so, every derived vector inherits the obligations.
- Embedding inversion attacks. Published work shows embeddings can leak the attributes they were built from β which converts a "we only store vectors" argument into a liability.
- Membership inference. Can an attacker determine whether a given user was in the training set?
- Machine unlearning. What's genuinely deployable versus what's a paper with a toy benchmark. Be ruthless here.
- Differential privacy / cohort aggregation. What does the privacy budget actually cost you in NDCG?
- Retention windows. How much interaction history does the model measurably need, versus how much you're keeping by default? Data minimization is easiest to argue when you've measured the marginal value of older data.
- Consent propagation. When a user withdraws consent, what happens to precomputed recommendation caches, materialized candidate sets, and warm segments?
- Pseudonymization that survives joins. Whether your scheme actually resists re-identification given the other datasets you hold.
13.3 Configuration that matters for regulatory research
| Knob | Setting | Why |
|---|---|---|
| Source policy β preferred | EUR-Lex, EDPB, national DPAs, ICO, OPC Canada, CAI QuΓ©bec, court decisions | Primary texts and regulator guidance beat everything |
| Source policy β banned | Law-firm marketing blogs, compliance-vendor content marketing | This space is saturated with SEO'd summaries that misstate scope and are optimized to sell a product |
validation | high minimum | A wrong regulatory claim is load-bearing by definition |
red_team | on (it's off by default) | If you walked in believing you're compliant, buy the adversarial pass |
| Freshness windows | Statute ~36mo Β· guidance ~12mo Β· enforcement/case law ~6mo | These claim classes genuinely age at different rates |
| Firewall | Do not paste your retention design in | Otherwise you get a well-cited report explaining why your current design is fine |
The firewall discipline is at its most valuable and most tempting to break here. The instinct to say "here's how we currently handle deletion, is it compliant?" produces a motivated report. Ask "what does the law require for deletion in vector stores?" and compare afterward.
13.4 What to hand counsel
The output should let a lawyer work in an hour rather than a week:
- Requirements traced to primary sources, with dates, not to secondary summaries
- An explicit "could not determine" section β jurisdictional gaps are the most important finding
- Conflicts between regimes surfaced as conflicts, not averaged away
- A staleness map that says which obligations to re-check and when
- Your specific open questions, framed as questions
Then keep it refreshed. The "overturned claim feeds a downstream artifact" warning is at its most valuable here: if a lawful-basis assumption in your PRD stops holding, you want the delta report to tell you, not an auditor.
14. Deep dive: security and adversarial research
Security is the other category I'd rank above component selection, and it's the one most consistently skipped until a review board forces it.
14.1 Why it fits the skill
Threat knowledge is published, adversarial, and perishable β the three properties the verification and freshness machinery exist for. It's also a domain where the model's training data is systematically incomplete: novel attack classes appear faster than they get absorbed.
14.2 Threat dimensions for a recommendation feature
Most engineers threat-model the service (authn, injection, rate limits) and skip the ranking system as an attack surface. Both belong in the run.
Manipulation and integrity
- Shilling / profile-injection attacks β coordinated fake interaction patterns that promote or bury items. Published attack models and detection approaches exist; this is a solved-ish literature that most teams have never read.
- Data poisoning of the training or feedback loop, including slow-drip attacks below anomaly thresholds
- Popularity and trending manipulation, and feedback-loop amplification
- Catalog enumeration via recommendation responses
Confidentiality and inference
- Embedding inversion β recovering source attributes from a vector (overlaps Β§13, but it's a security control question here)
- Membership inference β determining whether a user or item was in training data
- Cross-user leakage β inferring another user's behavior from changes in shared segments, co-occurrence surfaces, or "people also viewed"
- Model extraction β reconstructing your ranking function through systematic querying
- Cache and shared-segment poisoning
Access control
- IDOR and horizontal privilege issues on personalization endpoints β mundane, and the most commonly exploited
14.3 If there's an LLM anywhere in the pipeline
Add these dimensions explicitly:
- Indirect prompt injection via user-generated content, item metadata, or retrieved documents β the dominant risk class for retrieval-backed systems
- Tool-use boundary design and least-privilege for agentic components
- Output handling β treating model output as untrusted before it reaches a shell, a template, a query, or a browser
PR #2611 is itself the canonical worked example: a research brief was being interpolated into a double-quoted shell template, so $(), backticks, or a quote break inside researched or imported content could shape a command β amplified by a permission-skipping flag. The fix was structural, not a filter: briefs are written to a file and the template substitutes a skill-generated path, so untrusted text never touches a command line. Take that pattern wholesale into your own agent tooling. Filters on untrusted text fail; changing the channel so the text never reaches an interpreter doesn't.
14.4 Supply chain
- Model provenance β where the weights came from, what's actually verifiable
- Serialization risk in model artifacts (pickle-family deserialization remains a live RCE vector)
- Dataset provenance and whether training data carries obligations
- Dependency health β release cadence, maintainer count, open-issue and security-advisory trends
- CVE landscape for your serving stack, index, and inference runtime
14.5 Configuration for security research
| Knob | Setting |
|---|---|
| Preferred sources | NIST, OWASP, MITRE ATT&CK/ATLAS, CVE/NVD, vendor security advisories, peer-reviewed adversarial-ML venues, credible incident writeups |
| Banned sources | Security-vendor content marketing, "top 10 threats" listicles |
validation | high |
red_team | on β this is the category it was built for |
| Freshness | Attack classes ~24mo Β· advisories ~3mo Β· tooling ~6mo |
14.6 Turning the report into work
The output shouldn't stop at a threat list. Convert it: threat β likelihood/impact for your deployment β control β story. Threats you consciously accept get written down as accepted, with the citation attached. That record is what makes the next security review fast, and it's the thing that's always missing when a reviewer asks "did you consider X?"
15. Deep dive: algorithm and technique-trend research
This is the weakest of the categories you raised β but it's rescuable if you reframe it.
15.1 First, disambiguate "EMA"
Two unrelated research problems share the acronym:
- Exponential decay of user interest profiles β recency-weighted aggregation of a user's interaction vectors, so last week outweighs last year. A ranking-features question.
- EMA teacher weights in self-supervised training β momentum encoders in the BYOL/DINO/MoCo family, where a slowly-updated copy of the network supervises the fast one. A representation-learning question.
They share nothing except the smoothing formula. A run that doesn't disambiguate produces a report that's half-relevant twice over.
15.2 Why "trends in algorithms like X" is the anti-pattern
No decision means no dimension pruning, which means unbounded scope, maximum fan-out, and an expensive encyclopedia entry you'll skim once. Convert it into a decision:
| Vague ask | Decision framing | Type + shape |
|---|---|---|
| "Trends in EMA" (sense 1) | "Replace fixed-window last-N profile aggregation with EMA decay β and what half-life per surface?" | technical + select |
| "Trends in EMA" (sense 2) | "Has EMA-teacher SSL held up against contrastive training for retrieval embeddings at our scale and data volume?" | academic-lit |
| "What's new in reranking" | "Is a cross-encoder rerank worth 40ms at our p99, versus MMR-only?" | technical + select |
15.3 The dimension you must add by hand
Negative results, failed reproductions, and industry postmortems. Name it explicitly at the plan gate.
The literature is systematically positive-biased: papers report wins, and a survey that only aggregates claimed improvements is worse than nothing β it's confidently wrong in a specific, actionable direction. Recommender systems have a well-documented reproducibility problem in particular, where reported gains over properly-tuned simple baselines often fail to replicate.
This is also where "no conclusions from training data" pays off most, because model memory of an ML technique is weighted heavily toward the abstract of the original paper β the most optimistic sentence anyone ever wrote about it.
15.4 Read benchmark claims like an adversary
Require every reported number to carry:
- The dataset and its known idiosyncrasies
- The date β a 2023 retrieval benchmark describes a world that no longer exists
- Who ran it β self-reported vendor numbers flagged as such
- Tuning-budget parity β was the baseline tuned as hard as the proposed method? Usually not.
- Whether the gain survives at your scale and data regime, which is rarely the paper's regime
15.5 Know where research stops and your eval starts
For a parameter like an EMA half-life, research gives you the prior and the conventions β plausible ranges, how others parameterize per surface, what failure looks like when decay is too aggressive. It cannot give you the answer. Your offline replay against your own interaction logs decides it, and your A/B confirms it.
Running a deep engagement to pick a number your own data can answer in an afternoon is the clearest form of research-as-procrastination. Use quick for the prior, then go measure.
16. Applied: a multilingual translation feature
This is the higher-value case, because almost every decision is external.
16.1 Decision map
| Decision | Type + shape | Why external |
|---|---|---|
| MT provider / model selection | competitive + select | Pricing, language pairs, quality claims, and rate limits are all public and all move |
| Quality evaluation methodology | academic-lit | BLEU vs. chrF vs. COMET vs. LLM-as-judge is a live methodological debate; picking wrong invalidates your whole eval |
| Locale, normalization, and collation handling | technical or domain | These are external standards (Unicode/CLDR/ICU), not opinions |
| Human-in-the-loop / post-editing workflow | domain + user-voice | Localization industry has established practice you shouldn't reinvent |
| Data residency and PII in translation payloads | domain | Regulatory, jurisdiction-specific, and changes |
| Terminology/glossary and do-not-translate handling | technical | Provider feature matrices differ sharply here and are poorly summarized |
16.2 Traps this pack is built to catch
- Vendor-reported quality numbers. The source-quality card treats an aggregator as one publisher; verification at
highcross-checks the claim classes the recommendation rests on. Insist that self-reported quality claims are marked as such. - Language-coverage asymmetry. "Supports 100+ languages" is a marketing claim; per-pair quality varies by an order of magnitude. Make coverage-quality a named dimension, not a checkbox.
- Stale benchmarks. Set the freshness bar aggressively β 12 months, not 36.
- Pricing shape, not just price. Per-character vs. per-token vs. per-request vs. committed-use changes the ranking entirely at your volume. State your actual volume at the plan gate.
16.3 Suggested mode
Draft β Process β focused Run on the gaps:
- Draft a prompt for whichever deep-research product you subscribe to. Vendor landscapes are exactly what hosted crawlers are good at.
- Run it there; bring the report back.
- Process it β original preserved in
imports/, claims extracted, gaps flagged against thecompetitivepack. - Run natively on the two or three gaps (usually: your specific language pairs, and anything requiring internal or MCP-only sources).
16.4 Then refresh
Set a calendar reminder from the staleness map. MT pricing and model versions turn over on a roughly quarterly cadence. refresh the translation vendor research gives you a delta report β confirmed / changed / overturned β with a warning if an overturned claim underpins something you already shipped a decision on.
17. Deep dive: licensing, procurement and vendor risk
The most-skipped category, and the one that kills projects latest in the cycle β after integration, when unwinding is most expensive.
17.1 Model and dataset licensing
- Open weights β open source. Many popular model licenses carry field-of-use restrictions, acceptable-use policies, monthly-active-user thresholds that flip commercial terms, or naming and attribution requirements. Several forbid using outputs to train competing models β which matters if you plan to distill.
- Dataset provenance. A permissively-licensed model trained on a non-commercial dataset is a real and common trap, particularly for multilingual and speech models.
- OSS license compatibility with how you actually distribute β SaaS, on-prem, embedded, and client-side each trigger different obligations.
- Output IP and indemnification. Who owns generated translations? Does the vendor indemnify you against third-party claims, and under what conditions do they void it?
Type: domain (or technical when it's mostly library compatibility). Preferred sources: the license texts themselves, model cards, official FAQs. Banned: summaries of licenses. Read the primary text; this is a category where paraphrase loses the operative clause.
17.2 Procurement and vendor assurance
If a vendor will process your data β an MT API, a hosted embedding endpoint β these determine whether you're allowed to use them at all, and they should be researched before you build against the API, not after:
- SOC 2 Type II / ISO 27001 status and scope
- DPA availability, SCCs, and transfer mechanism
- Sub-processor list and whether it's stable and notified
- Data residency and processing-location commitments
- Training-on-customer-data policy β the default matters, and so does whether opting out changes pricing or features
- Retention and deletion commitments, with actual timelines
- Breach notification SLA
- Exit terms and data portability β the exit cost is the real measure of lock-in
- Uptime SLA, rate limits, and what happens at the ceiling
Type: competitive. This is the research whose absence produces the sentence "legal won't approve the vendor we've already integrated."
17.3 Dependency and deprecation risk
Cheap to run, disproportionately useful:
- Release cadence and whether it's slowing
- Maintainer count and bus factor
- Open-issue and security-advisory trend lines
- Corporate backing, and whether the backer has a history of sunsetting
- Migration paths that already exist for people leaving
A quick preset run answers most of this and has saved more projects than any model comparison.
18. Best practices
18.1 Framing
- Lead with the decision, not the topic. "Research embeddings" gets you an encyclopedia entry. "Pick the embedding model for our recommendation retrieval stage under these constraints" gets you a recommendation.
- State your constraints as constraints. Latency budget, memory ceiling, language mix, volume, license posture, deploy target. These become matrix weights.
- Name candidates as inclusions, never as the frame. Otherwise you get a confirmation exercise.
- Declare your freshness bar when the field moves fast. Don't accept the pack default silently.
- Pick the decision shape deliberately.
selectfor choose-between,explorewhen you don't yet know the option space. Runningselecttoo early narrows prematurely.
18.2 At the plan gate
- Read every dimension. This is your only hard stop. Delete dimensions that don't bear on the decision β each one costs a full fan-out.
- Sanity-check the topology. Independent sub-questions β breadth. One contested question β depth. A lookup β straightforward. If it proposes six assistants for something simple, say so.
- Match effort to reversibility.
quickfor a decision you can undo next sprint;deep+validation = highfor something that becomes load-bearing. - Check the time estimate against your patience. Approving a 40-minute run you'll abandon at minute 12 wastes everything except what's already on disk.
18.3 During and after
- Trust the firewall; don't defeat it. Resist the urge to paste your architecture doc "for context." Project context is legitimately framing; it is inadmissible as evidence. Feeding it in is how you get a report that agrees with you.
- Chase answer-engine citations to primaries. If the report leans on an aggregator, that's one publisher, not three.
- Read the "could not determine" section first. Gaps are more informative than confirmations.
- Check the staleness map and act on it. Research that's never refreshed is research that silently becomes wrong.
- Keep
research.mdin version control alongside the PRD it grounds. The provenance frontmatter is what makes the decision auditable in six months.
18.4 Cost and token discipline
- Draft β Process is the cheap path. If you already pay for a deep-research subscription, the round-trip is one paste and it crawls wider per dollar.
- Default to
standard. The presets were rescaled downward because v1 was too slow and too token-heavy. Reach fordeepdeliberately. - Use
deepeninstead of re-running. Drilling one dimension is far cheaper than a fresh engagement. - Use
refreshinstead of redoing. It re-verifies only what's stale.
18.5 Hygiene
- Turn on
red_teamfor decisions with a strong prior. It's off by default. If you walked in already believing the answer, buy the adversarial pass. - Redact before quoting people. The
user-voicepack now requires stripping usernames, handles, emails, and identifying URLs from verbatim quotes β carry that rule into anything you paste into a PRD. - Never shell-interpolate researched text. The PR's critical finding. Researched and imported content is untrusted input; pass it by file path, not on a command line β especially near any
--dangerously-skip-permissionsflag.
18.6 Domain-specific craft
- Run the compliance and security gates in week one, not week ten. Their findings are design constraints. Discovered late, they're rewrites.
- Tune source policy per domain, not once. Regulatory research wants regulators and bans law-firm blogs; security research wants NIST/OWASP/CVE and bans vendor marketing; academic research wants venues and bans press releases. The default policy is a compromise; override it.
- Set freshness per claim class, not per run. Statute text, regulator guidance, and enforcement posture age at wildly different rates β and so do attack classes, advisories, and tooling.
- Always add a "negative results and failures" dimension to any technique or trend research. Published literature is positive-biased and won't volunteer it.
- Split regulatory research into requirements and implementation. One run answers "what must be true"; a second answers "how do we make it true in a vector index." Merging them makes both shallow.
- Demand a "could not determine" section on compliance work. In regulatory research the gaps are the finding β an unresolved jurisdictional question is more actionable than five confirmed ones.
- Convert security output into accepted-or-mitigated decisions, with citations attached. A threat list is not a deliverable; a threat register with dispositions is.
- Know where research stops. Priors and conventions come from the literature; the actual parameter comes from your offline replay. Research that could be settled by an afternoon of measurement is procrastination.
19. Anti-patterns
| Anti-pattern | Why it fails | Do instead |
|---|---|---|
| "Research recommendation systems" | No decision β unbounded dimensions β expensive encyclopedia | Name the decision and constraints |
| Running research on your own codebase | Firewall means it looks outward; your repo isn't a source | bmad-document-project |
| Pasting architecture docs "for context" | Defeats the firewall; produces agreeable findings | Let context shape questions only |
deep + max on every run | Burns tokens and minutes for marginal gain | Scale to reversibility |
| Approving the plan gate without reading | The one place your judgment is irreplaceable | Prune dimensions, check topology |
Treating research.md as a one-time artifact | Claims rot; downstream artifacts inherit the rot | Refresh from the staleness map |
| Using research to decide how to implement | Wrong tool; you need your codebase, not the web | Story workflows |
| Accepting vendor-published quality numbers | Systematically flattering | Flag self-reported; verify at high |
| Naming your preferred option in the framing | Converts research into justification | "Include X, Y, Z β and anything better" |
| "Is our current design GDPR-compliant?" | Motivated framing; the firewall exists to prevent exactly this | "What does the law require here?" β then compare yourself |
| One giant "GDPR + security + vendors" run | Three source policies in conflict; shallow on all three | Three engagements, three policies |
| Sourcing compliance claims from law-firm blogs | SEO'd, scope-distorting, sales-motivated | Ban them; require regulators and primary texts |
| Threat list with no dispositions | Reads like diligence, changes nothing | Threat β likelihood/impact β control or accepted, cited |
| Trend research with no negative-results dimension | Aggregates only claimed wins; confidently wrong | Name failed reproductions as a required dimension |
| Researching a parameter your own data can settle | Expensive procrastination | quick for the prior, then measure |
| Vendor research after integration | Discovers blockers when unwinding costs most | Procurement gate before the first API call |
| Assuming open weights means usable | Field-of-use and MAU clauses bite late | Read the license text, not a summary |
20. Command cheat sheet
| Goal | Type this |
|---|---|
| Start research | /bmad-deep-recon, then describe the decision |
| Force a type | "competitive research on DeepL and Google Translate" |
| Draft for your own tool | "draft a deep research prompt about X for Gemini" |
| Process a report | "there's a research report at ~/Downloads/report.pdf, process it" |
| Choose between options | "help me choose between Postgres and MySQL for this" |
| Refresh | "refresh the market research" |
| Deepen one dimension | "deepen the pricing dimension" |
| Customize defaults | /bmad-customize bmad-deep-recon |
Legacy IDs (bmad-market-research, bmad-domain-research, bmad-technical-research) still work and forward with the type pre-set.
21. Transferable design lessons
Independent of whether you adopt Deep Recon, these generalize to any agentic system you build:
- Consolidate near-duplicate prompt trees into one skill with data-driven variation. 5,136 lines β ~650 by turning three workflows into six ~25-line policy cards.
- Keep the entry point lean; defer detail. ~4k β ~2.1k tokens by carving procedures into just-in-time reference files. Entry-point tokens are paid on every invocation.
- Files-first, conversation-as-control-channel. Anything valuable goes to disk on arrival. Contexts die; disks don't.
- Verify at landing, not at the end. A late pass degraded quality in field testing.
- Mechanical work belongs in a tested script. Counting, cross-referencing, date math, slug generation.
- Build an explicit bias firewall. Separate "what shapes the question" from "what counts as evidence," and enforce it at the subagent boundary.
- Choose fan-out topology deliberately. Parallelism is a cost, not a virtue.
- Treat tool output as untrusted input. File-based handoff over shell interpolation, protocol allowlists, escaping at the boundary.
- Give artifacts a lifecycle. Staleness maps, delta refreshes, and downstream-impact warnings turn a document into an asset.
- Single-writer rule for parallel agents. Fan out reads; serialize writes through the lead.
22. The epistemology underneath all of this
This section assumes no philosophy background. Every term is defined in plain language before it's used.
The PR has a section literally headed "Epistemics and reliability." That's not decoration β it's the honest label for what the whole design is. Read it this way and the mechanisms stop looking like a feature list and start looking like a single coherent argument.
22.1 What "epistemology" means
Epistemology is the branch of philosophy that asks: what is knowledge, and what makes a belief justified?
The classic starting point: knowing something requires three things.
- It's true
- You believe it
- You have good reason β justification β for believing it
Miss any one and you don't have knowledge. If it's true but you have no grounds, you got lucky. If you have grounds but it's false, you're mistaken.
Why this matters here: an LLM produces sentences that satisfy #1 and #2 by accident and skip #3 entirely. It asserts things without holding beliefs, and its confidence is uncorrelated with whether it has grounds. It can tell you something perfectly true while having no justification whatsoever β the sentence just came out fluent.
There's a name for the case where you have a true, believed claim that's only accidentally right: a Gettier case (after a famous three-page paper from 1963). Picture a stopped clock that happens to show the correct time when you glance at it. You now believe something true, for a reason that gives you no actual grounds. Every uncited model output is a potential stopped clock.
Deep Recon's whole purpose is to bolt a justification layer onto a system that natively has none.
22.2 The core concepts, defined
| Concept | Plain meaning | Everyday example |
|---|---|---|
| Justification | The grounds you have for a belief β the why behind it | "The bridge is closed" vs. "The bridge is closed because I just drove past the barrier" |
| Testimony | Believing something because someone told you. Most of what anyone knows works this way β you've never personally verified that Antarctica exists | Trusting a doctor, a map, a news report |
| Foundationalism | The view that beliefs form a structure resting on a base β some things are believed because of other things, and the chain has to stop somewhere solid | A wall of bricks needs a foundation, not infinitely more bricks below |
| Defeasible | A belief held provisionally, which new evidence can overturn. It's "reasonable until defeated," not "proven forever" | "The train runs at 8" β until they change the timetable |
| Defeater | The new evidence that overturns it | The posted schedule change |
| Fallibilism | Accepting that any of your beliefs might be wrong, without concluding that nothing is worth believing. Confidence without certainty | Science's default posture |
| Falsification | Testing an idea by trying hard to break it rather than piling up examples that fit. Associated with Karl Popper | Don't count white swans; go looking for a black one |
| Calibration | Your confidence matching your actual accuracy. Being 70% sure of things that turn out true about 70% of the time | A weather forecaster who says "30% rain" and is right about that often |
| Provenance | Where a claim came from, and through whose hands | A museum tracing an artifact's ownership chain |
| Independence | Two sources counting as genuinely separate evidence, rather than both repeating one original | Two newspapers citing the same wire story are one source, not two |
22.3 Every mechanism is an epistemological commitment
Now the mapping. Each row is a design choice in the skill and the philosophical position it encodes.
| Mechanism | What it commits to |
|---|---|
| "No conclusions from training data" | Truth alone isn't enough β a claim needs traceable justification. This is the rule that bars the stopped clock. |
Inline [n] β source appendix | Foundationalism. Every claim has to bottom out in a retrieved source, not in another claim. No infinite regress, no circles. |
| "Answer engines count as one publisher β chase their citations" | Guards against false independence. Three sites echoing one primary report are one witness wearing three hats. Counting them as three is how confident nonsense propagates. |
| Publisher + publication date + access date on every claim | The epistemology of testimony. Since you're believing things you didn't verify yourself, you need to know who said it, when, and when you looked β that's exactly what lets a reader evaluate it. |
| Preferred / banned source policy | A reductionist stance on testimony: trust is earned, not presumed. Publishers are ranked. "Someone published it" is not a credential. |
| Claim statuses (unverified β verified β disputed β overturned) | Defeasible reasoning made explicit. Beliefs are held provisionally with their status visible, rather than silently promoted to fact. |
| "An outcome adjusts a claim's status β it never licenses rewriting findings" | Defeat must stay visible. You don't quietly delete the belief you used to hold; you mark it overturned. Erasing the old belief destroys the audit trail that made the new one trustworthy. |
| Staleness map + freshness windows per claim class | Fallibilism with a clock. Different kinds of claims decay at different rates β statute text ages slowly, pricing fast. Justification has a shelf life. |
| "A three-year-old market size is history, not fact" | A subtle one: the proposition itself changes character over time. It stops being a claim about the present and becomes a claim about the past. |
| Red-team pass | Falsification. Attack the conclusion instead of accumulating agreeable evidence. Off by default, which is a cost decision, not an epistemic one β turn it on when you had a prior. |
| "Could not determine" section | Calibration. Reporting the shape of your ignorance. Most systems β and most people β never do this, which is why overconfidence is the default failure. |
| Negative-results dimension for literature | Corrects publication bias: the evidence base itself is distorted, because journals print wins and quietly drop failures. Surveying only what got published systematically overestimates. |
| Verification at landing, not at the end | Justification is checked while the context that produced it still exists. A late pass evaluates claims stripped of their situation β and field testing showed it degraded quality. |
| Files-first / memlog as truth | The record of how you came to believe something must outlive the conversation. Reasoning that evaporates can't be audited. |
22.4 The elegant one: the research firewall
This is the deepest idea in the design, and it's a direct implementation of a distinction from philosophy of science.
Context of discovery vs. context of justification (Hans Reichenbach, 1930s). These are two separate questions about any belief:
- Discovery: how did you come up with this idea? A hunch, a dream, a colleague's offhand remark, your existing assumptions β anything goes. There's no wrong way to generate a hypothesis.
- Justification: what makes it true? Here almost nothing goes. The grounds have to be independent of how you happened to think of it.
The classic illustration: the chemist KekulΓ© reportedly hit on the ring structure of benzene after daydreaming about a snake biting its tail. Perfectly fine as discovery. Utterly irrelevant as justification β the structure is right because of the evidence, not because of the dream.
The firewall implements exactly this split at a process boundary:
- Your project files, architecture docs, and briefs are allowed to shape which questions get asked β that's discovery, and your priors are a legitimate source of good questions.
- They are inadmissible as evidence β that's justification, and it has to come from outside.
- Subagents receive only their assignment.
persistent_factsdefaults to empty.
Why this is unusually good engineering: most bias mitigation is an instruction β "be objective," "consider alternatives." Instructions fail, because a system that wants to agree with you will find a way. This is architectural. The subagent cannot be biased by context it was never given.
The failure it prevents is the single most common one in agentic research: hand an agent your design doc and ask it to research alternatives, and it comes back explaining that your design is excellent. Not through deceit β through ordinary confirmation bias, which is what you get when the thing generating hypotheses also gets to grade them.
22.5 Where the epistemology is genuinely weak
Being honest about this matters more than admiring the design.
-
The independence assumption is shaky. Fan-out to multiple assistants borrows its logic from a result about crowds: if many judges each do slightly better than chance and their errors are independent, the majority is very reliable. But these subagents share a base model, a training corpus, and query craft. They are correlated witnesses, not independent ones. Six of them do not buy six times the reliability β they buy the same blind spot, six times, expressed differently.
-
Verification isn't independent either. The system checking a claim is the same system that produced it. That's a coherence check β does this hang together? β not corroboration, which requires a genuinely separate source. Useful, but weaker than it looks.
-
The web is not a neutral evidence base. Search ranking is itself an epistemic filter, shaped by commercial incentives. What is findable is not the same as what is true, and the gap is systematic rather than random. SEO-saturated domains β compliance, security vendors, "best X for Y" β are exactly where this bites hardest, which is why the banned-source policy is doing far more work than it appears to.
-
Citation prevents fabrication, not laundering. A well-cited report built on weak sources is more dangerous than an uncited one, because it wears the costume of justification. Rigor in the form can disguise rot in the content.
-
The plan gate is the least-examined step and the most consequential. You choose which dimensions count before any evidence exists. Every downstream mechanism assumes the question was well-posed. That's where the deepest bias enters β and nothing in the system checks it. Which is precisely why it's the one place your own judgment is irreplaceable, and why "read every dimension at the plan gate" is the most important practice in Β§18.
The honest summary: Deep Recon doesn't give you knowledge. It gives you auditable justification β a chain you can inspect and challenge. That's a real and unusual improvement over uncited fluency, and it's less than it can look like when the output is well-formatted and thoroughly cited.
22.6 Why this matters doubly for search and recommendation work
Here's the reflexive turn: search and recommendation systems are themselves epistemic technologies.
A ranking function is an implicit theory of relevance. A theory of relevance is an implicit theory of what is worth knowing. When you build a recommender, you are building a machine that shapes what people can come to know β you're operating on the justification side of other people's beliefs, at scale.
Which means the same concepts run in both directions:
| Epistemology concept | Its form in your systems |
|---|---|
| Publication bias | Popularity bias β rich-get-richer feedback loops distorting what's available to be seen |
| Epistemic closure / narrowed inquiry | Filter bubbles β the system narrowing the space of what a user can encounter |
| Transparency of grounds | DSA recommender-transparency duties β a legal demand that an epistemic intermediary disclose its criteria |
| Construct validity (does the measure capture the thing?) | Offline/online metric divergence β NDCG moves, engagement doesn't, because the proxy measures something adjacent |
| Testimony and provenance | Source attribution in retrieval and RAG β whether users can trace what they're being shown |
| Independence of sources | Deduplication and diversity in candidate sets β ten versions of one document are one document |
| Calibration | Confidence display and abstention β showing "we're not sure" instead of always returning ten results |
| The firewall | Personalization vs. evidence β a user's history should shape what you show them, not what you claim is true |
That last row is the sharpest one, and it's worth sitting with. Deep Recon's firewall says: your context shapes the questions, never the answers. A recommendation system that lets a user's history shape what it presents as true β rather than merely what it surfaces β is doing the thing the firewall exists to prevent, to someone else, without their knowledge.
The discipline Deep Recon applies to your own knowing is the same discipline you owe your users about theirs. Provenance, defeasibility, calibrated uncertainty, source independence, visible criteria. In your research process they're hygiene. In your ranking systems they're ethics.
23. Worked walkthroughs for software engineers
Fidelity note. The session excerpts below are illustrative reconstructions. They show the shape of each interaction β the decision points, what you type, where you push back, what lands on disk. Exact prompt wording and gate formatting live in the skill's reference files and will differ in detail. The workflow, artifacts, and decision points reflect the documented design; the TOML key paths should be confirmed against your installed
customize.toml.
23.0 Setup, once
npx bmad-method install # select your IDE; deep-recon ships in core
Confirm it's there, then look at what you can change before your first real run:
/bmad-customize bmad-deep-recon
Two things worth setting on day one, before you've formed habits:
# _bmad/custom/bmad-deep-recon.user.toml (personal, gitignored)
[workflow]
output_format = "both" # md for the repo, html for sharing with non-engineers
validation = "normal" # raise per-run when the decision is load-bearing
Leave red_team off globally. Turn it on per-run, deliberately, when you notice you already believe the answer.
Walkthrough A β Native Run: choosing an embedding model
Scenario. You own multilingual search and recommendation. Retrieval runs on OpenSearch with HNSW. You need to commit to an embedding model for the recommendation retrieval stage and live with it for roughly a year, because re-embedding the corpus and rebuilding the index is a multi-week project.
This is the gate everyone runs. It's genuinely the least valuable of the gates β but it's the best one to learn the mechanics on, because the feedback loop is short.
A.1 The invocation, and the fork in the road
> /bmad-deep-recon
Deep Recon opens the floor and, on a bare research ask, states the Draft-vs-Run trade once and remembers your answer for the session. For this one, Run is right: you'll want follow-up rounds on contradictions, and some sources are technical enough that you'll want to chase citations interactively.
Now the part that determines everything downstream.
β What most engineers type:
research the best embedding models for multilingual search
What comes back: a competent encyclopedia entry. Every dimension is in scope because nothing was pruned. Maximum fan-out, maximum tokens, and a report that ranks models against generic criteria you don't share. You'll skim it once and decide on vibes anyway.
β What to type instead:
I need to pick an embedding model for the retrieval stage of our
recommendation system. Decision horizon ~12 months β re-embedding the
corpus is a multi-week project, so this is expensive to reverse.
Constraints:
- Content is multilingual; the mix is roughly [your actual mix]
- Retrieval stage budget is 200ms p99, end to end
- Index memory has a hard ceiling; dimensionality is a real cost, not a
preference
- Self-hostable strongly preferred; API-only is a significant negative
- Must be usable commercially without a revenue-threshold clause
Include these candidates β but do not treat the list as the frame, and
surface anything stronger: [3-5 named models].
Type: technical, select shape. Effort: deep. Validation: high.
Freshness: benchmark claims older than 12 months are reported as history,
not as current fact.
Four things are doing work there:
| Element | Why it matters |
|---|---|
| The decision and its horizon | Prunes dimensions. "12 months, expensive to reverse" tells the run to weight license stability and maintenance health, not just today's benchmark |
| Constraints as constraints | These become the weights in the selection matrix. Without them you get generic weights |
| "Do not treat the list as the frame" | Without this, naming candidates quietly converts research into justification for your shortlist |
| Explicit freshness bar | Embedding benchmarks from 2024 describe a different world. The pack default may be more generous than you want |
A.2 The plan gate β the only place your attention is irreplaceable
An illustrative gate for the above:
DECISION
Select an embedding model for recommendation retrieval; 12-month horizon,
high reversal cost.
DIMENSIONS (6)
1. Multilingual coverage and per-language retrieval quality
2. Dimensionality vs. index memory and HNSW build/query cost
3. Published retrieval benchmarks (MTEB/BEIR family) with dataset caveats
4. Inference latency and throughput; self-host vs. hosted
5. License terms, commercial-use restrictions, model provenance
6. Maintenance signals: release cadence, backing, deprecation risk
TOPOLOGY breadth-first (dimensions are largely independent)
EFFORT deep β 6 assistants / 12 sources per round / 3 rounds
VALIDATION high; red_team off
FRESHNESS benchmarks 12mo Β· license 24mo Β· maintenance 6mo
ESTIMATE ~35-45 minutes
Approve, or tell me what to change.
What to actually do here β this is the whole skill:
- Delete dimensions that don't bear on the decision. Each one costs a full fan-out. If you'll self-host regardless, dimension 4 collapses to "self-host latency only" β say so. Cutting one dimension at
deepsaves roughly 15% of the run. - Add what's missing. Two things are absent above and belong: fine-tuning and adaptation cost (if you'll adapt to your domain, a model that resists adaptation is disqualified regardless of zero-shot numbers), and how each model behaves under the filtered-search patterns your recommender actually uses. Benchmarks measure unfiltered top-k; your production path is filtered.
- Sanity-check the topology. Breadth-first is right here β these are independent questions. If it had proposed depth-first, that would be a signal the decision was framed as one contested question rather than six separable ones.
- Check the estimate against your patience. 40 minutes is real. If you'll wander off at minute 12, drop to
standardnow. Files-first means you keep what landed, but you'll have a partial report you don't trust.
A realistic reply:
Approve with changes:
- Drop dimension 4's hosted-API sub-question; we self-host, full stop.
- Add: fine-tuning/adaptation cost and whether the license permits it
- Add: behavior under filtered ANN search, not just unfiltered top-k
- Keep effort at deep
A.3 During the run
You'll see digests landing and report sections committing per dimension, because everything hits disk on arrival. Two things to watch:
- Aggregator pileup. If several digests trace back to the same summary site, that's one publisher wearing several hats. Say so: "dimension 3 is leaning on aggregators β chase the primary benchmark repos."
- Round-two assignments. Contradictions from round one become round two's work. If two sources disagree on a latency figure and round two isn't chasing it, flag it. Disagreement is the highest-value lead in the run.
A.4 What lands on disk
_bmad/planning/embedding-model-selection-2026-07/
βββ briefs/
β βββ multilingual-coverage.md
β βββ dimensionality-index-cost.md
β βββ ...
βββ digests/
β βββ d01-mteb-multilingual-subsets.md
β βββ d02-hnsw-memory-scaling.md
β βββ ...
βββ memlog # append-only; claim tally lives here
βββ research.md # the canonical cited report
research.md is the artifact. Everything else is the audit trail β and the reason a run that dies at minute 30 resumes instead of restarting.
A.5 Reading the report β where to look first, in order
- "Could not determine." Read this before the recommendation. If per-language quality for your two most important languages is in here, the selection matrix is weaker than it looks and you should say so out loud in the ADR.
- The selection matrix. Check that the weights are your constraints. If it weighted "ease of getting started" heavily, it defaulted to generic criteria and you under-specified at the plan gate.
- Self-reported vs. independent numbers. Every vendor-run benchmark should be flagged. If they aren't, ask.
- The staleness map. Turn it into calendar entries the same day. This is the step everyone skips and it's what makes the artifact a living asset rather than a snapshot.
- The recommendation, last. By now you know how much weight it can bear.
A.6 When the matrix disagrees with you
This happens, and it's the most useful moment in the process. Two legitimate responses:
- Your constraint was wrong or unstated. Fix the weights and say why in the ADR. "We overrode the matrix because index memory is a harder ceiling than the weighting reflected" is a fine sentence.
- Your prior was wrong. Rarer, more valuable.
What's not legitimate is re-running with a different framing until you get the answer you wanted. If you're tempted, that's the moment to turn red_team on instead.
A.7 Handoff
research.md carries metadata frontmatter that downstream skills consume directly:
/bmad-prd
The PRD reads the summary without reprocessing the digests. In your repo, put the report next to the ADR it grounds:
docs/decisions/0014-embedding-model.md # the decision
docs/decisions/0014-research.md # the evidence
Realistic cost: ~40 minutes wall clock, most of it unattended. Compare against the multi-week cost of re-embedding after a wrong pick.
Walkthrough B β Draft β Process: the MT vendor landscape
Scenario. You need translation for the multilingual feature. Six plausible vendors, opaque and structurally different pricing, quality claims that are all self-reported.
This is the textbook Draft case: a broad public sweep over commercial sources, which is exactly what hosted deep-research products are good at, and which you're probably already paying for.
B.1 Draft
> draft a deep research prompt for Gemini: choosing a machine translation
vendor for [your language pairs], ~[N] million characters/month, EU +
Canada data residency requirements, glossary/do-not-translate support
required. Competitive type, select shape.
You get back a prompt carrying the competitive pack's craft β pruned dimensions, freshness bars, source policy, and a hard citation demand, tuned to the tool you named.
Check it before you paste. Two things:
- Does it demand citations with publication dates? If the citation demand is soft, the report will be soft.
- Does it name volume and language pairs? Pricing rankings invert with volume, and "supports 100+ languages" is a marketing claim that says nothing about your specific pairs. If those aren't in the prompt, add them by hand.
B.2 Round-trip, then Process
Paste into your subscription tool, let it crawl, save the output.
> there's a research report at ~/Downloads/mt-vendors.pdf, process it
What Process does, and why each part matters:
| Step | Why |
|---|---|
Original preserved untouched in imports/ | Provenance. You can always go back to what the tool actually said |
Claims extracted to digests/ behind the firewall | Your project context can't leak into the extraction |
Gap-check against the competitive pack | The pack knows what a vendor teardown should cover. This is the highest-value step β it tells you what your external tool missed |
Distilled into the standard cited research.md with metadata | Downstream skills consume it identically to a native run |
B.3 The gap report is the point
Typical output from the gap check on a vendor sweep:
COVERED
pricing, language coverage, published quality claims, API surface
GAPS (not covered by the imported material)
- sub-processor lists and data residency commitments
- training-on-customer-data defaults and opt-out terms
- glossary / do-not-translate feature parity across vendors
- exit terms and data portability
- per-pair quality for [your two lowest-resource pairs]
Note what the gaps are: every single one is a procurement or per-pair specific question. Hosted research tools crawl broad commercial surfaces well and are poor at the narrow, contractual, and specific. That's the division of labour to internalize.
B.4 Targeted Run on the gaps only
> run a focused research pass on the gaps only β sub-processors,
training-on-customer-data terms, glossary parity, exit terms.
Type competitive, effort standard, validation high.
Small, cheap, and it lands in the same run folder β the slug is deterministic across the draftβprocessβrefresh lifecycle, so the report is one artifact, not three.
Net cost: one paste, one file drop, one 12-minute run. Your subscription paid for the expensive crawling.
Walkthrough C β The compliance gate, done without fooling yourself
Scenario. Design freeze is in two weeks. You need to know whether the deletion path survives a right-to-erasure request against a vector index.
C.1 The framing trap, shown concretely
β Here's our retention and deletion design [paste]. Is it GDPR compliant?
This defeats the firewall by hand. You've supplied the conclusion as context, and you'll get a well-cited report explaining why your design is fine. It will be persuasive. It will be worthless.
β
What does GDPR Art. 17 require when personal data has been embedded into
a vector index that does not support hard delete? Include regulator
guidance on derived data and on bounded-but-delayed deletion.
Type: domain. Validation: high. red_team on.
Then compare your design against the requirements yourself, afterward. That ordering is the entire discipline.
C.2 Source policy override β do this before running
Regulatory research is the clearest case for overriding the default source policy, because the SEO layer in this space is thick and sales-motivated:
# _bmad/custom/bmad-deep-recon.user.toml
[[workflow.source_policies]]
code = "regulatory"
preferred = [
"eur-lex.europa.eu", "edpb.europa.eu", "ico.org.uk",
"priv.gc.ca", "cai.gouv.qc.ca",
]
banned_kinds = ["law-firm marketing", "compliance-vendor content marketing"]
[workflow.freshness.regulatory]
statute = "36mo"
guidance = "12mo"
enforcement = "6mo"
Confirm the exact key paths against the shipped customize.toml; the shape and the intent are what matter.
C.3 Two runs, not one
Run 1 (domain) β what the law requires. Erasure scope for derived data, whether embeddings are personal data, Art. 22 threshold for your ranking surface, Quebec Law 25 automated-decision notice, transfer posture for inference calls.
Run 2 (technical) β how to satisfy it in your stack. Real deletion latency under HNSW soft-delete plus segment merge; whether bounded-but-delayed deletion is defensible; consent propagation to precomputed candidate sets and warm caches; embedding inversion as a residual risk.
Merging these produces a report that's shallow on both, because they want different sources and different freshness windows.
C.4 What you hand counsel
Not the whole report. A one-pager built from it:
- Requirements, each traced to a primary source with a date
- Our design's position on each β your comparison, done after the fact
- "Could not determine", verbatim. In compliance work the gaps are the finding
- Three specific questions you need a lawyer to answer
An hour of counsel time instead of a week. And when the auditor asks "how did you conclude this?", the answer is a file with publishers and access dates, not a recollection.
Walkthrough D β Threat-modeling a ranking surface
Scenario. The recommendation feature ships to authenticated users next quarter. Security review is a launch gate.
D.1 The run
> technical research: attack surface of a personalized recommendation
ranking system serving authenticated users. Cover manipulation of
rankings, poisoning of the interaction feedback loop, inference attacks
against user embeddings, cross-user leakage through shared segments,
and model extraction. Include documented incidents, not just papers.
Validation: high. red_team on.
red_team on is deliberate. You are walking in believing the system is basically safe β buy the adversarial pass.
"Include documented incidents, not just papers" is the other lever. Academic attack papers describe what's possible; incident writeups describe what's happened, which is a much better guide to what to fix first.
D.2 The transformation that makes it useful
A threat list is not a deliverable. Convert it, in the same session:
| Threat (from report) | Likelihood here | Impact | Disposition | Artifact |
|---|---|---|---|---|
| Shilling / coordinated profile injection | Medium β accounts are cheap | High β ranking integrity | Mitigate | Story: interaction-rate anomaly detection per item |
| Embedding inversion recovering attributes | Low β vectors not exposed at API | High if exposed | Control | ADR: user vectors never leave the service boundary |
| Cross-user leakage via shared segments | Medium | Medium | Mitigate | Story: minimum cohort size before a segment is surfaced |
| Model extraction via systematic querying | Low β rate limits exist | Medium | Accept, documented | Note in threat register, with citation |
| Feedback-loop poisoning (slow-drip) | Medium | High β hard to detect | Investigate | Spike: can our anomaly detection see sub-threshold drift? |
Accepted risks get written down with the citation attached. That record is what makes the next security review fast, and it's exactly what's missing when a reviewer asks "did you consider X?" and the honest answer is "probably, in a meeting."
D.3 If there's an LLM in the pipeline
Add indirect prompt injection via item metadata and user-generated content as a first-class dimension, and take the structural lesson from PR #2611 itself: they didn't filter untrusted text out of a shell command, they changed the channel so it never reached one. Briefs went to a file; the template substitutes a skill-generated path. Filters on untrusted text fail eventually. Removing the interpreter from the path doesn't.
Walkthrough E β Refresh, three months later
> refresh the embedding model research
Only stale claims get re-verified, per the staleness map. You get a delta:
CONFIRMED (11) license terms, dimensionality/memory figures, ...
CHANGED (3)
[4] Model B latency benchmark β improved ~20% after a runtime release
[7] Model C pricing β restructured to committed-use tiers
[9] Model A release cadence β slowed; last release 5 months ago
OVERTURNED (1)
[12] Model D commercial-use terms changed; the revenue threshold that
made it viable for us no longer applies as documented
β Claim [12] is referenced by:
docs/decisions/0014-embedding-model.md
That warning is the whole reason the lifecycle exists. A licensing assumption underpinning a shipped decision moved, and you found out from a 6-minute refresh rather than from procurement, or a lawyer, or a blog post someone forwards you.
What you do: re-open the ADR, note the change, decide whether it changes anything. Often it doesn't. The value is that the question got asked at all.
Walkthrough F β Deepen one dimension
You committed to a model. Now you need the fine-tuning story properly, and only that.
> deepen the fine-tuning and adaptation dimension
Drills one dimension without re-running the other five. Minutes, not tens of minutes. This is the command that makes research iterative β you stop trying to front-load every question into one enormous engagement and instead pull threads as they become load-bearing.
Rule of thumb: deepen when the question was in scope but under-answered. A fresh run when the question is genuinely new.
Walkthrough G β Headless refresh in CI
The headless JSON contract means the staleness map can run itself. A quarterly job, roughly:
# .github/workflows/research-refresh.yml
on:
schedule: [{ cron: "0 6 1 */3 *" }] # first of the month, quarterly
jobs:
refresh:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Refresh decision research
run: |
bmad-deep-recon refresh \
--headless --output-format md \
--workspace docs/decisions/research/
- name: Open an issue if anything was overturned
run: ./scripts/alert-on-overturned.sh
Headless runs present canonical markdown only β output_format = auto handles that without configuration. Alert on overturned and on changed that touches a referenced claim; ignore confirmed. Otherwise you've built a quarterly notification everyone mutes by the second quarter.
This is the cheapest high-value automation in the whole system: decision rot, detected without anyone remembering to look.
Walkthrough H β The anti-walkthrough
Worth seeing the failure mode concretely, because it's what a first run usually looks like.
> research recommendation system best practices
What the plan gate proposes: eleven dimensions, breadth-first, deep, ~55 minutes. Nothing was pruned, because no decision was stated and therefore nothing could be pruned.
What you get: a well-cited, genuinely accurate survey of recommender systems. Collaborative filtering, content-based, hybrids, cold start, evaluation, MLOps. All true. All findable in any textbook. None of it weighted to a choice you face.
Cost: ~55 minutes and a large token spend, for something you skim once.
What went wrong, precisely: the plan gate is a pruning device. It prunes dimensions against the decision. No decision means no pruning function, so the run is unbounded by construction. The mechanism didn't fail β it was handed nothing to work with.
The fix is one sentence, always the same shape: "I am choosing between X, Y and Z, under constraints A, B and C, and I'll live with it for N months."
If you cannot write that sentence, you're not ready to research. You're ready to brainstorm β which is a different skill, and the right one for that moment.
23.9 Team integration patterns
Keep the research in the repo, next to the decision.
docs/decisions/
βββ 0014-embedding-model.md # ADR: what we chose and why
βββ 0014-research.md # the evidence, with provenance
βββ 0015-mt-vendor.md
βββ 0015-research.md
The ADR states the decision and the reasoning. The research file carries the citations, dates, and staleness map. Six months later the ADR tells you what, and the research file tells you whether it still holds.
Review research in PRs. A research report in a pull request gets the same treatment as code: someone checks whether the plan-gate dimensions were right, whether the weights match the team's actual constraints, and whether the "could not determine" section was read rather than skipped. This catches motivated framing better than anything else, because the person reviewing didn't want the answer.
Onboarding. A new engineer reading 0014-research.md learns why the stack looks the way it does, from sources, in twenty minutes. Compare with the usual mechanism: asking whoever's been there longest and getting a partly-reconstructed memory.
Don't let it become theatre. Research that's produced, filed, and never refreshed or contradicted is a compliance ritual. The signal that it's real: someone, at some point, overrode a recommendation and wrote down why.
23.10 Calibration β what to spend where
| Engagement | Preset | Validation | Red team | Time | Worth it when |
|---|---|---|---|---|---|
| Library or framework pick | quick | normal | off | ~8 min | Multi-year dependency |
| Dependency health check | quick | normal | off | ~6 min | Always. Cheapest useful run there is |
| Metric / eval methodology | standard | normal | off | ~20 min | The metric will govern future decisions |
| Component selection (model, index) | standardβdeep | high | off | 25β45 min | Reversal cost is weeks |
| Vendor / build-vs-buy | deep | high | off | 35β50 min | Data leaves your boundary |
| Privacy / regulatory | deep | high | on | 40β60 min | Any personal data or profiling |
| Security / threat model | deep | high | on | 40β60 min | User-facing or model-driven surface |
| Algorithm / technique trend | quickβstandard | normal | off | 10β20 min | Only after converting it to a decision |
Two patterns in that table worth naming:
red_teamis on exactly where you have a prior. Nobody walks into a privacy or security review neutral β you walk in believing you're fine. That's the condition the adversarial pass exists for.- The cheapest runs are the most consistently underused. A six-minute dependency-health check has probably prevented more grief than any model comparison ever run.
24. Sources
- BMAD-METHOD PR #2611 β "feat(core): consolidate research trio into bmad-deep-recon", merged 23 Jul 2026 β https://github.com/bmad-code-org/BMAD-METHOD/pull/2611
docs/explanation/deep-recon.mdβ https://github.com/bmad-code-org/BMAD-METHOD/blob/main/docs/explanation/deep-recon.mddocs/how-to/customize-bmad.md(config layering and merge rules) β https://github.com/bmad-code-org/BMAD-METHOD/blob/main/docs/how-to/customize-bmad.md
Applied guidance in Β§12βΒ§17, the epistemological analysis in Β§22, and the walkthroughs in Β§23 are my analysis, not sourced from the BMAD docs. The named philosophical concepts (Gettier, Popper, Reichenbach, Condorcet) are standard terms of art in epistemology and philosophy of science.