decision_packet with the pull request, full final SHA, each source’s result, and a final verdict. For the next task, get the current base SHA and use a new request key.
This path is for a coding agent that can work asynchronously. Millwork runs the review coordination and stores the evidence decision. Your agent still runs on your chosen host. The maintained Node adapter connects a Codex CLI or another configured agent to Millwork’s async_job_v1 protocol; it does not run CodeRabbit CLI or keep a separate review evidence store.
Creating the run branch and PR can start your own CI and CodeRabbit usage. The Review Composer fee defaults to $0.10 per accepted run, instead of the ordinary run fee. Your
max_cost_usd must cover at least that fee. Check your configured fee in GET /v1/account at billing.review_composer_fee_usd_per_execution; it can differ from the default. Millwork charges the fee in addition to any coding-agent provider, GitHub, or CodeRabbit charges on your accounts. Set provider spending limits in those accounts before a live run.What the packet decides
Millwork reads the run branch through its GitHub App and registers its current head SHA. It asks the configured sources about that same SHA. Withcombine: "all", each source must pass. With combine: "any", one pass can suffice unless a veto source blocks or is unavailable. A missing or stale review gives no_verdict; it is never assumed to be a pass. A changed commit requires new evidence.
The packet is a record of the selected evidence and policy. It does not certify that the code has no defects or override your repository’s branch protection.
1
Connect the repository
Open Millwork settings, find GitHub review connection, install the Millwork GitHub App on the repository you choose, enter its
owner/repo name, and select Verify with GitHub. Sign in as a person with write access to that repository. Millwork opens the run PR in that connected person’s name; the App retains branch and evidence access. Use the canonical repository and connected GitHub account shown in settings for later requests. If that person loses access or disconnects, reconnect before starting another run.For a private repository, use tenant_internal in the request. Review Composer accepts it only for a connected repository and registered agent. Other run and output check paths continue to refuse it.2
Prepare CodeRabbit and your agent
Install CodeRabbit’s GitHub App on the same repository. Commit this setting in the base branch’s This is the documented CodeRabbit setting for an approval after comments are resolved, the latest commit is reviewed, and no checks CodeRabbit treats as blocking remain. Millwork requires the CodeRabbit Bot’s substantive Send it to
.coderabbit.yaml before the first run:APPROVED review on the registered SHA and no unresolved threads started by that bot. A comment or an earlier-SHA approval does not pass.CodeRabbit may show advisory warnings, such as a generic PR title, even after approval. Inspect those warnings in CodeRabbit before merging; Millwork does not parse their text into the decision packet.For a private repository, confirm the connected GitHub person has a CodeRabbit seat and that CodeRabbit is enabled on this repository. If CodeRabbit does not start, inspect its repository configuration and plan limits; a bot-posted review command is not proof of an automatic review.Deploy an async_job_v1 agent endpoint. Copy the maintained server.mjs adapter from its setup page; that page also covers the protocol, stable retry identity, non-force push, cancellation and restart behavior. Generate a random token of at least 32 characters and configure it as REVIEW_ADAPTER_TOKEN on the adapter host. Keep it in your secret manager. The endpoint must answer authenticated HEAD with 200 and accept POST start, status and cancel at the same HTTPS URL.If you supply another async_job_v1 adapter, persist the job identity before starting work. Return job not found for a stable attempt key only if no start was ever accepted for that key. After acceptance, status must find that same job across process restarts, including a terminal failure. Millwork can safely reissue start with the original key only on an explicit job not found response.Register this endpoint through the dedicated route. It checks that the named repository is already connected and sets the private grant and protocol fields for you:POST /v1/review-composer/agents with your Millwork organization key. It returns an arm_id (your agent ID) with status: "degraded" until the token is privately connected. The TypeScript SDK exposes solver.reviewComposerAgents.create(body, { idempotencyKey }).Start the private handoff with POST /v1/review-composer/agents/{arm_id}/connection/intents and {"stop_choice":{"kind":"preset_days","days":90}}, or call solver.reviewComposerAgents.createConnectionIntent(armId, { kind: "preset_days", days: 90 }). Open its continue_url in a signed-in browser. Enter the same token you set on the adapter host. The link expires after 15 minutes and can be used once. The token goes to Millwork’s separate agent custody; it is never part of agent registration, run submission, or the receipt.After saving the token, call GET /v1/review-composer/agents/{arm_id}/connection. Copy pending_key.handle and pending_key.captured_generation into POST /v1/review-composer/agents/{arm_id}/connection/test. The test sends an authenticated HEAD to your registered endpoint. Your agent becomes ready only when the endpoint returns 200. In the SDK, use connection(armId) and testConnection(armId, pending_key). You can also inspect, replace, or revoke the token through these connection routes; a revoked or expired token cannot authorize another run. Keep the agent ID once status is ready.3
Choose the GitHub rule
Choose one or more required GitHub Actions jobs by workflow ID and job name, not by a loose check label. In an authenticated GitHub CLI session, list workflow IDs with Use
gh api repos/team/repo/actions/workflows --jq '.workflows[] | [.id, .name]'. Open a successful run and copy the job name exactly. Millwork examines all current attempts for the selected workflow and final SHA; a pending rerun or failed job cannot inherit an earlier pass.Get the current full base commit SHA just before submission. For main:refs/heads/main as base_ref and that 40-character value as base_sha. If the base changes before acceptance, refresh it and create a new request identity. A normal merge that moves the base forward during a run is checked for ancestry; a rewrite cannot silently pass.4
Start one run
The default first-use policy asks for both CodeRabbit and one named GitHub job. Replace the repository, base SHA, arm ID, workflow ID and job name with your verified values. Send this body to
all means both must pass. on_eval: ["gate"] keeps the action tied to the registered SHA. Set a runtime deadline and a max_cost_usd budget of at least the configured Review Composer fee (default $0.10). The maintained adapter cannot measure or cap the Codex CLI’s separate provider bill; set any provider spending limit in that account. The provider bill is on top of the Millwork fee. Review GitHub and CodeRabbit plan usage before starting.POST /v1/executions with an Idempotency-Key you keep with the request. If the response is uncertain, retry the exact same body and key; do not start another run just to recover the first. In TypeScript, use solver.executions.create(body, { idempotencyKey }). The current public execution MCP does not yet support this option; use REST or the TypeScript SDK for this run.5
Inspect the packet and run again
Poll Act on
GET /v1/executions/{execution_id} until the run is terminal. Read decision_packet there and in the receipt export. This example shows a GitHub job that passed while CodeRabbit approval remained unavailable; actual evidence references and reasons come from your run:decision_packet.verdict and decision_packet.action, not the execution’s lifecycle status: completed can mean observation ended with review needed. Read each source even if the aggregate passed under any. If the result is block or no_verdict, inspect the source reason, PR and current SHA. Resolve comments, repair CI, or correct permissions as appropriate. A repaired commit must receive fresh checks and review before it can pass. A cancelled, timed-out, or failed review job gives no_verdict rather than approval. agent_usage_usd: 0 means the adapter did not report provider usage; check the provider account for its bill. For the next task, reuse the verified connection, registered agent, and policy shape; choose a fresh base SHA and new request key.