Source: BMAD Recon Β· bmad-recon.md Β· updated 2026-07-25 Β· πŸ”’ secret gist

Synced 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. Then bmad-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?"

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:

FeatureDeep Recon valueWhy
User recommendation (in an existing OpenSearch/HNSW stack)High β€” but not where you'd guessIndex 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 translationHighVendor/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

TermMeaning
SkillA directory containing SKILL.md (the entry point) plus supporting files. The unit of installation and invocation. Invoked as /bmad-<name>.
SKILL.mdThe router/entry file. Modern BMAD keeps it lean and defers detail to references/. Every token in SKILL.md is paid on every invocation.
references/*.mdProcedure files loaded just-in-time, only when that branch is taken. This is the token-optimization pattern.
customize.tomlPer-skill config. Merged through a layered resolver (see Β§9).
AgentA skill with a persona (e.g. Mary the Analyst). Agents expose a menu of options that route to workflow skills.
WorkflowA multi-step skill. Older ones sharded into step-01…step-NN.md; newer ones use mode-based reference files.
Core skill vs module skillsrc/core-skills/ ships to every install. src/bmm-skills/ ships only with the BMM (software dev) module.
ShimA stub skill that forwards an old ID to a new one so existing habits don't break.
Subagent / assistantA spawned sub-context with its own token budget, given a narrow brief, returning a digest.
Planning artifactsThe output folder where analysis/planning docs land, consumed by downstream skills.
MemlogAn 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:

  1. Hallucinated grounding. Ask a model about market size or vendor pricing and it answers from training data β€” confidently, uncitably, and often 18 months stale.
  2. 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.md from ~3,989 to ~2,091 tokens by carving procedures into references/.

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:

FindingFix
{brief} interpolated inside a double-quoted shell template β€” $(), backticks, and quote-breaking could reach a command line, amplified by --dangerously-skip-permissionsContract 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 unvalidatedAllowlist to http(s) only; escape source-derived text before insertion
Refresh/Deepen reset verification status for out-of-scope claimsStatuses preserved outside the refresh scope
user-voice pack ranked community posts above surveysTriangulate instead; redact usernames, handles, emails, identifying URLs from verbatim quotes
Parallel dimension writes raced on research.mdExplicit single-writer rule: digests return to the lead, which alone writes in plan order

3. The three modes

ModeWhat happensYou supply
DraftComposes a research prompt carrying the type pack's craft β€” pruned dimensions, freshness bars, source policy, a hard citation demand β€” tuned to the tool you nameOne paste into ChatGPT / Gemini / Grok / Perplexity
ProcessFiles 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 frontmatterThe report, from any source
RunNative research in session: plan gate β†’ parallel fan-out β†’ verification at landing β†’ cited synthesisApproval at one plan gate

Choosing

SituationMode
You already pay for a deep-research product and don't mind one round-tripDraft β†’ Process
You already have a report (analyst PDF, colleague's doc, whatever)Process
You want results now, one sitting, no app switchingRun
Research needs internal sources or MCP tools only your session can reachRun
Broad public sweep first, targeted follow-up secondDraft + 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.

TypeUse when
marketSizing an opportunity, segments, pricing, go-to-market
domainLearning an industry or field: structure, players, rules, vocabulary
technicalEvaluating a technology area, integration approaches, implementation reality
competitiveTearing down named competitors: offers, pricing, trajectory, sentiment
user-voiceWhat users actually experience and want: reviews, communities
academic-litLiterature 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

PresetAssistantsSources / roundRounds
quick251
standard (default)382
deep6123

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

  1. 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.
  2. The research firewall. Your project files and briefs shape what gets asked, never what gets found. Assistants receive only their assignment. persistent_facts defaults 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

LevelBehavior
normal (default)Spot-checks the claims the recommendation actually rests on
highCross-checks the pack's critical claim classes and red-teams major conclusions
maxChecks 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:

  1. _bmad/custom/{skill-name}.user.toml β€” personal, gitignored β€” wins
  2. _bmad/custom/{skill-name}.toml β€” team/org, committed
  3. 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

KeyPurpose
validationnormal / high / max
red_teamAdversarial pass; default off
use_workflowsWhether to invoke other workflows
subagent_modelsWhich model each assistant class uses
output_formatauto / html / md / both
external_sourcesMCP research sources β€” shipped examples: Tavily, Perplexity Sonar, xAI X-Search
source policiesPreferred and banned sources
doc standards, handoffsDownstream contract
custom typesAdd 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.

#GateThe questionType + shapeCost of skipping
0ValidateDo users actually want this? What already exists?user-voice, competitiveYou build something nobody asked for
1Define successHow is this measured, and does the metric predict anything real?academic-litYou optimize a number that doesn't move the business
2Build vs. buyIs there a vendor? What's the exit cost?competitive + selectEighteen months rebuilding a commodity
3Legal to ship?Lawful basis, disclosure, residency, retention, transparency dutiesdomainRedesign after legal review, or a regulator finds it
4Attack surfaceAbuse vectors, adversarial ML, supply chaintechnicalSecurity review blocks launch; or it doesn't and you learn later
5Licensing & procurementCan we actually use this model/library/vendor?domain / competitiveChosen model turns out to be non-commercial; vendor has no DPA
6Component selectionWhich model, index, library, framework?technical + selectReversible, usually β€” the cheapest gate to get wrong
7Failure modesWhat broke for everyone else who shipped this?technicalYou rediscover known incidents in production
8Cost at scaleWhat does this cost at 100Γ— current volume?technicalUnit economics collapse post-launch
9RefreshDid the ground move under a decision we already made?refreshSilent 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 caseType + shapeRun it whenTypical miss if skipped
1Feature validationuser-voiceBefore committing a quarter to a surface nobody complained aboutBuilding a feature that solves a problem users don't have
2Competitive teardowncompetitiveA rival shipped the thing you're about to shipReinventing, or missing table-stakes behavior
3Metric & eval methodologyacademic-litYour metric will govern every future decision on the featureOptimizing an offline metric with no online correlation
4Component / model selectiontechnical + selectSwitching cost is high (index format, embedding dim, framework)Lock-in to a dying option
5Build vs. buycompetitive + selectA credible vendor existsRebuilding a commodity, or buying an unexitable dependency
6Privacy & data protectiondomainAny personal data, profiling, or automated decisioning β€” see Β§13Redesign after legal review; regulatory exposure
7Security, abuse & adversarial MLtechnicalThe feature is user-facing, user-influenced, or model-driven β€” see Β§14Shipping a manipulable ranking surface
8Licensing & IPdomainAny third-party model, dataset, or copyleft library β€” see Β§17Discovering the model is non-commercial after integration
9Procurement & vendor assurancecompetitiveVendor will process your data β€” see Β§17Legal blocks a vendor you already built against
10Standards & interoptechnicalLanguage tags, encodings, collation, protocols, schemasSubtly wrong behavior in locales you don't test
11Accessibility & inclusive designtechnical / domainNew UI surface, especially multilingualWCAG failures found at audit; RTL and text-expansion breakage
12Fairness, bias & transparency dutiesacademic-lit + domainRanking or recommending to people at scalePopularity-bias spirals; unmet transparency obligations
13Algorithm & technique trendsacademic-litYou suspect the state of the art moved β€” see Β§15Building on a technique the field has quietly abandoned
14Failure-mode / postmortem researchtechnicalBefore designing anything with a known-hard failure modeRediscovering others' incidents in your own production
15Cost modeling at scaletechnicalPer-request inference, egress, or storage costs dominateUnit economics that only fail at volume
16Dependency health & maintenance risktechnicalAdopting a library or model you'll depend on for yearsAdopting an abandoned project with a bus factor of one
17Observability & eval toolingtechnical + selectYou need to measure a system you can't easily inspectNo way to tell whether the feature is working
18Migration & deprecation risktechnicalYour current stack component has a sunset signalForced 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.md with 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

DecisionType + shapeDimensions to insist on at the plan gate
Embedding model for item/user vectorstechnical + selectMultilingual 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 diversitytechnical + selectLatency at your p99 budget, quality delta on public rerank benchmarks, serving cost, staleness of published numbers
ANN index choice / HNSW parameterization defaultstechnicalRecall-vs-latency curves published by index maintainers, memory footprint at your cardinality, filtered-search behavior
Offline metric conventionsacademic-litNDCG@k vs. MRR vs. Recall@k in the recsys literature, position-bias correction, offline↔online correlation evidence
Cold-start strategyacademic-lit or domainPublished approaches, reported lift, honest failure reports
What users complain about in "recommended for you" surfacesuser-voiceFilter-bubble complaints, repetition, staleness, opacity
Lawful basis, retention, erasure, transparency dutiesdomainSee Β§13 β€” the highest-value research on this feature
Manipulation, poisoning and inference attackstechnicalSee Β§14 β€” shilling, embedding inversion, membership inference
Popularity bias and fairness obligationsacademic-lit + domainMeasured popularity-bias effects, mitigation cost in NDCG, disclosure duties
Embedding model / reranker licensingdomainField-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 data rule 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

KnobSettingWhy
Source policy β€” preferredEUR-Lex, EDPB, national DPAs, ICO, OPC Canada, CAI QuΓ©bec, court decisionsPrimary texts and regulator guidance beat everything
Source policy β€” bannedLaw-firm marketing blogs, compliance-vendor content marketingThis space is saturated with SEO'd summaries that misstate scope and are optimized to sell a product
validationhigh minimumA wrong regulatory claim is load-bearing by definition
red_teamon (it's off by default)If you walked in believing you're compliant, buy the adversarial pass
Freshness windowsStatute ~36mo Β· guidance ~12mo Β· enforcement/case law ~6moThese claim classes genuinely age at different rates
FirewallDo not paste your retention design inOtherwise 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

KnobSetting
Preferred sourcesNIST, OWASP, MITRE ATT&CK/ATLAS, CVE/NVD, vendor security advisories, peer-reviewed adversarial-ML venues, credible incident writeups
Banned sourcesSecurity-vendor content marketing, "top 10 threats" listicles
validationhigh
red_teamon β€” this is the category it was built for
FreshnessAttack 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:

  1. 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.
  2. 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.

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 askDecision framingType + 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

DecisionType + shapeWhy external
MT provider / model selectioncompetitive + selectPricing, language pairs, quality claims, and rate limits are all public and all move
Quality evaluation methodologyacademic-litBLEU vs. chrF vs. COMET vs. LLM-as-judge is a live methodological debate; picking wrong invalidates your whole eval
Locale, normalization, and collation handlingtechnical or domainThese are external standards (Unicode/CLDR/ICU), not opinions
Human-in-the-loop / post-editing workflowdomain + user-voiceLocalization industry has established practice you shouldn't reinvent
Data residency and PII in translation payloadsdomainRegulatory, jurisdiction-specific, and changes
Terminology/glossary and do-not-translate handlingtechnicalProvider 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 high cross-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:

  1. Draft a prompt for whichever deep-research product you subscribe to. Vendor landscapes are exactly what hosted crawlers are good at.
  2. Run it there; bring the report back.
  3. Process it β€” original preserved in imports/, claims extracted, gaps flagged against the competitive pack.
  4. 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

  1. 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.
  2. State your constraints as constraints. Latency budget, memory ceiling, language mix, volume, license posture, deploy target. These become matrix weights.
  3. Name candidates as inclusions, never as the frame. Otherwise you get a confirmation exercise.
  4. Declare your freshness bar when the field moves fast. Don't accept the pack default silently.
  5. Pick the decision shape deliberately. select for choose-between, explore when you don't yet know the option space. Running select too early narrows prematurely.

18.2 At the plan gate

  1. 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.
  2. 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.
  3. Match effort to reversibility. quick for a decision you can undo next sprint; deep + validation = high for something that becomes load-bearing.
  4. 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

  1. 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.
  2. Chase answer-engine citations to primaries. If the report leans on an aggregator, that's one publisher, not three.
  3. Read the "could not determine" section first. Gaps are more informative than confirmations.
  4. Check the staleness map and act on it. Research that's never refreshed is research that silently becomes wrong.
  5. Keep research.md in 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

  1. 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.
  2. Default to standard. The presets were rescaled downward because v1 was too slow and too token-heavy. Reach for deep deliberately.
  3. Use deepen instead of re-running. Drilling one dimension is far cheaper than a fresh engagement.
  4. Use refresh instead of redoing. It re-verifies only what's stale.

18.5 Hygiene

  1. Turn on red_team for decisions with a strong prior. It's off by default. If you walked in already believing the answer, buy the adversarial pass.
  2. Redact before quoting people. The user-voice pack now requires stripping usernames, handles, emails, and identifying URLs from verbatim quotes β€” carry that rule into anything you paste into a PRD.
  3. 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-permissions flag.

18.6 Domain-specific craft

  1. Run the compliance and security gates in week one, not week ten. Their findings are design constraints. Discovered late, they're rewrites.
  2. 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.
  3. 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.
  4. Always add a "negative results and failures" dimension to any technique or trend research. Published literature is positive-biased and won't volunteer it.
  5. 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.
  6. 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.
  7. Convert security output into accepted-or-mitigated decisions, with citations attached. A threat list is not a deliverable; a threat register with dispositions is.
  8. 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-patternWhy it failsDo instead
"Research recommendation systems"No decision β†’ unbounded dimensions β†’ expensive encyclopediaName the decision and constraints
Running research on your own codebaseFirewall means it looks outward; your repo isn't a sourcebmad-document-project
Pasting architecture docs "for context"Defeats the firewall; produces agreeable findingsLet context shape questions only
deep + max on every runBurns tokens and minutes for marginal gainScale to reversibility
Approving the plan gate without readingThe one place your judgment is irreplaceablePrune dimensions, check topology
Treating research.md as a one-time artifactClaims rot; downstream artifacts inherit the rotRefresh from the staleness map
Using research to decide how to implementWrong tool; you need your codebase, not the webStory workflows
Accepting vendor-published quality numbersSystematically flatteringFlag self-reported; verify at high
Naming your preferred option in the framingConverts 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" runThree source policies in conflict; shallow on all threeThree engagements, three policies
Sourcing compliance claims from law-firm blogsSEO'd, scope-distorting, sales-motivatedBan them; require regulators and primary texts
Threat list with no dispositionsReads like diligence, changes nothingThreat β†’ likelihood/impact β†’ control or accepted, cited
Trend research with no negative-results dimensionAggregates only claimed wins; confidently wrongName failed reproductions as a required dimension
Researching a parameter your own data can settleExpensive procrastinationquick for the prior, then measure
Vendor research after integrationDiscovers blockers when unwinding costs mostProcurement gate before the first API call
Assuming open weights means usableField-of-use and MAU clauses bite lateRead the license text, not a summary

20. Command cheat sheet

GoalType 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:

  1. 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.
  2. 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.
  3. Files-first, conversation-as-control-channel. Anything valuable goes to disk on arrival. Contexts die; disks don't.
  4. Verify at landing, not at the end. A late pass degraded quality in field testing.
  5. Mechanical work belongs in a tested script. Counting, cross-referencing, date math, slug generation.
  6. Build an explicit bias firewall. Separate "what shapes the question" from "what counts as evidence," and enforce it at the subagent boundary.
  7. Choose fan-out topology deliberately. Parallelism is a cost, not a virtue.
  8. Treat tool output as untrusted input. File-based handoff over shell interpolation, protocol allowlists, escaping at the boundary.
  9. Give artifacts a lifecycle. Staleness maps, delta refreshes, and downstream-impact warnings turn a document into an asset.
  10. 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.

  1. It's true
  2. You believe it
  3. 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

ConceptPlain meaningEveryday example
JustificationThe 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"
TestimonyBelieving something because someone told you. Most of what anyone knows works this way β€” you've never personally verified that Antarctica existsTrusting a doctor, a map, a news report
FoundationalismThe 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 solidA wall of bricks needs a foundation, not infinitely more bricks below
DefeasibleA 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
DefeaterThe new evidence that overturns itThe posted schedule change
FallibilismAccepting that any of your beliefs might be wrong, without concluding that nothing is worth believing. Confidence without certaintyScience's default posture
FalsificationTesting an idea by trying hard to break it rather than piling up examples that fit. Associated with Karl PopperDon't count white swans; go looking for a black one
CalibrationYour confidence matching your actual accuracy. Being 70% sure of things that turn out true about 70% of the timeA weather forecaster who says "30% rain" and is right about that often
ProvenanceWhere a claim came from, and through whose handsA museum tracing an artifact's ownership chain
IndependenceTwo sources counting as genuinely separate evidence, rather than both repeating one originalTwo 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.

MechanismWhat 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 appendixFoundationalism. 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 claimThe 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 policyA 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 classFallibilism 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 passFalsification. 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" sectionCalibration. 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 literatureCorrects 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 endJustification 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 truthThe 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_facts defaults 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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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 conceptIts form in your systems
Publication biasPopularity bias β€” rich-get-richer feedback loops distorting what's available to be seen
Epistemic closure / narrowed inquiryFilter bubbles β€” the system narrowing the space of what a user can encounter
Transparency of groundsDSA 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 provenanceSource attribution in retrieval and RAG β€” whether users can trace what they're being shown
Independence of sourcesDeduplication and diversity in candidate sets β€” ten versions of one document are one document
CalibrationConfidence display and abstention β€” showing "we're not sure" instead of always returning ten results
The firewallPersonalization 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:

ElementWhy it matters
The decision and its horizonPrunes dimensions. "12 months, expensive to reverse" tells the run to weight license stability and maintenance health, not just today's benchmark
Constraints as constraintsThese 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 barEmbedding 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:

  1. 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 deep saves roughly 15% of the run.
  2. 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.
  3. 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.
  4. Check the estimate against your patience. 40 minutes is real. If you'll wander off at minute 12, drop to standard now. 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

  1. "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.
  2. 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.
  3. Self-reported vs. independent numbers. Every vendor-run benchmark should be flagged. If they aren't, ask.
  4. 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.
  5. 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:

StepWhy
Original preserved untouched in imports/Provenance. You can always go back to what the tool actually said
Claims extracted to digests/ behind the firewallYour project context can't leak into the extraction
Gap-check against the competitive packThe 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 metadataDownstream 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 hereImpactDispositionArtifact
Shilling / coordinated profile injectionMedium β€” accounts are cheapHigh β€” ranking integrityMitigateStory: interaction-rate anomaly detection per item
Embedding inversion recovering attributesLow β€” vectors not exposed at APIHigh if exposedControlADR: user vectors never leave the service boundary
Cross-user leakage via shared segmentsMediumMediumMitigateStory: minimum cohort size before a segment is surfaced
Model extraction via systematic queryingLow β€” rate limits existMediumAccept, documentedNote in threat register, with citation
Feedback-loop poisoning (slow-drip)MediumHigh β€” hard to detectInvestigateSpike: 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

EngagementPresetValidationRed teamTimeWorth it when
Library or framework pickquicknormaloff~8 minMulti-year dependency
Dependency health checkquicknormaloff~6 minAlways. Cheapest useful run there is
Metric / eval methodologystandardnormaloff~20 minThe metric will govern future decisions
Component selection (model, index)standard–deephighoff25–45 minReversal cost is weeks
Vendor / build-vs-buydeephighoff35–50 minData leaves your boundary
Privacy / regulatorydeephighon40–60 minAny personal data or profiling
Security / threat modeldeephighon40–60 minUser-facing or model-driven surface
Algorithm / technique trendquick–standardnormaloff10–20 minOnly after converting it to a decision

Two patterns in that table worth naming:

  • red_team is 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.md
  • docs/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.