Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
30e30f3
feat(ace-assign): add scoped watch command for fork continuations
cs3b Apr 25, 2026
1f90ca1
spec(task-specs): mark scoped watch implementation task complete
cs3b Apr 25, 2026
326db59
spec(watch): tidy scoped watch targeting spec
cs3b Apr 25, 2026
cffb8c4
fix(ace-assign): guard teardown env restoration
cs3b Apr 25, 2026
b699dba
spec(retros): add watcher slice retrospective
cs3b Apr 25, 2026
9e47af8
chore(ace-assign): publish 0.56.0 release metadata
cs3b Apr 25, 2026
71a1986
chore(ace-overseer): bump ace-assign dependency for 0.56
cs3b Apr 25, 2026
23f3cab
chore(project-default): sync root release artifacts
cs3b Apr 25, 2026
f44b9d5
spec(task): mark scoped watch targeting task done
cs3b Apr 25, 2026
7a23a6e
feat(ace-assign): keep watch alive across fork subtree recovery
cs3b Apr 25, 2026
c88ccba
spec(task-specs): mark watch continuation task slice complete
cs3b Apr 25, 2026
6f56427
style(ace-assign): reindent watch command
cs3b Apr 25, 2026
ebc24a6
style(assign): parenthesize assignment in watch conditionals
cs3b Apr 25, 2026
b3b97f0
chore(ace-assign): release v0.57.0
cs3b Apr 25, 2026
dda1fd5
chore(ace-overseer): release v0.15.5
cs3b Apr 25, 2026
1771c54
chore(project default): record the coordinated release
cs3b Apr 25, 2026
0ee80fb
spec(ace-retros): add watch continuation retro
cs3b Apr 25, 2026
a7adfea
fix(ace-assign): sort work-on-task batches by sibling dependencies
cs3b Apr 25, 2026
6d66fd6
fix(ace-task): load parent subtasks in dependency-safe order
cs3b Apr 25, 2026
2a5fda5
chore(project default): bump ace-assign and ace-task release versions
cs3b Apr 25, 2026
03b7d8e
feat(ace-assign): document and cover watch continuation recovery flows
cs3b Apr 25, 2026
e18ab20
spec(task-specs): note the expanded watcher goal bundle
cs3b Apr 25, 2026
f24bd0c
test(ace-assign): add headless fork mode to retained watch fixtures
cs3b Apr 25, 2026
cdf4265
spec(task-specs): mark watcher verification task in progress
cs3b Apr 25, 2026
d25db11
fix(ace-assign): preserve mapped sub-step overrides during YAML startup
cs3b Apr 25, 2026
63dd76b
chore(project default): bump ace-assign to v0.57.2
cs3b Apr 25, 2026
ab26d72
spec(retro): add retained watch startup retro
cs3b Apr 25, 2026
6586eff
spec(task): mark watcher verification retained e2e done
cs3b Apr 25, 2026
46861c4
fix(ace-assign): support task-like launcher objects without dependencโ€ฆ
cs3b Apr 25, 2026
bc30ec1
chore(project default): publish ace-assign 0.57.3 release notes and lโ€ฆ
cs3b Apr 25, 2026
ec19d90
fix(ace-assign): preserve fork roots and stabilize watch continuation
cs3b Apr 25, 2026
9ec6975
fix(ace-review): update the Gemini role mapping for code shine
cs3b Apr 25, 2026
755fc9f
chore(ace-config): correct the review preset role alias
cs3b Apr 25, 2026
cc6812e
docs(project default): record the latest release bumps in the root chโ€ฆ
cs3b Apr 25, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
---
id: 8ro1ts
title: 8ro-t-0ve-0-watch-slice
type: standard
tags: [ace-assign, watch, assignment]
created_at: "2026-04-25 01:13:06"
status: active
---

# 8ro-t-0ve-0-watch-slice

## What Went Well
- The scoped watcher command surface, scope parsing, and direct fast tests were already in place on the branch, so task verification could focus on whether the shipped slice actually held up under package-level validation.
- The subtree flow still surfaced a real regression instead of rubber-stamping the earlier commit: package verification caught a teardown bug in `ace-assign/test/test_helper.rb` that did not show up in the narrower watcher-only tests.
- Re-running the direct watcher tests plus the full `ace-assign` package suite provided strong evidence that the slice is stable after the guard fix.

## What Could Be Improved
- Assignment child steps advanced underneath the driver multiple times, which caused reports to land on the wrong step numbers and made the subtree harder to audit.
- The initial work step report was used as a planning artifact because the subtree state changed between status checks; that is a process bug even though the underlying code was already shipped.
- The pre-commit review fallback only linted files and did not preserve a cleaner distinction between review evidence and later verification evidence.

## Key Learnings
- In forked assignment subtrees, the driver has to re-check status immediately before every `finish` call; otherwise queued child steps can auto-advance and consume the wrong report.
- Package-wide verification remains necessary even when the task-specific test surface passes. The watcher slice looked complete in direct tests, but `ace-test all --profile 6` exposed a regression in shared test infrastructure.
- Guarding teardown/setup assumptions in shared test helpers is low-cost and prevents broad false-negative package failures.

## Action Items
- Tighten `as-assign-drive` usage discipline so scoped drivers re-read active child state immediately before writing reports in long-running subtrees.
- Keep package-level verification in the subtree even when a task appears isolated to one command/test area.
- Preserve the `(@original_env || {})` guard in `ace-assign/test/test_helper.rb` and treat shared test helper edits as full-package verification triggers.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
id: 8ro24k
title: 8ro.t.0ve.2 watch continuation
type: standard
tags: [ace-assign, watch, recovery]
created_at: "2026-04-25 01:25:04"
status: active
---

# 8ro.t.0ve.2 watch continuation

## What Went Well
- Extended `ace-assign watch` without replacing the scoped-target shell from the prior sibling task, so the new wait/recovery loop stayed aligned with the already-shipped public command surface.
- Added direct fast coverage for the new behavioral risks: live wait, stale-session recovery, `Errno::EPERM` as alive, sequential multi-root continuation, and scoped non-widening.
- Package-level verification exposed environment leakage from the forked assignment shell before release, which let the subtree document the clean-env verification path instead of shipping ambiguous test evidence.

## What Could Be Improved
- Package verification inside a scoped `/as-assign-drive` session inherits `ACE_ASSIGN_*` variables that can contaminate unrelated tmux/launcher tests; the verification workflow should clear fork-only env by default before running package suites.
- The `watch` implementation reused assignment-in-condition patterns that lint flagged late in the review step; keeping lint in the implementation loop earlier would have avoided two small follow-up style commits.
- The release step still arrived through the compatibility `wfi://release/publish` shim, which adds one extra read/translation hop during subtree closeout.

## Action Items
- Update assignment verification guidance or helpers so package-level test runs inside forked subtree sessions start from a neutral `ACE_ASSIGN_*` environment.
- Keep `ace-lint` in the implementation loop for command-layer Ruby changes before the pre-commit-review step to reduce style-only follow-up commits.
- Consider retiring assignment preset references to `wfi://release/publish` in favor of `wfi://release/local` directly so release steps expose the current workflow without the compatibility shim.
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
id: 8roifd
title: 8ro-t-0ve-1-watch-startup-retained-e2e
type: standard
tags: []
created_at: "2026-04-25 12:17:05"
status: active
---

# 8ro-t-0ve-1-watch-startup-retained-e2e

## What Went Well
- The stalled subtree was recoverable from assignment reports and retained E2E artifacts without replaying the whole branch history.
- A focused fast regression around `AssignmentExecutor#start` exposed the real startup bug quickly: mapped `sub_steps` overrides were preserved by dynamic batch insertion but dropped during initial YAML assignment creation.
- Package verification was reliable once the scoped worker's live env (`ACE_ASSIGN_DEFAULT_TARGET`, `TMUX`, `ACE_ASSIGN_FORK_WINDOW`) was removed from the test process.

## What Could Be Improved
- Scoped worker environments should not leak assignment or tmux targeting variables into package/E2E verification runs; that pollution produced false failures unrelated to the task.
- Manual fixture reproductions wrote generated `jobs/` artifacts back into the repo fixture tree, which had to be cleaned before release prep.
- The retained E2E harness still mixes real product failures with environment/runtime failures (missing tmux runtime, stale local fixture copies), making TC-level diagnosis slower than necessary.

## Action Items
- Add an explicit clean-env helper or workflow note for subtree verification commands that must ignore worker-scoped assignment/tmux env vars.
- Keep generated retained-fixture job outputs outside tracked fixture directories so local reproductions cannot masquerade as source edits.
- Follow up on the retained watch E2E harness so sandbox-local fixture generation stays aligned with the repo fixtures and current runner guidance.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: 8ro.t.0ve.0
status: pending
status: done
priority: medium
created_at: "2026-04-25 00:34:53"
estimate: TBD
Expand Down Expand Up @@ -47,26 +47,29 @@ ace-assign watch --assignment 8abcd1 --poll-interval 60
```

- CLI options in v1:

- `--assignment <id>`
- `--root <root>`
- `--poll-interval <seconds>`
- `--quiet`
- `--debug`

- Startup summary reports assignment id, optional subtree root, and effective poll interval.
- Stop summary names the remaining inline/manual boundary when fork work is exhausted.
- Error output is explicit and non-zero for:

- conflicting `--root` versus scoped `@<root>`
- non-fork root target
- invalid or non-positive poll interval
- watched failed scope

### Success Criteria

- [ ] `ace-assign watch` is registered in `ace-assign/lib/ace/assign/cli.rb`.
- [ ] Scoped-target parsing is deterministic and rejects conflicting root forms.
- [ ] Terminal scoped subtrees exit successfully without relaunching.
- [ ] Manual-tail stop behavior is implemented for watched scopes with no remaining fork work.
- [ ] Invalid-target and invalid-poll-interval paths fail non-zero.
- [x] `ace-assign watch` is registered in `ace-assign/lib/ace/assign/cli.rb`.
- [x] Scoped-target parsing is deterministic and rejects conflicting root forms.
- [x] Terminal scoped subtrees exit successfully without relaunching.
- [x] Manual-tail stop behavior is implemented for watched scopes with no remaining fork work.
- [x] Invalid-target and invalid-poll-interval paths fail non-zero.

## Vertical Slice Decomposition (Task/Subtask Model)

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: 8ro.t.0ve.1
status: pending
status: done
priority: medium
created_at: "2026-04-25 00:34:53"
estimate: TBD
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
id: 8ro.t.0ve.2
status: pending
status: in-progress
priority: medium
created_at: "2026-04-25 00:34:53"
estimate: TBD
Expand Down Expand Up @@ -55,11 +55,11 @@ Telemetry rules:

### Success Criteria

- [ ] Whole-assignment watch can continue across multiple fork roots in sequence.
- [ ] Active-live telemetry causes wait instead of duplicate relaunch.
- [ ] Lost-session state triggers recovery from assignment state rather than terminal-handle dependence.
- [ ] `Errno::EPERM` is treated as alive.
- [ ] Scoped targets still respect the scoped boundary while using wait/recovery logic.
- [x] Whole-assignment watch can continue across multiple fork roots in sequence.
- [x] Active-live telemetry causes wait instead of duplicate relaunch.
- [x] Lost-session state triggers recovery from assignment state rather than terminal-handle dependence.
- [x] `Errno::EPERM` is treated as alive.
- [x] Scoped targets still respect the scoped boundary while using wait/recovery logic.

## Vertical Slice Decomposition (Task/Subtask Model)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ TC-004-watch-recovers-after-interruption
- `TC-003` records raw artifacts proving the watcher advanced across multiple fork roots and stopped at an inline/manual tail.
- `TC-004` records raw artifacts proving the watcher resumed from assignment state after the original parent/session disappeared.
- The verifier uses raw captures under `results/tc/03/` and `results/tc/04/` as primary evidence.
- The retained runner/verifier bundle order expands from 2 goals to 4 goals without creating a watcher-only suite.

## Notes for Implementer

Expand Down
2 changes: 1 addition & 1 deletion .ace/review/presets/code-shine.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,5 +41,5 @@ bundle: "project"

models:
- role:review-codex
- role:review-geminie
- role:review-gemini
# - role:review-claude
11 changes: 11 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,18 @@ All notable changes to this project will be documented in this file.

- **ace-task**: Removed spike as an active task type from drafting/review guidance. Drafts now create real child tasks for each original intention, and `as-task-review` is responsible for deep analysis, draft reshaping, and dependency repair for uncertain task families.
- **ace-task v0.36.6**: redesigned spike-task workflow around explicit parent-goal evaluation, in-folder post-spike task-tree rewrites, later review handoff, and same-parent follow-up subtasks for any out-of-folder drift.
- **ace-assign v0.57.0**: Extended the public `ace-assign watch` flow with live fork waiting, assignment-state recovery after lost session state, and sequential continuation across pending fork roots while preserving scoped subtree boundaries.

### Fixed
- **ace-review v0.53.7**: Corrected the `code-shine` review preset to use the shipped `review-gemini` role so polish review runs no longer fail on the misspelled Gemini alias.
- **ace-assign v0.57.5**: Preserved mapped `sub_steps` overrides for explicitly numbered top-level roots so generated child steps keep their declared fork context, provider, and workflow-backed instructions during assignment startup.
- **ace-assign v0.57.4**: Hardened scoped `ace-assign watch` continuation so leaf fork roots are recovered correctly and tmux-backed live subtrees are not relaunched while still running.
- **ace-assign v0.57.3**: Restored dependency-ordered batch compatibility for task-like objects that only expose `status` and `subtasks`, so `ace-overseer` launcher flows no longer crash when expanding explicit task refs.
- **ace-assign v0.57.2**: Preserved mapped `sub_steps` overrides during `ace-assign create --yaml`, keeping nested fork recovery/watch fixtures materialized as real fork children instead of flattening override hashes into plain child names.
- **ace-task v0.36.3**: Parent-task auto-close now follows the same `TaskManager#update` path as explicit closes, so linked GitHub issues close consistently when child tasks move to archive or are manually closed.
- **ace-tmux v0.17.1**: Clarified the shipped runtime-inspection contract so docs consistently treat `ace-tmux list` as the read-side baseline and no longer reference the stale `ace-tmux state` surface.
- **ace-assign v0.57.1**: Fixed `work-on-task` batch expansion so sibling task execution respects in-batch dependencies and fails clearly on cyclic dependency sets instead of trusting raw child order.
- **ace-task v0.36.8**: Fixed parent subtask loading and tree display to use dependency-safe sibling ordering, and tightened draft/review guidance so executable child order is encoded explicitly.

### Changed
- **ace-task v0.36.4**: Tightened spike draft/work/review guidance so spike tasks must declare a completion contract, synchronize affected task/doc artifacts, and rerun parent `as-task-review` before they can be considered complete.
Expand All @@ -20,7 +28,10 @@ All notable changes to this project will be documented in this file.
- **ace-assign v0.55.0**: Added `ace-assign fork-run --callback` for tmux-backed parent/child agent flows so the forked child can send one final status sentence back to the origin pane with `ace-tmux send` while the parent drive session stays idle until that callback arrives.

### Technical
- **ace-assign v0.57.5**: Moved watch polling and recovery state handling into a dedicated runtime helper, and added fast regression coverage for explicit numbered-root overrides plus the extracted watch runtime path.
- **ace-assign v0.57.4**: Synced retained watch fixture paths, expanded shared fork-environment cleanup in tests, and added direct regression coverage for scoped leaf recovery plus tmux liveness detection.
- **ace-assign v0.55.0**: Persisted callback-pane metadata in fork tmux session files, exported `ACE_ASSIGN_CALLBACK_PANE` into tmux fork launches, and updated `/as-assign-drive` to document callback-mode resume and assignment-state recovery when the callback is missing on re-entry.
- Dependency-following patch release after the `ace-assign v0.57.0` line update: `ace-overseer v0.15.5`.

### Fixed
- **ace-assign v0.54.8**: Corrected tmux fork-window naming to derive from the launcher origin pane instead of the session's currently active window, and stopped tmux fork launches from stealing focus by creating fork windows and panes detached.
Expand Down
10 changes: 5 additions & 5 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
PATH
remote: ace-assign
specs:
ace-assign (0.55.0)
ace-assign (0.57.5)
ace-b36ts (~> 0.13)
ace-llm (~> 0.34)
ace-support-cli (~> 0.6)
Expand Down Expand Up @@ -199,8 +199,8 @@ PATH
PATH
remote: ace-overseer
specs:
ace-overseer (0.15.3)
ace-assign (~> 0.54)
ace-overseer (0.15.5)
ace-assign (~> 0.57)
ace-git (~> 0.19)
ace-git-worktree (~> 0.21)
ace-support-cli (~> 0.6)
Expand Down Expand Up @@ -237,7 +237,7 @@ PATH
PATH
remote: ace-review
specs:
ace-review (0.53.6)
ace-review (0.53.7)
ace-b36ts (~> 0.13)
ace-bundle (~> 0.41)
ace-git (~> 0.19)
Expand Down Expand Up @@ -338,7 +338,7 @@ PATH
PATH
remote: ace-task
specs:
ace-task (0.36.7)
ace-task (0.36.8)
ace-b36ts (~> 0.13)
ace-git (~> 0.19)
ace-support-cli (~> 0.6)
Expand Down
47 changes: 47 additions & 0 deletions ace-assign/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,53 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

## [0.57.5] - 2026-04-25

### Fixed
- Preserved mapped `sub_steps` overrides for explicitly numbered top-level roots during assignment startup, so generated children keep their declared fork context, provider, and workflow-backed instructions.

### Technical
- Extracted `ace-assign watch` polling, boundary evaluation, telemetry checks, and recovery flow into a dedicated `WatchRuntime`, keeping the CLI command focused on option parsing and dispatch.
- Added fast regression coverage for explicit numbered-root override preservation and the extracted watch runtime wiring.

## [0.57.4] - 2026-04-25

### Fixed
- Hardened scoped `ace-assign watch` continuation so a fork-enabled leaf root remains eligible for recovery or launch instead of exiting early with a false "no fork work remains" result.
- Treated tmux session metadata as valid fork liveness telemetry so watcher recovery no longer relaunches already-running tmux-backed fork subtrees.

### Technical
- Corrected retained `TS-ASSIGN-003` watch runner fixture references to the shipped `job.yaml` paths.
- Expanded shared test environment cleanup to clear and restore the full active fork runtime variable set, and added direct watch command coverage for scoped leaf recovery and tmux liveness handling.

## [0.57.3] - 2026-04-25

### Fixed
- Preserved mapped `sub_steps` overrides during `ace-assign create --yaml` startup so nested fork children keep their declared fork context, launch mode, provider, and custom instructions instead of collapsing into plain child names.
- Restored compatibility with task-like objects that do not expose `dependencies` or `metadata`, so dependency-ordered assignment expansion no longer breaks `ace-overseer` launcher flows and similar integrations.

### Technical
- Added regression coverage for initial assignment creation with mapped `sub_steps` children to keep retained watch-recovery fixtures materialized as real nested fork work.
- Added direct regression coverage for task-like objects that only provide `status` and `subtasks`, matching `ace-overseer` assignment launcher compatibility expectations.

## [0.57.1] - 2026-04-25

### Fixed
- Dependency-sort expanded `work-on-task` task batches so sibling tasks respect in-batch dependencies instead of raw subtask folder order.
- Fail fast when the requested assignment batch contains a dependency cycle instead of materializing an invalid execution order.

### Technical
- Added regression coverage for parent-subtask expansion ordering, explicit multi-task dependency ordering, and cyclic batch rejection.

## [0.57.0] - 2026-04-25

### Changed
- Added a public `ace-assign watch` command with scoped subtree targeting, explicit startup summaries, live wait/recovery behavior for active fork roots, and sequential continuation across pending fork roots until only inline/manual work remains.

### Technical
- Shared subtree root resolution and fork-root validation between `watch` and `fork-run`, added direct watcher fast coverage for wait/recovery/`Errno::EPERM`/scoped-boundary behavior, and hardened package verification against inherited scoped-target environment leakage from forked drive sessions.

## [0.55.0] - 2026-04-23

### Changed
Expand Down
Loading