ace-overseer 0.13.9 → 0.15.3

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4267353d4b28e609ce53853dedd016a4e4f3d6155abe6d9e4098417a38fab460
4
- data.tar.gz: 69141dbe8fa9bd0bd182f2bd7dbbcd38eeaf43c120d22b5cbe591dca454abd08
3
+ metadata.gz: 3ad5c1cd73b433965d9e8ac955ca8230dd677c6c5067bcdee1a2ff6427603deb
4
+ data.tar.gz: efa22f74cc5af23a2e686c924558ca276d539369646f89825739b5255c3d307d
5
5
  SHA512:
6
- metadata.gz: e422836882f2d5da8176c1a27072379c7d487555b7a0764c6a60f7a63babb4722e197f1a3487e5d79d73cef667db2fdea1b35d0eb51af53ec526efd0aaf70899
7
- data.tar.gz: c9082cbcb5e4ca4d9a0475c4f0cb31fb13848024812bccee23fe53d2871e25547bff939951c2bcee3a87e247a6db9a8b20cb4b0ed33c9b86ec3a6ae6f12fff21
6
+ metadata.gz: 819bcbfad49d1edacfb604f39727573b83524c8fd49370ca35f8ff342f0a24850e7f25e8de59f1097f3c1d644fac2721a05bd0cae92df34231d0d4dfe6511f1e
7
+ data.tar.gz: 4cc5095cf8a5189e1b000234eda8fda11f8d841a7e8f3c294ca0756477e6f0e4b90aa84b9854c3648c6a783128c08bf4472fb5fd15b3501a09dec8b0f0bdc60a
data/CHANGELOG.md CHANGED
@@ -6,6 +6,132 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
8
  ## [Unreleased]
9
+ ### Fixed
10
+ - Updated the `ace-tmux` runtime dependency constraint to `~> 0.17` so overseer stays compatible with the current tmux runtime control release line.
11
+
12
+ ## [0.15.3] - 2026-04-23
13
+
14
+ ### Technical
15
+ - Tightened retained `status --watch` E2E coverage to use a controlled bounded-session shutdown with explicit command captures, keeping refresh verification aligned with the documented watch contract.
16
+
17
+ ## [0.15.2] - 2026-04-23
18
+
19
+ ### Technical
20
+ - Aligned retained `work-on` E2E verification with the current prepared-assignment contract so post-launch status accepts `paused` plus `next_step` until `/ace-assign-drive` actually starts work.
21
+
22
+ ## [0.15.1] - 2026-04-23
23
+
24
+ ### Technical
25
+ - Updated the `ace-git-worktree` runtime dependency constraint to `~> 0.21` so overseer stays aligned with the current worktree minor release line.
26
+
27
+ ## [0.15.0] - 2026-04-23
28
+
29
+ ### Changed
30
+ - Updated overseer status collection, formatting, and work-on orchestration to consume `ace-assign`'s `active_steps`/`next_step` lifecycle contract instead of the old singular `current_step`/`in_progress` model.
31
+ - Revised overseer test fixtures and resume behavior so existing assignments now prefer the focused active step and otherwise fall back to the next pending step in scope.
32
+
33
+ ## [0.14.14] - 2026-04-23
34
+
35
+
36
+ ### Changed
37
+ - Reworked tmux window-open behavior to align with shared session targeting and reduce ambiguity when launching and reusing worktree windows.
38
+ - Updated overseer tmux-window coverage to verify the current session/window lifecycle against the improved launcher behavior.
39
+
40
+
41
+ ## [0.14.13] - 2026-04-22
42
+
43
+ ### Fixed
44
+ - Matched existing tmux windows through the shared `ace-tmux` sanitized window-name policy so worktrees with punctuation are not reopened under duplicate names.
45
+
46
+ ## [0.14.12] - 2026-04-19
47
+
48
+ ### Technical
49
+ - Tightened retained overseer E2E runner and verifier contracts so `work-on` postcondition captures cannot run before the primary command has completed, and preset-override verification requires public `r8x` worktree evidence.
50
+
51
+ ## [0.14.11] - 2026-04-18
52
+
53
+ ### Technical
54
+ - Relaxed retained watch-mode E2E verification to tolerate bounded `Open3` stream-closure noise when the visible `status --watch` behavior and controlled shutdown codes are otherwise correct.
55
+
56
+ ## [0.14.10] - 2026-04-16
57
+
58
+ ### Fixed
59
+ - Normalized `status --watch` interrupt handling so watch-mode exits no longer dump a Ruby stack trace, and aligned retained E2E verification with the bounded termination codes the command now emits.
60
+
61
+ ## [0.14.9] - 2026-04-16
62
+
63
+ ### Fixed
64
+ - Reused the orchestrator task manager when launching default assignments so multi-task `work-on` flows no longer partially provision a task and then fail lookup against a different task-resolution path.
65
+
66
+ ## [0.14.8] - 2026-04-16
67
+
68
+ ### Fixed
69
+ - Relaxed `TS-OVERSEER-001` prune verification to judge the documented public prune flow from captured dry-run/prune artifacts and resulting state instead of requiring echoed command lines.
70
+
71
+ ## [0.14.7] - 2026-04-16
72
+
73
+ ### Fixed
74
+ - Taught tmux window opening to create the target session when it is missing so sandboxed overseer E2E runs can open task windows reliably on the intended socket.
75
+
76
+ ## [0.14.6] - 2026-04-15
77
+
78
+ ### Changed
79
+ - Reworked `TS-OVERSEER-001` into a public-surface goal contract by absorbing standalone help survey into Goal 2 preflight, simplifying prune flow to normal lifecycle commands, and tightening rerun/override checks to stable status/worktree oracles.
80
+ - Added `TS-OVERSEER-002` status-and-operations coverage with watch-refresh and multi-task bundle journeys.
81
+ - Updated `docs/usage.md` with explicit public verification paths for preset override, idempotent rerun, and minimal prune lifecycle checks.
82
+
83
+ ### Fixed
84
+ - Updated the `ace-assign` runtime dependency constraint to `~> 0.53` so overseer remains aligned with the current assign minor release line.
85
+
86
+ ## [0.14.4] - 2026-04-13
87
+
88
+ ### Fixed
89
+ - Rewrote the retained `TS-OVERSEER-001` workflow-value cases around final sandbox state and runner observations so preset-override and prune verification no longer depend on brittle helper artifacts.
90
+
91
+ ## [0.14.3] - 2026-04-13
92
+
93
+ ### Fixed
94
+ - Tightened `TS-OVERSEER-001` preset-override and prune scenario contracts so path-check artifacts are explicit and optional pre-completion status captures no longer fail the workflow before semantic verification.
95
+
96
+ ## [0.14.2] - 2026-04-13
97
+
98
+ ### Fixed
99
+ - Updated the `ace-assign` runtime dependency constraint to `~> 0.49` so overseer remains compatible with the new assign minor release line.
100
+
101
+ ## [0.14.1] - 2026-04-13
102
+
103
+ ### Changed
104
+ - Completed the batch i05 migration follow-through for this package and aligned it with the restarted `fast` / `feat` / `e2e` verification model.
105
+
106
+ ### Technical
107
+ - Included in the coordinated assignment-driven patch release for batch i05 package updates.
108
+
109
+
110
+ ## [0.14.0] - 2026-04-12
111
+
112
+ ### Changed
113
+ - Migrated package tests to the `fast` / `feat` / `e2e` model by moving deterministic coverage from `test/{atoms,commands,models,molecules,organisms}` into `test/fast/*`.
114
+ - Added E2E migration decision tracking for `TS-OVERSEER-001` via `test/e2e/TS-OVERSEER-001-overseer-workflow/e2e-decision-record.md`.
115
+ - Updated package README testing guidance to teach only `ace-test ace-overseer`, `ace-test ace-overseer feat`, `ace-test ace-overseer all`, and `ace-test-e2e ace-overseer`.
116
+
117
+ ### Fixed
118
+ - Hardened `TS-OVERSEER-001` sandbox setup by loading `mise.toml` from `${ACE_E2E_SOURCE_ROOT:-$PROJECT_ROOT_PATH}`.
119
+ - Updated TC-002/TC-003 verifier expectations to use the JSON status oracle and task-window-scoped tmux duplicate checks, eliminating false negatives in rerun validation.
120
+
121
+ ## [0.13.12] - 2026-04-12
122
+
123
+ ### Fixed
124
+ - Updated the `ace-git-worktree` runtime dependency constraint to `~> 0.20` so overseer remains compatible with the new worktree minor release line.
125
+
126
+ ## [0.13.11] - 2026-04-11
127
+
128
+ ### Fixed
129
+ - Updated the `ace-assign` runtime dependency constraint to `~> 0.47` so overseer remains compatible with the latest assign minor release line.
130
+
131
+ ## [0.13.10] - 2026-04-07
132
+
133
+ ### Fixed
134
+ - Updated the `ace-assign` runtime dependency constraint to `~> 0.44` so overseer remains compatible with the new assign minor release line.
9
135
 
10
136
  ## [0.13.9] - 2026-04-01
11
137
 
data/README.md CHANGED
@@ -46,5 +46,17 @@ ace-overseer status --watch
46
46
 
47
47
  **Customize the workflow** - the full pipeline is defined in two layers: the [assignment preset](../ace-assign/.ace-defaults/assign/presets/work-on-task.yml) controls which steps run and in what order (onboard, implement, test, release, review, PR), while each step references a [workflow instruction](../ace-task/handbook/workflow-instructions/task/work.wf.md) that defines how it executes. Browse [available presets](../ace-assign/.ace-defaults/assign/presets/) or create your own to tailor the pipeline to your project.
48
48
 
49
+ For explicit end-to-end validation paths, see [Public Verification Paths](docs/usage.md#public-verification-paths).
50
+
51
+ ## Testing
52
+
53
+ - `ace-test ace-overseer` runs deterministic fast coverage from `test/fast/`.
54
+ - `ace-test ace-overseer feat` runs deterministic feature coverage from `test/feat/` when present.
55
+ - `ace-test ace-overseer all` runs fast + feat deterministic coverage.
56
+ - `ace-test-e2e ace-overseer` runs retained workflow scenarios from `test/e2e/`.
57
+
58
+ The package no longer uses deterministic `*_test.rb` files under `test/e2e/` and
59
+ does not use `ace-test ace-overseer e2e` as a deterministic test path.
60
+
49
61
  ---
50
62
  [Getting Started](docs/getting-started.md) | [Usage Guide](docs/usage.md) | [Handbook - Skills, Agents, Templates](docs/handbook.md) | Part of [ACE](https://github.com/cs3b/ace)
data/docs/usage.md CHANGED
@@ -72,3 +72,27 @@ Start task work: `ace-overseer work-on --task 8q4.t.umu.1`.
72
72
  Check dashboard: `ace-overseer status`.
73
73
 
74
74
  Preview then prune: `ace-overseer prune --dry-run`, then `ace-overseer prune --yes`.
75
+
76
+ ## Public Verification Paths
77
+
78
+ Use these user-visible checks when validating behavior end-to-end:
79
+
80
+ - Preset override path:
81
+
82
+ 1. `ace-overseer work-on --task <task-ref> --preset <preset-name>`
83
+ 2. `ace-git-worktree list` (confirm worktree exists for `<task-ref>`)
84
+ 3. `ace-overseer status --format json` (confirm the task appears with assignment/preset details)
85
+
86
+ - Idempotent rerun oracle:
87
+
88
+ 1. Run `ace-overseer work-on --task <task-ref>` twice
89
+ 2. Verify one task entry remains in `ace-overseer status --format json`
90
+ 3. Verify only one matching worktree exists in `ace-git-worktree list`
91
+
92
+ - Prune lifecycle minimal flow:
93
+
94
+ 1. `ace-task done <task-ref>`
95
+ 2. `ace-overseer prune --dry-run`
96
+ 3. `ace-overseer prune --yes`
97
+ 4. `ace-git-worktree list` to confirm removed vs retained task worktrees
98
+ 5. `ace-overseer prune --dry-run` to confirm no remaining safe candidates
@@ -128,9 +128,14 @@ module Ace
128
128
  bar = progress_bar(done.to_i, total.to_i)
129
129
  counts = "#{done}/#{total}"
130
130
  counts = "#{counts} (#{failed} failed)" if failed.positive?
131
- current = assignment["current_step"] || assignment[:current_step]
131
+ active_steps = assignment["active_steps"] || assignment[:active_steps]
132
+ next_step = assignment["next_step"] || assignment[:next_step]
132
133
  parts = "#{bar} #{counts}"
133
- parts = "#{parts} #{colorize(current, :dim)}" if current
134
+ if active_steps.is_a?(Array) && !active_steps.empty?
135
+ parts = "#{parts} #{colorize(active_steps.join(", "), :dim)}"
136
+ elsif next_step
137
+ parts = "#{parts} #{colorize("next: #{next_step}", :dim)}"
138
+ end
134
139
  parts
135
140
  end
136
141
  private_class_method :format_progress
@@ -31,6 +31,8 @@ module Ace
31
31
  else
32
32
  run_once(format)
33
33
  end
34
+ rescue Interrupt
35
+ nil
34
36
  rescue => e
35
37
  raise Ace::Support::Cli::Error.new(e.message)
36
38
  end
@@ -1,14 +1,18 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "ace/tmux"
4
+
3
5
  module Ace
4
6
  module Overseer
5
7
  module Molecules
6
8
  class TmuxWindowOpener
7
- def initialize(tmux_window_command: nil)
9
+ def initialize(tmux_window_command: nil, tmux_executor: nil)
8
10
  @tmux_window_command = tmux_window_command || Ace::Tmux::CLI::Commands::Window.new
11
+ @tmux_executor = tmux_executor || Ace::Tmux::Molecules::TmuxExecutor.new
9
12
  end
10
13
 
11
14
  def open(worktree_path:, preset: nil)
15
+ ensure_session_exists
12
16
  return if window_already_open?(worktree_path)
13
17
 
14
18
  @tmux_window_command.call(
@@ -21,13 +25,21 @@ module Ace
21
25
 
22
26
  private
23
27
 
28
+ def ensure_session_exists
29
+ session = ENV["ACE_TMUX_SESSION"]
30
+ return unless session && !session.empty?
31
+ return if @tmux_executor.capture(["tmux", "has-session", "-t", session]).success?
32
+
33
+ created = @tmux_executor.run(["tmux", "new-session", "-d", "-s", session])
34
+ raise "Failed to create tmux session '#{session}'" unless created
35
+ end
36
+
24
37
  def window_already_open?(worktree_path)
25
38
  session = ENV["ACE_TMUX_SESSION"]
26
39
  return false unless session
27
40
 
28
- name = File.basename(worktree_path.to_s)
29
- executor = Ace::Tmux::Molecules::TmuxExecutor.new
30
- result = executor.capture(["tmux", "list-windows", "-t", session, "-F", '#{window_name}'])
41
+ name = Ace::Tmux::Atoms::WindowNameSanitizer.call(File.basename(worktree_path.to_s))
42
+ result = @tmux_executor.capture(["tmux", "list-windows", "-t", session, "-F", '#{window_name}'])
31
43
  return false unless result.success?
32
44
 
33
45
  result.stdout.split("\n").any? { |w| w.strip == name }
@@ -54,7 +54,8 @@ module Ace
54
54
  end
55
55
 
56
56
  def assignment_info_to_h(info)
57
- current = info.queue_state.current
57
+ active_steps = info.queue_state.active_steps
58
+ next_step = active_steps.empty? ? info.queue_state.next_workable : nil
58
59
  {
59
60
  "assignment" => {
60
61
  "id" => info.id,
@@ -65,10 +66,11 @@ module Ace
65
66
  "total" => info.queue_state.summary[:total],
66
67
  "done" => info.queue_state.summary[:done],
67
68
  "failed" => info.queue_state.summary[:failed],
68
- "in_progress" => info.queue_state.summary[:in_progress],
69
+ "active" => info.queue_state.summary[:active],
69
70
  "pending" => info.queue_state.summary[:pending]
70
71
  },
71
- "current_step" => current ? current.name : nil
72
+ "active_steps" => active_steps.map(&:name),
73
+ "next_step" => next_step&.name
72
74
  }
73
75
  end
74
76
 
@@ -11,8 +11,8 @@ module Ace
11
11
  task_loader: nil, config: nil, assignment_detector: nil)
12
12
  @worktree_provisioner = worktree_provisioner || Molecules::WorktreeProvisioner.new
13
13
  @tmux_window_opener = tmux_window_opener || Molecules::TmuxWindowOpener.new
14
- @assignment_launcher = assignment_launcher || Molecules::AssignmentLauncher.new
15
14
  @task_manager = task_loader || Ace::Task::Organisms::TaskManager.new
15
+ @assignment_launcher = assignment_launcher || Molecules::AssignmentLauncher.new(task_manager: @task_manager)
16
16
  @config = config || Ace::Overseer.config
17
17
  @assignment_detector = assignment_detector
18
18
  end
@@ -70,9 +70,10 @@ module Ace
70
70
  end
71
71
  assignment_result = if existing
72
72
  progress.call("Assignment already active: #{existing.dig("assignment", "id")}")
73
+ focused_step = existing.dig("focus_step", "number") || existing.dig("next_step", "number")
73
74
  {
74
75
  assignment_id: existing.dig("assignment", "id"),
75
- first_step: existing.dig("current_step", "number"),
76
+ first_step: focused_step,
76
77
  created: false
77
78
  }
78
79
  else
@@ -185,15 +186,29 @@ module Ace
185
186
  Ace::Assign.reset_config!
186
187
  executor = Ace::Assign::Organisms::AssignmentExecutor.new
187
188
  result = executor.status
189
+ focus_step = result[:current]
190
+ next_step = result[:state].active_steps.empty? ? result[:state].next_workable : nil
188
191
  {
189
192
  "assignment" => {
190
193
  "id" => result[:assignment].id,
191
194
  "name" => result[:assignment].name,
192
195
  "state" => result[:state].assignment_state.to_s
193
196
  },
194
- "current_step" => result[:current] && {
195
- "number" => result[:current].number,
196
- "name" => result[:current].name
197
+ "active_steps" => result[:state].active_steps.map do |step|
198
+ {
199
+ "number" => step.number,
200
+ "name" => step.name
201
+ }
202
+ end,
203
+ "next_step" => if result[:state].active_steps.empty? && result[:state].next_workable
204
+ {
205
+ "number" => next_step.number,
206
+ "name" => next_step.name
207
+ }
208
+ end,
209
+ "focus_step" => focus_step && {
210
+ "number" => focus_step.number,
211
+ "name" => focus_step.name
197
212
  }
198
213
  }
199
214
  rescue Ace::Assign::AssignmentErrors::NoActive
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Ace
4
4
  module Overseer
5
- VERSION = "0.13.9"
5
+ VERSION = '0.15.3'
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ace-overseer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.13.9
4
+ version: 0.15.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Michal Czyz
8
8
  bindir: exe
9
9
  cert_chain: []
10
- date: 2026-04-05 00:00:00.000000000 Z
10
+ date: 2026-04-26 00:00:00.000000000 Z
11
11
  dependencies:
12
12
  - !ruby/object:Gem::Dependency
13
13
  name: ace-support-cli
@@ -71,14 +71,14 @@ dependencies:
71
71
  requirements:
72
72
  - - "~>"
73
73
  - !ruby/object:Gem::Version
74
- version: '0.42'
74
+ version: '0.54'
75
75
  type: :runtime
76
76
  prerelease: false
77
77
  version_requirements: !ruby/object:Gem::Requirement
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '0.42'
81
+ version: '0.54'
82
82
  - !ruby/object:Gem::Dependency
83
83
  name: ace-git
84
84
  requirement: !ruby/object:Gem::Requirement
@@ -99,14 +99,14 @@ dependencies:
99
99
  requirements:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
- version: '0.19'
102
+ version: '0.21'
103
103
  type: :runtime
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
106
106
  requirements:
107
107
  - - "~>"
108
108
  - !ruby/object:Gem::Version
109
- version: '0.19'
109
+ version: '0.21'
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: ace-task
112
112
  requirement: !ruby/object:Gem::Requirement
@@ -127,14 +127,14 @@ dependencies:
127
127
  requirements:
128
128
  - - "~>"
129
129
  - !ruby/object:Gem::Version
130
- version: '0.11'
130
+ version: '0.17'
131
131
  type: :runtime
132
132
  prerelease: false
133
133
  version_requirements: !ruby/object:Gem::Requirement
134
134
  requirements:
135
135
  - - "~>"
136
136
  - !ruby/object:Gem::Version
137
- version: '0.11'
137
+ version: '0.17'
138
138
  - !ruby/object:Gem::Dependency
139
139
  name: ace-support-test-helpers
140
140
  requirement: !ruby/object:Gem::Requirement