Problem
Each agent instance has a Kanban board of tickets, and that work usually also exists as GitHub issues on the agent's repo. Two parallel records of the same work with nothing reconciling them, so a card can sit stale while the real issue has moved on.
Proposal
Let a ticket optionally be backed by a GitHub issue. Explicitly NOT two-way sync, and NOT a live view calling the GitHub API on every board render. The ticket row stores the issue NUMBER as a stable key plus a small cached projection (title, state, labels) for display. GitHub stays the single source of truth for issue content; the board never claims to own the description.
Cache Invalidation
Prefer GitHub webhooks over polling: on issue events, update the cached row for the ticket referencing that number. Fall back to refresh-on-open if a webhook is missed. Avoid timer-based polling.
V1 Scope
Board is read-only with respect to GitHub. Moving a card does NOT mutate the issue upstream. Drag-to-change-issue-state is deliberately deferred to a later issue since it needs conflict handling this does not.
Settings
Per-agent setting for whether that agent's board is issue-backed at all, since not every agent has or wants a repo behind it. Boards stay fully usable with no issue backing.
Sequencing
This adds a field to the ticket model. The original draft of this issue sequenced that behind in-flight update_ticket work cited as "#137". Two corrections, both verified at filing time:
It also landed on PAS, not here, so it does not touch this repo's ticket model and there is no schema collision on this repo to sequence around. Anyone picking this up should confirm the current shape of the ticket model on this repo directly rather than treating the PAS change as a blocker.
Cross-reference
Problem
Each agent instance has a Kanban board of tickets, and that work usually also exists as GitHub issues on the agent's repo. Two parallel records of the same work with nothing reconciling them, so a card can sit stale while the real issue has moved on.
Proposal
Let a ticket optionally be backed by a GitHub issue. Explicitly NOT two-way sync, and NOT a live view calling the GitHub API on every board render. The ticket row stores the issue NUMBER as a stable key plus a small cached projection (title, state, labels) for display. GitHub stays the single source of truth for issue content; the board never claims to own the description.
Cache Invalidation
Prefer GitHub webhooks over polling: on issue events, update the cached row for the ticket referencing that number. Fall back to refresh-on-open if a webhook is missed. Avoid timer-based polling.
V1 Scope
Board is read-only with respect to GitHub. Moving a card does NOT mutate the issue upstream. Drag-to-change-issue-state is deliberately deferred to a later issue since it needs conflict handling this does not.
Settings
Per-agent setting for whether that agent's board is issue-backed at all, since not every agent has or wants a repo behind it. Boards stay fully usable with no issue backing.
Sequencing
This adds a field to the ticket model. The original draft of this issue sequenced that behind in-flight
update_ticketwork cited as "#137". Two corrections, both verified at filing time:#137here autolinks to Refactor: split agent-storage.ts (1262 LOC) per storage domain #137, "Refactor: split agent-storage.ts (1262 LOC) per storage domain" — closed, and unrelated to tickets.It also landed on PAS, not here, so it does not touch this repo's ticket model and there is no schema collision on this repo to sequence around. Anyone picking this up should confirm the current shape of the ticket model on this repo directly rather than treating the PAS change as a blocker.
Cross-reference
update_ticketwork referenced above (closed, completed)