Skip to content

AI Agents

After each command commits, Specor automatically runs proactive AI agents in the background. Agents read the affected part of the product graph and produce suggestions — structured observations that surface in the UI and API.

How agents work

  1. A command commits and produces events.
  2. Each agent that is configured to trigger on that event type runs asynchronously.
  3. The agent receives a context pack — the affected node plus its two-hop neighbourhood, open suggestions, and relevant ontology rules — and analyses it.
  4. Suggestions are deduplicated and filtered against suppressions before being saved.
  5. Suggestions appear in the workspace inbox.

Agents can chain: accepting a suggestion may execute a command, which triggers agents again, up to a depth of 3.

Agent types

coverage

Checks whether required semantic elements are present for each node type.

CategoryTriggered when
feature_missing_metricA Feature has no linked Metric
feature_missing_acceptance_criteriaA Feature has no AcceptanceCriteria
feature_missing_needA Feature is not linked to any Need
flow_missing_actor_assignmentA Flow has no Actor
capability_missing_featureA Capability has no child Features
metric_missing_targetA Metric has no target_value
need_not_addressedA Need is not linked to any Feature
duplicate_featureA Feature appears semantically identical to another

Triggers on: node created / updated for Feature, Flow, Capability, Metric, Need, Domain; edge created.


conflict

Detects semantic contradictions between connected nodes.

CategoryTriggered when
contradicting_feature_rulesTwo Rules on the same Feature contradict each other
feature_rule_conflicts_capability_constraintA Feature’s Rule conflicts with its parent Capability
circular_flow_dependencySteps in a Flow form a cycle

Triggers on: Rule, Feature, Capability, Flow, or Step created, updated, or with edges added/removed.


flow

Checks the structural integrity of Flows.

CategoryTriggered when
flow_no_terminal_stepA Flow has no Step that has no outgoing next_step edge
flow_unreachable_stepA Step exists that cannot be reached from the first Step
flow_invalid_state_transitionA Step transition violates the defined state machine

Triggers on: Flow or Step created, updated, or with edges changed.


impact

Tracks downstream consequences of structural changes.

CategoryTriggered when
metric_linked_to_deleted_featureA Metric’s Feature was deleted
flows_need_review_after_rule_changeA Rule changed on a Feature that has Flows
feature_archived_with_many_dependentsA Feature is archived but other nodes depend on it
flow_unowned_no_actor_stepsA Flow has steps but no Actor involvement
need_orphaned_after_feature_changeA Need lost all its linked Features

Triggers on: any node updated, deleted, moved, or with edges removed.


naming

Flags vague or low-quality node titles and descriptions.

CategoryTriggered when
placeholder_titleTitle looks like a placeholder (e.g. “New Feature”, “TODO”)
missing_descriptionNode has no description
overly_generic_titleTitle is too generic to be useful
title_too_shortTitle is fewer than 3 meaningful words
description_too_vagueDescription is present but gives no information

Triggers on: any node created or updated.


alignment

Checks whether connected nodes are semantically consistent with each other.

CategoryTriggered when
feature_misaligned_with_needA Feature does not actually address its linked Need
feature_misaligned_with_capabilityA Feature is outside its parent Capability’s scope
capability_misaligned_with_domainA Capability does not fit its Domain
acceptance_criteria_misaligned_with_featureAn AcceptanceCriteria tests the wrong thing
metric_misaligned_with_feature_goalA Metric does not measure what the Feature aims to achieve
need_outside_domain_scopeA Need is linked to a Domain it does not belong to

Triggers on: Feature, Capability, Need, AcceptanceCriteria, or Metric created, updated, or with edges added.


Suggestion lifecycle

A suggestion starts in pending and moves to one of:

StatusHow it gets there
pendingCreated by an agent
snoozedUser deferred it until a future date
acceptedUser accepted and executed the suggested command
rejectedUser dismissed it (optionally with a note)

Rejected suggestions can be suppressed — the agent will not raise that category for that node again. Suppressions can be deleted to re-enable the agent for a node.

Confidence and severity

Each suggestion has a confidence (0.0–1.0) and a severity (info, warning, error). If confidence is below 0.5, severity is automatically downgraded to info regardless of the agent’s output.

Enabling / disabling agents

Agents can be toggled per workspace via PATCH /workspaces/{id}/agent-config. Disabled agents produce no suggestions but their runs are still recorded.