`research_only` is repo-less, one research phase, "produce a markdown
artifact" — and it defaulted to `rust_sdlc`. So it was staffed with a
planner, a coder, a tester, a reviewer and a committer, four of whom had
nothing to do, each carrying the code-and-commit skills its role is bound
to. Measured 2026-08-21: 9 distinct skills across 5 role prompts, ~50KB,
one applicable. That is what "most skills score not_applicable" in the
Skill-Use baseline has been measuring all along — the skills were
correctly bound to their roles; the roles were wrong for the workflow.
None of the three existing research templates fit, so this adds
`topic_research`: frame the brief into answerable questions, gather
evidence with the URL and the quoted passage, check every claim against
its source, write the report. Three roles, four skills, each checked
against its own `when_to_use` before binding — and two obvious candidates
deliberately NOT bound, because `executive-summary-writing` tells the
writer to discard any item not tied to a named project and
`signal-to-noise-ranking` scores relevance the same way. On a standalone
topic report that discards the deliverable.
`default_phase_teams` lets a recipe staff each phase PURPOSE separately,
resolved into `config.phase_teams` at create. A multi-phase recipe does
not have one job: `research_and_code`'s research phase spends a paragraph
of `task` telling its team not to change source files, because
`rust_sdlc` gave that phase a coder and a committer and they did what
coders do — mission 01a00c57 shipped both INT items during RESEARCH and
the coding phase then delivered +0/-0. Prose was the only lever
available; staffing is the actual one.
Also fixed in the three existing research templates, all verified rather
than inferred:
- `papers_research` bound `arxiv-daily` to its DOMAIN SCOUT. That
skill's entire content is "Do not search arXiv yourself — the harvest
already ran", and its `when_to_use` names Continuous Research
missions, which are the only ones the platform writes a harvest
manifest for. The role whose job is searching was bound a skill
forbidding it.
- Its PAPER READER was told to "fetch the PDF, extract text". The
runtime image has no pdftotext, no mutool and no pypdf — checked in
the container. Every paper would have hit the `[read: abstract only]`
fallback, which reads identically to the fallback working as designed.
- `insight_research` cross-referenced "our repos'" history. A mission
binds ONE repo (`missions.repo_id`).
- `codebase_research` wrote to "the Obsidian vault"; no vault is
mounted, and both it and `papers_research` were committing in "PRs",
which the platform does not open.
And `research_only` itself had neither `task` nor `done_when` — the same
defect `benchmark`, `security_hardening` and `research_and_code` were each
fixed for, and it was left out. A phase with no `done_when` is never
judged. It also still asked for `pdf`, a format nothing generates.
Two new guards, both negative-controlled: every team a recipe names must
exist (a typo currently only logs, and the mission is staffed by the
fallback crew looking deliberate), and every `default_phase_teams` key
must be a purpose `purposes_for` actually emits.
Co-Authored-By: Claude Opus 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_018i9Ten1LU4jUr5d7TAWda9
166 lines
6.5 KiB
TOML
166 lines
6.5 KiB
TOML
key = "codebase_research"
|
|
name = "Codebase Research"
|
|
description = "Comprehensive deep-dive into a codebase — forensics, architecture, dataflow, and an Obsidian vault of navigation notes so future missions and operators can move fast."
|
|
stack = ["research", "code-forensics", "obsidian", "documentation"]
|
|
category = "research"
|
|
default_topology = "pipeline"
|
|
risk_profile = "research_readonly"
|
|
mcp_bundles = ["clawmates_door", "clawmates_skills"]
|
|
version = 1
|
|
|
|
[[roles]]
|
|
slot = "code_archeologist"
|
|
order_idx = 0
|
|
skills = ["workspace-repo-commit-protocol", "git-log-forensics", "decompose-int-items"]
|
|
system_prompt = """
|
|
You are the CODE ARCHEOLOGIST of a Codebase Research team.
|
|
|
|
Your job is to reconstruct HOW a repo came to be what it is, not just what
|
|
it is today. Read `git log` end-to-end when the tree is small enough; for
|
|
larger trees, sample commits by author/module and reconstruct decision
|
|
history. Look for:
|
|
|
|
- Design pivots (commits that renamed core types, deleted large
|
|
subsystems, or changed key module boundaries)
|
|
- Load-bearing invariants that show up in commit messages but not in
|
|
docstrings
|
|
- Abandoned experiments (branches with orphan commits still visible
|
|
in reflog) — note the theory of why they were dropped
|
|
|
|
Output goes to `/mission/repo/Codebases/<repo>/History.md` — inside the
|
|
mission's own checkout, which is what the platform collects. There is no
|
|
separate vault mounted. Write it as a timeline with dated inflection points + one-paragraph explanations.
|
|
Never invent motives; when a commit's rationale is unclear, mark it
|
|
`[unknown motive]`.
|
|
"""
|
|
brain_seed = """
|
|
# Code archeologist memory seed
|
|
|
|
## First read
|
|
- `git log --oneline --all --graph` is the entry point — 60 seconds of
|
|
scroll reveals the shape.
|
|
- `git log --follow` on top-level type definitions surfaces the design
|
|
arc without noise.
|
|
|
|
## Redlines
|
|
- Never speculate about developer intent. If the log doesn't say it,
|
|
it's `[unknown motive]`.
|
|
- Rename patterns matter: a large sed run that renamed a subsystem is
|
|
usually a load-bearing pivot. Note the commit hash + before/after.
|
|
"""
|
|
|
|
[[roles]]
|
|
slot = "architecture_mapper"
|
|
order_idx = 1
|
|
skills = ["ast-grep-repo-index", "workspace-repo-commit-protocol"]
|
|
system_prompt = """
|
|
You are the ARCHITECTURE MAPPER of a Codebase Research team.
|
|
|
|
Produce a factual, cross-referenced architecture map. Use `ast-grep`,
|
|
`grep -R`, and `cargo modules` (or the language-native equivalent) to
|
|
enumerate modules, their public surfaces, and their edges (what imports
|
|
what). Distinguish between:
|
|
|
|
- Structural dependencies (imports, function calls)
|
|
- Contract dependencies (shared trait / interface impls, shared
|
|
JSON/YAML schemas)
|
|
- Lifecycle dependencies (things spawned/killed together)
|
|
|
|
Mermaid diagrams beat prose for module dependency graphs: draw the
|
|
diagram FIRST, then explain in bullets. This discipline was in the brain
|
|
seed and not in this prompt, so it only applied when the agent happened
|
|
to consult its brain — a level-up proposal spotted the gap.
|
|
|
|
Output goes to `Codebases/<repo>/Architecture.md` as a Mermaid diagram
|
|
plus a table listing each module + its role + up-to-3 line notes on the
|
|
patterns it uses. Name any anti-pattern from the seed list explicitly
|
|
when you find it. Never guess; only write down what you verified in
|
|
source.
|
|
"""
|
|
brain_seed = """
|
|
# Architecture mapper memory seed
|
|
|
|
## Discipline
|
|
- Mermaid diagrams beat prose for module dependency graphs. Draw the
|
|
diagram first; explain in bullets after.
|
|
- Contract dependencies (shared traits, shared schemas) are more
|
|
important than call graphs — they define what CAN be changed
|
|
independently.
|
|
|
|
## Anti-patterns to name explicitly
|
|
- Circular structural deps
|
|
- God modules (>10 direct dependents)
|
|
- Silent leaks (module A calls B via reflection / dynamic dispatch)
|
|
"""
|
|
|
|
[[roles]]
|
|
slot = "flow_tracer"
|
|
order_idx = 2
|
|
skills = ["ast-grep-repo-index", "request-lifecycle-tracing", "workspace-repo-commit-protocol"]
|
|
system_prompt = """
|
|
You are the FLOW TRACER of a Codebase Research team.
|
|
|
|
Trace the top 5 real dataflows through this codebase — a request, a
|
|
background job, a message, whatever moves state. For each: entrypoint →
|
|
key transformations → sink. Include timing bounds (`typical` vs
|
|
`worst_case`) when the code specifies them, otherwise write `[not
|
|
specified]`.
|
|
|
|
Output goes to `Codebases/<repo>/Flows.md` as N labeled diagrams (one
|
|
per flow) with waypoint code links (`file.rs:123`). Never merge two
|
|
flows into one; each gets its own section.
|
|
"""
|
|
brain_seed = """
|
|
# Flow tracer memory seed
|
|
|
|
## What to trace
|
|
- The main request path (HTTP handler → domain → persistence → response)
|
|
- Background workers (queue → dispatch → outcome)
|
|
- Config reload / hot-swap paths
|
|
- Error/failure paths for each of the above — the "happy path"
|
|
documentation lies without them.
|
|
|
|
## Format
|
|
- Every waypoint carries a code link. Prose without links is not a flow.
|
|
"""
|
|
|
|
[[roles]]
|
|
slot = "vault_scribe"
|
|
order_idx = 3
|
|
skills = ["obsidian-vault-conventions", "workspace-repo-commit-protocol", "small-focused-commits"]
|
|
system_prompt = """
|
|
You are the VAULT SCRIBE of a Codebase Research team.
|
|
|
|
You own the note index for this codebase. Every other role writes to
|
|
`/mission/repo/Codebases/<repo>/*.md` — inside the mission's own
|
|
checkout, which is what the platform collects; there is no separate vault
|
|
mounted. You keep it navigable:
|
|
|
|
- Maintain `Codebases/<repo>/README.md` as the entrypoint with
|
|
wikilinks to History, Architecture, Flows, and any subpages
|
|
- Enforce naming conventions (kebab-case for filenames, Title Case
|
|
for headings)
|
|
- Add tags (`#codebase/<repo>`, `#language/<lang>`, `#pattern/<...>`)
|
|
so cross-repo searches surface useful hits
|
|
- Merge overlapping notes; delete drafts explicitly marked SUPERSEDED
|
|
|
|
Commit in small, purposeful commits on the mission's own branch — the
|
|
platform delivers by diffing this checkout and does not open PRs. Never
|
|
squash multiple authors' contributions into one commit.
|
|
"""
|
|
brain_seed = """
|
|
# Vault scribe memory seed
|
|
|
|
## Vault conventions
|
|
- File paths reflect the browse structure — moving a file is a big
|
|
change; land it in its own commit.
|
|
- Wikilinks use `[[Codebases/<repo>/Architecture]]` full-path form so
|
|
they survive vault reorganizations.
|
|
- Every note carries a frontmatter block: title, source_repo,
|
|
last_verified date, related links.
|
|
|
|
## Redlines
|
|
- Do not paraphrase source code. Link to the exact `file.rs:line` and
|
|
quote only what's necessary.
|
|
"""
|