Stack mapping
September 6, 2026 · View on GitHub
Every item on the hackathon kick-off slide, where it lives in this repo, and where a judge can see it during the 3-minute demo. If it is not visible on screen, it does not count.
| Kick-off item | Where it lives | Visible in the demo as |
|---|---|---|
| MCP | MCP tool server in mcp_server/ (8085); called by Finder, CDR and Pipeline | "MCP tool calls" panel, bottom left — search, places, rag_retrieve, persist_and_schedule, inbox with their arguments |
| AG-UI | ui_client/agui/ (CopilotKit) + POST /ag-ui on 8084 | The artifact drawer. Agent tool calls mount real components — research brief, content package, critique card, email, calendar — not chat text |
| OpenTelemetry | Spans named {agent}.{pattern} on every agent | The live agent trace. Each row is a span: agent name, pattern badge, service, summary |
| LangGraph | P2's graphs in the CDR service | Sequential and loop badges — ResearchThenPropose, and the RefinementLoop that fails a draft then passes the rewrite |
| DeepAgents | CDRRootAgent, the root planner — DeepAgents-style (plan → delegate to subgraphs as tools), hand-written on LangGraph, not the deepagents package | First line of every run: "DeepAgents root … delegating to finder, research, package, outreach subgraphs" |
| Claude Agent SDK | Optional specialist critic in harness/claude_agent.py | FactCheckerAgent, when ANTHROPIC_API_KEY is set. GET :8084/health reports claude_agent_sdk.available so a dead integration is visible before a demo, not during one |
| AWS Bedrock AgentCore | Deploy target for the recorded demo | Not on screen — deployment target, called out verbally |
| Groq | Local inference for the llm-pattern agents | Green llm badges: DraftWriterAgent, ProposalGenerationAgent, PitchEmailAgent, ReplyClassifierAgent |
Agent patterns on screen
The trace badges the pattern for every agent, because "which pattern is this" is the question judges actually ask.
| Badge | Meaning | Count | Example |
|---|---|---|---|
llm | Single model call | 26 | DraftWriterAgent, FactCheckerAgent, PitchEmailAgent |
sequential | Ordered pipeline | 5 | ResearchThenPropose, OutreachPipeline, PersistAndSchedule |
custom | Hand-written control flow | 2 | CDRRootAgent, OpportunityFinderRoot |
parallel | Fan-out / gather | 1 | ParallelResearch — four research specialists at once |
loop | Iterative refinement, max 3 | 1 | RefinementLoop — fact + voice critique, rewrite, re-check |
35 distinct named agents are defined across the four services and appear on the trace by name. Verify the count yourself:
grep -rho 'name = "[A-Za-z]*"' */agents/*.py | sort -u | wc -l
Most carry the llm badge because most are a single prompted step. The
patterns that matter for the brief — parallel fan-out, and a refinement loop
that visibly fails then passes — are ParallelResearch and RefinementLoop,
both of which run in every campaign.
Human-in-the-loop
Deliberately minimal. One Run campaign click is the only required human action
in the entire demo. PAUSE_BEFORE_SEND exists as a toggle and defaults off —
outreach sends without approval. There is a Stop button; it ends the run, it does
not gate it.
Protocol note
The UI never learns whether events came from a fixture file or from P2's live
agent — both arrive as the same AG-UI SSE stream from POST /ag-ui. Going live is
USE_FIXTURES=0, not a rewrite. See demo/fixtures/README.md
for the event contract and cdr/agui_map.py for the one
module that holds P2's schemas to it.
If the live CDR stops answering mid-run, the board says so on the trace and keeps the events it already drew; if it never answered at all, the run falls back to the fixture replay and labels itself. Either way the demo does not hang.