GitHub
Concept

Issues

The atomic unit of work — six statuses, five types, five priorities, parent/sub-issue hierarchy, and assignment to either humans or agents.

Issues are the work-tracking primitive in ProxifAI. They link to branches, pull requests, sprints, initiatives, and workflows — and they can be assigned to either a human or an AI agent. The schema lives in internal/core/models/models.go (look for type Issue struct).

Anatomy of an issue

FieldTypeNotes
numberintSequential per team, displayed as <team-identifier>-<number> (e.g. BACK-42)
titlestringRequired
descriptionnullable MarkdownFull Markdown + @-mentions
statusenumSix values, see below
priorityenumFive values, see below
typeenumtask, bug, story, epic, subtask
teamIdrequiredIssues are owned by a team, never floating
projectIdnullableOptional link to a project
assigneeIdnullableHuman assignee
assigneeAgentIdnullableAgent assignee — independent from human assignee
parentIdnullableSub-issue support — points at the parent
initiativeIdnullableDirect link to a roadmap initiative
sprintIdnullableSprint membership
workflowIdnullableAutomation attached to the issue
startDate, dueDatenullable dates
estimatenullable intStory points or hours
summarynullableAI-generated synopsis (populated by the summarizer workflow)
labels, customFieldsembeddedPer-team labels + per-team custom fields

assigneeId and assigneeAgentId are independent — an issue can have both a human owner and an agent that’s actively working on it, or just one, or neither.

Status

Six statuses, defined as IssueStatus in models.go:

StatusWhat it means
backlogNot yet committed to a sprint or release; “someday maybe”
todoCommitted and ready to start
in_progressActively being worked on
in_reviewCode is up for review or approval is pending
doneCompleted
cancelledDecided not to ship; preserved in history

Status transitions emit issue.status_changed platform events that trigger rules can react to.

Priority

PriorityUse for
urgentDrop-everything work — pages oncall
highTop of the queue this sprint
mediumDefault for committed work
lowNice-to-have
noneUnrated

Type

TypeTypical use
taskDefault — generic work item
bugSomething broken; payload includes reproduction context
storyUser-facing capability, often broken into subtasks
epicLarge container; sub-issues hang off it
subtaskChild of any other issue (set parentId)

The type field is purely descriptive — it doesn’t change behavior. Use it to filter views and to enable type-specific UI affordances (e.g. story-point columns on storys).

Creating issues

From the UI

Plan → Issues → New (or c shortcut from the issue list). Title is required; everything else has a per-team default.

From the CLI

pfai task create \
  --title "Auth: redirect loop on 401" \
  --type bug --priority high \
  --team backend --assignee alice \
  --label "auth,production"

From the AI chat

“Create an issue for the auth redirect loop” — the chat agent fills in title, description, suggested type and priority, and posts it for you to confirm.

Auto-created via trigger rule

Trigger rules with action_type: create_issue open issues from any platform event — alerts, webhook payloads, agent failures. See Triggers.

Assigning to an agent

assigneeAgentId makes an issue actionable by a workflow:

pfai task dispatch BACK-42 --agent claude-code --branch main

This sets assigneeAgentId, creates an AgentExecution, and dispatches the agent in per_execution mode against the issue’s repo. The agent inherits the issue’s context (description, comments, linked PRs) via the pfai_<execID> token and reports progress back through pfai exec status / pfai exec log.

When the agent opens a PR with Closes #<number> in its body, the PR gets linked back automatically and merging it transitions the issue to done.

Sub-issues

Set parentId to nest issues under another. The full chain is browsable in the UI as a tree, and the parent’s progress bar reflects sub-issue completion. There’s no enforced depth limit — epicstorytasksubtask is the convention but technically arbitrary.

pfai task create --parent BACK-100 --title "Wire OIDC callback handler"

Activity timeline

Every change to an issue appends an Activity row. Twelve activity types are recorded (models.go):

issue_created · status_changed · priority_changed · assignee_changed
title_changed · description_changed · labels_changed
comment_added · comment_deleted · time_logged
agent_dispatched · workflow_assigned

Comments are a separate concern from activity — they’re stored in Comment and rendered inline with activity entries in the UI. Both support @-mentions; mentioning @<agent-name> triggers the comment_trigger and dispatches that agent.

Custom fields

Per-team CustomFieldDefinition rows let you add fields to every issue in the team. Four storage types are supported, plus a select-style mode:

Field typeStored asUse for
texttextValueFree-form strings — Slack channel, repro URL
numbernumberValue (float64)Severity (1–5), customer count, ARR impact
datedateValue (ISO date)Customer SLA, regulatory deadline
booleanbooleanValueCustomer-facing? Needs translation?
selecttextValue + options JSONBounded choice (e.g. severity level)

Each definition has position, isRequired, and defaultValue. Manage with pfai custom-field or the Team Settings → Custom Fields UI.

Filtering and views

The issue list query supports filtering on every column above. The web UI exposes the most common filters as one-click chips; the API accepts the same as URL params:

pfai task ls --status open,in_progress --priority high,urgent --assignee @me
pfai task ls --label bug --updated-after "7 days ago" -o json

Saved combinations live in the View table per team — see Teams & Views for visibility scopes.

Time tracking

Per-issue TimeEntry rows record duration + optional note + author. Totals roll up to sprint and project dashboards. Log time via the issue detail page’s Log time button or:

pfai time log BACK-42 --duration 1h30m --note "Reviewed redirect handler"

Traceability to code

LinkHow it forms
BranchesClick Create branch on the issue, or pfai task branch BACK-42 — creates <assignee>/back-42-<slug>
PRsAny PR mentioning the issue (Closes #42, Fixes #42, Refs BACK-42) — auto-linked on PR creation/update
CommitsCommit messages mentioning the identifier link the commit
Agent runsassigneeAgentId and dispatched executions appear under the issue’s Activity tab
WorkflowsIssues with workflowId set show that workflow’s runs against this issue

When a linked PR with Closes #42 merges, the issue transitions to done. The transition emits issue.status_changed so other automation can pile on (e.g. ping the customer who reported the bug).

REST endpoints

Method · PathPurpose
GET /api/v1/issues?team=&status=&assignee=...List with filters
POST /api/v1/issuesCreate
GET /api/v1/issues/{id}Read (full graph: assignee, project, labels, custom fields)
PATCH /api/v1/issues/{id}Update any field
DELETE /api/v1/issues/{id}Soft-delete
POST /api/v1/issues/{id}/dispatchDispatch the assigned agent
GET · POST /api/v1/issues/{id}/commentsComments thread
GET /api/v1/issues/{id}/activityActivity timeline
POST /api/v1/issues/{id}/time-entriesLog time

See also