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 Settings → Integrations. Under Connected repositories, select Add repositories. GitHub opens the Millwork GitHub App page. Choose the personal account or GitHub organization that owns the repository. Choose Only select repositories and pick the repositories Millwork needs. Select Install, or Save if the App is already installed. GitHub may ask you to authorize Millwork for your GitHub account, then returns you to Millwork.Millwork shows Repositories updated and updates the connected repository list. Every repository you selected and can push to shows Connected under your GitHub account. A repository you removed from the App’s access leaves the list. Millwork never asks you for a repository name.The other results tell you what to do next:
- Waiting for approval: a GitHub organization owner needs to approve the Millwork GitHub App. After they approve, select Add repositories again and finish on GitHub. Your repositories appear once Millwork confirms your access.
- No repository to connect: GitHub granted no repository you can push to. Select Add repositories and include one you can write to.
- GitHub did not confirm the change: select Add repositories again.
- App access missing on a row: the repository was removed from the App on GitHub. Select Add repositories to grant it again.
- App status unavailable on a row: Millwork could not reach GitHub to check it. Select Sync repositories to check again.
owner/repo shown under Connected repositories for later requests. If a row shows Reconnect required, open that row’s menu and select Reconnect on GitHub 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 account 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.In Settings → Integrations, select Register agent under Coding agents to register this endpoint. Select Enter key and save the key on the private page. Return to Integrations and select Check for entered key if offered. When the row says Key ready to test, open its row menu and select Test and connect. The dashboard never asks for the token in the registration form. The equivalent dedicated API route 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 connected repository, registered agent, and policy shape; choose a fresh base SHA and new request key.