Files
Gitea-Tools/docs/architecture/control-plane-db-substrate.md
T
sysadmin 036b78e31e feat: control-plane DB substrate for atomic assign/lease (Closes #613)
Add SQLite single-writer MVP control plane per the allocator ADR:
sessions, work_items (issue/pr only), atomic assign+lease, mutation
gates, terminal-lock index, and provider-neutral incident_links.

DB coordinates concurrency; Gitea remains assignable work; raw
Sentry/GlitchTip incidents are never work items. #600 and #612 build on
this substrate.
2026-07-09 22:27:51 -04:00

2.2 KiB

Control-plane DB substrate (#613)

Status: Implemented (SQLite single-writer MVP)
ADR: mcp-allocator-control-plane-observability-adr.md
Module: control_plane_db.py

Architecture statement

DB coordinates, Gitea records, Sentry/GlitchTip observe; the bridge is the only path that turns observations into Gitea work.

What this ships

Capability Notes
Schema sessions, work_items, leases, assignments, terminal_locks, events, incident_links
Atomic assign+lease ControlPlaneDB.assign_and_lease — one BEGIN IMMEDIATE transaction
Mutation gate require_valid_assignment — workers need a live assignment/lease
Heartbeat / release / expire Lease lifecycle helpers
Terminal-lock index Routing signal for #600 (terminal path first)
incident_links Provider-neutral link model for #612 — not assignable work

Hard rules (enforced in code)

  1. Assignable work_items.kind ∈ {issue, pr} only — never raw Sentry/GlitchTip incidents.
  2. Two concurrent sessions cannot both receive an active assignment on the same open work item (second gets wait).
  3. Merged/closed work items return no_safe_work.
  4. SQLite path is the single-writer MVP (GITEA_CONTROL_PLANE_DB, default under ~/.cache/gitea-tools/control-plane/). Multi-session multi-host production requires Postgres or a single allocator daemon (ADR §6).

Dependency chain

#613 control-plane DB (this)  →  #600 allocator API  →  #612 incident bridge
  • #600 must call this substrate (not file locks / comment-only leases alone) for completion.
  • #612 must write incident_links here and create Gitea issues; the allocator assigns those issues, not raw incidents.

Non-goals (intentionally deferred)

  • Full gitea_allocate_next_work routing policy (REQUEST_CHANGES → author, etc.) — #600
  • Sentry/GlitchTip provider adapters and auto-watchdog — #612
  • Gitea comment/label mirror writers (may be added by allocator tooling later)

Tests

python3 -m pytest tests/test_control_plane_db.py -q