This client mirrors and verifies upstream-compatible behavior. Upstream runtimes remain the canonical protocol owners.
CAVI's Project Board is a REST-and-RPC hybrid over the cavi-control kanban plane. Every helper here is a divergence point: it prefers native OpenClaw Workboard RPC (workboard.cards.*) when a workboardRpc is supplied, falls back to the cavi-control kanban REST surface (and a legacy compat aggregate on 404), and degrades to a source: "mock"MutationResult on backend failure. That fallback ladder — plus the DTO normalization between the Workboard card shape and the ProjectBoard* domain types — is the value-add. None of these are pure pass-throughs.
Route literals: cavi.projectBoard.{root,profile,sprint,backlog,call} in extensions/cavi/contracts/surfaces.ts; the backlog-item path helper is projectBoardBacklogItemPath(itemId). Workboard RPC methods are owned by providers/openclaw/workboard.ts.
gateway Upstream equivalent OpenClaw Workboard RPC workboard.cards.listCAVI value-add Adapts native Workboard cards into the ProjectBoardWorkspaceSnapshot DTO; when no workboardRpc is wired, fans out to the three kanban REST sections and, on 404, retries the legacy single-payload compat aggregate.
gateway Upstream equivalent cavi-control kanban REST profile section (no native RPC) CAVI value-add Normalizes the raw profile payload to ProjectBoardProfile and applies the same 404-to-compat fallback; the read backing the email mutations.
gateway Upstream equivalent cavi-control kanban REST profile section (no native RPC) CAVI value-add De-duplicates and lowercases the email list before persisting, then re-normalizes the response; carries the compat fallback.
Mutations
Each mutation is wrapped in withMutationResult, so a backend failure returns a MutationResult with source: "mock" and a structured contractGap instead of throwing (401/403 still throw).
gateway Upstream equivalent cavi-control kanban profile PUT (email list is CAVI-only; no Workboard RPC) CAVI value-add Validates and normalizes the address, reads-modifies-writes the profile email set idempotently, and degrades to a deterministic mock id on failure.
gateway Upstream equivalent cavi-control kanban profile PUT (no native RPC) CAVI value-add Locates the existing recipient, swaps it in place across the email list, re-persists, and degrades to mock.
gateway Upstream equivalent cavi-control kanban profile PUT (no native RPC) CAVI value-add Filters the recipient out of the list, guards against no-op deletes, and degrades to mock.
gateway Upstream equivalent OpenClaw Workboard RPC workboard.cards.createCAVI value-add Maps the backlog draft into a Workboard create payload (or the REST body), normalizes the returned card to ProjectBoardBacklogItem, and degrades to a mock item.
gateway Upstream equivalent OpenClaw Workboard RPC workboard.cards.update / workboard.cards.moveCAVI value-add Splits a single board edit into the Workboard patch+move pair (or one REST PATCH), maps status/priority enums both directions, and degrades to a mock item.
gateway Upstream equivalent OpenClaw Workboard RPC card-action methods (workboard.cards.dispatch, …) CAVI value-add Routes known board actions to the matching Workboard RPC, otherwise POSTs the cavi-control call endpoint with a generated trace id, parses the ack, and on total failure returns a queued local-fallback ack describing storage limitations.