IssueFlow
Features

The governance layer for agentic delivery.

IssueFlow provides the rails — gates, routing, recovery, and audit — around the agents you already use. Here is what that looks like end to end.

Intake

Full-lifecycle triage

IssueFlow starts where the work actually starts — a messy report. It reproduces the issue, root-causes it, and decomposes it into concrete tasks. A target allowlist keeps agents from misfiling or hallucinating a repo, and a source issue only closes once every child task is terminalized.

Governance

Design-first human gates

Gating at the pull request is low-leverage busywork; once an agent has a validated spec, it follows it well. Place the human gate at design instead, and catch architectural errors before a line of code exists. Approve or reject from the portal — or straight from a GitHub comment with [hr:go] / [hr:fail].

Neutrality

Bring your own agent, per stage

IssueFlow bundles no agent, no LLM, and no fixed prompts. You declare the frameworks available on each worker and assign one to each stage — Claude Code, Copilot, Cursor, or your own. The engine composes each prompt from your charter plus execution context; it never dictates content.

Reliability

A self-healing supervisor

Hand-rolled loops are fragile. A reconciler continuously checks every run against invariants, recovers lost, stale, or displaced workers, and re-queues attempts — without you watching a terminal. This is infrastructure recovery, not an agent guessing at fixes.

Control flow

Failure-aware routing

Every stage emits an outcome, and a failure carries a reason. You route on that reason — send a failed validation to a remediation stage, a design error somewhere else — with attempt limits and escalation. Routing fails closed to a catch-all rather than stranding an issue.

Ownership

Your infrastructure, your audit trail

Workers are self-hosted — your code and agent runs never leave your machines. Every command and event is stamped with the acting user for a full audit trail, and the entire operator surface is available from the portal, an MCP tool, or a GitHub comment.

See it

It all lives in your workflow config.

portal.issueflow.cloud
The IssueFlow workflow designer showing a real solution's routing graph with pass/fail edges, conditional routes, and an escalation ladder
The workflow designer — a real solution's validated routing graph.
Where we're honest

IssueFlow is GitHub-native today; the engine is built in a modular way so other source-control and project-management adapters can follow, but only the GitHub adapter exists right now. Workers are self-hosted by design — there is no managed fleet — so your code and keys stay with you. We'd rather tell you what a feature does today than what it might do someday.

Self-hosted workers · GitHub-native · your keys
Complete capabilities

The full inventory.

For the evaluator who wants to find the one capability that decides it. Everything below ships today and is dogfooded on IssueFlow's own repo — anything still hardening is marked as such.

Configure everything

The workflow, the gates, the routing, the agents — all yours to define.

Configurable workflow

User-defined stages & graph

Name your own stages; the engine runs whatever pipeline you draw — no fixed template.

Canonical + sparse-overlay config

Define a solution once; override only what differs per repo or stage. No config sprawl.

Three-file config model

solution.yaml / repo.yaml / workstation.yaml, joined by a slug — what to build / where / on what machine.

Opaque per-stage config

Each stage carries its own config blob (agent, model, prompt, tools, env) the engine passes through untouched.

Load-time reachability validation

The graph is checked before it runs — valid targets, no orphans or dead-ends. Errors surface at load, never mid-run.

Live config refresh (no restart)

A .issueflow push or portal edit rebuilds config in place; solutions pick it up in seconds — no engine bounce.

Configurable human gates

Gate anywhere

A human gate can sit at any stage boundary — the design gate before build is the flagship placement.

[hr:*] / [ar:*] control verbs

Resolve a gate straight from a GitHub comment (hr:go / hr:fail) — human- or agent-resolve, no portal round-trip.

Blocked-as-state

“Blocked” is a hold on a run an operator resolves directly at any time — it never needs the ladder to reach a human first.

Mid-stage suspend & ask

A working agent can pause, pose a question, and suspend without an outcome; the stage re-runs with the durable Q&A injected.

Structured decision asks

An escalation can present an ordered option/tradeoff menu rendered as a real decision, not a free-text guess.

Interactive block-consult (/ask)

Ask a read-only consult agent about a parked run before committing a routing decision — multi-turn, zero state change.

Authorized-logins governance

Configure exactly which GitHub logins may drive a solution's control verbs. Fails closed if unset.

Multi-dimension routing

Status ≠ outcome

“How execution went” is separated from “what the work decided,” so an agent crash is never misread as a real failure verdict.

User-defined fail-reasons

Declare your own routing vocabulary (needs-info, blocked, no-change-required…) above the pass/fail layer.

User-defined dimensions

Route on per-solution dimensions (lane, priority, issue-type, anything) extracted from prefixed labels.

when: conditioning + catch-all

Route by outcome, fail-reason, and per-dimension conditions — failing closed to a catch-all rather than stranding a run.

Route directives

done / previous / escalate / resolved-without-merge — terminal and control directives, not just next-stage pointers.

Configurable source branch per route

A stage can be told exactly which branch to work from.

Position-cursor model

Routing writes an explicit next-stage cursor; dispatch never re-computes “where was this run?” — kills resumption bugs.

Framework & model agnostic

Single execute() contract

Every framework — Claude Code, Copilot, Cursor, any process tool, or a human — plugs into one uniform contract.

Bring your own agent + model

Your subscriptions and LLM keys run the work; model is a per-stage parameter, mixable across the pipeline.

Process & human frameworks

A stage can be an automated agent, a scripted process, or a human step — all first-class.

Launch-spec templating

Per-workstation launcher templates; a typo is a typed refusal at boot, never a silent per-issue decline.

Hermetic launch + scrubbed auth

Agents launch from a constructed env allowlist; code-mode launches strip SCM write credentials — defense against rogue self-publish.

Per-agent tool / MCP / env scoping

Each stage's agent gets exactly the tools, MCP servers, and env it's granted — nothing more.

Per-agent charter / prompt / permissions

Every stage has its own editable charter, system prompt, and permission set — canonical or per-repo override.

Standalone merge tool

The merge/PR step runs as its own launched process, keeping the worker domain-free.

Full-lifecycle intake

Vague-report → multi-repo decomposition

A whole-solution triage stage reads an unclear report and spawns concrete component issues in the right repos.

Target allowlist

Every decomposition target is validated against declared repos; a hallucinated target is rejected loudly, never mis-filed.

Directive-label propagation

Decomposed children inherit the parent's routing directives, so they route in the parent's context.

Gated source close

The source issue closes only once every child terminalizes; a child that fails escalates the source instead of a half-done close.

Exactly-once child creation

Each child is claimed on a unique engine-side row, so an at-least-once retry never duplicates issues.

Resolve-without-merge

Close an issue as genuinely “nothing to do” (duplicate / already fixed) — distinct from a real merge and from a give-up.

Govern & control

Trustworthy, not autonomous — every run is gated, resolvable, and auditable.

Escalation & the human floor

Ordered escalation ladder

Declare an ordered ladder of resolvers (worker → process → human), each with its own attempt bounds; safe default if unset.

Automatic ladder progression

An exhausted level advances to the next and actively dispatches it — a worker-to-worker ladder never freezes.

Human-floor conversion

Reaching a human level converts the blocked hold to a gate a person resolves via verbs — idempotent and crash-self-healing.

Escalation carries real evidence

The human handoff carries the actual failure reason + resolver verdict, not a bare escalation-level label.

Operator control

Full operator action set

Pause, resume, restage, cancel, restart, set-status, respond, ask, admit, escalate, set-priority, drain, evacuate, and more.

MCP operator surface (JSON-RPC)

Every operator action exposed as an MCP tool for IDE/agent use; a bad call returns a structured error, never a crash.

Idempotent operator calls

Every call mints a fresh client token, so a retried call collapses through the bus's dedup key.

Restage with a real stage dropdown

Re-stage picks from the issue's own workflow stages, so a typo can't produce an invalid restage.

Control center (portal)

Issue board with persisted views

Hold-state pills, per-row actions, group/sort/filter that persist across reloads.

Issue detail

Current stage/status/outcome, prominent hold, full event trail, attempts, and every maintain-action.

“Waiting on you” queue

Every run whose hold is human-owned, with the question/reason inline and one-click resolve.

Escalations view

Every live blocked hold with reason, evidence, and its server-driven applicable actions — nothing invented client-side.

Visual workflow designer

ELK layered graph, drag-to-rearrange, fanned parallel edges, persisted node layout.

Route editor

Edit a stage's routing (outcome / fail-reason / directive / when: → target) from the designer's inspector.

Form-based config editor

Register solutions and edit dimensions, fail-reasons, ladder, admission order, repo settings, charters — no raw YAML.

Dispatch from the portal

Create and immediately start an issue without waiting on a webhook.

Analytics dashboard

KPI cards + breakdowns by outcome / status / stage / failure-category over the run event trail.

Ownership & audit

Self-hosted workers on your infra

A thin worker owns all git/worktree/publish plumbing; your code and agents run on your machines, engine stays hosted.

Full event trail + user attribution

Every command/event stamped with the acting user for a real audit trail.

GitHub App integration (multi-app)

Authenticate as one or many GitHub Apps, resolved per repo-owner, with PAT fallback and a loud failure on an uncovered owner.

Session auth / pluggable identity

An IdentityProvider port with a GitHub OAuth adapter and CSRF-safe login, mounted only when configured.

Reliability & recovery

The self-healing supervisor that makes “just build it myself” irrational.

Self-healing engine

Self-healing reconciler

A continuous supervisor classifies every run against invariants and emits the cheapest corrective command.

Lost / stale / displaced-worker recovery

Reclaims an in-flight attempt whose worker died or was replaced and re-queues it — without charging the issue's failure bounds.

No-eligible-worker auto-recovery

A run blocked for lack of a capable worker auto-requeues the moment a matching worker rejoins — no human nudge.

Progress-bound circuit breaker

Escalates a run whose attempt/rework/decline counters exceed limits, with a loud alert on repeated launch failures.

Hard-bound termination

Kills an attempt that blew its execution-time ceiling; a wedged agent can't run forever.

Supervised-lapse recovery

A human/supervised stage gone silent is reclaimed and escalated to a person, never headlessly re-dispatched.

Recover-in-place ladder

Reuse the pinned workstation + worktree when possible, rebuild from SCM if not, start over only when state is unrecoverable.

Config-error fail-closed park

An unresolvable route lands a blocked hold with a config-error reason, never a silent skip-loop.

State-shape repair

Repairs structural inconsistencies (a running attempt on a terminal run) by re-queuing or fixing pointers.

Idempotent, deduped recovery

Each rule's command is deduped per run+occurrence, so the same violation across ticks acts exactly once.

Dispatch-dead detection

Raises a system-wide stall incident — but suppresses it when a degraded dependency (a real outage) is the cause.

Fleet liveness & crash safety

Background lease + roster heartbeats

A long run keeps its lease fresh from side threads, so a healthy 12–18 min stage is never wrongly reclaimed.

Liveness / idle-kill

Session-activity liveness terminates a framework that stopped making progress rather than hanging forever.

Graceful drain (no reclaim)

Drain a worker so it finishes current work then exits when idle — without yanking running stages.

Worker replacement / self-terminate

On a displacement signal the old daemon cancels, drains, and reclaims its own in-flight work to the replacement.

Orphan-workspace sweep

A run-state-aware reaper reclaims leaked worktrees and stray branches after crashes, failing safe toward KEEP.

Native-crash diagnostics

Catches C-level fatal signals (SIGSEGV/SIGABRT) and dumps every thread's stack — the one mode no Python exit path sees.

Transport-failure resilience

Capped-backoff retry on connection/timeout/5xx, escalating a sustained outage instead of retrying silently forever.

Ingest & health

Durable webhook inbox

GitHub deliveries are persisted and acked immediately, then drained idempotently — nothing is lost on a restart.

Onboarding-label opt-in ingest

Only issues deliberately given the onboarding label are tracked; add/remove is a clean on/off switch.

/health with reconciler-gating

Returns 503 on a migration mismatch that freezes the reconciler, so a load balancer sees a frozen engine as unhealthy.

Boundary-effective holds

No hold interrupts a live attempt; the stage runs to its boundary and the hold takes effect there.

Pause / resume with deferred-route replay

On resume, the already-computed routing decision is applied verbatim without re-running routing.

Scale & orchestration

Multi-repo, multi-worker, multi-tenant — with dependencies and epics.

Cross-issue orchestration

Admission control

New runs for a gated solution park un-claimable until an orchestrator admits them — stage work in before it consumes workers.

Declarative admission-order / priority

A priority spec (lane → priority → issue-type) decides which claimable run a free worker gets first; FIFO as tiebreak.

Cross-issue dependencies

An issue depends_on others and parks until every prerequisite succeeds; never runs past a failed prerequisite.

Dependency cycle detection

Rejects an edge that would create a cycle or self-loop — no silently unusable dependency that strands a run.

Concurrency grouping

Cap how many runs of a semantic group (e.g. same code-area) run at once; excess park and release by priority-then-age.

Constraint re-check on re-queue

Every transition back into the queue re-evaluates dependency + concurrency, so a release can't sneak past its cap.

Board-coherence sweep

A standing sweep releases holds whose constraints cleared and escalates ones that never can.

Epic management

Epic → child fan-out

A passing epic stage spawns child issues, links them to the parent, and starts each child's run.

Auto-advance on completion

The epic parks waiting-on-children and auto-advances into doc → merge → e2e → cleanup once every child terminalizes.

Materialization-gated advance

The parent advances only once all expected children have actually materialized — closes zero-children and partial races.

Shared run-branch inheritance

Epic children inherit the parent's run-branch and truncate their routing (same-repo epic model).

Partial-failure escalation

A child-creation failure escalates and retries, reusing already-created children — no silent loss.

Fleet & tenancy

Multi-workstation fleet

Many concurrent worker machines, each declaring which solutions and frameworks it serves; dispatch goes only to a capable one.

Multi-repo from a manifest

One worker serves multiple solutions and resolves each solution's canonical + member repos from a registration manifest.

Parallel stage execution

A bounded thread pool runs up to max_concurrency claim/build/execute/report cycles at once per worker.

Per-run worktree isolation

Every run gets its own git worktree, so concurrent stages never collide on working state.

Capacity- & liveness-gated dispatch

Only an alive, capable worker with free capacity is matched; no match = WAIT, never a lost issue.

Multi-tenancy at the boundary

A TenantContext stamps tenant_id on every command/event and scopes every read/write; the domain stays tenant-agnostic.

Solution-subject runs

Orchestration work (Orchestrator, Blocker-Resolver) runs as first-class runs sharing one state machine and recovery path.

Depth & learning

The operational long tail — and the parts still hardening, marked honestly.

Operational depth

Model tiers (S / M / L)

Map complexity to a small/medium/large model per stage; spend the expensive model only where it pays.

Personas

Named agent identities carried across stages.

Interactive / interjection stages

Stages designed to pause for human input as their normal mode.

Event-bus, solution-scoped stages

Stages triggered by solution-level events, not just the linear issue flow.

At-least-once idempotent outbox

All external side effects run as idempotent outbox effects, so retries converge without duplication.

PM-mirrored status projection

Internal states project onto a human vocabulary (PENDING/READY/IN_PROGRESS/WAITING/COMPLETED/CANCELLED), mirrored to the PM tool.

Classified terminal disposition

Every finished run is tagged SUCCESS / REJECTED / CANCELLED / RESTARTED / RESOLVED — “shipped it” vs “gave up” vs “nothing to do.”

Rework-in-place counter

Routing back to an iteration stage advances a rework counter the breaker watches.

Local workspace CLI

worker workspaces list / prune (dry-run default) to inspect and clean isolated worker workspaces.

Worker protocol control plane

register / claim / heartbeat / progress / complete / drain / orphan-check / advisory — the full fleet control plane.

Config-write REST surface

The entire portal config editor is also a REST API — everything the UI does, scriptable.

Recursive proof

IssueFlow builds itself through itself — the strongest possible reliability demonstration.

In hardening

Agent learning from corrections ([hr:learn])in hardening

A human's resolution can propose a durable, context-scoped learning future agents match against.

Deterministic lesson matchingin hardening

Recorded lessons are scored by stage + dimensions + keywords to enrich agent charters.

Ready to put your agents on rails?

Connect your repo