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 itemWhere it livesVisible in the demo as
MCPMCP 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-UIui_client/agui/ (CopilotKit) + POST /ag-ui on 8084The artifact drawer. Agent tool calls mount real components — research brief, content package, critique card, email, calendar — not chat text
OpenTelemetrySpans named {agent}.{pattern} on every agentThe live agent trace. Each row is a span: agent name, pattern badge, service, summary
LangGraphP2's graphs in the CDR serviceSequential and loop badges — ResearchThenPropose, and the RefinementLoop that fails a draft then passes the rewrite
DeepAgentsCDRRootAgent, the root planner — DeepAgents-style (plan → delegate to subgraphs as tools), hand-written on LangGraph, not the deepagents packageFirst line of every run: "DeepAgents root … delegating to finder, research, package, outreach subgraphs"
Claude Agent SDKOptional specialist critic in harness/claude_agent.pyFactCheckerAgent, 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 AgentCoreDeploy target for the recorded demoNot on screen — deployment target, called out verbally
GroqLocal inference for the llm-pattern agentsGreen 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.

BadgeMeaningCountExample
llmSingle model call26DraftWriterAgent, FactCheckerAgent, PitchEmailAgent
sequentialOrdered pipeline5ResearchThenPropose, OutreachPipeline, PersistAndSchedule
customHand-written control flow2CDRRootAgent, OpportunityFinderRoot
parallelFan-out / gather1ParallelResearch — four research specialists at once
loopIterative refinement, max 31RefinementLoop — 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.