vibecheck0.3.0
Concepts

Issue lifecycle

Severity levels and the detected → acknowledged → resolved flow.

Every problem VibeCheck finds is a VibeIssue. It's born when a detector's threshold trips, travels to the MCP store over the beacon, and moves through a three-state lifecycle as your agent works on it.

The issue state machine and severity ladderAn issue moves through three states: detected, then acknowledged via the acknowledge_issue tool, then resolved via the resolve_issue tool. Its severity climbs a four-step ladder — info, warning, error, critical — from a neutral tone up to the full fault accent.STATE 1detectedin active listSTATE 2acknowledgedseen, mutedSTATE 3resolvedfixedacknowledge_issueresolve_issueSEVERITY — INCREASING WEIGHTinfowarningerrorcritical
Every issue has a state and a severity. It travels detected → acknowledged → resolved; acknowledging or resolving drops it from the active list.

The issue shape

interface VibeIssue {
  readonly id: string
  readonly detector: DetectorName        // e.g. 'dom-bloat'
  readonly severity: Severity            // info | warning | error | critical
  readonly title: string
  readonly description: string
  readonly evidence: Record<string, unknown> // typed per detector
  readonly timestamp: number
  readonly acknowledged: boolean
  readonly resolved: boolean
}

Severity

Four levels, ordered least to most urgent:

info  →  warning  →  error  →  critical

Severity is set by the detector — for example dom-bloat emits a warning at ≥800 nodes and an error at ≥1,500. Agents can filter by it: get_detected_issues accepts a severity argument.

The lifecycle

detected  →  acknowledged  →  resolved
  • detected — a detector emitted the issue from a snapshot; it arrives in the store and shows up in get_detected_issues.
  • acknowledged — you or the agent has seen it and doesn't want it in the active list. The acknowledge_issue tool records its id.
  • resolved — it's fixed. The resolve_issue tool records its id.

Acknowledging or resolving an issue removes it from get_detected_issues, so the active list is always "what still needs attention."

Where state lives

The MCP VibeStore is immutable — every update returns a new store. It holds:

  • latestSnapshot — the most recent snapshot received.
  • issueHistory — the last 100 issues seen (older ones are dropped).
  • acknowledgedIds / resolvedIds — sets of ids the agent has actioned.

Because acknowledge/resolve state is keyed by issue id, a re-detected issue that carries the same id stays actioned across snapshots.

Two issue stores

The MCP VibeStore (above) is what your agent reads. The React widget keeps its own browser-side IssueStore in localStorage with a newsent-to-agentresolved status, so the overlay's list survives reloads. They track the same issues from opposite ends of the pipeline.