Inspiration
SignalPM came from one core PM problem: the most important product decisions are usually made with fragmented evidence. Support tickets say one thing, sales calls say another, NPS comments add nuance, and analytics signals lag behind. Teams still have to manually stitch all of this together while ARR risk is moving in real time.
The product idea was to make evidence-to-decision flow operational, not just analytical. We wanted a system that can:
- Ingest and normalize messy multi-source customer truth.
- Detect and rank pain clusters by business impact, not just mention count.
- Generate execution artifacts such as proposal, PRD, design handoff, and engineering handoff.
- Keep answers citation-grounded and auditable.
- Move from insight to action with Jira, Slack, and Email dispatch plus decision approvals.
The second inspiration was technical: simple one-shot RAG is usually not enough for PM-grade answers. So we built around iterative retrieval, sufficiency checks, and fallback modes that keep the system useful even when live agent runtime is slow or partially unavailable.
What it does
SignalPM is a full-stack PM intelligence system with four connected loops.
1) Evidence loop
- Pulls synthetic or uploaded multi-source data into
signalpm_signals. - Normalizes each record with customer metadata, extracted signal fields, provenance, and dedupe keys.
- Supports filtering and search across signals, clusters, proposals, PRDs, and memory.
2) Agent loop
- Routes user intent into workflows:
synthesize,propose,spec,ask,design_handoff,engineering_handoff. - Runs iterative evidence gathering with stop conditions: sufficiency met, diminishing returns, or duration budget reached.
- Validates grounding and optional workspace guard constraints.
- Persists structured outputs into clusters, proposals, PRDs, handoffs, and decision docs.
3) Decision loop
- Scores proposals and PRDs with explicit weighted factors.
- Stores decision ledger entries such as
pending_review,approved,rejectedwith scoring breakdown and evidence lineage. - Writes decision memory for future runs so later agents can leverage prior governance context.
4) Execution loop
- Runs Kibana-native multi-step workflows such as synthesis to proposal to spec, proposal to design, proposal to engineering, and war-room brief.
- Syncs workflow runs into app history.
- Provides step-level output inspection and dispatch actions for Jira, Slack, and Email.
How we built it
Architecture and runtime
- Backend is FastAPI with 64 route handlers across agents, ingestion, data views, analytics, decisions, actions, workflows, jobs, sources, uploads, system, and chat threads.
- Runtime policy enforces connector consistency at startup through
KIBANA_CONNECTOR_IDandCHAT_DEFAULT_CONNECTOR_IDalignment. - Orchestration is centralized in
Orchestrator, which maps workflow intent to specialized agents and controls retries, timeouts, and fallbacks. - Agent execution is unified through
AgentRunner, handling loop control, citation extraction, sufficiency checks, grounding checks, persistence, and memory append. - Search and retrieval use a hybrid strategy in
QueryService: retriever path when available, bool fallback, then legacy in-memory scoring fallback.
Reliability engineering choices
- Retry-aware Kibana API clients handle transient
408,425,429, and5xxclasses. - Circuit breaker opens after repeated Kibana failures and forces Elasticsearch-grounded fallback answers for a cooling window.
- Workflow wall-clock is bounded to avoid hanging UX.
- Chat routes implement fast and deep mode, agent fallback, and MCP fallback with timeout budgets.
- War-room report generation has deterministic fallback if narrative agent generation fails.
Data model and persistence
- Signals go to
signalpm_signals. - Cluster outputs go to
signalpm_clusters. - Proposal outputs go to
signalpm_proposals. - PRD outputs go to
signalpm_prds. - Handoff outputs go to
signalpm_handoffs. - Decision docs go to
signalpm_decisions. - Memory docs go to
signalpm_memory. - Workflow run history goes to
signalpm_workflow_runs. - Action previews and events are persisted for traceability.
Synthetic data and quality gates
Deterministic generation currently produces 10,080 signals across 8 sources.
Source split:
- intercom 2160
- salesforce 1680
- gong 1440
- slack 1200
- delighted 1200
- amplitude 960
- google_meet 720
- microsoft_teams 720
- Quality report generated February 27, 2026 passes with:
- duplicate_rate: 0.0
- numeric_field_coverage: 1.0
- invalid_numeric_rate: 0.0
- backward_compatibility_rate: 1.0
- enterprise_coverage: 0.398413
- unique_text_rate: 0.52996
Frontend and operator experience
- Next.js App Router shell unifies evidence, signals, trends, proposals, PRDs, sources, war-room, and chat.
- War-room page adds scenario simulation and strategic brief generation.
- Workflow console supports run sync by execution ID, search, phase-by-phase inspection, and dispatch actions.
- Chat API supports SSE stream events such as
assistant_delta,tool_progress,completed, anderrorwith multi-mode orchestration.
Agents in depth
Two orchestration layers exist: backend orchestrator runtime and 8 provisioned Agent Builder agents.
Backend Orchestrator runtime
- Classifies intent using keyword mapping and explicit workflow field.
- Applies workflow-specific iteration caps.
- Enriches context with workflow-aware memory layers.
- Executes through Kibana converse with bounded retry policy.
- On timeout or circuit open, builds fallback answer from Elasticsearch search results.
- Supports chaining such as synthesis to proposal to spec and top-3 auto generation branch.
- Builds handoff prompts from upstream structured outputs and citations.
Agent 1: Synthesis Agent (signalpm_synthesis_agent)
Purpose: detect and rank pain clusters with ARR-aware impact framing.
Key tools:
pain_point_aggregationsentiment_by_themesegment_analysiscompetitor_mentionsrevenue_impactsemantic_signal_search
Output contract includes structured impact metrics, ARR totals, segments, trend direction, confidence, and top signal references.
Agent 2: Proposal Agent (signalpm_proposal_agent)
Purpose: convert cluster pain into prioritizable proposals.
Computes score, urgency, strategic fit, and decision lineage. Persists proposal and paired decision document.
Agent 3: Spec Agent (signalpm_spec_agent)
Purpose: generate structured PRD drafts from proposal context and memory.
Normalizes required sections, computes completeness meta, and persists PRD plus decision record.
Agent 4: Evidence Chat Agent (signalpm_evidence_chat_agent)
Purpose: high-depth evidence-grounded Q&A with broad tool access and enforced grounding checks.
Agent 5: Evidence Chat Fast Agent (signalpm_evidence_chat_fast_agent)
Purpose: low-latency demo and triage responses with constrained tool usage.
Agent 6: Design Handoff Agent (signalpm_design_handoff_agent)
Purpose: production-ready design handoffs including flows, IA, states, accessibility, telemetry, and acceptance criteria.
Agent 7: Engineering Handoff Agent (signalpm_engineering_handoff_agent)
Purpose: implementation-ready plans including backend changes, API contracts, data models, migration strategy, rollout plan, and QA matrix.
Agent 8: Workflow Orchestrator Agent (signalpm_workflow_orchestrator_agent)
Purpose: invoke Kibana workflows and manage async execution state, retries, and dispatch actions.
Tools in depth
Includes 15 tools covering ES|QL aggregations, semantic search, memory retrieval, multi-step workflows, and dispatch integrations for Jira, Slack, and Email.
Challenges
Live runtime reliability pressure under some modes.
Benchmark artifact dated February 26, 2026 shows overall gate failures:
- weighted score 0.52 out of 5.0
- hard fails 71
- live quality report weighted score 0.23 out of 5.0
- timeout rate 0.875
Maintaining strict grounding while preserving low latency required layered fallbacks.
Workflow and webhook branching increased complexity.
Current local test status February 27, 2026: 101 passed, 4 failed.
Three failures are async pytest plugin configuration related.
One failure is slack workflow fallback behavior mismatch.
Keeping prompt contracts and runtime behavior synchronized required careful version discipline.
Accomplishments
- Built a complete operational AI PM loop, not just a chatbot.
- Implemented 8 agents, 15 tools, and 7 workflows in one coherent stack.
- Added resilience patterns including timeouts, retries, circuit breaker, and deterministic fallback.
- Implemented decision lineage and transparent scoring.
- Passed synthetic data quality gate at 10k plus scale.
- Delivered a workflow console with phase inspection and dispatch actions.
- Built reproducible provisioning and verification scripts.
What we learned
- PM decisions require both narrative intelligence and deterministic evidence.
- Sufficiency criteria must be workflow-specific.
- Memory improves quality only when intentionally layered.
- Fallback strategies are mandatory for reliability.
- Explicit tool contracts reduce drift.
- Actionability changes perceived value more than analytics alone.
What’s next for SignalPM
- Raise benchmark pass rates with focused citation completeness and latency improvements.
- Fix 4 failing unit tests and stabilize async test wiring.
- Improve deep-mode reliability under load.
- Strengthen workflow dispatch observability and failure classification.
- Expand workspace guard and RBAC defaults.
- Improve section-level citation density in proposals and PRDs.
- Add closed-loop tracking from dispatched actions back into decision memory and priority scoring.
Built With
- elasticsearch
- fastapi
- next
- python
- typescript
- vector-database
Log in or sign up for Devpost to join the conversation.