fluid-core/workplans/FLUID-WP-0004-publication-and-control-apis.md
tegwick 03ff7a8ad7
Some checks failed
ci / build (push) Has been cancelled
Add control APIs, control-plane binary, and close the CLI gate bypass
Completes FLUID-WP-0004. The Revision and Intent APIs (Blueprint 44.1
and 44.5) are served by fluid-control, which is deliberately off the
request path and must never be reachable by interface consumers: it is
the mechanism that evolves the interface in response to their behaviour.

Intent amendment is a proposal, never an edit. Rewriting a recorded
version returns 409, because changing what a version says would change
what already-published revisions were governed by.

A rejected candidate comes back as 422 with its full stage report rather
than as a server fault. Rejection is a normal outcome (invariant 14) and
the reasons are the evidence a later hypothesis needs.

Also closes a real hole this workplan opened: `fluid revision publish`
previously wrote straight into the evidence store, which was a way
around the deterministic policy gate for anyone with shell access. It
now runs the same pipeline the control plane does and requires a signing
key.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014KmVxhJ35tCo7rE7UnLwWu

Assistant: claude-code
Assistant-Model: opus
Assistant-Process: 1116572@bnt-lap001
Assistant-Session: 8ba9bb93-a72a-4883-b189-2499cce5c400
2026-09-04 03:00:17 +02:00

2.5 KiB

id type title domain repo status owner topic_slug created updated planning_priority planning_order depends_on state_hub_workstream_id
FLUID-WP-0004 workplan Revision publication pipeline and control APIs infotech fluid-core done worsch fluid-core 2026-09-04 2026-09-04 high 3
FLUID-WP-0003
2221f88d-ffc5-5e22-80c2-d67a1b17f8ba

FLUID-WP-0004 - Publication and control APIs

Nothing reaches the router unsigned. The deterministic policy gate is built now, before anything can generate candidates, so a future Daimon has nowhere to bypass.

T01 - Publication pipeline

id: FLUID-WP-0004-T01
status: done
priority: high
state_hub_task_id: "74bf29c7-b8a6-5a18-bfc7-94641d12564b"

Blueprint §35: SOURCE, BUILD, CONTRACT CHECK, TEST, SECURITY CHECK, POLICY CHECK, SIGN, PUBLISH, ROUTE. Each stage emits an audit event.

T02 - Descriptor signing and verification

id: FLUID-WP-0004-T02
status: done
priority: high
state_hub_task_id: "9449aa0b-3c73-56d5-8768-df94b26f0282"

The router accepts only signed or otherwise authenticated published revision descriptors (§35). An unsigned descriptor must be refused, and that refusal tested.

T03 - Revision API

id: FLUID-WP-0004-T03
status: done
priority: high
state_hub_task_id: "ba302369-3243-57ac-a34a-9a0a29002ac5"

Blueprint §44.1: create, verify, publish, set state, query lineage.

T04 - Intent API

id: FLUID-WP-0004-T04
status: done
priority: medium
state_hub_task_id: "27c597da-4f58-5a0d-b70e-8ba0749d9002"

Blueprint §44.5: read active intent, read historical intent, validate a candidate against intent, propose an amendment. Amendment stays separately governed — the API records a proposal, it does not enact one.

T05 - Deterministic policy gate

id: FLUID-WP-0004-T05
status: done
priority: high
state_hub_task_id: "b2f96c6c-2c37-5892-bafd-ab9eb2c3f8c2"

Blueprint §28.2. Allowed adaptation class, permitted operational mode, complexity threshold, security status, test status, compatibility status, traffic-allocation maximum, budget, approval requirement. This gate is the architectural boundary that stops agentic reasoning from becoming security policy.

T06 - Trust model in the type system

id: FLUID-WP-0004-T06
status: done
priority: medium
state_hub_task_id: "70cc234b-9570-5c51-8620-1a7d32b9a25c"

Blueprint §47 made mechanical: generated artifacts are an untrusted candidate type until verification produces a signed revision. The compiler should make the unsafe path awkward to write.