oh-my-codex 0.17.0 → 0.17.2

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 (178) hide show
  1. package/Cargo.lock +5 -5
  2. package/Cargo.toml +1 -1
  3. package/dist/cli/__tests__/question.test.js +2 -0
  4. package/dist/cli/__tests__/question.test.js.map +1 -1
  5. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js +3 -0
  6. package/dist/cli/__tests__/ralph-goal-mode-contract.test.js.map +1 -1
  7. package/dist/cli/__tests__/ralph.test.js +0 -124
  8. package/dist/cli/__tests__/ralph.test.js.map +1 -1
  9. package/dist/cli/__tests__/setup-install-mode.test.js +156 -3
  10. package/dist/cli/__tests__/setup-install-mode.test.js.map +1 -1
  11. package/dist/cli/__tests__/setup-refresh.test.js +3 -3
  12. package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
  13. package/dist/cli/__tests__/team.test.js +166 -42
  14. package/dist/cli/__tests__/team.test.js.map +1 -1
  15. package/dist/cli/doctor.js +9 -4
  16. package/dist/cli/doctor.js.map +1 -1
  17. package/dist/cli/plugin-marketplace.d.ts +5 -1
  18. package/dist/cli/plugin-marketplace.d.ts.map +1 -1
  19. package/dist/cli/plugin-marketplace.js +31 -2
  20. package/dist/cli/plugin-marketplace.js.map +1 -1
  21. package/dist/cli/question.d.ts +1 -1
  22. package/dist/cli/question.d.ts.map +1 -1
  23. package/dist/cli/question.js +98 -4
  24. package/dist/cli/question.js.map +1 -1
  25. package/dist/cli/ralph.d.ts.map +1 -1
  26. package/dist/cli/ralph.js +1 -49
  27. package/dist/cli/ralph.js.map +1 -1
  28. package/dist/cli/setup.d.ts +1 -0
  29. package/dist/cli/setup.d.ts.map +1 -1
  30. package/dist/cli/setup.js +75 -9
  31. package/dist/cli/setup.js.map +1 -1
  32. package/dist/cli/team.d.ts.map +1 -1
  33. package/dist/cli/team.js +21 -29
  34. package/dist/cli/team.js.map +1 -1
  35. package/dist/config/generator.d.ts +4 -0
  36. package/dist/config/generator.d.ts.map +1 -1
  37. package/dist/config/generator.js +58 -0
  38. package/dist/config/generator.js.map +1 -1
  39. package/dist/hooks/__tests__/agents-overlay.test.js +29 -0
  40. package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
  41. package/dist/hooks/__tests__/session.test.js +126 -1
  42. package/dist/hooks/__tests__/session.test.js.map +1 -1
  43. package/dist/hooks/agents-overlay.d.ts.map +1 -1
  44. package/dist/hooks/agents-overlay.js +6 -3
  45. package/dist/hooks/agents-overlay.js.map +1 -1
  46. package/dist/hooks/session.d.ts +11 -3
  47. package/dist/hooks/session.d.ts.map +1 -1
  48. package/dist/hooks/session.js +68 -6
  49. package/dist/hooks/session.js.map +1 -1
  50. package/dist/hud/__tests__/reconcile.test.js +63 -0
  51. package/dist/hud/__tests__/reconcile.test.js.map +1 -1
  52. package/dist/hud/__tests__/tmux.test.d.ts +2 -0
  53. package/dist/hud/__tests__/tmux.test.d.ts.map +1 -0
  54. package/dist/hud/__tests__/tmux.test.js +92 -0
  55. package/dist/hud/__tests__/tmux.test.js.map +1 -0
  56. package/dist/hud/reconcile.d.ts +2 -0
  57. package/dist/hud/reconcile.d.ts.map +1 -1
  58. package/dist/hud/reconcile.js +14 -1
  59. package/dist/hud/reconcile.js.map +1 -1
  60. package/dist/hud/tmux.d.ts +12 -0
  61. package/dist/hud/tmux.d.ts.map +1 -1
  62. package/dist/hud/tmux.js +88 -0
  63. package/dist/hud/tmux.js.map +1 -1
  64. package/dist/mcp/__tests__/hermes-bridge.test.js +82 -1
  65. package/dist/mcp/__tests__/hermes-bridge.test.js.map +1 -1
  66. package/dist/mcp/hermes-bridge.d.ts +34 -1
  67. package/dist/mcp/hermes-bridge.d.ts.map +1 -1
  68. package/dist/mcp/hermes-bridge.js +75 -0
  69. package/dist/mcp/hermes-bridge.js.map +1 -1
  70. package/dist/mcp/hermes-server.d.ts +111 -6
  71. package/dist/mcp/hermes-server.d.ts.map +1 -1
  72. package/dist/mcp/hermes-server.js +38 -1
  73. package/dist/mcp/hermes-server.js.map +1 -1
  74. package/dist/pipeline/__tests__/stages.test.js +18 -9
  75. package/dist/pipeline/__tests__/stages.test.js.map +1 -1
  76. package/dist/pipeline/stages/team-exec.d.ts.map +1 -1
  77. package/dist/pipeline/stages/team-exec.js +2 -7
  78. package/dist/pipeline/stages/team-exec.js.map +1 -1
  79. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js +111 -269
  80. package/dist/planning/__tests__/approved-execution-lifecycle-matrix.test.js.map +1 -1
  81. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js +31 -72
  82. package/dist/planning/__tests__/approved-launch-hint-lineage-matrix.test.js.map +1 -1
  83. package/dist/planning/__tests__/artifacts.test.js +27 -372
  84. package/dist/planning/__tests__/artifacts.test.js.map +1 -1
  85. package/dist/planning/artifacts.d.ts +1 -14
  86. package/dist/planning/artifacts.d.ts.map +1 -1
  87. package/dist/planning/artifacts.js +11 -31
  88. package/dist/planning/artifacts.js.map +1 -1
  89. package/dist/question/__tests__/state.test.js +349 -1
  90. package/dist/question/__tests__/state.test.js.map +1 -1
  91. package/dist/question/__tests__/ui.test.js +6 -6
  92. package/dist/question/__tests__/ui.test.js.map +1 -1
  93. package/dist/question/events.d.ts +53 -0
  94. package/dist/question/events.d.ts.map +1 -0
  95. package/dist/question/events.js +201 -0
  96. package/dist/question/events.js.map +1 -0
  97. package/dist/question/state.d.ts +30 -2
  98. package/dist/question/state.d.ts.map +1 -1
  99. package/dist/question/state.js +276 -5
  100. package/dist/question/state.js.map +1 -1
  101. package/dist/question/types.d.ts +1 -0
  102. package/dist/question/types.d.ts.map +1 -1
  103. package/dist/question/types.js.map +1 -1
  104. package/dist/question/ui.d.ts.map +1 -1
  105. package/dist/question/ui.js +3 -18
  106. package/dist/question/ui.js.map +1 -1
  107. package/dist/ralph/__tests__/completion-audit.test.js +39 -0
  108. package/dist/ralph/__tests__/completion-audit.test.js.map +1 -1
  109. package/dist/scripts/__tests__/codex-native-hook.test.js +111 -1
  110. package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
  111. package/dist/scripts/__tests__/run-test-files.test.js +22 -0
  112. package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
  113. package/dist/scripts/codex-native-hook.d.ts.map +1 -1
  114. package/dist/scripts/codex-native-hook.js +93 -1
  115. package/dist/scripts/codex-native-hook.js.map +1 -1
  116. package/dist/scripts/codex-native-pre-post.d.ts.map +1 -1
  117. package/dist/scripts/codex-native-pre-post.js +12 -6
  118. package/dist/scripts/codex-native-pre-post.js.map +1 -1
  119. package/dist/scripts/run-test-files.js +12 -1
  120. package/dist/scripts/run-test-files.js.map +1 -1
  121. package/dist/team/__tests__/approved-execution.test.js +25 -24
  122. package/dist/team/__tests__/approved-execution.test.js.map +1 -1
  123. package/dist/team/__tests__/runtime.test.js +173 -26
  124. package/dist/team/__tests__/runtime.test.js.map +1 -1
  125. package/dist/team/__tests__/scaling.test.js +66 -17
  126. package/dist/team/__tests__/scaling.test.js.map +1 -1
  127. package/dist/team/__tests__/tmux-session.test.js +42 -0
  128. package/dist/team/__tests__/tmux-session.test.js.map +1 -1
  129. package/dist/team/__tests__/worker-bootstrap.test.js +205 -0
  130. package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
  131. package/dist/team/approved-execution.d.ts +13 -0
  132. package/dist/team/approved-execution.d.ts.map +1 -1
  133. package/dist/team/approved-execution.js +65 -30
  134. package/dist/team/approved-execution.js.map +1 -1
  135. package/dist/team/runtime.d.ts.map +1 -1
  136. package/dist/team/runtime.js +28 -24
  137. package/dist/team/runtime.js.map +1 -1
  138. package/dist/team/scaling.d.ts.map +1 -1
  139. package/dist/team/scaling.js +7 -8
  140. package/dist/team/scaling.js.map +1 -1
  141. package/dist/team/tmux-session.d.ts.map +1 -1
  142. package/dist/team/tmux-session.js +48 -2
  143. package/dist/team/tmux-session.js.map +1 -1
  144. package/dist/team/ultragoal-context.d.ts +35 -0
  145. package/dist/team/ultragoal-context.d.ts.map +1 -0
  146. package/dist/team/ultragoal-context.js +191 -0
  147. package/dist/team/ultragoal-context.js.map +1 -0
  148. package/dist/ultragoal/__tests__/docs-contract.test.js +19 -0
  149. package/dist/ultragoal/__tests__/docs-contract.test.js.map +1 -1
  150. package/package.json +1 -1
  151. package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
  152. package/plugins/oh-my-codex/skills/plan/SKILL.md +3 -3
  153. package/plugins/oh-my-codex/skills/ralph/SKILL.md +2 -2
  154. package/plugins/oh-my-codex/skills/ralplan/SKILL.md +1 -1
  155. package/plugins/oh-my-codex/skills/team/SKILL.md +6 -0
  156. package/plugins/oh-my-codex/skills/ultragoal/SKILL.md +11 -0
  157. package/skills/plan/SKILL.md +3 -3
  158. package/skills/ralph/SKILL.md +2 -2
  159. package/skills/ralplan/SKILL.md +1 -1
  160. package/skills/team/SKILL.md +6 -0
  161. package/skills/ultragoal/SKILL.md +11 -0
  162. package/src/scripts/__tests__/codex-native-hook.test.ts +133 -1
  163. package/src/scripts/__tests__/run-test-files.test.ts +32 -0
  164. package/src/scripts/codex-native-hook.ts +121 -2
  165. package/src/scripts/codex-native-pre-post.ts +12 -6
  166. package/src/scripts/run-test-files.ts +13 -2
  167. package/dist/planning/__tests__/context-pack-status.test.d.ts +0 -2
  168. package/dist/planning/__tests__/context-pack-status.test.d.ts.map +0 -1
  169. package/dist/planning/__tests__/context-pack-status.test.js +0 -795
  170. package/dist/planning/__tests__/context-pack-status.test.js.map +0 -1
  171. package/dist/planning/__tests__/ready-context-pack-role-refs.test.d.ts +0 -2
  172. package/dist/planning/__tests__/ready-context-pack-role-refs.test.d.ts.map +0 -1
  173. package/dist/planning/__tests__/ready-context-pack-role-refs.test.js +0 -612
  174. package/dist/planning/__tests__/ready-context-pack-role-refs.test.js.map +0 -1
  175. package/dist/planning/context-pack-status.d.ts +0 -73
  176. package/dist/planning/context-pack-status.d.ts.map +0 -1
  177. package/dist/planning/context-pack-status.js +0 -745
  178. package/dist/planning/context-pack-status.js.map +0 -1
@@ -1,66 +1,21 @@
1
1
  import { afterEach, beforeEach, describe, it } from 'node:test';
2
2
  import assert from 'node:assert/strict';
3
- import { createHash } from 'node:crypto';
4
3
  import { existsSync } from 'node:fs';
5
- import { mkdir, mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
4
+ import { mkdir, mkdtemp, rm, writeFile } from 'node:fs/promises';
6
5
  import { tmpdir } from 'node:os';
7
- import { join, relative } from 'node:path';
8
- import { readApprovedExecutionLaunchHintOutcome, readLatestPlanningArtifacts, } from '../artifacts.js';
9
- import { buildApprovedTeamExecutionBinding, buildApprovedTeamHandoffSection, } from '../../team/approved-execution.js';
6
+ import { join } from 'node:path';
7
+ import { readApprovedExecutionLaunchHint, readApprovedExecutionLaunchHintOutcome, readLatestPlanningArtifacts, } from '../artifacts.js';
8
+ import { buildApprovedTeamExecutionBinding, buildApprovedTeamHandoffSection, buildUltragoalCheckpointGuidance, } from '../../team/approved-execution.js';
10
9
  import { buildRalphAppendInstructions } from '../../cli/ralph.js';
11
10
  import { createTeamExecStage } from '../../pipeline/stages/team-exec.js';
12
- const LIFECYCLE_STATUSES = [
13
- 'missing-baseline',
14
- 'plan-only',
15
- 'incomplete',
16
- 'invalid',
17
- 'ready',
18
- ];
19
- const READY_ROLE_REFS = {
20
- scope: ['src/scope.ts'],
21
- build: ['src/build.ts'],
22
- verify: ['src/verify.ts'],
23
- };
24
11
  let tempDir;
25
- function computeGitBlobSha1(content) {
26
- const buffer = Buffer.from(content, 'utf-8');
27
- const header = Buffer.from(`blob ${buffer.length}\0`, 'utf-8');
28
- return createHash('sha1').update(header).update(buffer).digest('hex');
29
- }
30
- function relativeToRepo(path) {
31
- return relative(tempDir, path).replaceAll('\\', '/');
32
- }
33
- function canonicalContextPackRelativePath(slug) {
34
- return `.omx/context/context-20260507T120000Z-${slug}.json`;
35
- }
36
- function buildContextPackOutcome(relativePackPath) {
37
- return [
38
- '## Context Pack Outcome',
39
- '',
40
- `- pack: created \`${relativePackPath}\``,
41
- ].join('\n');
42
- }
43
- function decodeRuntimeCliInstructionPayload(instruction) {
44
- const match = instruction.match(/--input-json-base64\s+([A-Za-z0-9_-]+)/);
45
- assert.ok(match?.[1], 'expected --input-json-base64 payload');
46
- return JSON.parse(Buffer.from(match[1], 'base64url').toString('utf-8'));
47
- }
48
- function expectedMissingRoles(status) {
49
- return status === 'incomplete' ? ['build', 'verify'] : [];
50
- }
51
- function expectedContextPack(status, packPath) {
52
- if (status === 'incomplete' || status === 'invalid' || status === 'ready') {
53
- assert.ok(packPath, `expected pack path for ${status}`);
54
- return { path: packPath };
55
- }
56
- return null;
12
+ async function setup() {
13
+ tempDir = await mkdtemp(join(tmpdir(), 'omx-approved-lifecycle-baseline-'));
57
14
  }
58
- function assertResolvedOutcome(outcome, mode) {
59
- assert.equal(outcome.status, 'resolved');
60
- if (outcome.status !== 'resolved') {
61
- throw new Error(`expected resolved ${mode} approved-execution outcome`);
15
+ async function cleanup() {
16
+ if (tempDir && existsSync(tempDir)) {
17
+ await rm(tempDir, { recursive: true, force: true });
62
18
  }
63
- return outcome.hint;
64
19
  }
65
20
  function makeCtx(overrides = {}) {
66
21
  return {
@@ -70,230 +25,117 @@ function makeCtx(overrides = {}) {
70
25
  ...overrides,
71
26
  };
72
27
  }
73
- async function setup() {
74
- tempDir = await mkdtemp(join(tmpdir(), 'omx-approved-lifecycle-matrix-'));
75
- }
76
- async function cleanup() {
77
- if (tempDir && existsSync(tempDir)) {
78
- await rm(tempDir, { recursive: true, force: true });
79
- }
80
- }
81
- async function writeContextPack(slug, prdPath, testSpecPath, roles) {
82
- const contextDir = join(tempDir, '.omx', 'context');
83
- await mkdir(contextDir, { recursive: true });
84
- const packPath = join(tempDir, canonicalContextPackRelativePath(slug));
85
- const prdContent = await readFile(prdPath, 'utf-8');
86
- const testSpecContent = await readFile(testSpecPath, 'utf-8');
87
- await writeFile(packPath, JSON.stringify({
88
- slug,
89
- basis: {
90
- prd: {
91
- path: relativeToRepo(prdPath),
92
- sha1: computeGitBlobSha1(prdContent),
93
- },
94
- testSpecs: [{
95
- path: relativeToRepo(testSpecPath),
96
- sha1: computeGitBlobSha1(testSpecContent),
97
- }],
98
- },
99
- entries: roles.map((role) => ({
100
- path: `src/${role}.ts`,
101
- roles: [role],
102
- })),
103
- }, null, 2));
104
- return packPath;
105
- }
106
- async function writeLifecycleFixture(status) {
28
+ async function writePrd(slug, withTestSpec) {
107
29
  const plansDir = join(tempDir, '.omx', 'plans');
108
30
  await mkdir(plansDir, { recursive: true });
109
- const prdPath = join(plansDir, `prd-${status}.md`);
110
- const testSpecPath = status === 'missing-baseline'
111
- ? null
112
- : join(plansDir, `test-spec-${status}.md`);
113
- const teamTask = `Execute ${status} team handoff`;
114
- const teamCommand = `omx team 2:executor "${teamTask}"`;
115
- const ralphTask = status === 'ready' || status === 'plan-only'
116
- ? `Execute ${status} ralph handoff`
117
- : `Repair ${status} ralph handoff`;
118
- const ralphCommand = `omx ralph "${ralphTask}"`;
119
- const prdLines = [
120
- `# ${status}`,
31
+ const prdPath = join(plansDir, `prd-${slug}.md`);
32
+ const testSpecPath = join(plansDir, `test-spec-${slug}.md`);
33
+ const teamTask = `Execute ${slug} with team`;
34
+ const ralphTask = `Execute ${slug} with ralph`;
35
+ await writeFile(prdPath, [
36
+ `# ${slug}`,
121
37
  '',
122
- ];
123
- if (status === 'incomplete' || status === 'invalid' || status === 'ready') {
124
- prdLines.push(buildContextPackOutcome(canonicalContextPackRelativePath(status)), '');
125
- }
126
- prdLines.push(teamCommand, ralphCommand);
127
- await writeFile(prdPath, prdLines.join('\n'));
128
- if (testSpecPath) {
129
- await writeFile(testSpecPath, `# ${status} test spec\n`);
130
- }
131
- let packPath = null;
132
- if (status === 'incomplete') {
133
- if (!testSpecPath) {
134
- throw new Error('expected incomplete lifecycle fixture to include a test spec');
135
- }
136
- packPath = await writeContextPack(status, prdPath, testSpecPath, ['scope']);
137
- }
138
- if (status === 'invalid') {
139
- if (!testSpecPath) {
140
- throw new Error('expected invalid lifecycle fixture to include a test spec');
141
- }
142
- packPath = await writeContextPack(status, prdPath, testSpecPath, ['scope', 'build', 'verify']);
143
- await writeFile(testSpecPath, '# invalid drifted test spec\n');
144
- }
145
- if (status === 'ready') {
146
- if (!testSpecPath) {
147
- throw new Error('expected ready lifecycle fixture to include a test spec');
148
- }
149
- packPath = await writeContextPack(status, prdPath, testSpecPath, ['scope', 'build', 'verify']);
150
- }
151
- return {
152
- status,
153
- prdPath,
154
- testSpecPath,
155
- packPath,
156
- teamTask,
157
- teamCommand,
158
- ralphTask,
159
- ralphCommand,
160
- };
161
- }
162
- async function runTeamExecForPlan(prdPath) {
163
- const previousCwd = process.cwd();
164
- try {
165
- process.chdir(tmpdir());
166
- return await createTeamExecStage().run(makeCtx({
167
- artifacts: {
168
- ralplan: {
169
- task: 'original request task',
170
- stage: 'ralplan',
171
- latestPlanPath: relativeToRepo(prdPath),
172
- },
173
- },
174
- }));
175
- }
176
- finally {
177
- process.chdir(previousCwd);
38
+ `Launch via omx team 2:executor "${teamTask}"`,
39
+ `Launch via omx ralph "${ralphTask}"`,
40
+ ].join('\n'));
41
+ if (withTestSpec) {
42
+ await writeFile(testSpecPath, `# ${slug} test spec\n`);
178
43
  }
44
+ return { prdPath, testSpecPath, teamTask, ralphTask };
179
45
  }
180
- function assertRalphGuidance(status, instructions) {
181
- switch (status) {
182
- case 'missing-baseline':
183
- assert.match(instructions, /Missing-baseline fallback/i);
184
- assert.match(instructions, /restore the missing baseline before broadening context/i);
185
- assert.doesNotMatch(instructions, /build refs \(read first\)/i);
186
- return;
187
- case 'plan-only':
188
- assert.match(instructions, /Plan-only fallback/i);
189
- assert.match(instructions, /pre-context-pack plan-only handoff baseline/i);
190
- assert.doesNotMatch(instructions, /build refs \(read first\)/i);
191
- return;
192
- case 'incomplete':
193
- assert.match(instructions, /missing required context roles: build, verify/i);
194
- assert.match(instructions, /Incomplete-pack fallback:/i);
195
- assert.match(instructions, /repair or recreate the canonical context pack with required role coverage/i);
196
- assert.doesNotMatch(instructions, /build refs \(read first\)/i);
197
- return;
198
- case 'invalid':
199
- assert.match(instructions, /invalid context pack issues:/i);
200
- assert.match(instructions, /repair or recreate the canonical context pack/i);
201
- assert.doesNotMatch(instructions, /build refs \(read first\)/i);
202
- return;
203
- case 'ready':
204
- assert.match(instructions, /approved context pack: .*context-20260507T120000Z-ready\.json/i);
205
- assert.match(instructions, /build refs \(read first\): src\/build\.ts/i);
206
- assert.match(instructions, /Read the build refs above before broader repo exploration/i);
207
- assert.doesNotMatch(instructions, /Missing-baseline fallback/i);
208
- assert.doesNotMatch(instructions, /repair or recreate the canonical context pack/i);
209
- return;
210
- default:
211
- throw new Error(`unexpected lifecycle status ${status}`);
212
- }
213
- }
214
- function assertTeamExecOutcome(fixture, result) {
215
- const expectedBinding = {
216
- prd_path: fixture.prdPath,
217
- task: fixture.teamTask,
218
- command: fixture.teamCommand,
219
- };
220
- if (fixture.status === 'ready') {
221
- assert.equal(result.status, 'completed');
222
- const artifacts = result.artifacts;
223
- const descriptor = artifacts.teamDescriptor;
224
- const instruction = artifacts.instruction;
225
- const runtimeCliInput = decodeRuntimeCliInstructionPayload(instruction);
226
- assert.equal(descriptor.task, fixture.teamTask);
227
- assert.deepEqual(descriptor.approvedExecution, expectedBinding);
228
- assert.equal(runtimeCliInput.task, fixture.teamTask);
229
- assert.deepEqual(runtimeCliInput.approvedExecution, expectedBinding);
230
- return;
231
- }
232
- if (fixture.status === 'plan-only') {
46
+ describe('approved execution lifecycle baseline matrix', () => {
47
+ beforeEach(async () => { await setup(); });
48
+ afterEach(async () => { await cleanup(); });
49
+ it('keeps approved execution absent when the PRD has no matching test-spec baseline', async () => {
50
+ const fixture = await writePrd('missing-baseline', false);
51
+ const selection = readLatestPlanningArtifacts(tempDir);
52
+ assert.equal(selection.prdPath, fixture.prdPath);
53
+ assert.deepEqual(selection.testSpecPaths, []);
54
+ assert.equal(readApprovedExecutionLaunchHintOutcome(tempDir, 'team').status, 'absent');
55
+ assert.equal(readApprovedExecutionLaunchHintOutcome(tempDir, 'ralph').status, 'absent');
56
+ assert.equal(readApprovedExecutionLaunchHint(tempDir, 'team'), null);
57
+ assert.equal(readApprovedExecutionLaunchHint(tempDir, 'ralph'), null);
58
+ const result = await createTeamExecStage().run(makeCtx({ artifacts: { ralplan: { latestPlanPath: fixture.prdPath } } }));
59
+ assert.equal(result.status, 'failed');
60
+ assert.match(result.error ?? '', /team_exec_approved_handoff_missing/);
61
+ });
62
+ it('reuses approved execution only with an explicit PRD and matching test-spec baseline', async () => {
63
+ const fixture = await writePrd('ready-baseline', true);
64
+ const teamOutcome = readApprovedExecutionLaunchHintOutcome(tempDir, 'team');
65
+ assert.equal(teamOutcome.status, 'resolved');
66
+ if (teamOutcome.status !== 'resolved')
67
+ throw new Error('expected ready team hint');
68
+ assert.equal(teamOutcome.hint.sourcePath, fixture.prdPath);
69
+ assert.deepEqual(teamOutcome.hint.testSpecPaths, [fixture.testSpecPath]);
70
+ assert.equal(teamOutcome.hint.task, fixture.teamTask);
71
+ assert.deepEqual(buildApprovedTeamExecutionBinding(teamOutcome.hint), {
72
+ prd_path: fixture.prdPath,
73
+ task: fixture.teamTask,
74
+ command: `omx team 2:executor "${fixture.teamTask}"`,
75
+ });
76
+ assert.match(buildApprovedTeamHandoffSection(teamOutcome.hint) ?? '', /approved plan/i);
77
+ assert.match(buildApprovedTeamHandoffSection(teamOutcome.hint) ?? '', /matching test specs|Test specs/);
78
+ const ralphOutcome = readApprovedExecutionLaunchHintOutcome(tempDir, 'ralph');
79
+ assert.equal(ralphOutcome.status, 'resolved');
80
+ if (ralphOutcome.status !== 'resolved')
81
+ throw new Error('expected ready ralph hint');
82
+ const instructions = buildRalphAppendInstructions(fixture.ralphTask, {
83
+ changedFilesPath: '.omx/ralph/changed-files.txt',
84
+ noDeslop: false,
85
+ approvedHint: ralphOutcome.hint,
86
+ });
87
+ assert.match(instructions, /Approved execution baseline is ready/);
88
+ assert.doesNotMatch(instructions, /context pack/i);
89
+ const result = await createTeamExecStage().run(makeCtx({ artifacts: { ralplan: { latestPlanPath: fixture.prdPath } } }));
233
90
  assert.equal(result.status, 'completed');
234
91
  const artifacts = result.artifacts;
235
92
  const descriptor = artifacts.teamDescriptor;
236
- const instruction = artifacts.instruction;
237
- const runtimeCliInput = decodeRuntimeCliInstructionPayload(instruction);
238
- assert.equal(descriptor.task, fixture.teamTask);
239
- assert.equal(descriptor.approvedExecution, null);
240
- assert.equal(runtimeCliInput.task, fixture.teamTask);
241
- assert.equal(runtimeCliInput.approvedExecution, null);
242
- return;
243
- }
244
- assert.equal(result.status, 'failed');
245
- assert.match(result.error ?? '', new RegExp(`team_exec_approved_handoff_nonready:${fixture.status}:.*prd-${fixture.status}\\.md`));
246
- assert.deepEqual(result.artifacts, {});
247
- }
248
- describe('approved execution lifecycle matrix', () => {
249
- beforeEach(async () => { await setup(); });
250
- afterEach(async () => { await cleanup(); });
251
- for (const status of LIFECYCLE_STATUSES) {
252
- it(`proves ${status} behavior across planning, Ralph, Team, and pipeline boundaries`, async () => {
253
- const fixture = await writeLifecycleFixture(status);
254
- const selection = readLatestPlanningArtifacts(tempDir);
255
- assert.equal(selection.prdPath, fixture.prdPath);
256
- assert.equal(selection.contextPackStatus, status);
257
- assert.deepEqual(selection.contextPack, expectedContextPack(status, fixture.packPath));
258
- assert.deepEqual(selection.contextPackRoleRefs, status === 'ready' ? READY_ROLE_REFS : null);
259
- assert.deepEqual(selection.missingRequiredContextPackRoles, expectedMissingRoles(status));
260
- const teamHint = assertResolvedOutcome(readApprovedExecutionLaunchHintOutcome(tempDir, 'team'), 'team');
261
- assert.equal(teamHint.sourcePath, fixture.prdPath);
262
- assert.equal(teamHint.task, fixture.teamTask);
263
- assert.equal(teamHint.command, fixture.teamCommand);
264
- assert.equal(teamHint.contextPackStatus, status);
265
- assert.deepEqual(teamHint.contextPack, expectedContextPack(status, fixture.packPath));
266
- assert.deepEqual(teamHint.contextPackRoleRefs, status === 'ready' ? READY_ROLE_REFS : null);
267
- assert.deepEqual(teamHint.missingRequiredContextPackRoles, expectedMissingRoles(status));
268
- const ralphHint = assertResolvedOutcome(readApprovedExecutionLaunchHintOutcome(tempDir, 'ralph'), 'ralph');
269
- assert.equal(ralphHint.sourcePath, fixture.prdPath);
270
- assert.equal(ralphHint.task, fixture.ralphTask);
271
- assert.equal(ralphHint.command, fixture.ralphCommand);
272
- assert.equal(ralphHint.contextPackStatus, status);
273
- assert.deepEqual(ralphHint.contextPack, expectedContextPack(status, fixture.packPath));
274
- assert.deepEqual(ralphHint.contextPackRoleRefs, status === 'ready' ? READY_ROLE_REFS : null);
275
- assert.deepEqual(ralphHint.missingRequiredContextPackRoles, expectedMissingRoles(status));
276
- if (status === 'ready') {
277
- assert.deepEqual(buildApprovedTeamExecutionBinding(teamHint), {
278
- prd_path: fixture.prdPath,
279
- task: fixture.teamTask,
280
- command: fixture.teamCommand,
281
- });
282
- assert.match(buildApprovedTeamHandoffSection(teamHint) ?? '', /Build refs \(read first\): src\/build\.ts/);
283
- }
284
- else {
285
- assert.equal(buildApprovedTeamHandoffSection(teamHint), undefined);
286
- }
287
- const instructions = buildRalphAppendInstructions(fixture.ralphTask, {
288
- changedFilesPath: '.omx/ralph/changed-files.txt',
289
- noDeslop: false,
290
- approvedHint: ralphHint,
291
- });
292
- assertRalphGuidance(status, instructions);
293
- const result = await runTeamExecForPlan(fixture.prdPath);
294
- assertTeamExecOutcome(fixture, result);
93
+ assert.deepEqual(descriptor.approvedExecution, {
94
+ prd_path: fixture.prdPath,
95
+ task: fixture.teamTask,
96
+ command: `omx team 2:executor "${fixture.teamTask}"`,
295
97
  });
296
- }
98
+ });
99
+ it('adds leader-owned Ultragoal checkpoint context to approved Team handoffs without breaking launch hint selection', async () => {
100
+ const plansDir = join(tempDir, '.omx', 'plans');
101
+ await mkdir(plansDir, { recursive: true });
102
+ const prdPath = join(plansDir, 'prd-ultragoal-team.md');
103
+ const testSpecPath = join(plansDir, 'test-spec-ultragoal-team.md');
104
+ const teamTask = 'Use Team + Ultragoal together for G001-team-runtime-bridge';
105
+ await writeFile(prdPath, [
106
+ '# Ultragoal Team bridge',
107
+ '',
108
+ 'Active ultragoal story: G001-team-runtime-bridge in .omx/ultragoal/goals.json.',
109
+ 'Team returns evidence for .omx/ultragoal/ledger.jsonl; the leader checkpoints with a fresh get_goal snapshot.',
110
+ '',
111
+ `Launch via omx team 3:executor "${teamTask}"`,
112
+ 'Use Ralph only for a later sequential single-owner verification/fix loop.',
113
+ ].join('\n'));
114
+ await writeFile(testSpecPath, '# Ultragoal Team bridge test spec\n');
115
+ const teamOutcome = readApprovedExecutionLaunchHintOutcome(tempDir, 'team', {
116
+ prdPath,
117
+ task: teamTask,
118
+ });
119
+ assert.equal(teamOutcome.status, 'resolved');
120
+ if (teamOutcome.status !== 'resolved')
121
+ throw new Error('expected ultragoal team hint');
122
+ const guidance = buildUltragoalCheckpointGuidance(teamOutcome.hint);
123
+ assert.equal(guidance?.goal_id, 'G001-team-runtime-bridge');
124
+ assert.equal(guidance?.checkpoint_policy, 'fresh_leader_get_goal_required');
125
+ assert.match(guidance?.checkpoint_command_template ?? '', /verified \.omx\/ultragoal\/goals\.json context/);
126
+ const section = buildApprovedTeamHandoffSection(teamOutcome.hint) ?? '';
127
+ assert.match(section, /Approved-plan Ultragoal hint/);
128
+ assert.match(section, /\.omx\/ultragoal\/goals\.json/);
129
+ assert.match(section, /\.omx\/ultragoal\/ledger\.jsonl/);
130
+ assert.match(section, /Team workers provide task\/evidence updates only/i);
131
+ assert.match(section, /No checkpoint command is emitted from approved-plan hints/i);
132
+ assert.doesNotMatch(section, /omx ultragoal checkpoint --goal-id/i);
133
+ assert.doesNotMatch(section, /auto[- ]launch.*team/i);
134
+ const ralphOutcome = readApprovedExecutionLaunchHintOutcome(tempDir, 'ralph', {
135
+ prdPath,
136
+ });
137
+ assert.equal(ralphOutcome.status, 'absent');
138
+ });
297
139
  it('keeps same-task team selector outcomes fail-closed when launch hints are ambiguous', async () => {
298
140
  const plansDir = join(tempDir, '.omx', 'plans');
299
141
  await mkdir(plansDir, { recursive: true });
@@ -1 +1 @@
1
- {"version":3,"file":"approved-execution-lifecycle-matrix.test.js","sourceRoot":"","sources":["../../../src/planning/__tests__/approved-execution-lifecycle-matrix.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAChE,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC3C,OAAO,EACL,sCAAsC,EACtC,2BAA2B,GAC5B,MAAM,iBAAiB,CAAC;AACzB,OAAO,EACL,iCAAiC,EACjC,+BAA+B,GAChC,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,4BAA4B,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAuBzE,MAAM,kBAAkB,GAA+B;IACrD,kBAAkB;IAClB,WAAW;IACX,YAAY;IACZ,SAAS;IACT,OAAO;CACR,CAAC;AAEF,MAAM,eAAe,GAAG;IACtB,KAAK,EAAE,CAAC,cAAc,CAAC;IACvB,KAAK,EAAE,CAAC,cAAc,CAAC;IACvB,MAAM,EAAE,CAAC,eAAe,CAAC;CAC1B,CAAC;AAEF,IAAI,OAAe,CAAC;AAEpB,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,MAAM,CAAC,MAAM,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,cAAc,CAAC,IAAY;IAClC,OAAO,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACvD,CAAC;AAED,SAAS,gCAAgC,CAAC,IAAY;IACpD,OAAO,yCAAyC,IAAI,OAAO,CAAC;AAC9D,CAAC;AAED,SAAS,uBAAuB,CAAC,gBAAwB;IACvD,OAAO;QACL,yBAAyB;QACzB,EAAE;QACF,qBAAqB,gBAAgB,IAAI;KAC1C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED,SAAS,kCAAkC,CAAC,WAAmB;IAC7D,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC1E,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,sCAAsC,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,CAA4B,CAAC;AACrG,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAuB;IACnD,OAAO,MAAM,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;AAC5D,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAuB,EAAE,QAAuB;IAC3E,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC1E,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,0BAA0B,MAAM,EAAE,CAAC,CAAC;QACxD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAkE,EAClE,IAAsB;IAEtB,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;IACzC,IAAI,OAAO,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,qBAAqB,IAAI,6BAA6B,CAAC,CAAC;IAC1E,CAAC;IACD,OAAO,OAAO,CAAC,IAAI,CAAC;AACtB,CAAC;AAED,SAAS,OAAO,CAAC,YAAmC,EAAE;IACpD,OAAO;QACL,IAAI,EAAE,uBAAuB;QAC7B,SAAS,EAAE,EAAE;QACb,GAAG,EAAE,OAAO;QACZ,GAAG,SAAS;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,KAAK;IAClB,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,gCAAgC,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,KAAK,UAAU,OAAO;IACpB,IAAI,OAAO,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED,KAAK,UAAU,gBAAgB,CAC7B,IAAY,EACZ,OAAe,EACf,YAAoB,EACpB,KAAiC;IAEjC,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;IACpD,MAAM,KAAK,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,gCAAgC,CAAC,IAAI,CAAC,CAAC,CAAC;IACvE,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACpD,MAAM,eAAe,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IAC9D,MAAM,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC;QACvC,IAAI;QACJ,KAAK,EAAE;YACL,GAAG,EAAE;gBACH,IAAI,EAAE,cAAc,CAAC,OAAO,CAAC;gBAC7B,IAAI,EAAE,kBAAkB,CAAC,UAAU,CAAC;aACrC;YACD,SAAS,EAAE,CAAC;oBACV,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC;oBAClC,IAAI,EAAE,kBAAkB,CAAC,eAAe,CAAC;iBAC1C,CAAC;SACH;QACD,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YAC5B,IAAI,EAAE,OAAO,IAAI,KAAK;YACtB,KAAK,EAAE,CAAC,IAAI,CAAC;SACd,CAAC,CAAC;KACJ,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACb,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,KAAK,UAAU,qBAAqB,CAAC,MAAuB;IAC1D,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,OAAO,MAAM,KAAK,CAAC,CAAC;IACnD,MAAM,YAAY,GAAG,MAAM,KAAK,kBAAkB;QAChD,CAAC,CAAC,IAAI;QACN,CAAC,CAAC,IAAI,CAAC,QAAQ,EAAE,aAAa,MAAM,KAAK,CAAC,CAAC;IAC7C,MAAM,QAAQ,GAAG,WAAW,MAAM,eAAe,CAAC;IAClD,MAAM,WAAW,GAAG,wBAAwB,QAAQ,GAAG,CAAC;IACxD,MAAM,SAAS,GAAG,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,WAAW;QAC5D,CAAC,CAAC,WAAW,MAAM,gBAAgB;QACnC,CAAC,CAAC,UAAU,MAAM,gBAAgB,CAAC;IACrC,MAAM,YAAY,GAAG,cAAc,SAAS,GAAG,CAAC;IAEhD,MAAM,QAAQ,GAAG;QACf,KAAK,MAAM,EAAE;QACb,EAAE;KACH,CAAC;IACF,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QAC1E,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,gCAAgC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvF,CAAC;IACD,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAE9C,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,SAAS,CAAC,YAAY,EAAE,KAAK,MAAM,cAAc,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,QAAQ,GAAkB,IAAI,CAAC;IACnC,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QACD,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9E,CAAC;IACD,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,2DAA2D,CAAC,CAAC;QAC/E,CAAC;QACD,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/F,MAAM,SAAS,CAAC,YAAY,EAAE,+BAA+B,CAAC,CAAC;IACjE,CAAC;IACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;QAC7E,CAAC;QACD,QAAQ,GAAG,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACjG,CAAC;IAED,OAAO;QACL,MAAM;QACN,OAAO;QACP,YAAY;QACZ,QAAQ;QACR,QAAQ;QACR,WAAW;QACX,SAAS;QACT,YAAY;KACb,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,OAAe;IAC/C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAClC,IAAI,CAAC;QACH,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACxB,OAAO,MAAM,mBAAmB,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7C,SAAS,EAAE;gBACT,OAAO,EAAE;oBACP,IAAI,EAAE,uBAAuB;oBAC7B,KAAK,EAAE,SAAS;oBAChB,cAAc,EAAE,cAAc,CAAC,OAAO,CAAC;iBACxC;aACF;SACF,CAAC,CAAC,CAAC;IACN,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAAC,MAAuB,EAAE,YAAoB;IACxE,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,kBAAkB;YACrB,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,yDAAyD,CAAC,CAAC;YACtF,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,OAAO;QACT,KAAK,WAAW;YACd,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,qBAAqB,CAAC,CAAC;YAClD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,8CAA8C,CAAC,CAAC;YAC3E,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,OAAO;QACT,KAAK,YAAY;YACf,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,gDAAgD,CAAC,CAAC;YAC7E,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YACzD,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4EAA4E,CAAC,CAAC;YACzG,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,OAAO;QACT,KAAK,SAAS;YACZ,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,+BAA+B,CAAC,CAAC;YAC5D,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,gDAAgD,CAAC,CAAC;YAC7E,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,OAAO;QACT,KAAK,OAAO;YACV,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,gEAAgE,CAAC,CAAC;YAC7F,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4CAA4C,CAAC,CAAC;YACzE,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,4DAA4D,CAAC,CAAC;YACzF,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,4BAA4B,CAAC,CAAC;YAChE,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,gDAAgD,CAAC,CAAC;YACpF,OAAO;QACT;YACE,MAAM,IAAI,KAAK,CAAC,+BAA+B,MAAM,EAAE,CAAC,CAAC;IAC7D,CAAC;AACH,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,MAA0E;IAE1E,MAAM,eAAe,GAAG;QACtB,QAAQ,EAAE,OAAO,CAAC,OAAO;QACzB,IAAI,EAAE,OAAO,CAAC,QAAQ;QACtB,OAAO,EAAE,OAAO,CAAC,WAAW;KAC7B,CAAC;IAEF,IAAI,OAAO,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAoC,CAAC;QAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,cAAyC,CAAC;QACvE,MAAM,WAAW,GAAG,SAAS,CAAC,WAAqB,CAAC;QACpD,MAAM,eAAe,GAAG,kCAAkC,CAAC,WAAW,CAAC,CAAC;QAExE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QAChE,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,iBAAiB,EAAE,eAAe,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QACzC,MAAM,SAAS,GAAG,MAAM,CAAC,SAAoC,CAAC;QAC9D,MAAM,UAAU,GAAG,SAAS,CAAC,cAAyC,CAAC;QACvE,MAAM,WAAW,GAAG,SAAS,CAAC,WAAqB,CAAC;QACpD,MAAM,eAAe,GAAG,kCAAkC,CAAC,WAAW,CAAC,CAAC;QAExE,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAChD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACjD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QACtD,OAAO;IACT,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACtC,MAAM,CAAC,KAAK,CACV,MAAM,CAAC,KAAK,IAAI,EAAE,EAClB,IAAI,MAAM,CAAC,uCAAuC,OAAO,CAAC,MAAM,UAAU,OAAO,CAAC,MAAM,OAAO,CAAC,CACjG,CAAC;IACF,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,UAAU,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3C,SAAS,CAAC,KAAK,IAAI,EAAE,GAAG,MAAM,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAE5C,KAAK,MAAM,MAAM,IAAI,kBAAkB,EAAE,CAAC;QACxC,EAAE,CAAC,UAAU,MAAM,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/F,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,MAAM,CAAC,CAAC;YACpD,MAAM,SAAS,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;YACvD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACjD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvF,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7F,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE1F,MAAM,QAAQ,GAAG,qBAAqB,CACpC,sCAAsC,CAAC,OAAO,EAAE,MAAM,CAAC,EACvD,MAAM,CACP,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC9C,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YACjD,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACtF,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC5F,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;YAEzF,MAAM,SAAS,GAAG,qBAAqB,CACrC,sCAAsC,CAAC,OAAO,EAAE,OAAO,CAAC,EACxD,OAAO,CACR,CAAC;YACF,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,UAAU,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;YACpD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAChD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YACtD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;YAClD,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,EAAE,mBAAmB,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;YACvF,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,mBAAmB,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC7F,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,+BAA+B,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC;YAE1F,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,CAAC,SAAS,CAAC,iCAAiC,CAAC,QAAQ,CAAC,EAAE;oBAC5D,QAAQ,EAAE,OAAO,CAAC,OAAO;oBACzB,IAAI,EAAE,OAAO,CAAC,QAAQ;oBACtB,OAAO,EAAE,OAAO,CAAC,WAAW;iBAC7B,CAAC,CAAC;gBACH,MAAM,CAAC,KAAK,CACV,+BAA+B,CAAC,QAAQ,CAAC,IAAI,EAAE,EAC/C,2CAA2C,CAC5C,CAAC;YACJ,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,KAAK,CAAC,+BAA+B,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC,CAAC;YACrE,CAAC;YAED,MAAM,YAAY,GAAG,4BAA4B,CAAC,OAAO,CAAC,SAAS,EAAE;gBACnE,gBAAgB,EAAE,8BAA8B;gBAChD,QAAQ,EAAE,KAAK;gBACf,YAAY,EAAE,SAAS;aACxB,CAAC,CAAC;YACH,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;YAE1C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACzD,qBAAqB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,EAAE,CAAC,oFAAoF,EAAE,KAAK,IAAI,EAAE;QAClG,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;QAChD,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;QACxD,MAAM,UAAU,GAAG,gCAAgC,CAAC;QACpD,MAAM,SAAS,CACb,OAAO,EACP;YACE,kBAAkB;YAClB,EAAE;YACF,mCAAmC,UAAU,GAAG;YAChD,mCAAmC,UAAU,GAAG;SACjD,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;QACF,MAAM,SAAS,CAAC,IAAI,CAAC,QAAQ,EAAE,6BAA6B,CAAC,EAAE,8BAA8B,CAAC,CAAC;QAE/F,MAAM,OAAO,GAAG,sCAAsC,CAAC,OAAO,EAAE,MAAM,EAAE;YACtE,OAAO;YACP,IAAI,EAAE,UAAU;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"approved-execution-lifecycle-matrix.test.js","sourceRoot":"","sources":["../../../src/planning/__tests__/approved-execution-lifecycle-matrix.test.ts"],"names":[],"mappings":"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"}
@@ -133,77 +133,49 @@ function selectUniqueHint(visibleHints, query, signatureFilter) {
133
133
  }
134
134
  return { status: 'unique', hint: matches[0] };
135
135
  }
136
+ function reusableRalphHints(state) {
137
+ return ralphVisibleHints(state).filter((hint) => hint.ready);
138
+ }
136
139
  function resolveExpectedRalphSelection(stems, states, query) {
137
- const newestNonready = [];
138
140
  if (!query.task && !query.command) {
139
141
  const latestIndex = states.length - 1;
140
- const latestSelection = selectUniqueHint(ralphVisibleHints(states[latestIndex]), query);
142
+ const latestSelection = selectUniqueHint(reusableRalphHints(states[latestIndex]), query);
141
143
  if (latestSelection.status === 'ambiguous') {
142
144
  return { status: 'ambiguous' };
143
145
  }
144
- if (latestSelection.status !== 'unique') {
145
- return { status: 'absent' };
146
- }
147
- if (latestSelection.hint.ready) {
148
- return { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint };
149
- }
150
- for (let index = latestIndex - 1; index >= 0; index -= 1) {
151
- const selection = selectUniqueHint(ralphVisibleHints(states[index]), { task: latestSelection.hint.task });
152
- if (selection.status === 'ambiguous') {
153
- return { status: 'ambiguous' };
154
- }
155
- if (selection.status === 'unique' && selection.hint.ready) {
156
- return { status: 'resolved', stem: stems[index], hint: selection.hint };
157
- }
158
- }
159
- return { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint };
146
+ return latestSelection.status === 'unique'
147
+ ? { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint }
148
+ : { status: 'absent' };
160
149
  }
161
150
  for (let index = states.length - 1; index >= 0; index -= 1) {
162
- const selection = selectUniqueHint(ralphVisibleHints(states[index]), query);
151
+ const selection = selectUniqueHint(reusableRalphHints(states[index]), query);
163
152
  if (selection.status === 'ambiguous') {
164
153
  return { status: 'ambiguous' };
165
154
  }
166
- if (selection.status !== 'unique') {
167
- continue;
168
- }
169
- if (selection.hint.ready) {
155
+ if (selection.status === 'unique') {
170
156
  return { status: 'resolved', stem: stems[index], hint: selection.hint };
171
157
  }
172
- newestNonready.push({ stem: stems[index], hint: selection.hint });
173
158
  }
174
- return newestNonready.length > 0
175
- ? { status: 'resolved', stem: newestNonready[0].stem, hint: newestNonready[0].hint }
176
- : { status: 'absent' };
159
+ return { status: 'absent' };
160
+ }
161
+ function reusableTeamHints(state) {
162
+ return teamVisibleHints(state).filter((hint) => hint.ready);
177
163
  }
178
164
  function resolveExpectedTeamSelection(stems, states, query) {
179
165
  const requestedSignature = query.command ? undefined : query.signature;
180
166
  if (!query.task && !query.command) {
181
167
  const latestIndex = states.length - 1;
182
- const latestSelection = selectUniqueHint(teamVisibleHints(states[latestIndex]), query, requestedSignature);
168
+ const latestSelection = selectUniqueHint(reusableTeamHints(states[latestIndex]), query, requestedSignature);
183
169
  if (latestSelection.status === 'ambiguous') {
184
170
  return { status: 'ambiguous' };
185
171
  }
186
- if (latestSelection.status !== 'unique') {
187
- return { status: 'absent' };
188
- }
189
- if (latestSelection.hint.ready) {
190
- return { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint };
191
- }
192
- for (let index = latestIndex - 1; index >= 0; index -= 1) {
193
- const selection = selectUniqueHint(teamVisibleHints(states[index]), { task: latestSelection.hint.task }, latestSelection.hint.signature);
194
- if (selection.status === 'ambiguous') {
195
- return { status: 'ambiguous' };
196
- }
197
- if (selection.status === 'unique' && selection.hint.ready) {
198
- return { status: 'resolved', stem: stems[index], hint: selection.hint };
199
- }
200
- }
201
- return { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint };
172
+ return latestSelection.status === 'unique'
173
+ ? { status: 'resolved', stem: stems[latestIndex], hint: latestSelection.hint }
174
+ : { status: 'absent' };
202
175
  }
203
- let newestNonready = null;
204
176
  let lineageSignature = null;
205
177
  for (let index = states.length - 1; index >= 0; index -= 1) {
206
- const selection = selectUniqueHint(teamVisibleHints(states[index]), query, requestedSignature ?? (query.task && !query.command
178
+ const selection = selectUniqueHint(reusableTeamHints(states[index]), query, requestedSignature ?? (query.task && !query.command
207
179
  ? lineageSignature ?? undefined
208
180
  : undefined));
209
181
  if (selection.status === 'ambiguous') {
@@ -215,14 +187,9 @@ function resolveExpectedTeamSelection(stems, states, query) {
215
187
  if (query.task && !query.command) {
216
188
  lineageSignature ??= selection.hint.signature ?? null;
217
189
  }
218
- if (selection.hint.ready) {
219
- return { status: 'resolved', stem: stems[index], hint: selection.hint };
220
- }
221
- newestNonready ??= { stem: stems[index], hint: selection.hint };
190
+ return { status: 'resolved', stem: stems[index], hint: selection.hint };
222
191
  }
223
- return newestNonready
224
- ? { status: 'resolved', stem: newestNonready.stem, hint: newestNonready.hint }
225
- : { status: 'absent' };
192
+ return { status: 'absent' };
226
193
  }
227
194
  function ralphQueryModel(kind) {
228
195
  switch (kind) {
@@ -374,7 +341,7 @@ function assertExpectedSelection(cwd, label, mode, options, expected) {
374
341
  }
375
342
  assert.equal(outcome.hint.sourcePath, planPath(cwd, expected.stem), `${label}: unexpected selected PRD`);
376
343
  assert.equal(outcome.hint.command, expected.hint?.command, `${label}: unexpected selected command`);
377
- assert.equal(outcome.hint.contextPackStatus, expected.hint?.ready ? 'plan-only' : 'missing-baseline', `${label}: unexpected readiness state`);
344
+ assert.deepEqual(outcome.hint.testSpecPaths.length > 0, true, `${label}: unexpected baseline readiness`);
378
345
  if (mode === 'team') {
379
346
  assert.equal(outcome.hint.workerCount, expected.hint?.signature === 'A' ? 3 : 5, `${label}: unexpected worker count`);
380
347
  assert.equal(outcome.hint.agentType, expected.hint?.signature === 'A' ? 'executor' : 'debugger', `${label}: unexpected agent type`);
@@ -443,38 +410,30 @@ describe('approved launch hint lineage matrix', () => {
443
410
  }
444
411
  }
445
412
  });
446
- it('skips newer nonready siblings until the last reusable visible Ralph lineage handoff', async () => {
413
+ it('treats newer no-baseline Ralph siblings as absent for bare lookups', async () => {
447
414
  const cwd = join(tempDir, 'ralph-three-plan-skip');
448
415
  await writeRalphScenario(cwd, ['ready', 'nonready', 'nonready']);
449
- assertExpectedSelection(cwd, 'ralph three-plan skip', 'ralph', {}, {
450
- status: 'resolved',
451
- stem: 'alpha',
452
- hint: { command: RALPH_COMMAND, task: RALPH_SHARED_TASK, ready: true },
453
- });
416
+ assertExpectedSelection(cwd, 'ralph three-plan no-baseline bare', 'ralph', {}, { status: 'absent' });
454
417
  });
455
- it('stops on same-lineage ambiguity before reviving an older Team handoff', async () => {
418
+ it('counts same-lineage ambiguity only among baseline-ready Team candidates', async () => {
456
419
  const cwd = join(tempDir, 'team-three-plan-ambiguous');
457
420
  await writeTeamScenario(cwd, ['readyA', 'nonreadyAA', 'nonreadyA']);
458
- assertExpectedSelection(cwd, 'team three-plan ambiguity', 'team', { task: TEAM_SHARED_TASK }, { status: 'ambiguous' });
421
+ assertExpectedSelection(cwd, 'team three-plan baseline-only ambiguity', 'team', { task: TEAM_SHARED_TASK }, {
422
+ status: 'resolved',
423
+ stem: 'alpha',
424
+ hint: { command: TEAM_COMMANDS.A, task: TEAM_SHARED_TASK, ready: true, signature: 'A' },
425
+ });
459
426
  });
460
427
  it('keeps hidden lineage candidates invisible even for exact-command lookups', async () => {
461
428
  {
462
429
  const cwd = join(tempDir, 'ralph-hidden-command');
463
430
  await writeRalphScenario(cwd, ['hidden', 'nonready']);
464
- assertExpectedSelection(cwd, 'ralph hidden exact command', 'ralph', ralphQueryOptions('command'), {
465
- status: 'resolved',
466
- stem: 'beta',
467
- hint: { command: RALPH_COMMAND, task: RALPH_SHARED_TASK, ready: false },
468
- });
431
+ assertExpectedSelection(cwd, 'ralph hidden exact command', 'ralph', ralphQueryOptions('command'), { status: 'absent' });
469
432
  }
470
433
  {
471
434
  const cwd = join(tempDir, 'team-hidden-command');
472
435
  await writeTeamScenario(cwd, ['hiddenA', 'nonreadyA']);
473
- assertExpectedSelection(cwd, 'team hidden exact command', 'team', teamQueryOptions('commandA'), {
474
- status: 'resolved',
475
- stem: 'beta',
476
- hint: { command: TEAM_COMMANDS.A, task: TEAM_SHARED_TASK, ready: false, signature: 'A' },
477
- });
436
+ assertExpectedSelection(cwd, 'team hidden exact command', 'team', teamQueryOptions('commandA'), { status: 'absent' });
478
437
  }
479
438
  });
480
439
  });