A dated, sourced record of a single competitor move: a launch, price change, strategic move, or reclassification.
A competitor signal is a dated, sourced record of a single observable competitorCompetitorMarket IntelligenceA competing product or companyView reference → move: a featureFeatureProduct SpecificationA product capability or featureView reference → launch, a pricing change, an acquisition, a partnership, a market entry, or a reclassification across a classification axisClassification AxisMarket IntelligenceA single dimension in a competitive classification matrix that defines one axis of comparison across alternatives.View reference →. Where a CompetitorMarket IntelligenceA competing product or companyView reference → is the standing profile of a rival, a competitor signal is one entry in that rival’s activity log: what moved, when, where it was observed, and how confident the observationObservationUser ResearchA specific behaviour or statement observedView reference → is.competitor
Competitive intelligence goes stale faster than almost anything else a team keeps. For decades it lived as prose: a quarterly competitive analysisCompetitive AnalysisMarket IntelligenceA structured analysis of the competitive landscapeView reference →, a battle card kept current by hand. Prose is hard to query, and it records the state of the landscape on the day it was written, not how the landscape moved.
Modelling competitive moves as discrete, timestamped events is the shift the competitor signal captures. Each move becomes a row with provenance (when it was observed, from what source, with what confidence), so the competitive landscape stops being a document to rewrite and becomes a history to replay. The same approach underlies a product analytics event stream or a git log, where the recorded unit is the change rather than the current snapshot.
The reclassification signal extends this from manual logging to automatic capture. When a competitor is re-classified on an axis, moving, say, from ai_integrated to ai_agentic, the move is emitted as a signal at the classify-write chokepoint, carrying the axis and the from and to values. The competitive history then includes not only the moves recorded by hand but every structural reclassification, replayable through diff_classification.
An analyst spots, in a rival’s changelogChangelogProduct SpecificationA record of changes shipped in a releaseView reference →, that the rival shipped an autonomous agent mode. One competitor signal records it: signal_type: feature_launch, a factual one-line summary, the changelog URL as source, the observation date as observed_at, and a confidence rating. It links from the competitor via CompetitoremitsCompetitor Signalhierarchy, maps to the comparable owned feature via competitor_emits_competitor_signalCompetitor Signalmaps toFeaturecross-domain, and, because the move exposes a positioningPositioningGo-To-MarketProduct positioning statementView reference → gap, attaches competitor_signal_maps_to_featureCompetitor SignalsurfacesOpportunitycross-domain.competitor_signal_surfaces_opportunity
Months later, "what has this competitor done this quarter?" is a single query against the signal stream. Because reclassification signals are auto-emitted, "how has this competitor’s AI maturity moved over the past year?" is answerable from the same stream, without anyone having logged each move by hand.
In the Unified Product Graph a competitor signal lives in the Market Intelligence region and is emitted by its competitor via CompetitoremitsCompetitor Signalhierarchy. It links to the feature it concerns via competitor_emits_competitor_signalCompetitor Signalmaps toFeaturecross-domain when a move targets a specific capabilityCapabilityStrategyAn ability that enables value deliveryView reference →, and to an opportunityOpportunityDiscoveryA validated gap worth solvingView reference → via competitor_signal_maps_to_featureCompetitor SignalsurfacesOpportunitycross-domain when a move opens a gap. Reclassification signals additionally carry competitor_signal_surfaces_opportunityCompetitorMarket IntelligenceA competing product or companyView reference →, competitoraxis, from_value, and to_value, mirroring the superseded and new classify edges, which is what lets diff_classification reconstruct a competitor’s movement across an axis over time.
High Strong confidence; evidence is solid or reasoning is well-validated.
Guessing No evidence
Type-specific fields on BaseNode
observed_atstringISO date-time the move was observed. @example "2026-06-10"
signal_typeenumKind of move. `feature_launch` = shipped a feature. `pricing_change` = a plan or tier change. `acquisition` / `partnership` / `market_entry` = strategic moves. `reclassification` = the competitor moved between classification cells on an axis (e.g. ai_integrated to ai_agentic); auto-emitted at the classify-write chokepoint and carries `axis` / `from_value` / `to_value` / `competitor`.
summarystringOne-line factual summary of the move (what shipped, not marketing copy).
impactenumExpected impact on our position.
competitorstringReclassification only. The qualified id of the competitor that moved, as the classify cross-edge source (e.g. `p_rival/n_acme`). Identifies both the subject and its owning product, so `diff_classification({ product })` can filter the history stream.
axisstringReclassification only. The `classification_axis` id the move is on (e.g. `ca_ai_maturity`). Mirrors the axis the superseded and new classify edges share.
from_valuestringReclassification only. The prior `classification_value` id the competitor was classified as before this move (the superseded cell). Absent for a first-time classification (nothing was superseded).
to_valuestringReclassification only. The new `classification_value` id the competitor is classified as after this move (the cell the new classify edge points at).
last_updatedstringProvenance: ISO date-time this record was last observed or refreshed. @example "2026-06-13"
sourcestringProvenance: where this was observed. A changelog, pricing, or docs URL, an analyst report, or a research note. @example "https://docs.larch.example/changelog/"
confidenceassessmentProvenance: how sure we are, on the canonical confidence_5 scale. Carries both a numeric value and a high / medium / low label.
observed_bystringProvenance: agent or routine id that last wrote this. Absent when hand-authored, the signal that a human (not a poller) is the last writer. @example "competitor-watch-agent"
idstringrequiredUnique identifier (UUID)
typeNodeTyperequiredDiscriminator for the entity type
titlestringrequiredDisplay name
descriptionstringOptional detailed description
statusstringLifecycle status
tagsstring[]Freeform tags for filtering
3 edge types connected to this entity.
competitor_emits_competitor_signalcompetitor_signal_maps_to_featurecompetitor_signal_surfaces_opportunity