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
| Field | Type | Notes |
|---|---|---|
number | int | Sequential per team, displayed as <team-identifier>-<number> (e.g. BACK-42) |
title | string | Required |
description | nullable Markdown | Full Markdown + @-mentions |
status | enum | Six values, see below |
priority | enum | Five values, see below |
type | enum | task, bug, story, epic, subtask |
teamId | required | Issues are owned by a team, never floating |
projectId | nullable | Optional link to a project |
assigneeId | nullable | Human assignee |
assigneeAgentId | nullable | Agent assignee — independent from human assignee |
parentId | nullable | Sub-issue support — points at the parent |
initiativeId | nullable | Direct link to a roadmap initiative |
sprintId | nullable | Sprint membership |
workflowId | nullable | Automation attached to the issue |
startDate, dueDate | nullable dates | |
estimate | nullable int | Story points or hours |
summary | nullable | AI-generated synopsis (populated by the summarizer workflow) |
labels, customFields | embedded | Per-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:
| Status | What it means |
|---|---|
backlog | Not yet committed to a sprint or release; “someday maybe” |
todo | Committed and ready to start |
in_progress | Actively being worked on |
in_review | Code is up for review or approval is pending |
done | Completed |
cancelled | Decided not to ship; preserved in history |
Status transitions emit issue.status_changed platform events that trigger rules can react to.
Priority
| Priority | Use for |
|---|---|
urgent | Drop-everything work — pages oncall |
high | Top of the queue this sprint |
medium | Default for committed work |
low | Nice-to-have |
none | Unrated |
Type
| Type | Typical use |
|---|---|
task | Default — generic work item |
bug | Something broken; payload includes reproduction context |
story | User-facing capability, often broken into subtasks |
epic | Large container; sub-issues hang off it |
subtask | Child 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 — epic → story → task → subtask 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 type | Stored as | Use for |
|---|---|---|
text | textValue | Free-form strings — Slack channel, repro URL |
number | numberValue (float64) | Severity (1–5), customer count, ARR impact |
date | dateValue (ISO date) | Customer SLA, regulatory deadline |
boolean | booleanValue | Customer-facing? Needs translation? |
select | textValue + options JSON | Bounded 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
| Link | How it forms |
|---|---|
| Branches | Click Create branch on the issue, or pfai task branch BACK-42 — creates <assignee>/back-42-<slug> |
| PRs | Any PR mentioning the issue (Closes #42, Fixes #42, Refs BACK-42) — auto-linked on PR creation/update |
| Commits | Commit messages mentioning the identifier link the commit |
| Agent runs | assigneeAgentId and dispatched executions appear under the issue’s Activity tab |
| Workflows | Issues 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 · Path | Purpose |
|---|---|
GET /api/v1/issues?team=&status=&assignee=... | List with filters |
POST /api/v1/issues | Create |
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}/dispatch | Dispatch the assigned agent |
GET · POST /api/v1/issues/{id}/comments | Comments thread |
GET /api/v1/issues/{id}/activity | Activity timeline |
POST /api/v1/issues/{id}/time-entries | Log time |
See also
Group issues into projects with status and health, link repositories.
Time-boxed iterations — three statuses, one active sprint per team.
Initiatives that group projects across teams for long-range planning.
Full CLI for issues — list, view, create, update, delete, dispatch, comments.