ace-assign 0.42.4 → 0.55.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 (76) hide show
  1. checksums.yaml +4 -4
  2. data/.ace-defaults/assign/catalog/composition-rules.yml +2 -17
  3. data/.ace-defaults/assign/catalog/steps/create-pr.step.yml +0 -26
  4. data/.ace-defaults/assign/catalog/steps/create-retro.step.yml +1 -1
  5. data/.ace-defaults/assign/catalog/steps/mark-task-done.step.yml +1 -2
  6. data/.ace-defaults/assign/catalog/steps/onboard.step.yml +0 -17
  7. data/.ace-defaults/assign/catalog/steps/plan-task.step.yml +0 -11
  8. data/.ace-defaults/assign/catalog/steps/pre-commit-review.step.yml +3 -0
  9. data/.ace-defaults/assign/catalog/steps/reflect-and-refactor.step.yml +3 -2
  10. data/.ace-defaults/assign/catalog/steps/review-pr.step.yml +0 -16
  11. data/.ace-defaults/assign/catalog/steps/split-subtree-root.step.yml +4 -2
  12. data/.ace-defaults/assign/catalog/steps/task-load.step.yml +1 -1
  13. data/.ace-defaults/assign/catalog/steps/verify-test-suite.step.yml +7 -34
  14. data/.ace-defaults/assign/catalog/steps/verify-test.step.yml +7 -4
  15. data/.ace-defaults/assign/catalog/steps/work-on-task.step.yml +0 -17
  16. data/.ace-defaults/assign/config.yml +1 -0
  17. data/.ace-defaults/assign/presets/fix-bug.yml +4 -3
  18. data/.ace-defaults/assign/presets/quick-implement.yml +1 -1
  19. data/.ace-defaults/assign/presets/work-on-task.yml +6 -16
  20. data/CHANGELOG.md +216 -0
  21. data/README.md +20 -43
  22. data/docs/demo/canonical-skill-source.gif +0 -0
  23. data/docs/demo/canonical-skill-source.tape.yml +51 -0
  24. data/docs/demo/fork-provider.cast +834 -0
  25. data/docs/demo/fork-provider.gif +0 -0
  26. data/docs/demo/fork-provider.recording.json +30 -0
  27. data/docs/demo/fork-provider.tape.yml +77 -20
  28. data/docs/getting-started.md +5 -2
  29. data/docs/usage.md +74 -4
  30. data/handbook/guides/fork-context.g.md +31 -7
  31. data/handbook/skills/as-assign-drive/SKILL.md +13 -1
  32. data/handbook/skills/as-create-retro-internal/SKILL.md +29 -0
  33. data/handbook/skills/as-mark-task-done-internal/SKILL.md +29 -0
  34. data/handbook/skills/as-reflect-and-refactor-internal/SKILL.md +30 -0
  35. data/handbook/skills/as-task-load-internal/SKILL.md +28 -0
  36. data/handbook/workflow-instructions/assign/compose.wf.md +3 -3
  37. data/handbook/workflow-instructions/assign/create-retro-internal.wf.md +11 -0
  38. data/handbook/workflow-instructions/assign/create.wf.md +6 -3
  39. data/handbook/workflow-instructions/assign/drive.wf.md +330 -40
  40. data/handbook/workflow-instructions/assign/mark-task-done-internal.wf.md +12 -0
  41. data/handbook/workflow-instructions/assign/prepare.wf.md +10 -5
  42. data/handbook/workflow-instructions/assign/reflect-and-refactor-internal.wf.md +14 -0
  43. data/handbook/workflow-instructions/assign/run-in-batches.wf.md +4 -1
  44. data/handbook/workflow-instructions/assign/start.wf.md +5 -2
  45. data/handbook/workflow-instructions/assign/task-load-internal.wf.md +12 -0
  46. data/handbook/workflow-instructions/assign/verify-test-suite.wf.md +36 -0
  47. data/lib/ace/assign/atoms/catalog_loader.rb +105 -2
  48. data/lib/ace/assign/atoms/preset_expander.rb +4 -0
  49. data/lib/ace/assign/atoms/step_file_parser.rb +15 -0
  50. data/lib/ace/assign/atoms/tree_formatter.rb +2 -2
  51. data/lib/ace/assign/cli/commands/add.rb +20 -11
  52. data/lib/ace/assign/cli/commands/assignment_target.rb +87 -3
  53. data/lib/ace/assign/cli/commands/create.rb +1 -1
  54. data/lib/ace/assign/cli/commands/fail.rb +1 -1
  55. data/lib/ace/assign/cli/commands/finish.rb +32 -8
  56. data/lib/ace/assign/cli/commands/fork_run.rb +58 -16
  57. data/lib/ace/assign/cli/commands/fork_session.rb +52 -0
  58. data/lib/ace/assign/cli/commands/list.rb +4 -3
  59. data/lib/ace/assign/cli/commands/retry_cmd.rb +1 -1
  60. data/lib/ace/assign/cli/commands/start.rb +9 -3
  61. data/lib/ace/assign/cli/commands/status.rb +237 -230
  62. data/lib/ace/assign/cli/commands/step.rb +62 -0
  63. data/lib/ace/assign/cli.rb +8 -1
  64. data/lib/ace/assign/models/assignment_info.rb +33 -4
  65. data/lib/ace/assign/models/queue_state.rb +101 -39
  66. data/lib/ace/assign/models/step.rb +17 -5
  67. data/lib/ace/assign/molecules/fork_session_launcher.rb +218 -21
  68. data/lib/ace/assign/molecules/queue_scanner.rb +1 -0
  69. data/lib/ace/assign/molecules/skill_assign_source_resolver.rb +223 -47
  70. data/lib/ace/assign/molecules/step_writer.rb +3 -3
  71. data/lib/ace/assign/molecules/tmux_control_surface_runner.rb +249 -0
  72. data/lib/ace/assign/organisms/assignment_executor.rb +355 -106
  73. data/lib/ace/assign/version.rb +1 -1
  74. data/lib/ace/assign.rb +1 -0
  75. metadata +35 -5
  76. data/.ace-defaults/assign/catalog/steps/verify-e2e.step.yml +0 -42
Binary file
@@ -0,0 +1,30 @@
1
+ {
2
+ "backend": "asciinema",
3
+ "tape_path": "/home/mc/ace-t.n1d/ace-assign/docs/demo/fork-provider.tape.yml",
4
+ "cast_path": "/home/mc/ace-t.n1d/ace-assign/docs/demo/fork-provider.cast",
5
+ "visual_path": "/home/mc/ace-t.n1d/ace-assign/docs/demo/fork-provider.gif",
6
+ "sandbox_path": "/home/mc/ace-t.n1d/.ace-local/demo/sandbox/8rfe9v",
7
+ "verification": {
8
+ "status": "pass",
9
+ "classification": "pass",
10
+ "summary": "Verification passed",
11
+ "retryable": false,
12
+ "report_path": null,
13
+ "details": {
14
+ "cast_path": "/home/mc/ace-t.n1d/ace-assign/docs/demo/fork-provider.cast",
15
+ "inputs_recorded": 0,
16
+ "echoed_commands_recorded": 435,
17
+ "script_commands_recorded": 0,
18
+ "commands_expected": 3,
19
+ "captured_vars": {
20
+ "ACE_TMUX_SESSION": "fork-demo PROJECT_ROOT_PATH=\"$PWD\" ace-assign status --assignment \"$(cat ASSIGN_ID)@010\""
21
+ },
22
+ "missing_vars": [],
23
+ "missing_output": [],
24
+ "missing_output_sequence": [],
25
+ "forbidden_hits": [],
26
+ "assertion_failures": [],
27
+ "assertions_skipped": false
28
+ }
29
+ }
30
+ }
@@ -1,34 +1,91 @@
1
1
  ---
2
- description: Show per-step fork provider different steps run with different LLM models
2
+ description: Show tmux-backed fork execution opening a fork staging window from the current work window
3
3
  tags:
4
4
  - ace-assign
5
5
  - fork
6
- - provider
6
+ - tmux
7
+ - demo
7
8
  settings:
8
- font_size: 16
9
- width: 1000
10
- height: 500
9
+ backend: asciinema
10
+ font_size: 14
11
+ width: 1200
12
+ height: 720
11
13
  format: gif
14
+ output: ace-assign/docs/demo/fork-provider.gif
12
15
  setup:
13
16
  - sandbox
14
17
  - git-init
15
- - copy-fixtures
18
+ - run: |
19
+ ruby -e 'require "fileutils"; root = File.dirname(ENV.fetch("BUNDLE_GEMFILE")); FileUtils.mkdir_p(".ace"); FileUtils.cp_r(File.join(root, ".ace", "llm"), File.join(".ace", "llm")); {".codex" => "skills", ".claude" => "skills", ".pi" => "skills"}.each { |dir, sub| src = File.join(root, dir, sub); next unless Dir.exist?(src); FileUtils.mkdir_p(dir); FileUtils.cp_r(src, File.join(dir, sub)) }'
20
+ - run: |
21
+ cat > fork-demo-job.yaml <<'YAML'
22
+ assignment:
23
+ name: tmux-fork-demo
24
+ description: Minimal assignment to demo tmux-backed fork execution
25
+ steps:
26
+ - name: demo-root
27
+ context: fork
28
+ instructions: |
29
+ Demonstrate tmux-backed fork execution for the assignment subtree.
30
+ sub_steps:
31
+ - onboard
32
+ YAML
33
+ - run: |
34
+ PROJECT_ROOT_PATH="$PWD" ace-assign create --yaml fork-demo-job.yaml
35
+ ruby -e 'link = ".ace-local/assign/.latest"; abort "no latest assignment" unless File.symlink?(link); File.write("ASSIGN_ID", File.basename(File.readlink(link)))'
36
+ - run: tmux new-session -d -s fork-demo -n work -c "$PWD" "bash --noprofile --norc -i"
16
37
  scenes:
17
- - name: Show step frontmatter with fork.provider
38
+ - name: Attach to the operator work window
18
39
  commands:
19
- - type: "cat .ace-local/assign/demoXx/steps/020-implement.st.md"
20
- sleep: 4s
21
- - name: Status shows per-step Fork Provider
40
+ - tmux:
41
+ action: attach
42
+ session: fork-demo
43
+ - tmux:
44
+ action: wait
45
+ for: window-active
46
+ session: fork-demo
47
+ window: work
48
+ - type: tmux display-message -p '#W'
49
+ sleep: 2s
50
+ - name: Launch the fork into a visible tmux window
22
51
  commands:
23
- - type: clear
24
- sleep: 1s
25
- - type: "ace-assign status"
26
- sleep: 4s
27
- - name: fork-run resolves step provider
28
- commands:
29
- - type: clear
30
- sleep: 1s
31
- - type: "ace-assign fork-run --root 020 --dry-run"
32
- sleep: 4s
52
+ - type: ACE_TMUX_SESSION=fork-demo PROJECT_ROOT_PATH="$PWD" ace-assign status --assignment "$(cat ASSIGN_ID)@010"
53
+ sleep: 2s
54
+ - type: bash -lc 'ACE_TMUX_SESSION=fork-demo PROJECT_ROOT_PATH="$PWD" ace-assign fork-run --assignment "$(cat ASSIGN_ID)@010" --launch-mode tmux --provider codex:gpt@yolo --cli-args "--no-alt-screen" --timeout 120 &'
55
+ sleep: 35s
56
+ - tmux:
57
+ action: wait
58
+ for: window-exists
59
+ session: fork-demo
60
+ window: work-fs
61
+ - tmux:
62
+ action: detach
63
+ session: fork-demo
64
+ verify:
65
+ require_output:
66
+ - work
67
+ - work-fs
68
+ - $as-assign-drive
69
+ - Explored
70
+ require_output_sequence:
71
+ - work
72
+ - ace-assign fork-run
73
+ - work-fs
74
+ - $as-assign-drive
75
+ - Explored
76
+ forbid_output:
77
+ - requires an active tmux session
78
+ - Could not resolve current tmux window
79
+ - No such file or directory
80
+ - Unknown provider
81
+ - Unknown providers in llm.providers.active
82
+ - Fork session execution failed
83
+ - does not support interactive mode
84
+ - Do you trust the contents of this directory?
85
+ assert_commands:
86
+ - 'ASSIGN_ID=$(cat ASSIGN_ID); test -f ".ace-local/assign/${ASSIGN_ID}/sessions/010-session.yml"'
87
+ - |
88
+ ASSIGN_ID=$(cat ASSIGN_ID); ruby -e 'require "yaml"; id = File.read("ASSIGN_ID").strip; data = YAML.safe_load_file(".ace-local/assign/#{id}/sessions/010-session.yml"); abort "bad metadata" unless data["launch_mode"] == "tmux" && data["tmux_window"] == "work-fs" && data["provider"] == "codex" && data["model"] == "gpt-5.4"'
33
89
  teardown:
90
+ - run: tmux kill-session -t fork-demo || true
34
91
  - cleanup
@@ -67,6 +67,7 @@ ace-assign create --task t.100,t.101 --preset work-on-task
67
67
 
68
68
  ```bash
69
69
  ace-assign status
70
+ ace-assign step
70
71
  ace-assign finish --message onboard.md
71
72
  ace-assign status
72
73
  ```
@@ -97,7 +98,8 @@ Use status views:
97
98
 
98
99
  ```bash
99
100
  ace-assign status
100
- ace-assign status --flat
101
+ ace-assign status --mode full
102
+ ace-assign status --mode progress
101
103
  ```
102
104
 
103
105
  ## 5) Use scoped assignment targeting
@@ -116,7 +118,8 @@ ace-assign finish --message report.md --assignment abc123@010.01
116
118
  |---------|---------|
117
119
  | `ace-assign create --yaml job.yaml` | Create assignment from YAML |
118
120
  | `ace-assign create --task t.xyz` | Create assignment from task refs |
119
- | `ace-assign status` | Show current queue |
121
+ | `ace-assign status` | Show current queue summary |
122
+ | `ace-assign step` | Show current or next step instructions |
120
123
  | `ace-assign start` | Start next workable step |
121
124
  | `ace-assign finish --message done.md` | Complete in-progress step |
122
125
  | `ace-assign fail --message "error"` | Mark current step failed |
data/docs/usage.md CHANGED
@@ -4,8 +4,8 @@ title: ace-assign Usage Guide
4
4
  purpose: Complete command reference for ace-assign queue orchestration, hierarchy,
5
5
  and fork execution.
6
6
  ace-docs:
7
- last-updated: '2026-04-01'
8
- last-checked: '2026-04-01'
7
+ last-updated: '2026-04-23'
8
+ last-checked: '2026-04-23'
9
9
  ---
10
10
 
11
11
  # ace-assign Usage Guide
@@ -23,12 +23,32 @@ Recommended:
23
23
  ace-assign finish --message report.md
24
24
  ```
25
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
+
26
44
  ## Core Lifecycle
27
45
 
28
46
 
29
47
  ```bash
30
48
  ace-assign create --yaml job.yaml
31
49
  ace-assign status
50
+ ace-assign start
51
+ ace-assign step
32
52
  ace-assign finish --message step-010.md
33
53
  ace-assign status
34
54
  ```
@@ -38,6 +58,7 @@ Use scoped targeting when needed:
38
58
 
39
59
  ```bash
40
60
  ace-assign status --assignment abc123@010.01
61
+ ace-assign start --assignment abc123@010.01
41
62
  ace-assign finish --message done.md --assignment abc123@010.01
42
63
  ```
43
64
 
@@ -87,12 +108,20 @@ Show queue status for active or explicitly targeted assignment.
87
108
  Options:
88
109
 
89
110
  - `--flat, -f`
111
+ - `--mode compact|progress|full`
90
112
  - `--format table|json`
91
113
  - `--assignment <id>`
92
114
  - `--all, -a`
93
115
  - `--quiet, -q`
94
116
  - `--debug, -d`
95
117
 
118
+ Text modes:
119
+
120
+ - `compact` (default) prints a short summary, hidden-step stats, and up to 5 upcoming step lines
121
+ - `progress` prints a single summary line
122
+ - `full` prints the full tree/table without step instructions
123
+ - JSON emits `active_steps` for all active steps in scope and `next_step` only when no step is active in that scope
124
+
96
125
  HITL stall behavior:
97
126
 
98
127
  - Canonical contract lives in `wfi://hitl` (`ace-hitl` package workflow).
@@ -105,9 +134,19 @@ HITL stall behavior:
105
134
  - Completion-attention flow:
106
135
  - 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>`.
107
136
 
137
+ ### `ace-assign step [STEP]`
138
+
139
+ Show instructions for the deepest active step in scope, the next workable pending step when nothing is active, or an explicit step number.
140
+
141
+ Options:
142
+
143
+ - `--assignment <id>`
144
+ - `--quiet, -q`
145
+ - `--debug, -d`
146
+
108
147
  ### `ace-assign start [STEP]`
109
148
 
110
- Start next workable pending step, or an explicit pending step in the active assignment.
149
+ Mark the next workable pending step active, or mark an explicit pending step active in the targeted assignment or subtree.
111
150
 
112
151
  Options:
113
152
 
@@ -117,7 +156,11 @@ Options:
117
156
 
118
157
  ### `ace-assign finish [STEP] --message VALUE`
119
158
 
120
- Complete current in-progress step (or explicit step in active assignment) with report content.
159
+ Complete the current active step (or explicit active step in the active assignment) with report content.
160
+ Use positional `STEP` only for the active assignment. When targeting another
161
+ assignment or a scoped subtree, pass `--assignment <id>` or
162
+ `--assignment <id@step>` without a positional `STEP`; the command finishes the
163
+ deepest active step in that target.
121
164
 
122
165
  `--message` accepts:
123
166
 
@@ -181,9 +224,35 @@ Options:
181
224
  - `--provider <provider:model>`
182
225
  - `--cli-args <args>`
183
226
  - `--timeout <seconds>`
227
+ - `--launch-mode auto|headless|tmux`
228
+ - `--callback`
184
229
  - `--quiet, -q`
185
230
  - `--debug, -d`
186
231
 
232
+ Launch modes:
233
+
234
+ - `auto` (default): use tmux when the current process is already inside tmux or `ACE_TMUX_SESSION` is set; otherwise use the headless subprocess path
235
+ - `headless`: force the existing provider subprocess path and never create tmux panes
236
+ - `tmux`: require tmux context, create or reuse `<origin-window>-fs`, start a real interactive agent in a pane there via `ace-llm --interactive`, and send the scoped `/as-assign-drive <assignment>@<root>` handoff automatically. The fork window name uses the shared `ace-tmux` safe-name policy, so punctuation in the base window is replaced with `-`. Fork windows and panes are created detached, so the current tmux focus stays where the user left it.
237
+ - `tmux`: require tmux context, create or reuse `<origin-window>-fs`, start a real interactive agent in a pane there via `ace-llm --interactive`, and send the scoped `/as-assign-drive <assignment>@<root>` handoff automatically
238
+ - This mode consumes the shared `ace-tmux` runtime/control surface for tmux targeting, pane dispatch, and diagnostics.
239
+ - The fork window name uses the shared `ace-tmux` safe-name policy, so punctuation in the base window is replaced with `-`.
240
+ - Fork windows and panes are created detached, so the current tmux focus stays where the user left it.
241
+ - Assignment step state remains the source of truth for subtree completion or failure; pane capture is diagnostic support only.
242
+
243
+ Callback mode:
244
+
245
+ - `--callback`: tmux-only fork mode that captures the pane where `fork-run` was started and passes it into the child fork session as `ACE_ASSIGN_CALLBACK_PANE`
246
+ - In callback mode the child agent is instructed to send one final status sentence back to the origin pane with `ace-tmux send` before stopping
247
+ - Callback mode is intended for interactive parent/child agent tmux flows where the parent stays idle until the child sends the final message back
248
+
249
+ Launch-mode precedence for fork execution:
250
+
251
+ 1. CLI `--launch-mode`
252
+ 2. Step frontmatter `fork.mode`
253
+ 3. Config `execution.launch_mode`
254
+ 4. Built-in default `auto`
255
+
187
256
  Provider resolution precedence for fork execution:
188
257
 
189
258
  1. CLI `--provider`
@@ -200,6 +269,7 @@ status: pending
200
269
  context: fork
201
270
  fork:
202
271
  provider: "claude:sonnet@yolo"
272
+ mode: "tmux"
203
273
  ---
204
274
  ```
205
275
 
@@ -1,10 +1,11 @@
1
1
  ---
2
2
  doc-type: guide
3
3
  title: Fork Context Guide
4
- purpose: Explain fork context execution model, boundaries, and recovery patterns for ace-assign subtree delegation.
4
+ purpose: Explain fork context execution model, boundaries, and recovery patterns for
5
+ ace-assign subtree delegation.
5
6
  ace-docs:
6
- last-updated: 2026-03-18
7
- last-checked: 2026-03-21
7
+ last-updated: '2026-04-23'
8
+ last-checked: '2026-04-23'
8
9
  ---
9
10
 
10
11
  # Fork Context Guide
@@ -13,13 +14,14 @@ ace-docs:
13
14
 
14
15
  Fork context enables step files to run in isolated agent contexts using the Task tool. When a step has `context: fork` in its frontmatter, ace-assign outputs instructions for the orchestrating agent to execute the step via a subagent.
15
16
 
16
- You can also set a per-step provider override with `fork.provider`:
17
+ You can also set per-step launch overrides with `fork.provider` and `fork.mode`:
17
18
 
18
19
  ```yaml
19
20
  ---
20
21
  context: fork
21
22
  fork:
22
23
  provider: "claude:sonnet@yolo"
24
+ mode: "tmux"
23
25
  ---
24
26
  ```
25
27
 
@@ -30,6 +32,13 @@ Provider precedence during `ace-assign fork-run`:
30
32
  3. Assign config `execution.provider`
31
33
  4. Built-in default
32
34
 
35
+ Launch-mode precedence during `ace-assign fork-run`:
36
+
37
+ 1. CLI `--launch-mode`
38
+ 2. Step `fork.mode`
39
+ 3. Assign config `execution.launch_mode`
40
+ 4. Built-in default `auto`
41
+
33
42
  For hierarchical split workflows, use **parent-only** fork markers:
34
43
  - Split parent step: `context: fork`
35
44
  - Child steps (`onboard-base`, `task-load`, `plan-task`, `work-on-task`, `verify-test`, `release-minor`): no `context: fork`
@@ -95,7 +104,7 @@ Return structured summary:
95
104
  When `ace:assign-drive` (or manual orchestration) encounters a fork-enabled subtree:
96
105
 
97
106
  1. Runs `ace-assign status`
98
- 2. Detects `Fork subtree detected (root: ...)` in output (outside fork scope)
107
+ 2. Uses compact/full status only to identify the active fork-capable step or subtree root
99
108
  3. Delegates with `ace-assign fork-run --assignment <id>@<root>`
100
109
  4. Fork launcher executes `/as-assign-drive <id>@<root>` in a scoped process
101
110
  5. Scoped process advances only inside subtree
@@ -105,7 +114,7 @@ When `ace:assign-drive` (or manual orchestration) encounters a fork-enabled subt
105
114
  ace:assign-drive loop
106
115
  |
107
116
  +-- ace-assign status
108
- +-- Detects "Fork subtree detected (root: ...)"
117
+ +-- Resolve fork subtree root from assignment state
109
118
  +-- ace-assign fork-run --assignment <id>@<root>
110
119
  +-- Forked /as-assign-drive <id>@<root>
111
120
  +-- Subtree completes
@@ -127,6 +136,21 @@ The orchestrating agent:
127
136
  - Processes subagent reports
128
137
  - Handles failures and retries
129
138
 
139
+ ## Scoped Status Semantics
140
+
141
+ Fork execution uses two layers of active ownership:
142
+
143
+ - The fork root stays `active` while the delegated session owns that subtree.
144
+ - Inside that subtree, zero or one deepest started descendant may also be `active`.
145
+
146
+ Status reporting is scope-aware:
147
+
148
+ - Unscoped status lists all `active_steps` in queue order and hides pending descendants under an active fork root from global `next_step` selection.
149
+ - Scoped status (`--assignment <id>@<root>`) reports activity only inside that subtree.
150
+ - When nothing is active inside the current scope, status reports `next_step` instead of predicting started work.
151
+
152
+ This keeps queue eligibility separate from execution state: pending descendants stay pending until scoped execution explicitly starts them.
153
+
130
154
  ## Recovery From Failed Fork Subtrees
131
155
 
132
156
  When a forked subtree fails, use **adaptive minimal-safe replay**:
@@ -245,4 +269,4 @@ ACE_DEBUG=1 ace-assign status
245
269
 
246
270
  - [ace-assign README](../../README.md) - Main documentation
247
271
  - [Work Queue Model](../workflow-instructions/drive-assignment.wf.md) - Assignment management
248
- - `ace-assign fork-run --root <step> --assignment <id>` - Prepare subtree-scoped fork session
272
+ - `ace-assign fork-run --root <step> --assignment <id>` - Prepare subtree-scoped fork session
@@ -12,7 +12,7 @@ allowed-tools:
12
12
  - AskUserQuestion
13
13
  - Skill
14
14
  argument-hint: "[assignment[@scope]]"
15
- last_modified: 2026-02-11
15
+ last_modified: 2026-04-23
16
16
  source: ace-assign
17
17
  skill:
18
18
  kind: workflow
@@ -22,3 +22,15 @@ skill:
22
22
  ---
23
23
 
24
24
  Load and run `ace-bundle wfi://assign/drive` in the current project, then follow the loaded workflow as the source of truth and execute it end-to-end instead of only summarizing it.
25
+
26
+ Hard stop rule:
27
+
28
+ - Do not stop after intermediate progress.
29
+ - Do not stop while waiting on a forked subtree; keep polling and resume the parent drive loop as soon as the subtree reaches a terminal state.
30
+ - Treat `ace-assign status --assignment <id>@<root>` as the source of truth for fork completion; quiet terminal output is not enough reason to stop or declare a stall.
31
+ - If a prior terminal or drive session ended, re-enter from assignment state and continue from the next runnable work instead of depending on the old terminal handle.
32
+ - Before any final response, re-check pinned assignment status. If any runnable `pending` or `active` work remains, continue driving.
33
+ - If unrelated dirty files are generated side effects outside task scope, clean/reset them instead of auto-committing them.
34
+ - Use progress updates for partial status only.
35
+ - Return a final user-facing completion response only when the assignment is complete or the workflow reaches an explicit blocker/failure stop condition.
36
+ - If pending work remains runnable, continue driving.
@@ -0,0 +1,29 @@
1
+ # bundle: wfi://assign/create-retro-internal
2
+ # agent: general-purpose
3
+ ---
4
+ name: as-create-retro-internal
5
+ description: Internal helper for retrospective creation in assignment closeout
6
+ user-invocable: false
7
+ allowed-tools:
8
+ - Bash(ace-bundle:*)
9
+ - Bash(ace-retro:*)
10
+ - Read
11
+ - Write
12
+ argument-hint: "[retro-title]"
13
+ last_modified: 2026-04-05
14
+ source: ace-assign
15
+ skill:
16
+ kind: workflow
17
+ execution:
18
+ workflow: wfi://assign/create-retro-internal
19
+ assign:
20
+ source: wfi://assign/create-retro-internal
21
+ steps:
22
+ - name: create-retro
23
+ description: Create retrospective summarizing outcomes and lessons
24
+ prerequisites:
25
+ - name: reflect-and-refactor
26
+ strength: recommended
27
+ ---
28
+
29
+ Load and run `ace-bundle wfi://assign/create-retro-internal` in the current project, then follow the loaded workflow as the source of truth.
@@ -0,0 +1,29 @@
1
+ ---
2
+ name: as-mark-task-done-internal
3
+ description: Internal helper for marking tasks done with verification
4
+ # bundle: wfi://assign/mark-task-done-internal
5
+ # agent: general-purpose
6
+ user-invocable: false
7
+ allowed-tools:
8
+ - Bash(ace-bundle:*)
9
+ - Bash(ace-task:*)
10
+ - Read
11
+ - Write
12
+ argument-hint: "[taskref]"
13
+ last_modified: 2026-04-05
14
+ source: ace-assign
15
+ skill:
16
+ kind: workflow
17
+ execution:
18
+ workflow: wfi://assign/mark-task-done-internal
19
+ assign:
20
+ source: wfi://assign/mark-task-done-internal
21
+ steps:
22
+ - name: mark-task-done
23
+ description: Mark task complete and verify persisted status
24
+ prerequisites:
25
+ - name: work-on-task
26
+ strength: required
27
+ ---
28
+
29
+ Load and run `ace-bundle wfi://assign/mark-task-done-internal` in the current project, then follow the loaded workflow as the source of truth.
@@ -0,0 +1,30 @@
1
+ # bundle: wfi://assign/reflect-and-refactor-internal
2
+ # agent: general-purpose
3
+ ---
4
+ name: as-reflect-and-refactor-internal
5
+ description: Internal helper for architecture reflection and bounded refactoring
6
+ user-invocable: false
7
+ allowed-tools:
8
+ - Bash(ace-bundle:*)
9
+ - Bash(ace-review:*)
10
+ - Bash(ace-git-commit:*)
11
+ - Read
12
+ - Write
13
+ argument-hint: "[assignment-context]"
14
+ last_modified: 2026-04-05
15
+ source: ace-assign
16
+ skill:
17
+ kind: workflow
18
+ execution:
19
+ workflow: wfi://assign/reflect-and-refactor-internal
20
+ assign:
21
+ source: wfi://assign/reflect-and-refactor-internal
22
+ steps:
23
+ - name: reflect-and-refactor
24
+ description: Run architecture reflection and execute bounded refactoring
25
+ prerequisites:
26
+ - name: work-on-task
27
+ strength: required
28
+ ---
29
+
30
+ Load and run `ace-bundle wfi://assign/reflect-and-refactor-internal` in the current project, then follow the loaded workflow as the source of truth.
@@ -0,0 +1,28 @@
1
+ ---
2
+ name: as-task-load-internal
3
+ description: Internal helper for loading task context into assignment execution
4
+ # bundle: wfi://assign/task-load-internal
5
+ # agent: general-purpose
6
+ user-invocable: false
7
+ allowed-tools:
8
+ - Bash(ace-bundle:*)
9
+ - Read
10
+ - Write
11
+ argument-hint: "[taskref]"
12
+ last_modified: 2026-04-05
13
+ source: ace-assign
14
+ skill:
15
+ kind: workflow
16
+ execution:
17
+ workflow: wfi://assign/task-load-internal
18
+ assign:
19
+ source: wfi://assign/task-load-internal
20
+ steps:
21
+ - name: task-load
22
+ description: Load task behavioral spec and dependency context into assignment execution
23
+ prerequisites:
24
+ - name: onboard-base
25
+ strength: recommended
26
+ ---
27
+
28
+ Load and run `ace-bundle wfi://assign/task-load-internal` in the current project, then follow the loaded workflow as the source of truth.
@@ -172,14 +172,14 @@ session:
172
172
 
173
173
  steps:
174
174
  - name: verify-test-suite
175
- workflow: wfi://test/verify-suite
175
+ source: wfi://assign/verify-test-suite
176
176
  instructions:
177
177
  - Run package test verification.
178
178
  ```
179
179
 
180
180
  Step mapping source of truth:
181
181
  - `name` from canonicalized step catalog entry
182
- - `workflow` from canonicalized step catalog entry
182
+ - `source` from canonicalized step catalog entry (step runtime contract)
183
183
  - `context` from canonicalized step catalog entry (if set)
184
184
  - `instructions` as assignment overlay from catalog description + request-specific context
185
185
 
@@ -253,4 +253,4 @@ After job.yaml is created:
253
253
  /as-assign-create <job.yaml>
254
254
  # or
255
255
  /as-assign-create "...intent..." --run
256
- ```
256
+ ```
@@ -0,0 +1,11 @@
1
+ # create-retro-internal
2
+
3
+ ## Purpose
4
+
5
+ Capture retrospective learnings after assignment implementation/release steps complete.
6
+
7
+ ## Steps
8
+
9
+ 1. Summarize outcomes, key decisions, and verification results.
10
+ 2. Capture issues, risks, and follow-up actions.
11
+ 3. Record the retrospective artifact in the task/retro system used by the assignment.
@@ -3,7 +3,7 @@ doc-type: workflow
3
3
  title: Create Assignment Workflow
4
4
  purpose: workflow instruction for smart public create UX that renders hidden specs and calls deterministic ace-assign create
5
5
  ace-docs:
6
- last-updated: 2026-03-18
6
+ last-updated: 2026-04-07
7
7
  last-checked: 2026-03-21
8
8
  ---
9
9
 
@@ -128,12 +128,12 @@ session:
128
128
 
129
129
  steps:
130
130
  - name: <step-name>
131
- workflow: <workflow-ref-if-public-step>
131
+ source: <source-ref-skill-or-wfi>
132
132
  instructions:
133
133
  - <instruction line>
134
134
  ```
135
135
 
136
- `instructions` are assignment overlay only. The reusable execution body comes from the referenced workflow during `ace-assign create`.
136
+ `instructions` are assignment overlay only. The reusable execution body comes from the canonical source resolution during `ace-assign create`.
137
137
 
138
138
  Rules:
139
139
  - Each invocation writes a new file (no in-place mutation of prior hidden specs).
@@ -156,6 +156,8 @@ If `--run` is present, hand off to drive as the last step:
156
156
  /as-assign-drive <assignment-id>
157
157
  ```
158
158
 
159
+ `/as-assign-drive` is a run-until-complete-or-blocked handoff, not a one-step progress check. Once handed off, it should keep driving until the assignment is actually complete or reaches an explicit blocker/failure stop condition.
160
+
159
161
  If no workable step exists, keep creation successful and report why drive cannot continue.
160
162
 
161
163
  ### 7. Report Result
@@ -203,6 +205,7 @@ Step 010: ...
203
205
  - Capability skills remain excluded from assign composition
204
206
  - Skill-backed steps still expand through runtime `assign.source` metadata
205
207
  - `--run` (when requested) triggers drive handoff as the final workflow step
208
+ - Drive handoff semantics are run-until-complete-or-blocked, not stop-after-first-progress
206
209
 
207
210
  ## Verification
208
211