diff --git a/examples/adversarial-implementation/README.md b/examples/adversarial-implementation/README.md
index 45e42c201..b17609066 100644
--- a/examples/adversarial-implementation/README.md
+++ b/examples/adversarial-implementation/README.md
@@ -305,6 +305,19 @@ Independent review summaries allow 1500 characters; detailed observations belong
in `findings`. The request states this bound alongside the exact revision and
clause IDs. Ordinary phase and API-foundation summaries retain their own bounds.
+A joined reply containing only `{"status":"in_progress"}` gets one completion
+turn in the same native conversation, with the same reviewer, resolved model,
+effort and exact source revision. The workflow saves the original reply, checks
+that the checkout is clean and reserves `completion/` before sending a prompt
+with a five-minute deadline. A second progress reply, unavailable conversation,
+failed turn or changed source holds the review. Unmarked prose and malformed
+verdicts do not authorize a completion turn. Status and reconciliation read the
+saved evidence without prompting; a later invocation never starts an unused or
+interrupted completion turn.
+
+The completion turn has its own allowance. If it returns a review whose only
+defect is summary length, the original formatting allowance still applies.
+
An otherwise-valid joined review with only an oversized summary can consume the
work item's recorded `maxResponseCorrections` allowance. Each correction stays
in the selected reviewer conversation with the same resolved model and effort.
@@ -322,7 +335,7 @@ Use `--props-action reconcile` when the selected joined review has a saved
execution but no accepted receipt. Only the selection's attempt qualifies: the
original reviewer, or Astra after a retained transition from an eligible Fable
failure. It checks that attempt's assignment, joined execution, unchanged raw
-reply, current schema, clauses and source before creating the missing receipt,
+reply, any saved completion, current schema, clauses and source before creating the missing receipt,
and saves a raw reply the execution joined but never wrote. It never shortens text, changes a verdict, repeats
a model call or overwrites a contradictory receipt. Missing or uncertain execution
continues to hold. Status uses this same validation boundary to read receipts.
diff --git a/examples/adversarial-implementation/components/Delivery/Finish.md b/examples/adversarial-implementation/components/Delivery/Finish.md
new file mode 100644
index 000000000..8e0c43404
--- /dev/null
+++ b/examples/adversarial-implementation/components/Delivery/Finish.md
@@ -0,0 +1,58 @@
+---
+description: 'Finish an incomplete review once in its original conversation, or read that saved turn. Use .'
+props:
+ type: object
+ properties:
+ delivery: {type: object}
+ revision: {type: string, pattern: '^[0-9a-f]{40}$'}
+ reviewer: {type: object}
+ catalog: {type: object}
+ attempt: {type: string, pattern: '^/'}
+ dispatch: {type: boolean}
+ required: [delivery, revision, reviewer, catalog, attempt, dispatch]
+ additionalProperties: false
+returns: {type: string}
+---
+
+The initial turn has returned an explicit progress reply. Reserve the one
+completion turn before prompting. Its reply and source evidence stay separate
+from the first turn and any later summary corrections.
+
+
+
+
+
+
+
+
+
+
+```bash exec as="reserved"
+mkdir -- {quoted}
+```
+
+
+
+Continue your unfinished independent review of {props.revision} from this conversation. Finish only the checks still needed. Keep source unchanged, run checks in the foreground and join them before returning. Return the final verdict for the original acceptance clauses as one JSON object. If you cannot finish, report the concrete blocker in the verdict. This is the only completion turn.
+
+
+
+
+{turn.reply}
+
+
+
+
+{savedRequest}
+
+
+{savedOutcome}
+
+
+
+
+{beforeText}
+{afterText}
+{reply}
+
+
diff --git a/examples/adversarial-implementation/components/Delivery/Reconcile.md b/examples/adversarial-implementation/components/Delivery/Reconcile.md
index 6085becbf..bf5daaf8a 100644
--- a/examples/adversarial-implementation/components/Delivery/Reconcile.md
+++ b/examples/adversarial-implementation/components/Delivery/Reconcile.md
@@ -14,7 +14,8 @@ returns: {type: object}
Only the retained selection's attempt can supply the receipt: the original
reviewer, or its replacement after a retained transition from an eligible
failure. A joined reply that was never saved as `raw.txt` is completed from the
-attempt's retained outcome.
+attempt's retained outcome. If it was a progress reply, only the saved
+completion turn can supply the review.
diff --git a/examples/adversarial-implementation/components/Delivery/Response.md b/examples/adversarial-implementation/components/Delivery/Response.md
index 9b047f127..62fae6f89 100644
--- a/examples/adversarial-implementation/components/Delivery/Response.md
+++ b/examples/adversarial-implementation/components/Delivery/Response.md
@@ -1,5 +1,5 @@
---
-description: 'Shorten only an oversized independent-review summary, or validate its saved correction chain without prompting. Use .'
+description: 'Finish a review after an explicit progress reply, repair an oversized summary, or validate the saved replies without prompting. Use .'
props:
type: object
properties:
@@ -14,32 +14,39 @@ props:
returns: {type: object}
---
-The original review stays unchanged. Each extra call belongs to the same
-reviewer, model and native conversation, and consumes the recorded response
-allowance before dispatch. Reconciliation reads that chain and sends no prompt.
+A progress reply can use one separate completion turn. Formatting corrections
+start with the completed review and consume only the recorded formatting
+allowance. Reconciliation reads both records and sends no prompt.
{assignmentText}
3 || limit !== (props.delivery.maxResponseCorrections ?? 0)}>
-
+
+{outcomeText}
+
+
+
+
+{props.raw}
+
+
+
+
+
-
+
-
-{outcomeText}
-
-
= limit}>
[key,key === "summary" ? value : {const:original[key]}]))}} />
-
+
64000}>
diff --git a/examples/adversarial-implementation/components/Delivery/Review.md b/examples/adversarial-implementation/components/Delivery/Review.md
index 330830114..daae17bd9 100644
--- a/examples/adversarial-implementation/components/Delivery/Review.md
+++ b/examples/adversarial-implementation/components/Delivery/Review.md
@@ -44,7 +44,19 @@ mkdir -- {quotedReplacement}
-
+
+
+
+
+
+
+
+{raw}
+
+
+
+
+
diff --git a/examples/adversarial-implementation/components/Delivery/Role.md b/examples/adversarial-implementation/components/Delivery/Role.md
index 2449ca3ee..52cb79ed8 100644
--- a/examples/adversarial-implementation/components/Delivery/Role.md
+++ b/examples/adversarial-implementation/components/Delivery/Role.md
@@ -31,7 +31,9 @@ Original captured source text:
Keep summary within {schemas.review.properties.summary.maxLength} characters, including spaces and newlines. Put detailed observations in findings; do not compress the whole report into summary. Check revision against the assigned full SHA and acceptance against the recorded clause IDs before returning.
-Return exactly one JSON object satisfying this schema. acceptance lists every clause ID actually examined. pass requires no blocking finding. The workflow supplies work, reviewer, attempt and completion metadata.
+If you must end the turn before the verdict is ready, return exactly {JSON.stringify(schemas.progress.const)} on its own. The workflow can then give this same conversation one chance to finish.
+
+Otherwise, return exactly one JSON object satisfying this schema. acceptance lists every clause ID actually examined. pass requires no blocking finding. The workflow supplies work, reviewer, attempt and completion metadata.
64000}>
diff --git a/examples/adversarial-implementation/components/Delivery/Schema.md b/examples/adversarial-implementation/components/Delivery/Schema.md
index bcfe715ac..009d4438c 100644
--- a/examples/adversarial-implementation/components/Delivery/Schema.md
+++ b/examples/adversarial-implementation/components/Delivery/Schema.md
@@ -5,4 +5,4 @@ returns: {type: object}
-
+
diff --git a/examples/adversarial-implementation/components/Delivery/records.ts b/examples/adversarial-implementation/components/Delivery/records.ts
index 2607137da..fe7a3eccc 100644
--- a/examples/adversarial-implementation/components/Delivery/records.ts
+++ b/examples/adversarial-implementation/components/Delivery/records.ts
@@ -99,7 +99,7 @@ export const holdSchema = z.strictObject({
schema: z.literal("delivery-review-hold.v1"),
work: z.string().min(1),
revision: z.string().regex(/^[0-9a-f]{40}$/),
- chain: z.enum(["fable-astra", "astra-final"]),
+ chain: selectionSchema.shape.chain,
summary: z.string().min(1),
unknown: z.string().min(1),
attempts: z.array(attemptSchema).min(1).max(2),
diff --git a/examples/adversarial-implementation/delivery.md b/examples/adversarial-implementation/delivery.md
index 1637a3133..ea366dadc 100644
--- a/examples/adversarial-implementation/delivery.md
+++ b/examples/adversarial-implementation/delivery.md
@@ -10,9 +10,10 @@ props:
---
Read the original delivery record and perform only its computed next action.
-A status read starts no agent. Review preserves every attempt and never repeats
-one: an unavailable Fable reviewer is replaced once by Codex Astra, and a review
-nobody could complete is held and asked about. Readiness permits no merge.
+A status read starts no agent. An explicit progress reply gets one continuation
+in the same conversation. An unavailable Fable reviewer is replaced once by
+Codex Astra. The workflow preserves each attempt and asks about a review it
+cannot complete. Readiness permits no merge.
{recordText}
diff --git a/examples/adversarial-implementation/tests/Delivery.test.md b/examples/adversarial-implementation/tests/Delivery.test.md
index ae994a1cc..fc8a5ca04 100644
--- a/examples/adversarial-implementation/tests/Delivery.test.md
+++ b/examples/adversarial-implementation/tests/Delivery.test.md
@@ -230,3 +230,63 @@ git rev-parse HEAD
+
+
+
+
+
+
+```bash exec as="head"
+git rev-parse HEAD
+```
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ question.held)} expected={[true]} />
+
+
+
+
+
+{raw}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/examples/adversarial-implementation/tests/agents/review-completion.md b/examples/adversarial-implementation/tests/agents/review-completion.md
new file mode 100644
index 000000000..27f21af9c
--- /dev/null
+++ b/examples/adversarial-implementation/tests/agents/review-completion.md
@@ -0,0 +1,27 @@
+
+{initial.text}
+
+
+The checks are still running.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+{text}
+
+
+
diff --git a/examples/adversarial-implementation/tests/components/Delivery/Role.md b/examples/adversarial-implementation/tests/components/Delivery/Role.md
index 841597a75..e2d17bf88 100644
--- a/examples/adversarial-implementation/tests/components/Delivery/Role.md
+++ b/examples/adversarial-implementation/tests/components/Delivery/Role.md
@@ -9,6 +9,11 @@ props: {type: object, properties: {delivery: {type: object}, revision: {type: st
clause.id),findings:["repair","false-pass"].includes(work) ? [{blocking:true,description:"A blocking regression remains."}] : []}} />
+
+
+{raw}
+
+
@@ -20,3 +25,5 @@ props: {type: object, properties: {delivery: {type: object}, revision: {type: st
+
+
diff --git a/specs/acp-client-spec.md b/specs/acp-client-spec.md
index aa6d7ff44..4d367b9f5 100644
--- a/specs/acp-client-spec.md
+++ b/specs/acp-client-spec.md
@@ -734,9 +734,10 @@ until one is installed as a root provider or by AgentProvider.
The CLI registers `claude-workflow-role` alongside ordinary `acpx`. The
adversarial workflow selects this provider only around Claude role calls,
-including foundation, document preparation, independent review and response-only
-correction. It uses the same carried adapter, session store and host identity
-coordination as ordinary calls. Interactive Sidekick configuration is unchanged.
+including foundation, document preparation, independent review and its completion
+and response-only correction turns. It uses the same carried adapter, session
+store and host identity coordination as ordinary calls. Interactive Sidekick
+configuration is unchanged.
The profile sets `CLAUDE_CODE_DISABLE_BACKGROUND_TASKS=1` in the child session
environment and supplies `disallowedTools: ["ScheduleWakeup"]` through ACPX to