Blackbird prompts: pitch-only / incubator refactor (prompts + docs) - #34
Conversation
These are meant for Blackbird employees to comment on the prompt-driven behavior of the bots, not for a developer tracking a change. Strip the developer meta accordingly: the "Revision N" changelogs, the PROPOSED/UNCHANGED labels, the prompt-assembly/code mechanics with file and line references, and the code-change appendices. Retitle the file-path section headers to plain-language names, keep every prompt body in full, and add a per-section "Source:" line pointing at the file each block quotes. Note: the quoted blocks still reflect the proposed prompt text, which does not yet match the on-disk prompt files verbatim; reconciling that is a follow-up. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Overwrite the PI (pi_lab / global) and hub (scout_hub) system and phase
prompts with the proposed text documented in
docs/specs/2026-08-07-{pi,hub}-bot-prompts.md. This moves both roles off
the old lab-to-lab scientific-collaboration model and onto the Blackbird
incubator/investor model: GrantBot/FOA and funding threads removed, no
lab-to-lab collaboration or brokered introductions, private instructions
dropped, and the screening rubric folded into the scout_hub system prompt.
identity.md (both) and the eight prompts/specialists/*.md were already
identical and are left untouched. The two "interview phase guidance"
sections are sourced from src/agent/thread_guidance.py (Python, not an md
file) and are out of scope here.
These prompts assume accompanying code changes not made in this commit
(e.g. the Phase-4 {foa_number} substitution, the PI post-type list, and
the #funding-opportunities universal channel).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Blackbird will evaluate the Baltimore-anchoring commitment outside this system, so remove it as a screening dimension everywhere it drives bot behavior: - PI + hub agent-system / phase4 / phase5 prompts: the gating criterion, the interview questions, the red flag, the decision-heuristic clause, the deferral examples, and the `baltimore_commitment` key in the assessment JSON skeleton. Dropping the key is safe — `gating` is plain JSONB filtered by `_normalize_gating`, and no schema column or consumer reads it. - src/agent/thread_guidance.py: the `_SCOUT_HUB` DECIDE guidance (the one remaining live "ask whether they'd anchor in Baltimore" instruction). The snapshot-pinned `_PI_LAB` strings have no Baltimore and are left byte-identical. - Both companion docs: §6 phase-guidance blocks stripped, and the six changed prompt blocks resynced so the docs still mirror the files. The Maryland non-dilutive funding programs (TEDCO/MSCRF/MII/QOF) are kept — they are capital sources, not location gating. Also removes a few clear redundancies: the PI "Who You Can Reach" section (covered by Core Rule 4 + Post Labels; its one unique point folded into Core Rule 4), the redundant "never ask to be introduced" conclusion bullet, and the hub Post-Labels pitch-intake paragraph (restated Interview Structure). Note: test_agent_turn_gm's golden-master snapshot still holds the pre-reframe collaboration prompts (it diverged at 55e89f8); regenerating it as a reviewed diff is deferred. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
A lab agent's only top-level post is now a 💡 pitch, and the hub only ever interviews pitches — it no longer scouts unsolicited results. Lab agent (prompts/agent-system.md, phase5-new-post.md): - Drop the 📰 Result post type from Post Labels, "how an interview starts", and Phase 5. If the lab cannot turn something into a pitch, it does not post. Hub (prompts/roles/scout_hub/*): - agent-system: an interview begins only when a PI opens a 💡 pitch (auto-routed as a thread); the hub does not scout and never opens a thread at a lab itself. - phase2 scan + prune: now no-ops — with labs posting only pitches (which reach the hub as Phase 3 threads, not this list) and the hub's own 🔍 assessments excluded, there is nothing to select or keep. - phase4: interviews are unchanged; the "about a paper" note reframed from result-scouting to a pitch that builds on published work. - phase5: the "reply to an interesting post" option is gone (nothing populates the interesting list); the assessment is now Option A and skip Option B, and the action JSON drops "reply"/target_post_id. Docs mirror the files. Prompt-only change: DEFAULT_POST_TYPES (post_types.py) still lists `paper` and the other pre-reframe types, so the rendered menu and the golden-master snapshot regen remain deferred. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…e prompt-set docs - Add docs/specs/2026-08-07-hub-lab-flow.md — a Mermaid schematic for the Blackbird-staff audience showing the pitch → interview → assessment cycle, the per-turn phase pipeline, and the interview's message-count progression. - Streamline both prompt-set docs so reviewers see only the prompts that actually drive an exchange: drop the two dormant Phase 2 sections (Scanning / Trimming — no-ops under pitch-only intake), renumber the remaining sections, and reframe the intros away from "full set" / "scanning". The Phase 2 prompt files still exist on disk; skipping the phase and deleting them is tracked in #33. These docs are now curated "used-prompts" references, not complete on-disk mirrors. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Under pitch-only intake an interview starts from the lab's own pitch, not
from the hub scouting results. Rewrite the PI phase-4 "about a paper"
section from result-scouting framing ("the hub reads results looking for
something worth screening") to "if your pitch builds on one of your lab's
papers", matching the hub-side reframe. Mirrored into the PI doc.
The deeper PI-side gap — the _PI_LAB phase guidance in
src/agent/thread_guidance.py still uses the collaboration model
(:memo:/complementarity/first-experiment) and is snapshot-pinned — is
left for a separate reviewed change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ocs branch, engine branch) Approved design from the 2026-08-12 brainstorm: strict hub-and-spoke topology, Approach C auto-activation intake, GrantBot/funding removal, memo-lifecycle deletion, phase-2 code guard, one-pitch-per-day pacing, and the two-branch packaging (this branch = instruction text for PR34; engine reconciliation as a stacked draft PR). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ase guidance Replaces the collaboration-era _PI_LAB strings (:memo:/✅ mandates) with the pitch-model text from the PI doc §4, and ports the hub doc's four §4 rewordings into _SCOUT_HUB (including 'in your rubric' for the dangling private-instructions pointer). Golden masters are regenerated in the engine-reconciliation branch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…le; align interview-start with hub auto-open Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…fidentiality; resolve the unsatisfiable ❓ label Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e-note length band Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ontext block Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…em in the prompt-set docs Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ion intake, disabled-in-code phase 2, one pitch per day Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ment lead-in, P3 activation node Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…e-1 table label Final-review fixes: the hub prune prompt (and its doc mirror) no longer asserts the retired do-not-scout model; the flow-doc phase-1 row header now matches its corrected cell; the Key-rules 💡 is backticked (deliberate deviation from the plan's bullet text, for consistent literal rendering); the Reading-it paragraph is re-wrapped with no word changes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Prompts+docs reconciliation landed on this branchFollowing an adversarial audit of this PR and a design review (see
CI remains red on this branch by design — tests and golden-master regeneration land Flagged for the engine-reconciliation branch (out of this branch's scope): the final |
Both roles' system prompts carried two Core Rules that no longer apply now
that private instructions and human-PI interaction are being removed
end-to-end (removal-cycle plan, decisions 1-10):
- pi_lab Core Rule 4 ("Your private instructions are confidential") and
Core Rule 6 ("DM rules" — DMing your own PI) deleted; renumbered
5->4 (the only-agent-you-talk-to rule).
- scout_hub Core Rule 4 ("Your own private instructions are confidential
too") and Core Rule 6 ("DM rules" — DMing a PI) deleted; renumbered
5->4 (one-PI-at-a-time). Rule 3 (interview confidences -> sidecar) is
untouched — it protects a PI's confidences, not the agent's own private
instructions, and stays per the plan's locked decisions.
- prompts/phase5-new-post.md: deleted the "## Your PI flagged this"
paragraph (Task-12 tag->pitch feature, reversed by the new scope).
- prompts/phase4-thread-reply.md: dropped the buried "...or your PI has
told you not to pursue it" clause from the self-decline bullet — the
same inbound-PI-DM premise the DM-rules Core Rule assumed.
All "PI intent" attribution language ("that's a question for my PI",
"cannot commit your PI") is kept per decision 10 — it describes the bot's
inability to speak for a person's intent, not an interaction channel.
Every edit is mirrored byte-identically into the embedded doc blocks
(docs/specs/2026-08-07-pi-bot-prompts.md §1/§3/§5,
docs/specs/2026-08-07-hub-bot-prompts.md §1), verified with a ported
doc-sync gate (Source-block byte-compare + §4 normalized compare against
thread_guidance.py) at /tmp/claude-1000/rm-b1-verify.py.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…to Phase 4 CONCLUDE The hub's Opportunity Assessment used to be a standalone Phase-5 top-level post, promised inline by the interview's concluding reply. Decision 9 (hard phase-5 gate for scout_hub) makes that promise structurally undeliverable, so Option A (locked) folds the assessment into the CONCLUDE reply itself: the verdict stays inline exactly as before, and the `<assessment_json>` sidecar skeleton/rules relocate unchanged from the deleted phase5-new-post.md into a new CONCLUDE-adjacent section of phase4-thread-reply.md. - Delete prompts/roles/scout_hub/phase5-new-post.md; delete hub doc §5, renumber §6/§7 -> §5/§6, fix the doc's "two situations" intro sentence. - Relocate the sidecar skeleton + confidentiality-binding quality-bar text into phase4-thread-reply.md's new "Concluding with an Opportunity Assessment" section (mirrored in hub doc §3); reconcile the now-false "outside <slack_message> is discarded" and "assessment turn has no tools" lines with the new same-turn reality. - thread_guidance.py _SCOUT_HUB[CONCLUDE]: verdict + sidecar in the same reply, "will follow as its own post" removed, no-tools sentence reworded since consult_specialist is reachable in this turn now. Mirrored in both docs' §4. - role.toml: post_types = [] (hub never posts top-level, of any type, including funding_collab) with a reply-only comment. - Retarget hub agent-system.md's Phase-5 pointers, Interview Conclusions, and Post Labels section (:mag: redefined as the sidecar's name). Fix the same "assessment will follow" promise on the lab's side (generic agent-system.md + phase4-thread-reply.md + lab phase5-new-post.md), mirrored in the PI doc. - hub-lab-flow.md: drop the H5/OUT split, fold the assessment into the concluding-reply node, Phase-5 table cell -> "— (reply-only)", Key rules updated. Gate: /tmp/claude-1000/rm-b1-verify.py exit 0 (21 sync points, shape-adjusted for the deleted Source block). Residue greps clean; remaining "Opportunity Assessment" mentions are either the (justified) dormant Phase-2 files awaiting Task-3 deletion or the term surviving correctly as the sidecar/verdict concept. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014oXRXEdWDcpitGYT3Y5hUP
Task 3 (B1) of the removal-cycle plan: phase-2 (scan + prune) has been dead
code since Task 8 disabled it in simulation.py, and per AUD-P2's map every
prompt file and doc reproduction of it goes, not just a "disabled in code"
label.
- Delete prompts/phase2-scan-filter.md, prompts/phase2-prune.md,
prompts/roles/scout_hub/phase2-scan-filter.md,
prompts/roles/scout_hub/phase2-prune.md.
- pi-bot-prompts.md: delete §6 "Phase 2 prompts (inactive)" (the file's
final section — no renumbering needed, nothing follows it); drop the
intro paragraph's "A final section reproduces the two phase-2 prompts"
clause.
- hub-bot-prompts.md: delete §6 "Phase 2 prompts (inactive)" (likewise the
final section post-Task-2's renumbering, now after §5 the specialist
panel); drop the matching intro-paragraph clause.
- hub-lab-flow.md §2: remove the P2 mermaid node (P1 --> P3 --> P4 --> P5),
the phase-2 table row, and the post-table "Phase 2 is disabled in code on
both sides" paragraph. §2's lead-in ("Only some phases do work in this
deployment") stays accurate — the hub's Phase 5 is still a no-op.
Engine code (agent.py's build_phase2_scan_prompt/build_scan_system_prompt,
simulation.py's _phase2_scan_filter/_phase2_prune, config.py's
interesting_posts_cap) and their tests are branch-2 and explicitly out of
scope here per AUD-P2.
Gate: /tmp/claude-1000/rm-b1-verify.py exit 0 (17 sync points).
grep -rniE 'phase[- ]?2' prompts/ docs/specs/2026-08-07-* -> zero hits.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ted for the reply-only system Adversarial comparison against the pre-refactor original: keeps its lean node labels, section skeleton, and five-bullet Key rules, while correcting the six claims the system has outgrown (mention-free auto-activation, no Phase 2 at all, Phase 1 is channel discovery, no hub top-level posts — the assessment sidecar rides in the concluding reply, one pitch per day) and fixing a residue the interim version carried: the OUT audience still described the retired 'visible courtesy note' top-level post; the visible artifact is the inline verdict in the thread, and the sidecar audience is Blackbird staff. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Second wave on this branch: the removal cycle (prompts+docs layer)Four product-direction changes landed on this head (commits
The engine half — including the audit-discovered fix that makes the message-12 MUST-CONCLUDE reply actually reachable in production — is stacked as draft PR #35. CI on this branch alone remains red by design; #35 is fully green. 🤖 Generated with Claude Code |
What this PR does
Reframes the coPI agent prompts — and their Blackbird-facing docs — from the original
lab↔lab collaboration model to a pitch-only / incubator model: each lab pitches one
idea to BlackbirdBot, which interviews it against a rubric and files an Opportunity
Assessment. Labs never talk to each other.
Scope is prompts + docs. The only code touched is prompt-string content in
thread_guidance.py(Baltimore removal). The engine still implements parts of thecollaboration model — see Remaining tension below, which is intended for a separate
reviewed change.
Commits (6)
a376d44docs(specs): reframe the two prompt-set docs for the end-user audience55e89f8feat(prompts): apply the incubator reframe to the on-disk prompt filesdcc5212refactor(prompts): drop Baltimore location gating and trim redundancy96e2522refactor(prompts): make intake pitch-only on both sidesfc8d8a9docs(specs): add hub↔lab flow schematic; trim dormant Phase 2 from the prompt-set docs66ed1b8docs(prompts): reframe the PI "about a paper" guidance for pitch-onlyBlackbird-facing review docs
Remaining tension: pitch model vs. collaboration model
TL;DR
This PR converts the prompts and docs to a pitch-only / incubator model, but large
parts of the engine still implement the original lab↔lab collaboration model. The prompts
now tell each bot to do one thing while some of the code still drives the other. CI is red
until the code and the golden-master snapshots are reconciled.
The two models
discover each other's posts, propose collaborations, exchange
:memo:Summary proposals,confirm with
✅, plus a funding/GrantBot/FOA track. Post types includepaper,help_wanted,introduction,idea_crosslab,funding_collab.other; each lab pitches one idea to BlackbirdBot, which interviews it against a
rubric and files an Opportunity Assessment. No collaboration, no
:memo:, no✅, noscouting.
Already converted (prompts + docs only)
.mdfiles for both roles → pitch-only (system prompt, phase-4 interview,phase-5 post, phase-2 turned into no-ops).
_SCOUT_HUBguidance in code)._SCOUT_HUBguidance was alreadyincubator-aligned; its
role.tomlalready restricts posts toopportunity_assessment).Where the collaboration model still lives — the conflicts to resolve
src/agent/thread_guidance.py—_PI_LAB(≈lines 23–49):memo:Summary proposal," and confirm a peer's:memo:with✅. This is the opposite of the pitch-only prompt wrapping it. Blocked by CLAUDE.md: thosepi_labstrings are declared byte-identical/immutable and snapshot-pinned — rewording them needs sign-off + the snapshot regen. The intended replacement text already exists as §4 of the PI doc.src/agent/post_types.py—DEFAULT_POST_TYPES(≈line 91)paper, help_wanted, introduction, idea_crosslab, pitch, funding_collab). Sincepi_labhas norole.toml, this tuple is the lab bot's menu, so the "authoritative"{post_type_menu}still offers collaboration/paper posts the prompts say don't exist. Should narrow to(pitch,). Unit-test deps:test_phase5_terminal_posts.pyposts apaper;test_agent_prompts.pyiterates the tuple.simulation.py:memo:→✅→Proposal path +prompts/email-reply-classify.md:memo:confirmed by✅creates aProposalrow) still exists. The prompts forbid it, so it's dormant once #1 lands — but it's collaboration-model residue to remove or consciously keep.tests/characterization/__snapshots__/test_agent_turn_gm.ambr+test_phase5_prompt_gm_PI_LAB, six-type menu). This PR's.mdchanges already diverged them, so these tests fail today andci.shis red. They must be regenerated as a reviewed diff once #1/#2 land.{foa_number}still substituted into the phase-4 template as literal"none";#funding-opportunitiesstill a universal channel;## Your Private Instructionsstill injected byagent.py; GrantBot process/funding_collab/retrieve_foastill present.Consequences right now
collaborations by its phase guidance (Co pi podcast #1) — an internal contradiction in production behavior.
paper/help_wanted/etc. (future ideas #2).Suggested resolution order
_PI_LAB) — the crux; needs a call on overriding the CLAUDE.md"do not reword" guard. Target text is PI-doc §4.
DEFAULT_POST_TYPESto(pitch,)+ fix the two unit tests.:memo:/✅/Proposal lifecycle, or leave dormant.