ReferencesMaturity Model

Maturity Model

The triage agent assigns a readiness level to every ticket. The level gates what the plugin will and will not do during that run.

The four levels

LevelNameWhat it doesWhat it does not do
L0DraftProduces a plan.yml and a one-page intent report. No agent dispatch beyond triage.Any write to user-facing artifacts.
L1ReportRuns research, discovery, and audit phases. Reads code. Produces analysis reports.Code writes, spec writes, ADR writes, git operations.
L2AssistedProduces specs, ADRs, and code changes in worktrees. Every write goes through an approval gate before committing.Auto-merging PRs or pushing to protected branches.
L3UnattendedFull autonomy. No approval gate. Self-healing converges without human input.Auto-merging PRs (never, even L3). Writing to denylist paths.

Per-level capability table

CapabilityL0L1L2L3
Triage emits planyesyesyesyes
Sub-agent dispatchnoyes (research only)yesyes
Spec write to .planning/nonoyes (after approval)yes
ADR write to docs/adr/nonoyes (after approval)yes
Worker writes to code pathsnonoyes (in worktree)yes (in worktree)
Self-healing retriesnonoyes (max 3)yes (max 3)
PR description writenonoyesyes
Append to .loop/state.mdyesyesyesyes
Append to .loop/run-log.mdyesyesyesyes
Touch denylist pathsnevernevernevernever
Merge to main / protected branchesnevernevernevernever

Denylist paths (all levels)

These paths are never written to, regardless of level or autonomy setting:

  • .env, .env.*
  • secrets/, secret/, private/
  • infra/production/, terraform/production/, k8s/production/
  • .git/objects/, .git/hooks/
  • Any path starting with .ssh/, .aws/, .gcloud/, .kube/

How triage assigns a level

Rules are evaluated in order; first match wins.

RuleOutcome
User explicitly requested a level in the ticketHonor it
Ticket touches denylist pathsCap at L1 regardless of request
Run log shows 3+ successful runs of this archetypeDefault L2 (or L3 if prior runs were marked success_no_review_needed)
Run log shows 1+ successful runs of this archetypeDefault L2 with approval gate
No history or fewer than 1 successful runDefault L1
Ticket is purely conversational (“explain X”)L0 — no agents needed

After picking a level, triage tells the user which level was chosen and why, then offers to downshift via AskUserQuestion. Upshifting requires explicit confirmation.

PeriodApproach
Week 1Run all tickets at L1. Review artifacts manually. Build trust.
Week 2For ticket types reviewed successfully twice, move to L2.
Week 3+For trivial recurring tickets (rename, typo, single-file), move to L3.

The plugin surfaces the data from .loop/run-log.md and makes recommendations. You decide when to advance.