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.
- checksums.yaml +4 -4
- data/.ace-defaults/assign/catalog/composition-rules.yml +2 -17
- data/.ace-defaults/assign/catalog/steps/create-pr.step.yml +0 -26
- data/.ace-defaults/assign/catalog/steps/create-retro.step.yml +1 -1
- data/.ace-defaults/assign/catalog/steps/mark-task-done.step.yml +1 -2
- data/.ace-defaults/assign/catalog/steps/onboard.step.yml +0 -17
- data/.ace-defaults/assign/catalog/steps/plan-task.step.yml +0 -11
- data/.ace-defaults/assign/catalog/steps/pre-commit-review.step.yml +3 -0
- data/.ace-defaults/assign/catalog/steps/reflect-and-refactor.step.yml +3 -2
- data/.ace-defaults/assign/catalog/steps/review-pr.step.yml +0 -16
- data/.ace-defaults/assign/catalog/steps/split-subtree-root.step.yml +4 -2
- data/.ace-defaults/assign/catalog/steps/task-load.step.yml +1 -1
- data/.ace-defaults/assign/catalog/steps/verify-test-suite.step.yml +7 -34
- data/.ace-defaults/assign/catalog/steps/verify-test.step.yml +7 -4
- data/.ace-defaults/assign/catalog/steps/work-on-task.step.yml +0 -17
- data/.ace-defaults/assign/config.yml +1 -0
- data/.ace-defaults/assign/presets/fix-bug.yml +4 -3
- data/.ace-defaults/assign/presets/quick-implement.yml +1 -1
- data/.ace-defaults/assign/presets/work-on-task.yml +6 -16
- data/CHANGELOG.md +216 -0
- data/README.md +20 -43
- data/docs/demo/canonical-skill-source.gif +0 -0
- data/docs/demo/canonical-skill-source.tape.yml +51 -0
- data/docs/demo/fork-provider.cast +834 -0
- data/docs/demo/fork-provider.gif +0 -0
- data/docs/demo/fork-provider.recording.json +30 -0
- data/docs/demo/fork-provider.tape.yml +77 -20
- data/docs/getting-started.md +5 -2
- data/docs/usage.md +74 -4
- data/handbook/guides/fork-context.g.md +31 -7
- data/handbook/skills/as-assign-drive/SKILL.md +13 -1
- data/handbook/skills/as-create-retro-internal/SKILL.md +29 -0
- data/handbook/skills/as-mark-task-done-internal/SKILL.md +29 -0
- data/handbook/skills/as-reflect-and-refactor-internal/SKILL.md +30 -0
- data/handbook/skills/as-task-load-internal/SKILL.md +28 -0
- data/handbook/workflow-instructions/assign/compose.wf.md +3 -3
- data/handbook/workflow-instructions/assign/create-retro-internal.wf.md +11 -0
- data/handbook/workflow-instructions/assign/create.wf.md +6 -3
- data/handbook/workflow-instructions/assign/drive.wf.md +330 -40
- data/handbook/workflow-instructions/assign/mark-task-done-internal.wf.md +12 -0
- data/handbook/workflow-instructions/assign/prepare.wf.md +10 -5
- data/handbook/workflow-instructions/assign/reflect-and-refactor-internal.wf.md +14 -0
- data/handbook/workflow-instructions/assign/run-in-batches.wf.md +4 -1
- data/handbook/workflow-instructions/assign/start.wf.md +5 -2
- data/handbook/workflow-instructions/assign/task-load-internal.wf.md +12 -0
- data/handbook/workflow-instructions/assign/verify-test-suite.wf.md +36 -0
- data/lib/ace/assign/atoms/catalog_loader.rb +105 -2
- data/lib/ace/assign/atoms/preset_expander.rb +4 -0
- data/lib/ace/assign/atoms/step_file_parser.rb +15 -0
- data/lib/ace/assign/atoms/tree_formatter.rb +2 -2
- data/lib/ace/assign/cli/commands/add.rb +20 -11
- data/lib/ace/assign/cli/commands/assignment_target.rb +87 -3
- data/lib/ace/assign/cli/commands/create.rb +1 -1
- data/lib/ace/assign/cli/commands/fail.rb +1 -1
- data/lib/ace/assign/cli/commands/finish.rb +32 -8
- data/lib/ace/assign/cli/commands/fork_run.rb +58 -16
- data/lib/ace/assign/cli/commands/fork_session.rb +52 -0
- data/lib/ace/assign/cli/commands/list.rb +4 -3
- data/lib/ace/assign/cli/commands/retry_cmd.rb +1 -1
- data/lib/ace/assign/cli/commands/start.rb +9 -3
- data/lib/ace/assign/cli/commands/status.rb +237 -230
- data/lib/ace/assign/cli/commands/step.rb +62 -0
- data/lib/ace/assign/cli.rb +8 -1
- data/lib/ace/assign/models/assignment_info.rb +33 -4
- data/lib/ace/assign/models/queue_state.rb +101 -39
- data/lib/ace/assign/models/step.rb +17 -5
- data/lib/ace/assign/molecules/fork_session_launcher.rb +218 -21
- data/lib/ace/assign/molecules/queue_scanner.rb +1 -0
- data/lib/ace/assign/molecules/skill_assign_source_resolver.rb +223 -47
- data/lib/ace/assign/molecules/step_writer.rb +3 -3
- data/lib/ace/assign/molecules/tmux_control_surface_runner.rb +249 -0
- data/lib/ace/assign/organisms/assignment_executor.rb +355 -106
- data/lib/ace/assign/version.rb +1 -1
- data/lib/ace/assign.rb +1 -0
- metadata +35 -5
- 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
|
|
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
|
-
-
|
|
6
|
+
- tmux
|
|
7
|
+
- demo
|
|
7
8
|
settings:
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
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
|
-
-
|
|
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:
|
|
38
|
+
- name: Attach to the operator work window
|
|
18
39
|
commands:
|
|
19
|
-
-
|
|
20
|
-
|
|
21
|
-
|
|
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:
|
|
24
|
-
sleep:
|
|
25
|
-
- type: "ace-assign
|
|
26
|
-
sleep:
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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
|
data/docs/getting-started.md
CHANGED
|
@@ -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 --
|
|
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-
|
|
8
|
-
last-checked: '2026-04-
|
|
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
|
-
|
|
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
|
|
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
|
|
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-
|
|
7
|
-
last-checked: 2026-
|
|
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
|
|
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.
|
|
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
|
-
+--
|
|
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-
|
|
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
|
-
|
|
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
|
-
- `
|
|
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-
|
|
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
|
-
|
|
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
|
|
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
|
|