Trixie

Backlog / KAN Tickets

Ticket reservation + routing + linking to holons.

Backlog Ticket Pipeline (v2026-08-02T101544Z-ab2bbdebf5) 2026-08-01 | backlog/ KAN tickets + kanban_api.py approval gate + backlog_api.py dispatch + holon mailbox 1 · RESERVE — claim a number before writing anything Agent session Orion / Flynn / OG2 TICKET_PROTOCOL.md _reserve_kan() kanban_api.py:731 with _kan_lock: n, n+1 backlog/.next-kan one integer, git-tracked kanban_api.py:75 claim read+write DEFECT — this counter cannot allocate unique numbers _kan_lock is per-PROCESS; .next-kan is git-tracked, so it FORKS with every branch. Two sessions both read 1098, both "reserve" it, both are correct on their own branch. Observed 2026-08-01 (KAN-1098/1099 collision). Fix: KAN-1106 timestamp uid = identity. 2 · WRITE + SERVE — markdown in git is the store backlog/ KAN-{n}-{slug}.md YAML frontmatter + body BOARD.md, GROOMED/ git-tracked, PR-reviewable backlog_router.py GET /api/backlog :377 GET /api/backlog/{t} :406 PATCH /api/backlog/{t} :430 POST /{t}/milestone :521 kanban_api.py GET /tickets :1166 GET /board :1225 GET /triage :1217 POST /groom :1293 backlog_offsite_router.py GET /offsite :93 GET /ticket/{kan_id} :110 POST /offsite/synthesize:138 GET /offsite/health :437 Marco (Mona SPA) KanbanPage.tsx — board, drawer, filters offsite panel — thrusts + groomed Read-only surfaces; every mutation goes back through the routers on the left. write KAN-N.md 3 · APPROVAL GATE → DISPATCH — no kanban-originated work runs unapproved approval gate POST /tickets/{id}/approve :1401 POST /tickets/{id}/unapprove :1432 kanban_pipeline.py config/kanban-pipeline.yaml dispatch POST /tickets/{id}/dispatch :1460 POST /api/backlog/dispatch/batch backlog_api.py:91 auto_approve default false holon mailbox holon_mailbox.py BEGIN EXCLUSIVE claim TTL recovers orphans KEVIN_HOME/db holon worker tools/holon_worker/ worker_loop.py claim → execute → commit Walt cost ledger X-Kevin-Ticket: KAN-N fabric_proxy/telemetry.py Real spend joined back to the ticket. drop_holon blocked_unapproved → back to board 1. reserve KAN-N 2. write KAN-N.md 3. serve to Marco 4. approve 5. dispatch 6. worker claims 7. cost attributed Ticket frontmatter — backlog/KAN-1106-immutable-ticket-uid.md --- key: KAN-1106 # LABEL, renumberable pre-merge only title: "Immutable ticket uid — identity is a timestamp" status: backlog # backlog | in_progress | done priority: "High" type: "Bug" owner: claude labels: [kanban, ticket-protocol, offline-safe, identity] related: [KAN-1107, KAN-1089] required_skills: - kevin-daemon-framework # routes the holon to a capable worker modules_affected: [daemon/src/kanban_api.py, backlog] created: "2026-08-01T09:10:00-0400" --- DispatchResult — POST /api/backlog/dispatch/batch { "ticket": "KAN-1106", "status": "blocked_unapproved", # or "dispatched" "holon": "", # id appears only once approved "reason": "ticket not approved for dispatch" } The gate is per-ticket and never silent An unapproved ticket comes back as blocked_unapproved rather than being dropped from the batch — a silently shrunk batch is indistinguishable from a batch that had less work in it. KAN-N is the correlation id ticket → holon → branch → PR → Walt spend. That is exactly why the number must stop carrying identity: renumbering would break every reference, so KAN-1106 moves identity to an immutable uid and freezes the label at merge. Legend actor = initiates work · process = code path · store = state on disk · bus = durable queue · dashed = separate process cyan = request flow · pink = state read/write · dashed green = pull / return path · red = refusal

Provenance

This drawing is generated, not drawn. It is rebuilt from the source files below, so when they change the picture changes — a diagram here cannot quietly describe a system that no longer works this way.

Owner
Trixie
Slug
backlog-tickets
Rendered
2026-08-02T101544Z
From commit
ab2bbdebf5
Watches
4 paths
  • backlog
  • daemon/src/backlog_api.py
  • daemon/src/backlog_router.py
  • daemon/src/backlog_offsite_router.py