Skip to content

v0.2.0

Release Date: 2026-07-25

Highlights

  • Metrics engine with 4 formulas: frustration, momentum, reach, and urgency
  • LLM-based consolidation pipeline: embed, cluster, summarize, review, attach
  • Analyst findings provider for Gartner, Forrester, and IDC
  • Competitive intelligence provider for win/loss and gaps from CRM sources
  • Curated signal support to skip clustering for pre-aggregated sources
  • Config helpers for typed mapping options (customer, capability, market)

Added

Metrics Engine

  • metrics package with a pluggable formula registry (Register, Get, MustGet, Compute, ComputeAll, List, IsRegistered)
  • frustration formula: weighted signal count multiplied by the age (in days) of the oldest signal
  • momentum formula: count of signals observed within a trailing window (default 30 days)
  • reach formula: count of distinct customer references across signals
  • urgency formula: sum of severity-weighted signal counts
  • metrics.Config with LoadConfig, LoadConfigOrDefault, Merge, and ToOptions helpers, plus ConfigFromProviderOptions for reading weight overrides from Config.Options["metrics"]

Consolidation Pipeline

  • consolidate package implementing a 5-stage pipeline (embed → cluster → summarize → review → attach) via consolidate.NewPipeline
  • OmniLLMEmbedder for batched embedding generation with configurable TextFunc extractors (TextFromSummary, TextFromMetadata, TextWithEntities)
  • Cosine-similarity Clusterer and IncrementalClusterer for grouping signals and incrementally attaching new signals to existing clusters
  • LLMSummarizer for generating root cause titles, descriptions, and symptom patterns from signal clusters
  • MemoryReviewer in-memory human review queue with approve/reject workflow, submit/approve/reject hooks, and an auto-approve threshold based on signal count
  • Curated signals (metadata["curated"] == true) skip clustering and map directly to root causes, preserving existing aggregation

Analyst Provider

  • provider/analyst package ingesting analyst findings from Gartner, Forrester, and IDC
  • Finding type with report ID, category, severity, markets, and competitors
  • Findings normalized to signal.TypeAnalystFinding signals with analyst_report_ref, market_ref, and competitor_ref MarketSpec typed refs
  • MemoryAdapter for testing and manual finding ingestion

Competitive Provider

  • provider/competitive package ingesting win/loss data and competitive gaps from CRM sources (Salesforce, HubSpot, Clari, Gong)
  • DealRecord type mapped to competitive win/loss signals, with customer_ref, market_ref, and competitor_ref typed refs
  • CompetitiveGap type mapped to signal.TypeCompetitiveGap signals, with competitor_ref, market_ref, and capability_ref typed refs
  • MemoryAdapter for testing with separate deal and gap stores

Provider and Config Helpers

  • omnisignal.IsCurated() for detecting pre-consolidated signals that should skip the clustering stage
  • Config.GetStringMap() for typed map[string]string option retrieval (handles both map[string]string and map[string]any)
  • OptCustomerMappings, OptCapabilityMappings, and OptMarketMappings well-known config option keys for mapping source system values to typed refs

Bug Fixes

  • Updated Jira and PagerDuty providers to use the common.SourceSystem struct instead of a plain string, matching signal-spec v0.2.0, and added customer/capability mapping support via config options

Documentation

  • Added PRD, TRD, PLAN, ROADMAP, and ARCHITECTURE specs covering the OmniSignal signal engine design across 6 phases (28 RMIs)
  • Added CLAUDE.md with repo-specific contributor guidelines
  • Added metadata conventions, PRISM-Roadmap handoff guide, and Aha provider guide covering enhancement request metadata, cross-repo reference format, and curated vs. raw signal handling
  • Updated README shields

Dependencies

  • Updated github.com/plexusone/signal-spec to v0.2.0 and removed the local replace directive
  • Added github.com/grokify/oscompat for cross-platform test assertions

Breaking Changes

None. The common.SourceSystem change in the Jira and PagerDuty providers is a downstream effect of the signal-spec v0.2.0 upgrade and does not change the omnisignal.Provider interface.

Installation

go get github.com/plexusone/omnisignal@v0.2.0

Migration Guide

From v0.1.0

  1. Update github.com/plexusone/signal-spec to v0.2.0 in your own code if you construct signal.Signal values directly; Signal.Source is now a common.SourceSystem struct rather than a string.
  2. If you want new signals to skip consolidation clustering (e.g., pre-aggregated feedback), set Metadata["curated"] = true or use omnisignal.IsCurated() to check.
  3. To compute derived metrics, register the built-in formulas are already registered via metrics package init(); call metrics.Compute(ctx, "frustration", signals, opts) or metrics.ComputeAll(ctx, signals, opts).

Full Changelog

See CHANGELOG.md for the complete list of changes.