ace-assign 0.71.0 → 0.73.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (195) hide show
  1. checksums.yaml +4 -4
  2. data/.ace-defaults/assign/catalog/steps/auto-merge.step.yml +8 -8
  3. data/.ace-defaults/assign/catalog/steps/create-pr.step.yml +1 -1
  4. data/.ace-defaults/assign/catalog/steps/mark-pr-ready.step.yml +1 -1
  5. data/.ace-defaults/assign/config.yml +0 -13
  6. data/.ace-defaults/assign/presets/fix-bug.yml +1 -1
  7. data/.ace-defaults/assign/presets/work-on-task-ace-development.yml +1 -1
  8. data/.ace-defaults/assign/presets/work-on-task-auto-merge.yml +1 -1
  9. data/.ace-defaults/assign/presets/work-on-task.yml +1 -1
  10. data/CHANGELOG.md +3 -2119
  11. data/README.md +58 -31
  12. data/docs/exit-codes.md +36 -44
  13. data/docs/getting-started.md +9 -4
  14. data/docs/usage.md +129 -522
  15. data/handbook/skills/as-assign-drive/SKILL.md +1 -4
  16. data/handbook/workflow-instructions/assign/drive.wf.md +47 -195
  17. data/handbook/workflow-instructions/assign/prepare.wf.md +1 -1
  18. data/handbook/workflow-instructions/assign/verify-test-suite.wf.md +8 -2
  19. data/lib/ace/assign/cli/commands/assignment_target.rb +2 -15
  20. data/lib/ace/assign/cli/commands/create.rb +1 -8
  21. data/lib/ace/assign/cli/commands/fail.rb +0 -6
  22. data/lib/ace/assign/cli/commands/finish.rb +2 -23
  23. data/lib/ace/assign/cli/commands/fork_session.rb +0 -1
  24. data/lib/ace/assign/cli/commands/select.rb +0 -1
  25. data/lib/ace/assign/cli/commands/start.rb +0 -2
  26. data/lib/ace/assign/cli/commands/status.rb +1 -31
  27. data/lib/ace/assign/cli/commands/step.rb +1 -3
  28. data/lib/ace/assign/cli.rb +1 -85
  29. data/lib/ace/assign/errors.rb +8 -80
  30. data/lib/ace/assign/models/assignment.rb +5 -28
  31. data/lib/ace/assign/molecules/assignment_manager.rb +0 -26
  32. data/lib/ace/assign/molecules/fork_session_launcher.rb +4 -12
  33. data/lib/ace/assign/molecules/lifecycle_exclusion.rb +15 -112
  34. data/lib/ace/assign/organisms/assignment_executor.rb +0 -6
  35. data/lib/ace/assign/organisms/task_assignment_creator.rb +3 -8
  36. data/lib/ace/assign/version.rb +1 -1
  37. data/lib/ace/assign.rb +0 -6
  38. metadata +4 -176
  39. data/.ace-defaults/assign/presets/close-delivery.yml +0 -57
  40. data/.ace-defaults/assign/presets/deliver-release.yml +0 -60
  41. data/.ace-defaults/assign/presets/integrate-batch.yml +0 -72
  42. data/.ace-defaults/assign/presets/supervise-delivery.yml +0 -69
  43. data/docs/protected-authority.md +0 -282
  44. data/exe/ace-scope-ready +0 -55
  45. data/lib/ace/assign/atoms/assignment_scope.rb +0 -58
  46. data/lib/ace/assign/atoms/attempt_state_machine.rb +0 -84
  47. data/lib/ace/assign/atoms/candidate_limits.rb +0 -20
  48. data/lib/ace/assign/atoms/delivery_parameters.rb +0 -19
  49. data/lib/ace/assign/atoms/evidence_digest.rb +0 -78
  50. data/lib/ace/assign/atoms/fixed_merge_schemas.rb +0 -398
  51. data/lib/ace/assign/atoms/git_blob_batch.rb +0 -59
  52. data/lib/ace/assign/authority/assignment_definition.rb +0 -35
  53. data/lib/ace/assign/authority/assignment_inventory.rb +0 -290
  54. data/lib/ace/assign/authority/campaign_consumer_policy.rb +0 -100
  55. data/lib/ace/assign/authority/campaign_execution.rb +0 -119
  56. data/lib/ace/assign/authority/campaign_round_transfer.rb +0 -82
  57. data/lib/ace/assign/authority/candidate_blob_batch.rb +0 -55
  58. data/lib/ace/assign/authority/candidate_head_comparison.rb +0 -139
  59. data/lib/ace/assign/authority/candidate_transfer.rb +0 -357
  60. data/lib/ace/assign/authority/cleanup_result_protection.rb +0 -53
  61. data/lib/ace/assign/authority/client.rb +0 -257
  62. data/lib/ace/assign/authority/command_execution.rb +0 -180
  63. data/lib/ace/assign/authority/deployment.rb +0 -627
  64. data/lib/ace/assign/authority/deployment_history.rb +0 -146
  65. data/lib/ace/assign/authority/endcap.rb +0 -457
  66. data/lib/ace/assign/authority/endcap_attempts.rb +0 -274
  67. data/lib/ace/assign/authority/endcap_campaign_results.rb +0 -232
  68. data/lib/ace/assign/authority/endcap_campaign_rounds.rb +0 -266
  69. data/lib/ace/assign/authority/endcap_contexts.rb +0 -23
  70. data/lib/ace/assign/authority/endcap_inboxes.rb +0 -37
  71. data/lib/ace/assign/authority/endcap_prepared_work.rb +0 -80
  72. data/lib/ace/assign/authority/endcap_publication.rb +0 -41
  73. data/lib/ace/assign/authority/endcap_results.rb +0 -398
  74. data/lib/ace/assign/authority/endcap_review_requests.rb +0 -183
  75. data/lib/ace/assign/authority/endcap_reviews.rb +0 -130
  76. data/lib/ace/assign/authority/endcap_service_context.rb +0 -38
  77. data/lib/ace/assign/authority/endcap_service_settlement.rb +0 -152
  78. data/lib/ace/assign/authority/evidence_transfer.rb +0 -67
  79. data/lib/ace/assign/authority/execution_scope_observation.rb +0 -903
  80. data/lib/ace/assign/authority/fixed_publication_lifecycle.rb +0 -176
  81. data/lib/ace/assign/authority/fixed_service_lifecycle.rb +0 -594
  82. data/lib/ace/assign/authority/inbox_context_original.rb +0 -113
  83. data/lib/ace/assign/authority/launch_attempt_consumers.rb +0 -51
  84. data/lib/ace/assign/authority/launch_campaign_registration.rb +0 -214
  85. data/lib/ace/assign/authority/launch_control_channel.rb +0 -313
  86. data/lib/ace/assign/authority/launch_control_exclusions.rb +0 -127
  87. data/lib/ace/assign/authority/launch_driver.rb +0 -393
  88. data/lib/ace/assign/authority/launch_input_inhibition.rb +0 -132
  89. data/lib/ace/assign/authority/launch_lifecycle.rb +0 -997
  90. data/lib/ace/assign/authority/launch_prepared_work.rb +0 -122
  91. data/lib/ace/assign/authority/launch_review.rb +0 -91
  92. data/lib/ace/assign/authority/launch_scope_abort.rb +0 -81
  93. data/lib/ace/assign/authority/launch_scope_admission.rb +0 -215
  94. data/lib/ace/assign/authority/launch_scope_close.rb +0 -146
  95. data/lib/ace/assign/authority/launch_scope_parent.rb +0 -44
  96. data/lib/ace/assign/authority/launch_scope_release.rb +0 -859
  97. data/lib/ace/assign/authority/launch_steering.rb +0 -353
  98. data/lib/ace/assign/authority/launch_stop.rb +0 -254
  99. data/lib/ace/assign/authority/maintenance_workspace_retirement.rb +0 -229
  100. data/lib/ace/assign/authority/ordinary_attempt_start.rb +0 -137
  101. data/lib/ace/assign/authority/ordinary_client.rb +0 -70
  102. data/lib/ace/assign/authority/ordinary_completion.rb +0 -104
  103. data/lib/ace/assign/authority/ordinary_effect_settlement.rb +0 -118
  104. data/lib/ace/assign/authority/ordinary_lifecycle.rb +0 -227
  105. data/lib/ace/assign/authority/ordinary_merge_evidence.rb +0 -81
  106. data/lib/ace/assign/authority/ordinary_peer.rb +0 -54
  107. data/lib/ace/assign/authority/ordinary_progress.rb +0 -162
  108. data/lib/ace/assign/authority/ordinary_queue.rb +0 -115
  109. data/lib/ace/assign/authority/ordinary_release_artifacts.rb +0 -143
  110. data/lib/ace/assign/authority/ordinary_results.rb +0 -206
  111. data/lib/ace/assign/authority/ordinary_review_evidence.rb +0 -180
  112. data/lib/ace/assign/authority/ordinary_reviews.rb +0 -214
  113. data/lib/ace/assign/authority/ordinary_server.rb +0 -75
  114. data/lib/ace/assign/authority/ordinary_supervisor.rb +0 -99
  115. data/lib/ace/assign/authority/original_inbox_selection.rb +0 -41
  116. data/lib/ace/assign/authority/posix_acl.rb +0 -59
  117. data/lib/ace/assign/authority/prepared_input.rb +0 -130
  118. data/lib/ace/assign/authority/prepared_queue.rb +0 -185
  119. data/lib/ace/assign/authority/prepared_task_context.rb +0 -116
  120. data/lib/ace/assign/authority/prepared_work.rb +0 -309
  121. data/lib/ace/assign/authority/prepared_worker.rb +0 -69
  122. data/lib/ace/assign/authority/private_directory.rb +0 -33
  123. data/lib/ace/assign/authority/protected_assignment_context.rb +0 -226
  124. data/lib/ace/assign/authority/readiness_hook.rb +0 -120
  125. data/lib/ace/assign/authority/receipt_transfer.rb +0 -48
  126. data/lib/ace/assign/authority/release_artifact_manifest.rb +0 -91
  127. data/lib/ace/assign/authority/retained_input.rb +0 -53
  128. data/lib/ace/assign/authority/router.rb +0 -81
  129. data/lib/ace/assign/authority/server.rb +0 -131
  130. data/lib/ace/assign/authority/service_cleanup_dispatch.rb +0 -88
  131. data/lib/ace/assign/authority/service_cleanup_evidence.rb +0 -180
  132. data/lib/ace/assign/authority/service_delivery_evidence.rb +0 -101
  133. data/lib/ace/assign/authority/service_evidence.rb +0 -286
  134. data/lib/ace/assign/authority/service_publication_evidence.rb +0 -110
  135. data/lib/ace/assign/authority/socket_server.rb +0 -255
  136. data/lib/ace/assign/authority/task_context_entry.rb +0 -32
  137. data/lib/ace/assign/authority/transfer_codec.rb +0 -189
  138. data/lib/ace/assign/cli/commands/attempt/base.rb +0 -84
  139. data/lib/ace/assign/cli/commands/attempt/evidence.rb +0 -28
  140. data/lib/ace/assign/cli/commands/attempt/finish.rb +0 -51
  141. data/lib/ace/assign/cli/commands/attempt/reconcile.rb +0 -49
  142. data/lib/ace/assign/cli/commands/attempt/start.rb +0 -45
  143. data/lib/ace/assign/cli/commands/attempt/status.rb +0 -54
  144. data/lib/ace/assign/cli/commands/authority/inbox_context_principal.rb +0 -25
  145. data/lib/ace/assign/cli/commands/authority/inbox_context_selection.rb +0 -28
  146. data/lib/ace/assign/cli/commands/authority/launch.rb +0 -97
  147. data/lib/ace/assign/cli/commands/authority/serve.rb +0 -31
  148. data/lib/ace/assign/cli/commands/authority/status.rb +0 -26
  149. data/lib/ace/assign/cli/commands/authority/task_context.rb +0 -31
  150. data/lib/ace/assign/cli/commands/authority/task_context_principal.rb +0 -25
  151. data/lib/ace/assign/cli/commands/authority/task_context_selection.rb +0 -30
  152. data/lib/ace/assign/cli/commands/authority/terminate.rb +0 -29
  153. data/lib/ace/assign/cli/commands/authority/worker.rb +0 -23
  154. data/lib/ace/assign/cli/commands/campaign_export_result.rb +0 -55
  155. data/lib/ace/assign/cli/commands/campaign_record_round.rb +0 -57
  156. data/lib/ace/assign/cli/commands/delivery.rb +0 -107
  157. data/lib/ace/assign/cli/commands/inbox_bind.rb +0 -34
  158. data/lib/ace/assign/cli/commands/protected_submission.rb +0 -61
  159. data/lib/ace/assign/cli/commands/resume.rb +0 -38
  160. data/lib/ace/assign/cli/commands/submit_candidate.rb +0 -34
  161. data/lib/ace/assign/cli/commands/submit_result.rb +0 -61
  162. data/lib/ace/assign/models/attempt.rb +0 -178
  163. data/lib/ace/assign/models/attempt_binding.rb +0 -116
  164. data/lib/ace/assign/models/evidence_event.rb +0 -86
  165. data/lib/ace/assign/models/execution_receipt.rb +0 -139
  166. data/lib/ace/assign/molecules/attempt_reconciler.rb +0 -127
  167. data/lib/ace/assign/molecules/attempt_store.rb +0 -201
  168. data/lib/ace/assign/molecules/canonical_attempt_state.rb +0 -151
  169. data/lib/ace/assign/molecules/canonical_evidence.rb +0 -170
  170. data/lib/ace/assign/molecules/canonical_read_commands.rb +0 -84
  171. data/lib/ace/assign/molecules/canonical_read_snapshot.rb +0 -313
  172. data/lib/ace/assign/molecules/evidence_calculator.rb +0 -237
  173. data/lib/ace/assign/molecules/evidence_journal.rb +0 -1899
  174. data/lib/ace/assign/molecules/execution_identity_resolver.rb +0 -137
  175. data/lib/ace/assign/molecules/execution_scope_lineage.rb +0 -345
  176. data/lib/ace/assign/molecules/fixed_effect_reference.rb +0 -31
  177. data/lib/ace/assign/molecules/installed_journal_read.rb +0 -143
  178. data/lib/ace/assign/molecules/journal_input_inhibition.rb +0 -78
  179. data/lib/ace/assign/molecules/journal_mutation.rb +0 -274
  180. data/lib/ace/assign/molecules/journal_prompt_mutation.rb +0 -241
  181. data/lib/ace/assign/molecules/ordinary_merge_cli.rb +0 -68
  182. data/lib/ace/assign/molecules/ordinary_merge_contract.rb +0 -410
  183. data/lib/ace/assign/molecules/original_launch_binding.rb +0 -37
  184. data/lib/ace/assign/molecules/proposal_journal.rb +0 -179
  185. data/lib/ace/assign/molecules/protected_control_exclusion.rb +0 -303
  186. data/lib/ace/assign/molecules/protected_workspace_exclusion.rb +0 -330
  187. data/lib/ace/assign/molecules/protected_workspace_provisioner.rb +0 -164
  188. data/lib/ace/assign/molecules/receipt_verifier.rb +0 -320
  189. data/lib/ace/assign/molecules/terminal_scope_receipt.rb +0 -88
  190. data/lib/ace/assign/organisms/attempt_coordinator.rb +0 -1374
  191. data/lib/ace/assign/organisms/delivery_coordinator.rb +0 -342
  192. data/lib/ace/assign/organisms/ordinary_driver.rb +0 -310
  193. data/lib/ace/assign/organisms/ordinary_merge_consumer.rb +0 -365
  194. data/lib/ace/assign/organisms/prepared_work_builder.rb +0 -194
  195. data/lib/ace/assign/organisms/protected_delivery_coordinator.rb +0 -100
data/docs/usage.md CHANGED
@@ -1,613 +1,220 @@
1
1
  ---
2
2
  doc-type: user
3
3
  title: ace-assign Usage Guide
4
- purpose: Complete command reference for ace-assign queue orchestration, hierarchy,
5
- and fork execution.
4
+ purpose: Command reference for local assignment plans, hierarchy, and fork execution.
6
5
  ace-docs:
7
- last-updated: '2026-04-23'
8
- last-checked: '2026-04-23'
6
+ last-updated: 2026-10-17
7
+ last-checked: 2026-10-17
9
8
  ---
10
9
 
11
10
  # ace-assign Usage Guide
12
11
 
13
- `ace-assign` manages assignment queues with explicit step states and optional hierarchy.
12
+ > **State owner:** `.ace-local/assign/` -- assignment plans and step state owned
13
+ > by `ace-assign`. There is no second queue; steps are never copied into the
14
+ > private overseer list or coworker configuration. See
15
+ > [docs/lab-flow.md](../../docs/lab-flow.md).
14
16
 
15
- ## Command Integrity
17
+ ## Testing contract
16
18
 
17
- When documenting or automating `ace-*` flows, prefer direct commands and explicit report files.
19
+ - `bin/ace-test ace-assign` - default deterministic package loop (`test/fast`)
20
+ - `bin/ace-test ace-assign feat` - deterministic feature/contract coverage
21
+ - `bin/ace-test ace-assign all` - full package deterministic coverage
22
+ - `bin/ace-test-e2e ace-assign` - scenario workflows under `test/e2e`
18
23
 
19
- Recommended:
24
+ ## Core lifecycle
20
25
 
26
+ An assignment is a numbered plan stored under `.ace-local/assign/`. Step state
27
+ moves `pending` → `in_progress` → `done` or `failed`. Commands without
28
+ `--assignment` act on the selected (active) assignment.
21
29
 
22
30
  ```bash
23
- ace-assign finish --message report.md
24
- ```
25
-
26
- ## Testing Contract
27
-
28
- Use package-scoped test commands with explicit layers:
29
-
30
- ```bash
31
- ace-test ace-assign
32
- ace-test ace-assign feat
33
- ace-test ace-assign all
34
- ace-test-e2e ace-assign
35
- ```
36
-
37
- For assignment verification, `verify-test-suite` is the standard gate:
38
-
39
- ```bash
40
- ace-test <package> all --profile 6
41
- ace-test-suite --target all
42
- ```
43
-
44
- ## Core Lifecycle
45
-
46
-
47
- ```bash
48
- ace-assign create --yaml job.yaml
31
+ ace-assign create --task abc123 --preset work-on-task
32
+ ace-assign list
49
33
  ace-assign status
50
- ace-assign start
51
34
  ace-assign step
52
- ace-assign finish --message step-010.md
53
- ace-assign status
54
- ```
55
-
56
- Use scoped targeting when needed:
57
-
58
-
59
- ```bash
60
- ace-assign status --assignment abc123@010.01
61
- ace-assign start --assignment abc123@010.01
62
- ace-assign finish --message done.md --assignment abc123@010.01
35
+ ace-assign start
36
+ ace-assign finish --message report.md
63
37
  ```
64
38
 
65
- ## Hierarchical Steps
66
-
67
- ### Numbering
68
-
69
- - Top-level: `010`, `020`, `030`
70
- - Child: `010.01`, `010.02`
71
- - Grandchild: `010.01.01`
72
-
73
- ### Rules
74
-
75
- - Parents auto-complete when all descendants are done.
76
- - Queue traversal works deepest actionable step first.
77
- - Inserted siblings can renumber later siblings (and descendants).
78
-
79
- Create child/sibling steps:
80
-
81
-
82
- ```bash
83
- ace-assign add --step update-docs --after 020
84
- ace-assign add --step review-pr --after 100 --child
85
- ace-assign add --yaml .ace-local/assign/jobs/add-task.yml --after 010 --child
86
- ```
39
+ `finish` accepts report content as a string, a file path, or stdin. Without
40
+ report content it fails instead of completing the step silently.
87
41
 
88
- ## Attempt Evidence
42
+ ## Hierarchical steps
89
43
 
90
- Execution evidence lives in assignment attempts, not in reports. An attempt binds an immutable ID to an assignment, step/subtree scope, project, boundary-derived actor/role/runtime, source task, and `base_head`; the deliverable `candidate_head` is pinned only when accepted evidence is submitted, and the evidence journal commit is tracked separately from both.
44
+ Steps are numbered `010`, `020`, `100`, and children use dots:
45
+ `010.01`, `010.01.01`.
91
46
 
92
- ### Ordinary local attempt lifecycle
47
+ - A parent completes only when all of its children are done.
48
+ - Traversal prioritizes pending children before siblings.
49
+ - Inserting siblings in an occupied range renumbers the following steps.
50
+ - `--child` inserts a step as a child of `--after`.
93
51
 
94
- Lifecycle exclusion uses the selected repository's actual Git common directory, shared by linked worktrees. `CACHE_BASE` changes assignment cache storage but cannot split creator and prune locks into a separate namespace. A missing Git repository or malformed retained removal fence refuses admission; it does not create a fallback lock root.
52
+ ## Commands
95
53
 
96
- ```bash
97
- ace-assign attempt start --assignment ASSIGNMENT --step STEP --project PROJECT
98
- ace-assign attempt status --assignment ASSIGNMENT --format json
99
- ace-assign attempt finish --attempt ATTEMPT --receipt receipt.json
100
- ace-assign attempt reconcile --attempt ATTEMPT --receipt receipt.json
101
- ```
54
+ ### `ace-assign create`
102
55
 
103
- - `attempt start` returns a JSON projection of the attempt (ID, state, binding facts, evidence references, digests). A repeated identical start returns the same attempt; a conflicting start exits 5 without launching a second writer.
104
- - `attempt status` exposes only state, binding, references, and digests -- never credentials or receipt bytes.
105
- - `attempt finish` accepts a structured receipt: operation, attributed producer, exact tested/reviewed head, verdict, artifact paths with SHA-256 digests, executed checks, and -- for review operations -- an executed independent reviewer verdict for that head.
106
- - `attempt reconcile` classifies interrupted attempts (`uncertain` when launch or effect completion cannot be proven either way, still `running` only for verifiably live processes) and resolves uncertainty only against a verified receipt attributed to the recorded execution boundary. Merge, publish, and deploy effects are never replayed automatically.
56
+ Create an assignment from a preset or a YAML definition.
107
57
 
108
- ### Protected completion, recovery and Inbox registration
58
+ | Option | Purpose |
59
+ |--------|---------|
60
+ | `--yaml` | Path to a job YAML file |
61
+ | `--task`, `-t` | Task reference(s); repeatable and comma-separated |
62
+ | `--preset`, `-p` | Assignment preset name (task mode only) |
63
+ | `--quiet`, `--debug` | Output control |
109
64
 
110
65
  ```bash
111
- ace-assign attempt finish --mapping MAP --assignment ASSIGNMENT --attempt ATTEMPT --result RESULT --head SHA --candidate-generation N --mutation ID --expected-generation N
112
- ace-assign attempt reconcile --mapping MAP --assignment ASSIGNMENT --attempt ATTEMPT --mutation ID --expected-generation N
113
- ace-assign inbox-bind --mapping MAP --assignment ASSIGNMENT --attempt ATTEMPT --event EVENT --inbox-context CONTEXT --mutation ID --expected-generation N
114
- ```
115
-
116
- The installed authority authenticates the current caller. Finish and recovery require the original launcher or an authorized mapped supervisor; Inbox binding requires the original worker or its authenticated descendant and an open execution scope. Installed current or retained authority, service and Inbox accounts also stay on the protected path: unsupported roles refuse rather than opening local authority.
117
-
118
- Protected finish selects an already submitted canonical result. A succeeded result requires accepted independent review for that exact candidate, prior no-writers proof and complete service settlement. It does not close the scope or accept `--receipt`. Protected recovery observes one original attempt; unresolved service effects remain unresolved. Terminal/released recovery returns authenticated retained selectors without creating another mutation or restarting execution. Inbox binding retains the original event/attempt attribution; fresh binding after scope seal refuses.
119
-
120
- Keep the original `--mutation` and `--expected-generation` for exact retries. Authority generation is distinct from `--candidate-generation`; rereading a newer generation changes the request. Assignment, attempt and mapping hints must agree with explicit selection. Commands print canonical JSON metadata and never resend effects during recovery.
121
-
122
- ### State machine
123
-
124
- `reserved -> running -> succeeded | failed | stopped | uncertain`; reconciliation may resolve `uncertain -> succeeded | failed`. Terminal attempts accept no new effects, and accepted history is append-only.
125
-
126
- ### Read accepted execution authority
127
-
128
- `attempt evidence` reads a managed coordinator-accepted receipt from immutable journal history without transitions, cache writes, or audit checkout creation. Supply the accepted attempt ID and exact canonical receipt digest. The trusted local operator or OS-enforced service verifies the actual executed outcome before accepting its receipt; worker-authored success claims cannot accept themselves. This reader consumes that attestation and does not execute a test or model.
129
-
130
- ```sh
131
- ace-assign attempt evidence --attempt ATTEMPT --receipt-digest SHA256 --format json \
132
- --kind check --check-name tests
133
- ace-assign attempt evidence --attempt ATTEMPT --receipt-digest SHA256 --format json \
134
- --kind review-collection
135
- ace-assign attempt evidence --attempt ATTEMPT --receipt-digest SHA256 --format json \
136
- --kind review-collection --historical-head EXACT_RECORDED_HEAD
137
- ace-assign attempt evidence --attempt ATTEMPT --receipt-digest SHA256 --format json \
138
- --kind review-approval
66
+ ace-assign create --yaml job.yaml
67
+ ace-assign create --task t.xyz
68
+ ace-assign create --task t.100,t.101 --preset work-on-task
139
69
  ```
140
70
 
141
- A check proof requires the live candidate head, intact accepted artifacts, and the matching executed operation: `tests` uses `test`, other explicit check names use that operation name. Review collection requires an accepted `review-collect` operation with a passed `review-execution` outcome and the retained metadata/report/prompt artifacts. Review approval requires an ordinary accepted `review` operation with the approved independent reviewer verdict, exact head and retained report artifacts; collection proof cannot substitute for approval. Both collection and approval support an exact `--historical-head`. Historical review validation exposes `historical: true` and the recorded head; it preserves accepted source authority across head drift and cannot certify live checks. Unknown receipts, changed artifacts, unaccepted/unmanaged history, wrong purposes and stale current queries fail closed. Retain the configured evidence ref alongside durable review campaigns.
142
-
143
- ### Service effect claims
71
+ When `--task` refs expand through the `work-on-task` preset, terminal tasks are
72
+ filtered before the assignment's own step expansion:
144
73
 
145
- External service operations (driven through `ace-lab service request`) claim their effect on the assignment journal before dispatch, so a retried or crashed request can never duplicate a side effect. The coordinator owns the trusted surface; callers never append journal events directly.
146
-
147
- - `Ace::Assign::Organisms::AttemptCoordinator#claim_service_request(binding)` records the claim and its attempt event atomically under a journal-wide request-ID index: the same request ID cannot be claimed twice, by another assignment, or against a stale candidate head. External-effect operations additionally require accepted review evidence at the current head, like `merge`.
148
- - `#service_request_status(request_id)` reads the authoritative claim state, including after local cache loss.
149
- - `#transition_service_request(request_id, state:, receipt:)` moves a claim to `succeeded` or `failed` only with a bound, non-secret receipt (exact request/attempt/project/operation/input digest/target fields, non-negative executor UID, and SHA-256 evidence references); rejected receipts never become approvals.
150
- - `#reject_service_request(binding, reason:)` durably records an auditable rejection without inventing a valid attempt.
151
- - Journal commits advance `journal_commit` only; they never change or authorize `candidate_head`, and `base_head` stays fixed at attempt start.
152
-
153
- ### Evidence storage and recovery modes
154
-
155
- - Task-attached (managed) attempts journal accepted evidence to the configured evidence Git ref (default `refs/ace/execution`) through an isolated, disposable audit checkout, outside the deliverable candidate branch. Journal commits never advance or exempt the reviewed candidate.
156
- - Taskless assignments persist attempts under `.ace-local/assign` with `recovery_mode: local_only`. This path never claims Git-backed recovery and cannot record external effects (`merge`, `publish`, `deploy`, `release`); attach the assignment to a source task before managed delivery.
157
- - Actor identity always comes from the execution boundary (the kernel process account for local use, or the trusted service executor's identity). Local execution requires equal real and effective UIDs and resolves the effective UID's OS account; terminal login, `USER`, and `LOGNAME` do not select the actor. Unknown accounts, changing credentials, and unsupported privilege transitions fail closed; flags never grant identity or authority. Historical attempt ownership is never rewritten.
158
-
159
- For developer callers, `Ace::Assign::Molecules::ExecutionIdentityResolver.new(adapter: "local").resolve.actor`
160
- returns `Etc.getpwuid(Process.euid).name` for an ordinary process, including one without a terminal login.
161
- If the OS account cannot be established or real/effective UIDs differ, it raises
162
- `Ace::Assign::AttemptErrors::UnauthorizedIdentity` (CLI exit code 5). Correct the process launch/account;
163
- setting `USER` or `LOGNAME` cannot authorize it. A previously recorded foreign owner still requires the
164
- existing recovery process; this change does not transfer ownership.
165
-
166
- ### status integration
167
-
168
- `ace-assign status --format json` includes the active attempt, `base_head`, `candidate_head`, `evidence_git_ref`, `journal_commit`, and unresolved effects. Feedback state is derived from accepted current-head evidence: `terminal` (accepted evidence at the current head), `open` (attempts without a terminal outcome), `uncertain` (unresolved interruptions), or `unknown` (no attempts). Merge authorization requires an executed independent review verdict for the current head plus an independent release receipt when relevant; report files, exit codes, and prose never authorize a merge.
169
-
170
- ## Commands
171
-
172
- ### `ace-assign create`
173
-
174
- Create a new assignment from YAML or from task refs expanded through an assignment preset.
175
-
176
- Options:
74
+ - Terminal refs (`done`, `skipped`, `cancelled`) are skipped before queue expansion.
75
+ - Mixed sets continue with remaining non-terminal refs and report skipped terminal refs.
76
+ - All requested tasks are already terminal (done/skipped/cancelled): <refs>
177
77
 
178
- - `--yaml FILE`
179
- - `--task, -t <taskref[,taskref...]>` (repeatable)
180
- - `--preset, -p NAME`
181
- - `--quiet, -q`
182
- - `--debug, -d`
78
+ The last case creates no assignment and returns that message instead.
183
79
 
184
- Exactly one mode is required: `--yaml` or `--task`.
80
+ `ace-assign` is role- and folder-name-agnostic: it delegates any non-terminal
81
+ task the caller names. The caller decides which tasks are appropriate; the
82
+ assignment tool does not classify management tasks or inspect `.gitignore`.
185
83
 
186
84
  ### `ace-assign status`
187
85
 
188
- Show queue status for active or explicitly targeted assignment.
189
-
190
- Options:
191
-
192
- - `--flat, -f`
193
- - `--mode compact|progress|full`
194
- - `--format table|json`
195
- - `--assignment <id>`
196
- - `--all, -a`
197
- - `--quiet, -q`
198
- - `--debug, -d`
199
-
200
- Text modes:
86
+ Show plan progress.
201
87
 
202
- - `compact` (default) prints a short summary, hidden-step stats, and up to 5 upcoming step lines
203
- - `progress` prints a single summary line
204
- - `full` prints the full tree/table without step instructions
205
- - JSON emits `active_steps` for all active steps in scope and `next_step` only when no step is active in that scope
206
-
207
- HITL stall behavior:
208
-
209
- - Canonical contract lives in `wfi://hitl` (`ace-hitl` package workflow).
210
- - If a step is failed with canonical message format `HITL: <id> <path>`, `ace-assign status` prints operator guidance with the matching `ace-hitl show <id>` command and available path hint.
211
- - Recommended resume flow:
212
-
213
- - `ace-hitl show <id>`
214
- - requester path (default): `ace-hitl wait <id>`
215
- - fallback path (when waiter inactive): `ace-hitl update <id> --answer "<decision>" --resume`
216
- - `ace-assign retry <failed-step> --assignment <assignment-id>`
217
-
218
- - Completion-attention flow:
219
-
220
- - When assignment work is complete but explicit user action is needed, create an approval HITL event (`kind=approval`) and include the resume instruction for `/as-assign-drive <assignment-id>`.
88
+ | Option | Purpose |
89
+ |--------|---------|
90
+ | `--mode` | Text mode: `compact` (default), `progress`, `full` |
91
+ | `--format` | `table` (default) or `json` |
92
+ | `--flat` | Flat list (full mode only) |
93
+ | `--assignment` | Show one assignment ID |
94
+ | `--all`, `-a` | Include completed assignments |
221
95
 
222
96
  ### `ace-assign step [STEP]`
223
97
 
224
- Show instructions for the deepest active step in scope, the next workable pending step when nothing is active, or an explicit step number.
225
-
226
- Options:
227
-
228
- - `--assignment <id>`
229
- - `--quiet, -q`
230
- - `--debug, -d`
98
+ Show instructions for the active, next, or explicit step.
231
99
 
232
100
  ### `ace-assign start [STEP]`
233
101
 
234
- Mark the next workable pending step active, or mark an explicit pending step active in the targeted assignment or subtree.
235
-
236
- Options:
237
-
238
- - `--assignment <id>`
239
- - `--quiet, -q`
240
- - `--debug, -d`
102
+ Start the next workable pending step, or an explicit step number.
241
103
 
242
104
  ### `ace-assign finish [STEP] --message VALUE`
243
105
 
244
- Complete the current active step (or explicit active step in the active assignment) with report content.
245
- Use positional `STEP` only for the active assignment. When targeting another
246
- assignment or a scoped subtree, pass `--assignment <id>` or
247
- `--assignment <id@step>` without a positional `STEP`; the command finishes the
248
- deepest active step in that target.
106
+ Complete the active step with report content.
249
107
 
250
- `--message` accepts:
251
-
252
- - Inline text
253
- - File path
254
-
255
- Options:
256
-
257
- - `--message, -m` (required)
258
- - `--assignment <id>`
259
- - `--quiet, -q`
260
- - `--debug, -d`
108
+ ```bash
109
+ ace-assign finish --message "done"
110
+ ace-assign finish --message report.md
111
+ cat report.md | ace-assign finish
112
+ ```
261
113
 
262
114
  ### `ace-assign fail --message TEXT`
263
115
 
264
- Mark current step as failed.
265
-
266
- Options:
267
-
268
- - `--message, -m` (required)
269
- - `--assignment <id>`
270
- - `--quiet, -q`
271
- - `--debug, -d`
116
+ Mark the current step failed. The error message is required.
272
117
 
273
118
  ### `ace-assign add`
274
119
 
275
- Insert new step(s) dynamically.
120
+ Add step(s) to the plan dynamically.
276
121
 
277
- Options:
122
+ | Option | Purpose |
123
+ |--------|---------|
124
+ | `--yaml` | YAML file with a top-level `steps:` array |
125
+ | `--step` | Preset step name(s), comma-separated |
126
+ | `--task` | Task reference expanded from a preset child template |
127
+ | `--preset` | Preset name (required only for `--step`/`--task`) |
128
+ | `--after`, `-a` | Insert after this step number (e.g. `010`) |
129
+ | `--child`, `-c` | Insert as a child of `--after` |
130
+ | `--assignment` | Target a specific assignment |
278
131
 
279
- - `--yaml FILE`
280
- - `--step NAME[,NAME...]`
281
- - `--task TASKREF`
282
- - `--preset NAME`
283
- - `--after, -a NUMBER`
284
- - `--child, -c`
285
- - `--assignment <id>`
286
- - `--quiet, -q`
287
- - `--debug, -d`
288
-
289
- Exactly one mode is required: `--yaml`, `--step`, or `--task`.
132
+ ```bash
133
+ ace-assign add --task t.xyz
134
+ ace-assign add --step update-docs --after 020
135
+ ace-assign add --step review-pr --after 100 --child
136
+ ace-assign add --yaml add-task.yml --after 010 --child
137
+ ```
290
138
 
291
139
  ### `ace-assign retry STEP_REF`
292
140
 
293
- Create a linked retry step for a failed step.
141
+ Retry a failed step by creating a new linked step.
294
142
 
295
- Options:
296
-
297
- - `--assignment <id>`
298
- - `--quiet, -q`
299
- - `--debug, -d`
143
+ ```bash
144
+ ace-assign retry 040
145
+ ```
300
146
 
301
147
  ### `ace-assign fork-run`
302
148
 
303
- Execute a fork-enabled subtree in an isolated process.
304
-
305
- Options:
306
-
307
- - `--root <step-number>`
308
- - `--assignment <id>`
309
- - `--provider <provider:model>`
310
- - `--cli-args <args>`
311
- - `--timeout <seconds>`
312
- - `--launch-mode auto|headless|tmux|herdr`
313
- - `--callback`
314
- - `--quiet, -q`
315
- - `--debug, -d`
316
-
317
- Launch modes:
318
-
319
- - `auto` (default): use the detected terminal runtime — tmux when the current process is inside tmux or `ACE_TMUX_SESSION` is set (tmux wins when both are live), herdr when `HERDR_SESSION` + `HERDR_PANE` are live; with no runtime detected, use the headless subprocess path (assign is the only consumer with a headless fallback)
320
- - `headless`: force the existing provider subprocess path and never create terminal panes
321
- - `tmux`: require a live tmux context, create or reuse `<origin-window>-fs` through the `ace-runtime` contract, start a real interactive agent in a prepared pane via `ace-llm --interactive`, and send the scoped `/as-assign-drive <assignment>@<root>` handoff automatically
322
- - `herdr`: the same flow through the Herdr adapter — the fork opens as a tab in the caller's live Herdr workspace and the child inherits `HERDR_*` plus `ACE_RUNTIME=herdr`
323
-
324
- - All terminal targeting, pane dispatch, and capture go through the runtime-neutral `ace-runtime` contract; the fork window name uses the shared `ace-runtime` safe-name policy, so punctuation in the base window is replaced with `-`.
325
- - Fork windows/panes and herdr tabs are created detached, so the current focus stays where the user left it.
326
- - Assignment step state remains the source of truth for subtree completion or failure; pane capture is diagnostic support only.
327
-
328
- Callback mode:
329
-
330
- - `--callback`: terminal-only fork mode (requires `tmux` or `herdr` launch mode) that captures the pane where `fork-run` was started and passes it into the child fork session as `ACE_ASSIGN_CALLBACK_PANE`
331
- - In callback mode the child agent is instructed to send one final status sentence back to the origin pane with `ace-runtime send` before stopping
332
- - Callback mode is intended for interactive parent/child agent flows where the parent stays idle until the child sends the final message back
333
-
334
- Launch-mode precedence for fork execution:
335
-
336
- 1. CLI `--launch-mode`
337
- 2. Step frontmatter `fork.mode`
338
- 3. Config `execution.launch_mode`
339
- 4. Built-in default `auto`
149
+ Prepare fork execution for an entire subtree.
340
150
 
341
- Provider resolution precedence for fork execution:
151
+ | Option | Purpose |
152
+ |--------|---------|
153
+ | `--root` | Fork subtree root step number (e.g. `010.01`) |
154
+ | `--provider` | LLM provider:model override |
155
+ | `--cli-args` | Extra CLI args for the provider process |
156
+ | `--timeout` | Execution timeout in seconds |
157
+ | `--launch-mode` | `auto`, `headless`, `tmux`, or `herdr` |
158
+ | `--callback` | Capture the origin pane and receive a final callback there |
342
159
 
343
- 1. CLI `--provider`
344
- 2. Step frontmatter `fork.provider`
345
- 3. Config `execution.provider`
346
- 4. Built-in default provider
347
-
348
- Step-level example:
349
-
350
- ```yaml
351
- ---
352
- name: research
353
- status: pending
354
- context: fork
355
- fork:
356
- provider: "claude:sonnet@yolo"
357
- mode: "tmux"
358
- ---
160
+ ```bash
161
+ ace-assign fork-run --root 010.01
162
+ ace-assign fork-run --root 010.01 --provider codex:gpt-5 --timeout 900
359
163
  ```
360
164
 
361
165
  ### `ace-assign list`
362
166
 
363
- List assignments.
364
-
365
- Options:
366
-
367
- - `--all, -a`
368
- - `--task, -t <taskref>`
369
- - `--tree`
370
- - `--format table|json`
371
- - `--quiet, -q`
372
- - `--debug, -d`
167
+ List assignments. `--all` includes completed ones, `--task` filters by task
168
+ ref, `--tree` shows the hierarchy, `--format json` exports.
373
169
 
374
170
  ### `ace-assign select [ID]`
375
171
 
376
- Select active assignment or clear selection.
377
-
378
- Options:
379
-
380
- - `--clear`
381
- - `--quiet, -q`
382
- - `--debug, -d`
172
+ Select the active assignment. `--clear` reverts to `.latest`.
383
173
 
384
- ## Workflow Patterns
174
+ ## Workflow patterns
385
175
 
386
- ### `work-on-task` Input Filtering (Prepare/Create Workflows)
387
-
388
- When using preset-backed assignment creation (`ace-assign create --task ...`, `/as-assign-prepare`, or `/as-assign-create`):
389
-
390
- - Requested refs are resolved first (single, comma list, range, pattern).
391
- - Terminal refs (`done`, `skipped`, `cancelled`) are skipped before queue expansion.
392
- - Mixed sets continue with remaining non-terminal refs and report skipped terminal refs.
393
- - If all requested refs are terminal, assignment creation stops with:
394
-
395
- - `All requested tasks are already terminal (done/skipped/cancelled): <refs>`
396
- - `No assignment created.`
397
-
398
- ### Scoped Subtree Execution
176
+ ### Scoped subtree execution
399
177
 
178
+ If several assignments are open, scope every command to the exact assignment
179
+ (and optionally a subtree):
400
180
 
401
181
  ```bash
402
- ace-assign status --assignment abc123@010.01
403
- ace-assign fork-run --assignment abc123@010.01
182
+ ace-assign status --assignment abc123
183
+ ace-assign finish --message report.md --assignment abc123
404
184
  ```
405
185
 
406
- ### Recovery from Failure
407
-
408
-
409
- ```bash
410
- ace-assign fail --message "Lint failed in docs"
411
- ace-assign retry 040 --assignment abc123
412
- ```
186
+ ### Recovery from failure
413
187
 
414
- ### Multi-assignment Management
188
+ Keep the failed step intact; add a retry or a fix step, then continue. Do not
189
+ delete steps to hide a failure.
415
190
 
191
+ ### Multi-assignment management
416
192
 
417
- ```bash
418
- ace-assign list --all
419
- ace-assign select abc123
420
- ace-assign select --clear
421
- ```
193
+ Use `ace-assign list --all` and `ace-assign select` to switch between open
194
+ plans. Each plan keeps its own history.
422
195
 
423
- ## Exit Codes
196
+ ## Exit codes
424
197
 
425
198
  | Code | Meaning |
426
199
  |------|---------|
427
200
  | 0 | Success |
428
- | 1 | General error |
429
- | 2 | Assignment error |
201
+ | 1 | General error (invalid step reference, rejected report, unhandled error) |
202
+ | 2 | Assignment error (no active/known assignment) |
430
203
  | 3 | Configuration not found |
431
204
  | 4 | Step not found |
205
+ | 5 | Lifecycle conflict or busy maintenance exclusion (conflicting identity or busy/expired maintenance; the operation is refused, not retried in a loop) |
432
206
  | 130 | Interrupted (SIGINT) |
433
207
 
434
- See [exit-codes.md](exit-codes.md) for complete descriptions.
435
-
436
- ## Resume accepted assignment state
437
-
438
- ```bash
439
- ace-assign resume --assignment ID --dry-run
440
- ace-assign resume --assignment ID
441
- ```
442
-
443
- Resume returns JSON with task goal, checkpoint, attempts, pending HITL references and unresolved effect/inbox references. Each attempt reports `adopt`, `restart-required` or `reconcile-required`, liveness, recovery reason and its last verified observation. Dry-run writes nothing. Actual resume journals a bounded observation; unproven running attempts become uncertain and keep their writer slot. Intent-only reservations remain `reserved` with `reconcile-required`: absent process-start history never proves that a child did not launch. `attempt start` refuses to reuse an unbound reservation, and `attempt reconcile` reports that protected launch reconciliation requires positive no-execution/no-surviving-writer proof before abort. The protected launch authority owns that proof and abort path; these source primitives do not implement it. Finish also rejects an unbound reservation before accepting any receipt, even if a stale local cache says running. Imported canonical evidence stores the exact submitted bytes without Git clean filters or line-ending conversions; immutable reuse compares the accepted Git blob. It never launches a new process or resends a payload. Restart goes through a new `attempt start` only after the previous attempt ends with accepted evidence.
208
+ ## Planned waves
444
209
 
445
- Managed agents invoking attempt start inside tmux/Herdr obtain a runtime-owned process binding. Recovery compares PID, UID, OS start time, host, exact pane/native session and Herdr terminal/native thread. A surviving shell is not the agent. Missing, unreadable or reused identity remains unknown. A plain local CLI establishes its actor through its effective UID's OS account, requiring equal real/effective UIDs, but supplies no durable agent identity; trusted service executors may supply `process_pid` in their configured identity JSON. Process observation never grants service privilege or effect authority.
446
-
447
- Pending HITL references retain their exact scope/attempt and are not rebound by
448
- resume. Uncertain external effects require their actual owner/result evidence;
449
- message submission cannot establish business success. `AttemptCoordinator#bind_inbox`
450
- retains original event attribution only. There is no agent-read reconciliation
451
- or signing-key requirement for ending or recovering an attempt. Inspect current
452
- agent progress at its original Herdr/tmux panel; uncertain sends are not repeated
453
- automatically.
454
-
455
- Installed Herdr/Pi compaction and writing-child stop/close acceptance must be recorded separately from deterministic fixture coverage before Lab cutover.
456
-
457
- ### Attempt-bound forge delivery
458
-
459
- `ace-assign create --task TASK --preset work-on-task --delivery-parameters delivery.json`
460
- accepts an explicit delivery mapping. A local-only preset rejects that mapping.
461
- The same mapping is retained as `delivery` in the assignment job:
462
-
463
- ```json
464
- {"forge_server":"lab-forge","pr_provenance":{"mode":"fork","head_repository_url":"https://forge.example/worker/project","head_ref":"task-branch","base_repository_url":"https://forge.example/team/project","base_ref":"main"}}
465
- ```
466
-
467
- Use either `forge_server` or boolean `forge_default: true`. With neither,
468
- the first remote delivery resolves the repository remote and journals the selected
469
- forge. Subsequent mutations retain that identity. Canonical mode requires equal
470
- head and base repository URLs; fork mode names both repositories explicitly.
471
- The source ref must already contain the exact local candidate commit.
472
-
473
- `ace-assign delivery --assignment ID --attempt ATTEMPT --operation create --title TITLE`
474
- creates a draft. Operations `update`, `review` and `status` reuse that attempt;
475
- status and review do not append evidence. `ready --tests TEST-REF.json --review
476
- REVIEW-REF.json` requires references containing `attempt_id` and `receipt_digest`
477
- to coordinator-accepted, executed tests and independent approval at the current
478
- candidate. Remote CI remains visible and advisory. An unresolved mutation is
479
- reconciled by exact provider identity; absence or conflicting matches remain
480
- unresolved and never trigger an automatic second write. Retrying readiness uses
481
- the original intent's evidence references, revalidated against the current head.
482
-
483
- Merge runs in the authorized qjx executor, which calls the neutral provider merge
484
- primitive under its existing scoped policy. The worker only consumes completion:
485
- `delivery --operation merge --service-request REQUEST --tests TEST-REF.json
486
- --review REVIEW-REF.json`. A completed, verified receipt must bind this assignment,
487
- attempt, candidate and exact PR resource; credentials do not grant authority.
488
- Version and changelog preparation do not authorize publication.
489
-
490
- The neutral `git/pr/create` and `git/pr/update` workflow and skill assets require
491
- qkb.1 companion adoption across installed consumers. Their source tests do not
492
- claim fresh installed workflow acceptance or authorized live merge acceptance.
493
-
494
- Delivery context belongs to the assignment's existing evidence journal, while each
495
- operation belongs to its own scoped attempt. Closing create step `030` and starting
496
- update `147` or readiness `148` retains the exact PR and forge. An unresolved intent
497
- from any earlier scoped attempt prevents a second mutation: reconciliation records
498
- a result under the current attempt and links the original intent digest and attempt.
499
- Status history includes each event's owning `attempt_id` and `event_digest`. No
500
- single delivery attempt needs to remain active throughout the recipe.
501
- If reconciliation recovers a different operation than the requested step (for
502
- example, create while invoking readiness), the command reports that the requested
503
- step still needs execution. It does not return success for an unperformed step.
504
- Retry that requested operation with its current evidence after recovery settles.
505
-
506
- Recovery compares the exact requested effect, not only its operation name. An
507
- uncertain update of one title/body cannot complete a later update with different
508
- content. Creation also checks the requested title/body against the observed draft,
509
- including adoption of an already known draft. A mismatched request receives
510
- `AttemptErrors::CurrentEffectRequired` after the old intent is settled; the new
511
- effect remains unperformed until explicitly retried. Explicit readiness references
512
- must match the recovered intent; omitting them during retry retains and revalidates
513
- its original references. Merge always consumes the exact named qjx service request,
514
- its candidate/target binding and verified receipt, never an older PR result.
515
-
516
-
517
- ## Protected cross-user native launch
518
-
519
- The fixed installed authority exposes `ace-assign authority serve`, `launch`,
520
- `status` and `terminate`. See [protected authority](protected-authority.md) for
521
- OS policy, native artifact installation, canonical launch stages and safe replay.
522
-
523
- ## Source-owned installation maintenance inventory
524
-
525
- The trusted installation owner loads exact protected content references for the
526
- original and staged candidate descriptor using `Authority::Deployment.load_artifact`.
527
- This Ruby-only source interface validates immutable authenticated descriptor bytes;
528
- it does not establish installed network or native readiness and is not exposed
529
- through worker transport or a CLI selector.
530
-
531
- `LaunchLifecycle#with_execution_slots(mapping_ids:, candidate_deployment:)` holds
532
- the same slot exclusions as normal admission while yielding frozen fixed
533
- mapping/journal/commit contexts. Changed, added and removed mappings cannot be
534
- omitted. Removed mappings retain their original journal selection; new mappings
535
- use the staged selection. Existing mappings and physical slots cannot be recycled
536
- to hide history. Ref changes, unreadable roots and conflicting aliases refuse.
537
-
538
- Full `slot_reusable!` maintenance eligibility and parent retirement remain
539
- unavailable until complete historical authentication and actual current inventory
540
- verification are connected. The inventory block grants neither policy publication
541
- nor positive maintenance readiness. Finish/stop wiring and installed acceptance
542
- remain separate unfinished 9c2 requirements. Existing normal admission and guarded
543
- abort/release behavior retain their current checks.
544
-
545
- ## Authenticated readiness and terminal scope closure
546
-
547
- The source-owned fixed ExecStartPost readiness hook uploads one bounded report
548
- through the authenticated authority connection, closes its write side and waits
549
- for acknowledgement. The authority joins the exact manager-selected hook/server
550
- actors, immutable runtime/configuration dependencies, original boot/network
551
- proofs and complete live mount/IPC/resource observations before binding native
552
- admission. The hook’s observed server network namespace must match both the original
553
- parent selection and the canonical network installation admission. A missing,
554
- malformed or different identity refuses native binding before child release.
555
- Unknown writable projections, writable API descendants, changed
556
- socket endpoints and incomplete evidence refuse. A read-only socket mount does
557
- not authorize messages.
558
-
559
- Original service issuance remains tracked while the manager command runs outside
560
- the callback's exclusions. Sealing cannot publish an empty-scope proof while an
561
- original issuer can still start the service. Admitted-but-unbound starts use the
562
- same positive cleanup and worker baseline as bound starts; an inactive snapshot
563
- does not assert that execution never happened.
564
-
565
- After the genuine terminal owner accepts authenticated result evidence, the
566
- existing release producer joins that receipt to the exact sealed empty scope.
567
- Current activation, jobs, recursive population, original resource identities,
568
- native directory absence and outside worker UID writers are checked again before
569
- publishing or consuming the proof. Empty scope alone supplies no terminal result.
570
-
571
- The required per-boot host proof is selected before parent activation and retained
572
- in canonical `scope_bound.boot_baseline_selection`; later reads authenticate that
573
- original immutable artifact rather than a current pointer. Domain gad.8/gad.b
574
- still must deliver trusted cold-start/boot refresh and activation inhibition.
575
- These source interfaces and controlled tests do not establish installed native,
576
- network or boot acceptance, and task 9c2 remains in progress through integration
577
- and independent review.
578
-
579
-
580
- ### Protected sealed-service no-effect settlement
581
-
582
- For the fixed original executor, `service_status` includes a closed immutable `settlement_context` containing the authenticated original request, execution binding and accepted current challenge (or null). Full original mapping/project/receiver credentials are checked before this private context is exposed. Ordinary status roles retain their existing projection. Terminal status still authenticates the imported original receipt through the canonical reader.
583
-
584
- The fixed original executor uses `claim_service_settlement` against the sealed original request. The authority records an acyclic challenge selecting the latest canonical uncertain/failed outcome. `complete_no_effect` uploads the exact original receipt and bounded inspection artifact through the existing private transfer. It authenticates the accepted challenge, original dispatch binding and imported artifact before atomically reaching `failed-settled`. Exact retries retain their first reply and do not invoke a new effect. A later genuine failure needs a fresh challenge; missing/orphan/stale challenges and changed input refuse.
585
-
586
- This generic authority path attributes the closed inspection report to the recorded executor. Actual operation-specific target absence, handler termination and surviving-writer inspection are an open gad.b producer obligation; a closed scope or timeout does not prove no effect. The current protected ingress atomically accepts a request and executor claim, so an absent canonical request cannot be converted into a requested-but-unclaimed settlement record.
587
-
588
-
589
- ### Protected original worker submission
590
-
591
- Run under the actual original prepared worker while its lineage is live. Read
592
- `ace-assign authority status --mapping M --assignment A --attempt T` and save
593
- `authority_generation` for the next new mutation. Candidate submission uses
594
- current `result_candidate_generation` (zero if null), then returns the next
595
- positive candidate generation. Review/result use that returned generation.
596
-
597
- ```sh
598
- ace-assign submit-candidate --mapping M --assignment A --attempt T --head H \
599
- --candidate-generation CURRENT --expected-generation G --mutation CANDIDATE --bundle candidate.bundle
600
- ace-assign submit-result --mapping M --assignment A --attempt T --head H \
601
- --candidate-generation ACCEPTED --expected-generation G --mutation RESULT --receipt result.json \
602
- --artifact first-evidence --artifact second-evidence
603
- ```
210
+ > **L3 status:** `ace-coworker` starts from `.ace-local/coworker/`, drives
211
+ > the assignment through this gem's CLI, records results in the task folder,
212
+ > and reports through `ace-hitl`. Resume after interruption is the remaining
213
+ > L3 leaf.
214
+ >
215
+ > **Planned (L5.5):** role rules, independent review rounds, and forge
216
+ > delivery workflow -- not available yet.
604
217
 
605
- The actual worker builds `Ace::Assign::Models::ExecutionReceipt` from its original
606
- assignment/project/scope, installed worker actor, tested head and actual executed
607
- checks/artifact digests. Failed receipts may have zero artifacts; succeeded
608
- receipts require evidence. Captured queue completion does not create a receipt or
609
- canonical acceptance. Independent installed reviewers use the existing
610
- `ace-overseer review` consumer for that exact candidate. Result submission obtains
611
- a new generation after review; exact retries retain the original generation,
612
- mutation and identical ordered bytes. Supervisor finish still revalidates result,
613
- review, writer exclusion and settlement. A lost reply never causes automatic resend.
218
+ The old protected/attempt-evidence and installation paths are removed from the
219
+ local flow. No journal, admission service, or second queue is required to
220
+ create, read, or drive an assignment.