From 6690b714c64aaef5781bc0aac41b777ab72e9070 Mon Sep 17 00:00:00 2001 From: soryu Date: Fri, 8 May 2026 12:12:51 +0100 Subject: feat(contracts): lifecycle — Lock/Start/Pause/Complete/Unlock + queue scheduler (#129) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds the contract lifecycle layer on top of the unified-contracts backbone (#128). State machine: draft → queued → active → shipped → archived At most one contract per directive sits in `active` at any time — the queue is serialised because each directive owns a single shared worktree. Repository helpers handle the transition checks AND auto-promote the next-up `queued` contract whenever the active slot frees (pause / complete / unlock-from-active / archive-from-active). Endpoints (all under /api/v1/contracts/{id}): POST /start draft → queued | active (depending on slot) POST /pause active → queued; promotes next queued POST /complete active → shipped; optional pr_url + pr_branch POST /unlock queued | active → draft; promotes if was active Frontend wiring: * `DirectiveContractStatus` now includes `queued`. * Migration adds `queued` to the CHECK constraint on directive_documents.status. * `ContractHeader` component renders breadcrumb + status pill + status-driven action buttons + a merge-mode (shared / own_pr) radio. Merge mode is editable only while draft / queued so a running flow's branch target can't change mid-stream. * RepositoryError gains a `Validation(String)` arm; the three existing exhaustive matches (files, mesh, versions) get a 400 BAD_REQUEST response for it. Drag-to-reorder UI deferred to a small follow-up — the backend endpoint already exists from the backbone PR. Co-authored-by: Claude Opus 4.7 (1M context) --- makima/src/server/openapi.rs | 5 +++++ 1 file changed, 5 insertions(+) (limited to 'makima/src/server/openapi.rs') diff --git a/makima/src/server/openapi.rs b/makima/src/server/openapi.rs index 7ddaf1b..184d12a 100644 --- a/makima/src/server/openapi.rs +++ b/makima/src/server/openapi.rs @@ -124,6 +124,10 @@ use crate::server::messages::{ApiError, AudioEncoding, StartMessage, StopMessage directive_documents::ship_document, directive_documents::archive_document, directive_documents::reorder_contract, + directive_documents::start_contract, + directive_documents::pause_contract, + directive_documents::complete_contract, + directive_documents::unlock_contract, directive_documents::list_document_tasks, // Order endpoints orders::list_orders, @@ -233,6 +237,7 @@ use crate::server::messages::{ApiError, AudioEncoding, StartMessage, StopMessage directive_documents::UpdateDirectiveDocumentRequest, directive_documents::ShipDirectiveDocumentRequest, directive_documents::ReorderDirectiveDocumentRequest, + directive_documents::CompleteContractRequest, directive_documents::DocumentTasksResponse, // Order schemas Order, -- cgit v1.2.3