Signals

A signal is an uninterpreted observation captured upstream of the loop — a bug report, a customer email, a Sentry alert, a teammate’s Slack message, a ten-second thought. Signals are held with full provenance until triage decides what each one becomes.

Three guarantees define the vertical:

  • Capture is frictionless. Title-only, never blocked by an approval, instant from anywhere.
  • Nothing is silently lost or rewritten. Source payloads are kept as immutable, append-only snapshots; there is no hard deletion; every move is on the record.
  • Demand becomes evidence. Triaged signals feed a cluster-weighted corpus that analysis consumes — “eleven people asked for CSV export” becomes a scored finding, not folklore.

Capturing signals

  • In the app — press ⌘⇧S anywhere, or run “Capture signal” from the palette. The composer defaults the project from your context and can attach the entity you were looking at.
  • From the CLIstella capture "Export progress needs a visible state". In a linked repository’s working directory, the project is inferred from the git remote.
  • From connectors — GitHub Issues, Slack, Sentry, inbound email, and generic signed webhooks ingest automatically. See Signal connectors.

Every signal gets an org-scoped display ID (SIG-n) at capture, stable for life. Signals can arrive assigned to a project (from context or a connector rule) or land in the organization’s unassigned bucket for routing.

Triage

Triage gives each signal its altitude. The queue is keyboard-complete:

Key Disposition What happens
i Seed intent Creates a draft intent carrying the signal as provenance
a Attach as evidence Attaches to an intent, epic, proposal, or North Star document — rendered in that item’s Evidence section
m Merge Folds into a cluster as a duplicate, bumping the demand count
x Dismiss Declines, with a required reason
s Snooze Hides until a time you pick; a source update wakes it
p Assign Routes to a project

Dispositions are reversible where reversal makes sense: dismissed signals can reopen, merged signals can unmerge, and a signal whose last attachment target goes away returns to pending — nothing dead-ends.

Agent-assisted triage is available and governed: a standing triage runner proposes actions with a rationale and confidence, and applying an agent suggestion passes the signal.triage gate under your project’s autonomy dial. A human accepting a suggestion applies it directly as that human’s act.

Clusters and demand

Merging duplicates builds a cluster with a demand count — the weight of accumulated asks. The demand corpus (cluster-weighted, triage-aware, with dismissed signals excluded) feeds the built-in demand signals analyzer, which reports validated versus unvalidated demand and cites the SIG-n receipts behind every finding. Demand flows into the same reports-and-scores pipeline as every other analyzer, so it competes for prioritization on evidence.

Resolution notices

When an epic ships, Stella Loop resolves the signals behind it — those that seeded the intent and those attached as evidence — and, where the connector has outbound replies enabled for the project, posts one resolution notice, ever, per signal back to the source: a comment on the GitHub issue, a Slack reply, an email. The default template is privacy-safe (no internal IDs or links). Signals captured in-app notify their capturing person through the inbox instead.

The provenance chain runs end to end: a support ticket is traceable to the merged change that resolved it, and the loop answers the person who asked.

For agents

Signals have full CLI and API parity: stella signal list|show|assign|snooze|seed-intent|attach|merge|dismiss and friends, all under /api/v1 with idempotency receipts on every mutation. See CLI and API.