8.7 KiB
8.7 KiB
API CONTRACTS
PMFlow OS
POST /pmflow-os/change-sets/{change_set_id}/commit
- Purpose: commit reviewed ChangeSet items into the official project truth layer.
- Auth: project member,
OWNER, orREVIEWER; tenant comes from JWT. - Request body:
item_ids?: string[]optional; default commits allaccepted / editeditems.mode: "atomic"required for C2 V1.note?: stringaudit note only.
- Behavior:
- Processes only
accepted / editedChangeItems. - C2 V1 is atomic: any eligible item write failure rolls back the whole commit.
- Required C2 objectType support:
Requirement / Decision / Task / Risk. - Optional C2 objectType support:
Release. - Unsupported for C2 V1:
ModelDecision / MetricSignal, which must fail with422 unsupported_object_type. Requirement / Decision / Risk / Releasewrite totruth_nodes.Taskwritestruth_nodes(node_type='task')plustasks.truth_node_id.- High-risk items require item-level approval with
decision in ('approved','edited')andafter_status in ('accepted','edited').
- Processes only
- Response data:
changeSet:{ id, status, rawStatus, committedAt, committedItemIds, skippedItemIds, failedItemIds }committedItems[]:{ changeItemId, objectType, targetType, targetId, status, evidenceIds, semanticFactStatus }skippedItems[]:{ changeItemId, objectType, status, reason }failedItems[]:{ changeItemId, objectType, code, message }projectTruthState?: optional backend projection after commit.
- Failure semantics:
404 changeset_not_found409 changeset_not_reviewed409 changeset_already_committed409 no_accepted_items409 high_risk_approval_required422 invalid_commit_item_ids422 unsupported_object_type422 invalid_change_payload500 commit_failed
Signal & SSTC
GET /projects/{project_id}/signals
- Response data:
items[]includes planner fields:planner_status: "pending" | "completed" | "failed"planner_analyzed_at: string | nullplanner_assignee_user_id: string | nullstrategic_analysis: object
Model Routing
GET /model-routing/functions/{function_name}
- Purpose: query function-level advanced routing override. This is an admin/advanced entry, not the default product UI for members or team leads.
- Response data:
function_nametiersource: "default" | "override"
PUT /model-routing/functions/{function_name}
- Auth: manager/admin only
- Request body:
tier
- Side effects:
- persist override into
integrations(type='model_routing') - append audit to
operation_logs
- persist override into
AI Routing & Providers
- UI placement: these endpoints power the team-level AI 运营中心 under
/ai-config; they are not project-scoped and must not be presented as per-project provider/model settings.
GET /ai-routing/overview
- Purpose: productized AI routing overview for team leads and AI operators.
- Auth:
OWNERorREVIEWERviacan_view_ai_policy. - Response data:
control_plane:{ version, source, updated_at, baseline_note }slots[]: low/high slot summaries with Chinese labels, provider/model display summary, connection state, and masked key status.metrics: recent 24h/7d calls, failures, failure rate, escalation rate, structured failure rate, average latency, and cost estimate.diagnostics[]: risk cards such as env key override, high slot unavailable, same runtime for low/high, protected downgrade, structured failure spike, or local Ollama scope risk.
- Boundary: no cleartext key,
api_env, prompt, raw provider secret, raw error, or raw routing meta.
GET /ai-routing/team-policy
- Purpose: team-lead-facing business policy view for project launch, requirement structuring, task breakdown, assignee matching, internal QA, external query, Feishu understanding, and Feishu reply.
- Auth:
OWNERorREVIEWER. - Response data:
strategy:quality_first | balanced | speed_firstscenes[]: Chinese business scene policies, preferred mode, escalation rule, fallback behavior, and editable business note.automation_boundary,budget_guard,quality_targets,updated_at,updated_by
- Boundary: team policy is saved product governance state only; it does not rewrite
llm_serviceruntime routing in v1.
PUT /ai-routing/team-policy
- Purpose: save team AI policy display/governance state.
- Auth:
OWNERonly viacan_approve_ai_routing_change. - Request body:
strategy?: "quality_first" | "balanced" | "speed_first"scenes?: [{ key, policy, mode?, human_confirmation?, protected? }]automation_boundary?: stringbudget_guard?: { enabled?: boolean, monthly_budget_cny?: number | null, alert_threshold_ratio?: number }quality_targets?: string[]
- Side effects:
- persist into
integrations(type='ai_team_policy') - append
operation_logs(entity_type='ai_routing_policy')
- persist into
- Boundary: never writes
backend/.control_plane/pmflow-routing-rules.json, provider secrets, or model-routing overrides.
GET /ai-routing/admin-console
- Purpose: AI admin/operator console aggregating provider connection summaries, low/high slots, business-scene routes, recent failure samples, protected scenes, and env override diagnostics.
- Auth:
OWNERorREVIEWER. - Response data:
providers[]: display-only provider health and masked key state.slots[]: fast/deep slot summaries.scene_routes[]: scene label, mode, contract, protection state; rawfunction_namemay only be present in admin data and must be hidden by default in UI advanced details.recent_failures[]: sanitized failure samples without raw error or prompt.protected_scenes[],environment_overrides[],diagnostics[]
POST /ai-routing/diagnostics/run
- Purpose: run read-only diagnostics for routing/provider health.
- Auth:
OWNERorREVIEWERviacan_operate_ai_routing. - Side effects: none; does not modify provider, slot, team policy, or runtime routing.
PMFlow OS Adaptive Capacity
All endpoints return { code, message, data }. Project members may read. Override simulate/apply requires OWNER or REVIEWER; write endpoints only persist capacity override audit records and must not assign tasks, request review, write ChangeSet, or mutate Project Memory.
GET /pmflow-os/projects/{project_id}/capacity-plan?date=YYYY-MM-DD
- Purpose: compute the daily adaptive human capacity plan from current truth-state, reviewer routing, execution summary, workspace bindings, user projects, legacy workload reference, and active overrides.
- Response data:
projectId,date,generatedAtteamDemandMixteamEffectiveMinutes,teamPlannedTouchMinutesmemberPlans[]: base/effective minutes, dynamicsuggestedBaseline, current mix, planned touch minutes, status, remaining minutes, bottleneck, fatigue risk, risk density,canTakeMore, manual override, explanationshumanTouches[]: source, target href, work type, estimated minutes, risk, urgency, binding, assigned user, context readiness, AI reduction potentialwarnings,recommendations
- Boundary: daily plan is computed at read time. Do not persist fixed baselines or daily snapshots.
POST /pmflow-os/projects/{project_id}/capacity-overrides/simulate
- Purpose: simulate a manager capacity override before applying it.
- Request body:
PMFlowCapacityOverridePayload - Response data:
{ beforePlan, afterPlan, impactSummary, warnings } - Boundary: no database write and no assignment side effect.
POST /pmflow-os/projects/{project_id}/capacity-overrides
- Purpose: apply a manager override and persist audit in
human_capacity_overrides. - Request body:
PMFlowCapacityOverridePayload - Response data:
PMFlowCapacityOverrideRecord - Side effects: insert one override audit row only.
- Boundary:
reasonis required; default expiry is same day 23:59 if omitted. Overtime increases time budget but must not clear fatigue or quality risk.
GET /pmflow-os/projects/{project_id}/capacity-overrides?date=YYYY-MM-DD
- Purpose: list override audit records for the given day.
- Response data:
PMFlowCapacityOverrideRecord[]
GET /pmflow-os/projects/{project_id}/execution-capabilities
- Addition: response data may include
adaptiveCapacitySummary: DailyCapacityPlan.
Task Briefs
GET /task-briefs/center
- Purpose: list generated brief cards
GET /task-briefs/templates
- Purpose: list templates
POST /task-briefs/templates
- Purpose: create template
PUT /task-briefs/templates/{template_id}
- Purpose: update template
GET /task-briefs/runs
- Purpose: list generation runs
POST /task-briefs/generate
- Purpose: generate one task brief run
GET /task-briefs/contract-sync
- Purpose: expose docs/contract sync status snapshot