feat(teams): staff research phases with a research team
`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
This commit is contained in:
co-authored by
Claude Opus 5
parent
4f4ce34203
commit
ceec0423ad
@@ -1,19 +1,54 @@
|
||||
key = "research_only"
|
||||
title = "Research only"
|
||||
blurb = "Produce a styled MD + PDF artifact in the workspace. One-shot or scheduled."
|
||||
blurb = "Answer a question and deliver a sourced markdown report. One-shot or scheduled."
|
||||
requires_repo = false
|
||||
|
||||
# Phases run in order. Each entry gets a `mission_phases` row on
|
||||
# mission create; the orchestrator dispatches per-kind executors.
|
||||
default_team_template = "rust_sdlc"
|
||||
#
|
||||
# `rust_sdlc` until 2026-08-21, which staffed this repo-less markdown mission
|
||||
# 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: 9 distinct skills across 5 role prompts, ~50KB, one applicable.
|
||||
# See docs/SKILL-USE-BASELINE.md finding 7.
|
||||
default_team_template = "topic_research"
|
||||
|
||||
[[phases]]
|
||||
kind = "research"
|
||||
order_idx = 0
|
||||
# Phase-scoped config, merged into mission_phases.config on insert.
|
||||
[phases.config]
|
||||
produces = ["md", "pdf"]
|
||||
# `pdf` dropped — PDF rendering was removed from the delivery path and
|
||||
# artifacts are served as Markdown, so asking for it named a format nothing
|
||||
# generates. `security_hardening` was corrected for this; this recipe was not.
|
||||
produces = ["md"]
|
||||
default_topology = "hub_spoke"
|
||||
# This recipe had NEITHER of the two keys below, which is the same defect
|
||||
# `benchmark`, `security_hardening` and `research_and_code` were each fixed
|
||||
# for: a phase with no `done_when` never enters `evaluating`, is never judged,
|
||||
# and reports `completed` whatever it did. The empty-delivery rule still caught
|
||||
# a phase that wrote nothing at all (`research` is in PRODUCING_KINDS), so the
|
||||
# gap was narrower here — a mission that wrote one junk file went green.
|
||||
task = """
|
||||
Answer the mission brief and deliver a sourced report.
|
||||
|
||||
There is no repository on this mission. `/mission/repo` is your workspace, everything you leave there is collected and published as the mission's artifact, and anything written anywhere else is not delivered.
|
||||
|
||||
Work in three passes and leave the trail behind: research/questions.md (what actually has to be answered), research/evidence.md (the sources, quoted, with the URL and the date fetched), and research/REPORT.md (the answer).
|
||||
|
||||
Cite every claim to a source you actually fetched. A claim you believe but cannot source belongs in the report's open-questions section, named as open — not hedged into the body, and not dropped silently.
|
||||
|
||||
If the brief is too vague to answer, say so in research/REPORT.md and say what you would need. That is a real result. A report written against a guess about what was wanted is worse than one sentence saying the brief was unusable.
|
||||
"""
|
||||
# Wording follows the measured rule: say what the file must CONTAIN. Positional
|
||||
# phrasing, or "and nothing else", makes the judge invent requirements it was
|
||||
# never given.
|
||||
done_when = "research/REPORT.md exists and answers the mission brief, with each claim in it carrying the URL of a source, and a section naming what could not be established"
|
||||
max_iterations = 2
|
||||
# Nothing is compiled here, so `on_green_tests` would gate on a suite that does
|
||||
# not exist. There is also usually nothing to commit — a repo-less mission
|
||||
# delivers by collection, not by diff.
|
||||
commit_policy = "always"
|
||||
|
||||
# Which team template is the "sensible default" for the picker when
|
||||
# the user hasn't explicitly picked one. UI honors this.
|
||||
|
||||
Reference in New Issue
Block a user