oh-my-codex 0.18.9 → 0.18.10
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.
- package/Cargo.lock +6 -6
- package/Cargo.toml +1 -1
- package/README.md +4 -0
- package/dist/autopilot/__tests__/deep-interview-gate.test.d.ts +2 -0
- package/dist/autopilot/__tests__/deep-interview-gate.test.d.ts.map +1 -0
- package/dist/autopilot/__tests__/deep-interview-gate.test.js +215 -0
- package/dist/autopilot/__tests__/deep-interview-gate.test.js.map +1 -0
- package/dist/autopilot/__tests__/ralplan-gate.test.js +148 -0
- package/dist/autopilot/__tests__/ralplan-gate.test.js.map +1 -1
- package/dist/autopilot/deep-interview-gate.d.ts.map +1 -1
- package/dist/autopilot/deep-interview-gate.js +140 -0
- package/dist/autopilot/deep-interview-gate.js.map +1 -1
- package/dist/cli/__tests__/auth.test.js +36 -3
- package/dist/cli/__tests__/auth.test.js.map +1 -1
- package/dist/cli/__tests__/codex-feature-probe.test.d.ts +2 -0
- package/dist/cli/__tests__/codex-feature-probe.test.d.ts.map +1 -0
- package/dist/cli/__tests__/codex-feature-probe.test.js +46 -0
- package/dist/cli/__tests__/codex-feature-probe.test.js.map +1 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js +2 -0
- package/dist/cli/__tests__/doctor-warning-copy.test.js.map +1 -1
- package/dist/cli/__tests__/index.test.js +251 -5
- package/dist/cli/__tests__/index.test.js.map +1 -1
- package/dist/cli/__tests__/launch-fallback.test.js +19 -5
- package/dist/cli/__tests__/launch-fallback.test.js.map +1 -1
- package/dist/cli/__tests__/package-bin-contract.test.js +19 -6
- package/dist/cli/__tests__/package-bin-contract.test.js.map +1 -1
- package/dist/cli/__tests__/setup-refresh.test.js +6 -2
- package/dist/cli/__tests__/setup-refresh.test.js.map +1 -1
- package/dist/cli/__tests__/sparkshell-packaging.test.js +45 -2
- package/dist/cli/__tests__/sparkshell-packaging.test.js.map +1 -1
- package/dist/cli/__tests__/team-decompose.test.js +10 -5
- package/dist/cli/__tests__/team-decompose.test.js.map +1 -1
- package/dist/cli/__tests__/team.test.js +45 -1
- package/dist/cli/__tests__/team.test.js.map +1 -1
- package/dist/cli/__tests__/ultragoal.test.js +75 -0
- package/dist/cli/__tests__/ultragoal.test.js.map +1 -1
- package/dist/cli/auth.d.ts.map +1 -1
- package/dist/cli/auth.js +25 -1
- package/dist/cli/auth.js.map +1 -1
- package/dist/cli/codex-feature-probe.d.ts +5 -2
- package/dist/cli/codex-feature-probe.d.ts.map +1 -1
- package/dist/cli/codex-feature-probe.js +25 -9
- package/dist/cli/codex-feature-probe.js.map +1 -1
- package/dist/cli/index.d.ts +28 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +149 -88
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/setup.d.ts.map +1 -1
- package/dist/cli/setup.js +9 -1
- package/dist/cli/setup.js.map +1 -1
- package/dist/cli/team.d.ts +4 -0
- package/dist/cli/team.d.ts.map +1 -1
- package/dist/cli/team.js +43 -4
- package/dist/cli/team.js.map +1 -1
- package/dist/cli/ultragoal.d.ts.map +1 -1
- package/dist/cli/ultragoal.js +29 -0
- package/dist/cli/ultragoal.js.map +1 -1
- package/dist/hooks/__tests__/agents-overlay.test.js +1 -0
- package/dist/hooks/__tests__/agents-overlay.test.js.map +1 -1
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js +15 -0
- package/dist/hooks/__tests__/autopilot-skill-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/deep-interview-contract.test.js +16 -0
- package/dist/hooks/__tests__/deep-interview-contract.test.js.map +1 -1
- package/dist/hooks/__tests__/skill-guidance-contract.test.js +14 -5
- package/dist/hooks/__tests__/skill-guidance-contract.test.js.map +1 -1
- package/dist/hooks/agents-overlay.d.ts.map +1 -1
- package/dist/hooks/agents-overlay.js +2 -1
- package/dist/hooks/agents-overlay.js.map +1 -1
- package/dist/hooks/extensibility/__tests__/plugin-runner.test.js +112 -1
- package/dist/hooks/extensibility/__tests__/plugin-runner.test.js.map +1 -1
- package/dist/hooks/extensibility/plugin-runner-stdin.d.ts +2 -0
- package/dist/hooks/extensibility/plugin-runner-stdin.d.ts.map +1 -0
- package/dist/hooks/extensibility/plugin-runner-stdin.js +16 -0
- package/dist/hooks/extensibility/plugin-runner-stdin.js.map +1 -0
- package/dist/hooks/extensibility/plugin-runner.js +2 -4
- package/dist/hooks/extensibility/plugin-runner.js.map +1 -1
- package/dist/hud/__tests__/index.test.js +23 -2
- package/dist/hud/__tests__/index.test.js.map +1 -1
- package/dist/hud/__tests__/reconcile.test.js +266 -0
- package/dist/hud/__tests__/reconcile.test.js.map +1 -1
- package/dist/hud/__tests__/tmux.test.js +118 -7
- package/dist/hud/__tests__/tmux.test.js.map +1 -1
- package/dist/hud/index.d.ts +6 -1
- package/dist/hud/index.d.ts.map +1 -1
- package/dist/hud/index.js +12 -3
- package/dist/hud/index.js.map +1 -1
- package/dist/hud/reconcile.d.ts +6 -2
- package/dist/hud/reconcile.d.ts.map +1 -1
- package/dist/hud/reconcile.js +58 -28
- package/dist/hud/reconcile.js.map +1 -1
- package/dist/hud/tmux.d.ts +14 -1
- package/dist/hud/tmux.d.ts.map +1 -1
- package/dist/hud/tmux.js +129 -15
- package/dist/hud/tmux.js.map +1 -1
- package/dist/ralplan/consensus-gate.js +9 -1
- package/dist/ralplan/consensus-gate.js.map +1 -1
- package/dist/scripts/__tests__/codex-native-hook.test.js +168 -15
- package/dist/scripts/__tests__/codex-native-hook.test.js.map +1 -1
- package/dist/scripts/__tests__/run-test-files.test.js +115 -1
- package/dist/scripts/__tests__/run-test-files.test.js.map +1 -1
- package/dist/scripts/codex-native-hook.d.ts.map +1 -1
- package/dist/scripts/codex-native-hook.js +74 -11
- package/dist/scripts/codex-native-hook.js.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.d.ts.map +1 -1
- package/dist/scripts/notify-hook/team-worker-stop.js +54 -21
- package/dist/scripts/notify-hook/team-worker-stop.js.map +1 -1
- package/dist/scripts/run-test-files.js +218 -160
- package/dist/scripts/run-test-files.js.map +1 -1
- package/dist/state/__tests__/operations.test.js +463 -0
- package/dist/state/__tests__/operations.test.js.map +1 -1
- package/dist/team/__tests__/delivery-log.test.js +18 -0
- package/dist/team/__tests__/delivery-log.test.js.map +1 -1
- package/dist/team/__tests__/runtime.test.js +48 -0
- package/dist/team/__tests__/runtime.test.js.map +1 -1
- package/dist/team/__tests__/tmux-session.test.js +107 -0
- package/dist/team/__tests__/tmux-session.test.js.map +1 -1
- package/dist/team/__tests__/tmux-test-fixture.d.ts.map +1 -1
- package/dist/team/__tests__/tmux-test-fixture.js +14 -2
- package/dist/team/__tests__/tmux-test-fixture.js.map +1 -1
- package/dist/team/__tests__/tmux-test-fixture.test.js +1 -0
- package/dist/team/__tests__/tmux-test-fixture.test.js.map +1 -1
- package/dist/team/__tests__/worker-bootstrap.test.js +54 -1
- package/dist/team/__tests__/worker-bootstrap.test.js.map +1 -1
- package/dist/team/delivery-log.d.ts +1 -1
- package/dist/team/delivery-log.d.ts.map +1 -1
- package/dist/team/delivery-log.js.map +1 -1
- package/dist/team/repo-aware-decomposition.d.ts +4 -0
- package/dist/team/repo-aware-decomposition.d.ts.map +1 -1
- package/dist/team/repo-aware-decomposition.js.map +1 -1
- package/dist/team/runtime.d.ts.map +1 -1
- package/dist/team/runtime.js +78 -9
- package/dist/team/runtime.js.map +1 -1
- package/dist/team/tmux-session.d.ts +1 -0
- package/dist/team/tmux-session.d.ts.map +1 -1
- package/dist/team/tmux-session.js +16 -5
- package/dist/team/tmux-session.js.map +1 -1
- package/dist/team/ultragoal-context.d.ts +12 -0
- package/dist/team/ultragoal-context.d.ts.map +1 -1
- package/dist/team/ultragoal-context.js +32 -8
- package/dist/team/ultragoal-context.js.map +1 -1
- package/dist/utils/__tests__/paths.test.js +23 -0
- package/dist/utils/__tests__/paths.test.js.map +1 -1
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +4 -2
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/toml.d.ts +4 -0
- package/dist/utils/toml.d.ts.map +1 -0
- package/dist/utils/toml.js +75 -0
- package/dist/utils/toml.js.map +1 -0
- package/package.json +1 -1
- package/plugins/oh-my-codex/.codex-plugin/plugin.json +1 -1
- package/plugins/oh-my-codex/skills/autopilot/SKILL.md +3 -0
- package/plugins/oh-my-codex/skills/deep-interview/SKILL.md +34 -0
- package/plugins/oh-my-codex/skills/ultrawork/SKILL.md +32 -17
- package/skills/autopilot/SKILL.md +3 -0
- package/skills/deep-interview/SKILL.md +34 -0
- package/skills/ultrawork/SKILL.md +32 -17
- package/src/scripts/__tests__/codex-native-hook.test.ts +216 -26
- package/src/scripts/__tests__/run-test-files.test.ts +138 -2
- package/src/scripts/codex-native-hook.ts +80 -10
- package/src/scripts/notify-hook/team-worker-stop.ts +58 -18
- package/src/scripts/run-test-files.ts +229 -150
- package/templates/AGENTS.md +40 -199
package/Cargo.lock
CHANGED
|
@@ -32,7 +32,7 @@ checksum = "6b947ae49db0d222b1dbc6b113ce7248a3fc3a6ca21b696717bfc000ba4484d8"
|
|
|
32
32
|
|
|
33
33
|
[[package]]
|
|
34
34
|
name = "omx-api"
|
|
35
|
-
version = "0.18.
|
|
35
|
+
version = "0.18.10"
|
|
36
36
|
dependencies = [
|
|
37
37
|
"serde",
|
|
38
38
|
"serde_json",
|
|
@@ -40,14 +40,14 @@ dependencies = [
|
|
|
40
40
|
|
|
41
41
|
[[package]]
|
|
42
42
|
name = "omx-explore-harness"
|
|
43
|
-
version = "0.18.
|
|
43
|
+
version = "0.18.10"
|
|
44
44
|
dependencies = [
|
|
45
45
|
"libc",
|
|
46
46
|
]
|
|
47
47
|
|
|
48
48
|
[[package]]
|
|
49
49
|
name = "omx-mux"
|
|
50
|
-
version = "0.18.
|
|
50
|
+
version = "0.18.10"
|
|
51
51
|
dependencies = [
|
|
52
52
|
"serde",
|
|
53
53
|
"serde_json",
|
|
@@ -55,7 +55,7 @@ dependencies = [
|
|
|
55
55
|
|
|
56
56
|
[[package]]
|
|
57
57
|
name = "omx-runtime"
|
|
58
|
-
version = "0.18.
|
|
58
|
+
version = "0.18.10"
|
|
59
59
|
dependencies = [
|
|
60
60
|
"omx-mux",
|
|
61
61
|
"omx-runtime-core",
|
|
@@ -64,7 +64,7 @@ dependencies = [
|
|
|
64
64
|
|
|
65
65
|
[[package]]
|
|
66
66
|
name = "omx-runtime-core"
|
|
67
|
-
version = "0.18.
|
|
67
|
+
version = "0.18.10"
|
|
68
68
|
dependencies = [
|
|
69
69
|
"fs2",
|
|
70
70
|
"serde",
|
|
@@ -73,7 +73,7 @@ dependencies = [
|
|
|
73
73
|
|
|
74
74
|
[[package]]
|
|
75
75
|
name = "omx-sparkshell"
|
|
76
|
-
version = "0.18.
|
|
76
|
+
version = "0.18.10"
|
|
77
77
|
dependencies = [
|
|
78
78
|
"omx-mux",
|
|
79
79
|
]
|
package/Cargo.toml
CHANGED
package/README.md
CHANGED
|
@@ -285,6 +285,10 @@ These are useful, but they are not the main onboarding path.
|
|
|
285
285
|
|
|
286
286
|
Use the team runtime when you specifically need durable tmux/worktree coordination, not as the default way to begin using OMX. In Codex App or plain outside-tmux sessions, treat `omx team` as a tmux-runtime shell surface rather than a directly available in-app workflow; launch OMX CLI from shell first if you actually want team execution.
|
|
287
287
|
|
|
288
|
+
When Team runs inside an Ultragoal story, Ultragoal remains leader-owned state: workers report checkpoint-ready evidence upward instead of mutating `.omx/ultragoal` directly. Team startup tolerates stale or malformed Ultragoal artifacts for unrelated work, but explicitly Ultragoal-linked Team launches stay fail-closed. Team startup also writes `.omx/state/team/<team-name>/preflight-context.json` so large Team runs can be resumed after compaction with the original task, worker split, Ultragoal context, and verification checklist.
|
|
289
|
+
|
|
290
|
+
For very small atomic work, Team may cap implicit fanout to one worker and print an over-orchestration warning; pass an explicit worker count only when the extra coordination cost is intentional.
|
|
291
|
+
|
|
288
292
|
```bash
|
|
289
293
|
omx team 3:executor "fix the failing tests with verification"
|
|
290
294
|
omx team status <team-name>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-interview-gate.test.d.ts","sourceRoot":"","sources":["../../../src/autopilot/__tests__/deep-interview-gate.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
import assert from 'node:assert/strict';
|
|
2
|
+
import { describe, it } from 'node:test';
|
|
3
|
+
import { canAdvanceAutopilotDeepInterviewToRalplan } from '../deep-interview-gate.js';
|
|
4
|
+
function validExecutionContract(stride) {
|
|
5
|
+
const perStride = {
|
|
6
|
+
task: {
|
|
7
|
+
allow_task_shrink: true,
|
|
8
|
+
acceptance_coverage_scope: 'task',
|
|
9
|
+
shrink_policy: 'allowed',
|
|
10
|
+
completion_unit: 'One focused task',
|
|
11
|
+
stop_condition: 'Stop after that task is implemented and verified',
|
|
12
|
+
},
|
|
13
|
+
deliverable: {
|
|
14
|
+
allow_task_shrink: false,
|
|
15
|
+
acceptance_coverage_scope: 'deliverable',
|
|
16
|
+
shrink_policy: 'ask_before_shrink',
|
|
17
|
+
completion_unit: 'The named deliverable',
|
|
18
|
+
stop_condition: 'Stop after the deliverable is complete and verified',
|
|
19
|
+
},
|
|
20
|
+
milestone: {
|
|
21
|
+
allow_task_shrink: false,
|
|
22
|
+
acceptance_coverage_scope: 'milestone',
|
|
23
|
+
shrink_policy: 'deny_unless_blocked',
|
|
24
|
+
completion_unit: 'The approved milestone',
|
|
25
|
+
stop_condition: 'Stop after the milestone is complete unless blocked',
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
return {
|
|
29
|
+
version: 1,
|
|
30
|
+
execution_stride: stride,
|
|
31
|
+
source: 'deep-interview',
|
|
32
|
+
selected_by: 'user',
|
|
33
|
+
...perStride[stride],
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
describe('autopilot deep-interview gate execution contract', () => {
|
|
37
|
+
it('falls back to persisted contract state when nextState is partial', async () => {
|
|
38
|
+
const persistedState = {
|
|
39
|
+
current_phase: 'deep-interview',
|
|
40
|
+
state: {
|
|
41
|
+
deep_interview_gate: {
|
|
42
|
+
status: 'complete',
|
|
43
|
+
rationale: 'Persisted gate and contract are ready for ralplan.',
|
|
44
|
+
},
|
|
45
|
+
handoff_artifacts: {
|
|
46
|
+
deep_interview: {
|
|
47
|
+
summary: 'Persisted handoff contract is canonical.',
|
|
48
|
+
execution_contract_required: true,
|
|
49
|
+
execution_contract: validExecutionContract('milestone'),
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const decision = await canAdvanceAutopilotDeepInterviewToRalplan({
|
|
55
|
+
cwd: process.cwd(),
|
|
56
|
+
currentState: persistedState,
|
|
57
|
+
nextState: {
|
|
58
|
+
active: true,
|
|
59
|
+
current_phase: 'ralplan',
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
assert.equal(decision.allowed, true);
|
|
63
|
+
assert.equal(decision.reason, 'record-backed deep-interview completion gate');
|
|
64
|
+
});
|
|
65
|
+
it('rejects an invalid contract explicitly supplied by nextState before persisted fallback', async () => {
|
|
66
|
+
const persistedState = {
|
|
67
|
+
current_phase: 'deep-interview',
|
|
68
|
+
state: {
|
|
69
|
+
deep_interview_gate: {
|
|
70
|
+
status: 'complete',
|
|
71
|
+
rationale: 'Persisted gate and contract are ready for ralplan.',
|
|
72
|
+
},
|
|
73
|
+
handoff_artifacts: {
|
|
74
|
+
deep_interview: {
|
|
75
|
+
summary: 'Persisted handoff contract is canonical.',
|
|
76
|
+
execution_contract_required: true,
|
|
77
|
+
execution_contract: validExecutionContract('milestone'),
|
|
78
|
+
},
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
const decision = await canAdvanceAutopilotDeepInterviewToRalplan({
|
|
83
|
+
cwd: process.cwd(),
|
|
84
|
+
currentState: persistedState,
|
|
85
|
+
nextState: {
|
|
86
|
+
active: true,
|
|
87
|
+
current_phase: 'ralplan',
|
|
88
|
+
execution_contract: {
|
|
89
|
+
...validExecutionContract('milestone'),
|
|
90
|
+
shrink_policy: 'allowed',
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
});
|
|
94
|
+
assert.equal(decision.allowed, false);
|
|
95
|
+
assert.match(decision.reason, /execution_contract/i);
|
|
96
|
+
assert.equal(decision.evidence?.execution_contract_status, 'invalid');
|
|
97
|
+
});
|
|
98
|
+
it('rejects a placeholder contract explicitly supplied by nextState before persisted fallback', async () => {
|
|
99
|
+
const persistedState = {
|
|
100
|
+
current_phase: 'deep-interview',
|
|
101
|
+
state: {
|
|
102
|
+
deep_interview_gate: {
|
|
103
|
+
status: 'complete',
|
|
104
|
+
rationale: 'Persisted gate and contract are ready for ralplan.',
|
|
105
|
+
},
|
|
106
|
+
handoff_artifacts: {
|
|
107
|
+
deep_interview: {
|
|
108
|
+
summary: 'Persisted handoff contract is canonical.',
|
|
109
|
+
execution_contract_required: true,
|
|
110
|
+
execution_contract: validExecutionContract('milestone'),
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
const decision = await canAdvanceAutopilotDeepInterviewToRalplan({
|
|
116
|
+
cwd: process.cwd(),
|
|
117
|
+
currentState: persistedState,
|
|
118
|
+
nextState: {
|
|
119
|
+
active: true,
|
|
120
|
+
current_phase: 'ralplan',
|
|
121
|
+
execution_contract: {},
|
|
122
|
+
},
|
|
123
|
+
});
|
|
124
|
+
assert.equal(decision.allowed, false);
|
|
125
|
+
assert.match(decision.reason, /execution_contract/i);
|
|
126
|
+
assert.equal(decision.evidence?.execution_contract_status, 'invalid');
|
|
127
|
+
});
|
|
128
|
+
it('rejects a non-object contract explicitly supplied by nextState before persisted fallback', async () => {
|
|
129
|
+
const persistedState = {
|
|
130
|
+
current_phase: 'deep-interview',
|
|
131
|
+
state: {
|
|
132
|
+
deep_interview_gate: {
|
|
133
|
+
status: 'complete',
|
|
134
|
+
rationale: 'Persisted gate and contract are ready for ralplan.',
|
|
135
|
+
},
|
|
136
|
+
handoff_artifacts: {
|
|
137
|
+
deep_interview: {
|
|
138
|
+
summary: 'Persisted handoff contract is canonical.',
|
|
139
|
+
execution_contract_required: true,
|
|
140
|
+
execution_contract: validExecutionContract('milestone'),
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
const decision = await canAdvanceAutopilotDeepInterviewToRalplan({
|
|
146
|
+
cwd: process.cwd(),
|
|
147
|
+
currentState: persistedState,
|
|
148
|
+
nextState: {
|
|
149
|
+
active: true,
|
|
150
|
+
current_phase: 'ralplan',
|
|
151
|
+
execution_contract: 'placeholder',
|
|
152
|
+
},
|
|
153
|
+
});
|
|
154
|
+
assert.equal(decision.allowed, false);
|
|
155
|
+
assert.match(decision.reason, /execution_contract/i);
|
|
156
|
+
assert.equal(decision.evidence?.execution_contract_status, 'invalid');
|
|
157
|
+
});
|
|
158
|
+
it('rejects a non-object handoff-local contract before compatibility fallback', async () => {
|
|
159
|
+
const decision = await canAdvanceAutopilotDeepInterviewToRalplan({
|
|
160
|
+
cwd: process.cwd(),
|
|
161
|
+
currentState: {
|
|
162
|
+
current_phase: 'deep-interview',
|
|
163
|
+
execution_contract: validExecutionContract('deliverable'),
|
|
164
|
+
state: {
|
|
165
|
+
deep_interview_gate: {
|
|
166
|
+
status: 'complete',
|
|
167
|
+
rationale: 'Compatibility direct contract is available.',
|
|
168
|
+
},
|
|
169
|
+
handoff_artifacts: {
|
|
170
|
+
deep_interview: {
|
|
171
|
+
summary: 'Handoff-local malformed contract must fail before direct fallback.',
|
|
172
|
+
execution_contract_required: true,
|
|
173
|
+
execution_contract: [],
|
|
174
|
+
},
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
},
|
|
178
|
+
nextState: {
|
|
179
|
+
active: true,
|
|
180
|
+
current_phase: 'ralplan',
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
assert.equal(decision.allowed, false);
|
|
184
|
+
assert.match(decision.reason, /execution_contract/i);
|
|
185
|
+
assert.equal(decision.evidence?.execution_contract_status, 'invalid');
|
|
186
|
+
});
|
|
187
|
+
it('allows a direct compatibility contract to satisfy a handoff required marker', async () => {
|
|
188
|
+
const decision = await canAdvanceAutopilotDeepInterviewToRalplan({
|
|
189
|
+
cwd: process.cwd(),
|
|
190
|
+
currentState: {
|
|
191
|
+
current_phase: 'deep-interview',
|
|
192
|
+
execution_contract: validExecutionContract('deliverable'),
|
|
193
|
+
state: {
|
|
194
|
+
deep_interview_gate: {
|
|
195
|
+
status: 'complete',
|
|
196
|
+
rationale: 'Compatibility direct contract is available.',
|
|
197
|
+
},
|
|
198
|
+
handoff_artifacts: {
|
|
199
|
+
deep_interview: {
|
|
200
|
+
summary: 'Marker is canonical; contract came from a compatibility location.',
|
|
201
|
+
execution_contract_required: true,
|
|
202
|
+
},
|
|
203
|
+
},
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
nextState: {
|
|
207
|
+
active: true,
|
|
208
|
+
current_phase: 'ralplan',
|
|
209
|
+
},
|
|
210
|
+
});
|
|
211
|
+
assert.equal(decision.allowed, true);
|
|
212
|
+
assert.equal(decision.reason, 'record-backed deep-interview completion gate');
|
|
213
|
+
});
|
|
214
|
+
});
|
|
215
|
+
//# sourceMappingURL=deep-interview-gate.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deep-interview-gate.test.js","sourceRoot":"","sources":["../../../src/autopilot/__tests__/deep-interview-gate.test.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,oBAAoB,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,WAAW,CAAC;AAEzC,OAAO,EAAE,yCAAyC,EAAE,MAAM,2BAA2B,CAAC;AAEtF,SAAS,sBAAsB,CAAC,MAA4C;IAC1E,MAAM,SAAS,GAAG;QAChB,IAAI,EAAE;YACJ,iBAAiB,EAAE,IAAI;YACvB,yBAAyB,EAAE,MAAM;YACjC,aAAa,EAAE,SAAS;YACxB,eAAe,EAAE,kBAAkB;YACnC,cAAc,EAAE,kDAAkD;SACnE;QACD,WAAW,EAAE;YACX,iBAAiB,EAAE,KAAK;YACxB,yBAAyB,EAAE,aAAa;YACxC,aAAa,EAAE,mBAAmB;YAClC,eAAe,EAAE,uBAAuB;YACxC,cAAc,EAAE,qDAAqD;SACtE;QACD,SAAS,EAAE;YACT,iBAAiB,EAAE,KAAK;YACxB,yBAAyB,EAAE,WAAW;YACtC,aAAa,EAAE,qBAAqB;YACpC,eAAe,EAAE,wBAAwB;YACzC,cAAc,EAAE,qDAAqD;SACtE;KACO,CAAC;IAEX,OAAO;QACL,OAAO,EAAE,CAAC;QACV,gBAAgB,EAAE,MAAM;QACxB,MAAM,EAAE,gBAAgB;QACxB,WAAW,EAAE,MAAM;QACnB,GAAG,SAAS,CAAC,MAAM,CAAC;KACrB,CAAC;AACJ,CAAC;AAED,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAChE,EAAE,CAAC,kEAAkE,EAAE,KAAK,IAAI,EAAE;QAChF,MAAM,cAAc,GAAG;YACrB,aAAa,EAAE,gBAAgB;YAC/B,KAAK,EAAE;gBACL,mBAAmB,EAAE;oBACnB,MAAM,EAAE,UAAU;oBAClB,SAAS,EAAE,oDAAoD;iBAChE;gBACD,iBAAiB,EAAE;oBACjB,cAAc,EAAE;wBACd,OAAO,EAAE,0CAA0C;wBACnD,2BAA2B,EAAE,IAAI;wBACjC,kBAAkB,EAAE,sBAAsB,CAAC,WAAW,CAAC;qBACxD;iBACF;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,yCAAyC,CAAC;YAC/D,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,YAAY,EAAE,cAAc;YAC5B,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,SAAS;aACzB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,8CAA8C,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wFAAwF,EAAE,KAAK,IAAI,EAAE;QACtG,MAAM,cAAc,GAAG;YACrB,aAAa,EAAE,gBAAgB;YAC/B,KAAK,EAAE;gBACL,mBAAmB,EAAE;oBACnB,MAAM,EAAE,UAAU;oBAClB,SAAS,EAAE,oDAAoD;iBAChE;gBACD,iBAAiB,EAAE;oBACjB,cAAc,EAAE;wBACd,OAAO,EAAE,0CAA0C;wBACnD,2BAA2B,EAAE,IAAI;wBACjC,kBAAkB,EAAE,sBAAsB,CAAC,WAAW,CAAC;qBACxD;iBACF;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,yCAAyC,CAAC;YAC/D,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,YAAY,EAAE,cAAc;YAC5B,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,SAAS;gBACxB,kBAAkB,EAAE;oBAClB,GAAG,sBAAsB,CAAC,WAAW,CAAC;oBACtC,aAAa,EAAE,SAAS;iBACzB;aACF;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,EAAE,SAAS,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;QACzG,MAAM,cAAc,GAAG;YACrB,aAAa,EAAE,gBAAgB;YAC/B,KAAK,EAAE;gBACL,mBAAmB,EAAE;oBACnB,MAAM,EAAE,UAAU;oBAClB,SAAS,EAAE,oDAAoD;iBAChE;gBACD,iBAAiB,EAAE;oBACjB,cAAc,EAAE;wBACd,OAAO,EAAE,0CAA0C;wBACnD,2BAA2B,EAAE,IAAI;wBACjC,kBAAkB,EAAE,sBAAsB,CAAC,WAAW,CAAC;qBACxD;iBACF;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,yCAAyC,CAAC;YAC/D,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,YAAY,EAAE,cAAc;YAC5B,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,SAAS;gBACxB,kBAAkB,EAAE,EAAE;aACvB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,EAAE,SAAS,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;QACxG,MAAM,cAAc,GAAG;YACrB,aAAa,EAAE,gBAAgB;YAC/B,KAAK,EAAE;gBACL,mBAAmB,EAAE;oBACnB,MAAM,EAAE,UAAU;oBAClB,SAAS,EAAE,oDAAoD;iBAChE;gBACD,iBAAiB,EAAE;oBACjB,cAAc,EAAE;wBACd,OAAO,EAAE,0CAA0C;wBACnD,2BAA2B,EAAE,IAAI;wBACjC,kBAAkB,EAAE,sBAAsB,CAAC,WAAW,CAAC;qBACxD;iBACF;aACF;SACF,CAAC;QAEF,MAAM,QAAQ,GAAG,MAAM,yCAAyC,CAAC;YAC/D,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,YAAY,EAAE,cAAc;YAC5B,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,SAAS;gBACxB,kBAAkB,EAAE,aAAa;aAClC;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,EAAE,SAAS,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,2EAA2E,EAAE,KAAK,IAAI,EAAE;QACzF,MAAM,QAAQ,GAAG,MAAM,yCAAyC,CAAC;YAC/D,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,YAAY,EAAE;gBACZ,aAAa,EAAE,gBAAgB;gBAC/B,kBAAkB,EAAE,sBAAsB,CAAC,aAAa,CAAC;gBACzD,KAAK,EAAE;oBACL,mBAAmB,EAAE;wBACnB,MAAM,EAAE,UAAU;wBAClB,SAAS,EAAE,6CAA6C;qBACzD;oBACD,iBAAiB,EAAE;wBACjB,cAAc,EAAE;4BACd,OAAO,EAAE,oEAAoE;4BAC7E,2BAA2B,EAAE,IAAI;4BACjC,kBAAkB,EAAE,EAAE;yBACvB;qBACF;iBACF;aACF;YACD,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,SAAS;aACzB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;QACrD,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,EAAE,SAAS,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6EAA6E,EAAE,KAAK,IAAI,EAAE;QAC3F,MAAM,QAAQ,GAAG,MAAM,yCAAyC,CAAC;YAC/D,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE;YAClB,YAAY,EAAE;gBACZ,aAAa,EAAE,gBAAgB;gBAC/B,kBAAkB,EAAE,sBAAsB,CAAC,aAAa,CAAC;gBACzD,KAAK,EAAE;oBACL,mBAAmB,EAAE;wBACnB,MAAM,EAAE,UAAU;wBAClB,SAAS,EAAE,6CAA6C;qBACzD;oBACD,iBAAiB,EAAE;wBACjB,cAAc,EAAE;4BACd,OAAO,EAAE,mEAAmE;4BAC5E,2BAA2B,EAAE,IAAI;yBAClC;qBACF;iBACF;aACF;YACD,SAAS,EAAE;gBACT,MAAM,EAAE,IAAI;gBACZ,aAAa,EAAE,SAAS;aACzB;SACF,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,8CAA8C,CAAC,CAAC;IAChF,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -12,6 +12,10 @@ describe('autopilot ralplan gate', () => {
|
|
|
12
12
|
const trackingPath = subagentTrackingPath(cwd);
|
|
13
13
|
try {
|
|
14
14
|
await mkdir(join(trackingPath, '..'), { recursive: true });
|
|
15
|
+
await writeFile(join(cwd, '.omx', 'state', 'session.json'), JSON.stringify({
|
|
16
|
+
session_id: sessionId,
|
|
17
|
+
native_session_id: 'thread-leader',
|
|
18
|
+
}, null, 2));
|
|
15
19
|
await writeFile(trackingPath, JSON.stringify({
|
|
16
20
|
schemaVersion: 1,
|
|
17
21
|
sessions: {
|
|
@@ -75,5 +79,149 @@ describe('autopilot ralplan gate', () => {
|
|
|
75
79
|
await rm(cwd, { recursive: true, force: true });
|
|
76
80
|
}
|
|
77
81
|
});
|
|
82
|
+
it('accepts fresh native review evidence when tracker leader id aliases a subagent lane', async () => {
|
|
83
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-fresh-subagent-alias-'));
|
|
84
|
+
const sessionId = 'sess-autopilot-fresh-subagent-alias';
|
|
85
|
+
const trackingPath = subagentTrackingPath(cwd);
|
|
86
|
+
try {
|
|
87
|
+
await mkdir(join(trackingPath, '..'), { recursive: true });
|
|
88
|
+
await writeFile(trackingPath, JSON.stringify({
|
|
89
|
+
schemaVersion: 1,
|
|
90
|
+
sessions: {
|
|
91
|
+
[sessionId]: {
|
|
92
|
+
session_id: sessionId,
|
|
93
|
+
leader_thread_id: 'thread-architect',
|
|
94
|
+
updated_at: '2026-05-28T18:35:10.000Z',
|
|
95
|
+
threads: {
|
|
96
|
+
'thread-architect': {
|
|
97
|
+
thread_id: 'thread-architect',
|
|
98
|
+
kind: 'subagent',
|
|
99
|
+
first_seen_at: '2026-05-28T18:34:51.000Z',
|
|
100
|
+
last_seen_at: '2026-05-28T18:34:51.000Z',
|
|
101
|
+
turn_count: 1,
|
|
102
|
+
mode: 'architect',
|
|
103
|
+
},
|
|
104
|
+
'thread-critic': {
|
|
105
|
+
thread_id: 'thread-critic',
|
|
106
|
+
kind: 'subagent',
|
|
107
|
+
first_seen_at: '2026-05-28T18:35:10.000Z',
|
|
108
|
+
last_seen_at: '2026-05-28T18:35:10.000Z',
|
|
109
|
+
turn_count: 1,
|
|
110
|
+
mode: 'critic',
|
|
111
|
+
},
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
},
|
|
115
|
+
}, null, 2));
|
|
116
|
+
const state = {
|
|
117
|
+
current_phase: 'ralplan',
|
|
118
|
+
handoff_artifacts: {
|
|
119
|
+
ralplan_consensus_gate: {
|
|
120
|
+
complete: true,
|
|
121
|
+
sequence: ['architect-review', 'critic-review'],
|
|
122
|
+
ralplan_architect_review: {
|
|
123
|
+
agent_role: 'architect',
|
|
124
|
+
provenance_kind: 'native_subagent',
|
|
125
|
+
verdict: 'approve',
|
|
126
|
+
session_id: sessionId,
|
|
127
|
+
thread_id: 'thread-architect',
|
|
128
|
+
artifact_path: '.omx/artifacts/architect.md',
|
|
129
|
+
tracker_path: '.omx/state/subagent-tracking.json',
|
|
130
|
+
completed_at: '2026-05-28T18:34:51.000Z',
|
|
131
|
+
},
|
|
132
|
+
ralplan_critic_review: {
|
|
133
|
+
agent_role: 'critic',
|
|
134
|
+
provenance_kind: 'native_subagent',
|
|
135
|
+
verdict: 'approve',
|
|
136
|
+
session_id: sessionId,
|
|
137
|
+
thread_id: 'thread-critic',
|
|
138
|
+
artifact_path: '.omx/artifacts/critic.md',
|
|
139
|
+
tracker_path: '.omx/state/subagent-tracking.json',
|
|
140
|
+
completed_at: '2026-05-28T18:35:10.000Z',
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
},
|
|
144
|
+
};
|
|
145
|
+
const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
|
|
146
|
+
assert.equal(decision.allowed, true);
|
|
147
|
+
assert.equal(decision.evidence?.blockedReason, null);
|
|
148
|
+
}
|
|
149
|
+
finally {
|
|
150
|
+
await rm(cwd, { recursive: true, force: true });
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
it('rejects native review evidence from the current native session leader', async () => {
|
|
154
|
+
const cwd = await mkdtemp(join(tmpdir(), 'omx-autopilot-ralplan-native-leader-'));
|
|
155
|
+
const sessionId = 'sess-autopilot-native-leader';
|
|
156
|
+
const trackingPath = subagentTrackingPath(cwd);
|
|
157
|
+
try {
|
|
158
|
+
await mkdir(join(trackingPath, '..'), { recursive: true });
|
|
159
|
+
await writeFile(join(cwd, '.omx', 'state', 'session.json'), JSON.stringify({
|
|
160
|
+
session_id: sessionId,
|
|
161
|
+
native_session_id: 'thread-leader',
|
|
162
|
+
}, null, 2));
|
|
163
|
+
await writeFile(trackingPath, JSON.stringify({
|
|
164
|
+
schemaVersion: 1,
|
|
165
|
+
sessions: {
|
|
166
|
+
[sessionId]: {
|
|
167
|
+
session_id: sessionId,
|
|
168
|
+
leader_thread_id: 'thread-leader',
|
|
169
|
+
updated_at: '2026-05-28T18:35:10.000Z',
|
|
170
|
+
threads: {
|
|
171
|
+
'thread-leader': {
|
|
172
|
+
thread_id: 'thread-leader',
|
|
173
|
+
kind: 'subagent',
|
|
174
|
+
first_seen_at: '2026-05-28T18:34:51.000Z',
|
|
175
|
+
last_seen_at: '2026-05-28T18:34:51.000Z',
|
|
176
|
+
turn_count: 2,
|
|
177
|
+
},
|
|
178
|
+
'thread-critic': {
|
|
179
|
+
thread_id: 'thread-critic',
|
|
180
|
+
kind: 'subagent',
|
|
181
|
+
first_seen_at: '2026-05-28T18:35:10.000Z',
|
|
182
|
+
last_seen_at: '2026-05-28T18:35:10.000Z',
|
|
183
|
+
turn_count: 1,
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
},
|
|
187
|
+
},
|
|
188
|
+
}, null, 2));
|
|
189
|
+
const state = {
|
|
190
|
+
current_phase: 'ralplan',
|
|
191
|
+
handoff_artifacts: {
|
|
192
|
+
ralplan_consensus_gate: {
|
|
193
|
+
complete: true,
|
|
194
|
+
sequence: ['architect-review', 'critic-review'],
|
|
195
|
+
ralplan_architect_review: {
|
|
196
|
+
agent_role: 'architect',
|
|
197
|
+
provenance_kind: 'native_subagent',
|
|
198
|
+
verdict: 'approve',
|
|
199
|
+
session_id: sessionId,
|
|
200
|
+
thread_id: 'thread-leader',
|
|
201
|
+
artifact_path: '.omx/artifacts/architect.md',
|
|
202
|
+
tracker_path: '.omx/state/subagent-tracking.json',
|
|
203
|
+
completed_at: '2026-05-28T18:34:51.000Z',
|
|
204
|
+
},
|
|
205
|
+
ralplan_critic_review: {
|
|
206
|
+
agent_role: 'critic',
|
|
207
|
+
provenance_kind: 'native_subagent',
|
|
208
|
+
verdict: 'approve',
|
|
209
|
+
session_id: sessionId,
|
|
210
|
+
thread_id: 'thread-critic',
|
|
211
|
+
artifact_path: '.omx/artifacts/critic.md',
|
|
212
|
+
tracker_path: '.omx/state/subagent-tracking.json',
|
|
213
|
+
completed_at: '2026-05-28T18:35:10.000Z',
|
|
214
|
+
},
|
|
215
|
+
},
|
|
216
|
+
},
|
|
217
|
+
};
|
|
218
|
+
const decision = canAdvanceAutopilotRalplanToUltragoal({ cwd, sessionId, currentState: state });
|
|
219
|
+
assert.equal(decision.allowed, false);
|
|
220
|
+
assert.match(buildAutopilotRalplanUltragoalGateError(decision), /architect tracker thread thread-leader is the session leader/);
|
|
221
|
+
}
|
|
222
|
+
finally {
|
|
223
|
+
await rm(cwd, { recursive: true, force: true });
|
|
224
|
+
}
|
|
225
|
+
});
|
|
78
226
|
});
|
|
79
227
|
//# sourceMappingURL=ralplan-gate.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ralplan-gate.test.js","sourceRoot":"","sources":["../../../src/autopilot/__tests__/ralplan-gate.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ralplan-gate.test.js","sourceRoot":"","sources":["../../../src/autopilot/__tests__/ralplan-gate.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"deep-interview-gate.d.ts","sourceRoot":"","sources":["../../src/autopilot/deep-interview-gate.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"deep-interview-gate.d.ts","sourceRoot":"","sources":["../../src/autopilot/deep-interview-gate.ts"],"names":[],"mappings":"AAIA,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAI1C,MAAM,WAAW,sCAAsC;IACrD,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACjC,SAAS,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC9B,kBAAkB,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;CACxC;AAED,MAAM,WAAW,yCAAyC;IACxD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,UAAU,CAAC;CACvB;AA+YD,wBAAsB,yCAAyC,CAC7D,KAAK,EAAE,sCAAsC,GAC5C,OAAO,CAAC,yCAAyC,CAAC,CA+DpD;AAED,wBAAgB,2CAA2C,CACzD,QAAQ,EAAE,yCAAyC,GAClD,MAAM,CAER"}
|
|
@@ -7,6 +7,9 @@ function safeObject(value) {
|
|
|
7
7
|
? value
|
|
8
8
|
: null;
|
|
9
9
|
}
|
|
10
|
+
function hasOwnKey(object, key) {
|
|
11
|
+
return Boolean(object) && Object.prototype.hasOwnProperty.call(object, key);
|
|
12
|
+
}
|
|
10
13
|
async function readDeepInterviewState(input) {
|
|
11
14
|
// Autopilot supervisor handoffs must not be driven by sibling workflow files.
|
|
12
15
|
// Standalone deep-interview -> ralplan reconciliation passes its source state
|
|
@@ -25,6 +28,133 @@ function deepInterviewHandoff(state) {
|
|
|
25
28
|
function deepInterviewGate(state) {
|
|
26
29
|
return safeObject(state?.deep_interview_gate) ?? safeObject(nestedState(state)?.deep_interview_gate);
|
|
27
30
|
}
|
|
31
|
+
function executionContractRequiredMarker(state) {
|
|
32
|
+
const nested = nestedState(state);
|
|
33
|
+
const handoff = safeObject(deepInterviewHandoff(state));
|
|
34
|
+
return executionContractRequiredValue(state)
|
|
35
|
+
|| executionContractRequiredValue(nested)
|
|
36
|
+
|| executionContractRequiredValue(deepInterviewGate(state))
|
|
37
|
+
|| executionContractRequiredValue(handoff);
|
|
38
|
+
}
|
|
39
|
+
function executionContractRequiredValue(state) {
|
|
40
|
+
return state?.execution_contract_required === true || state?.executionContractRequired === true;
|
|
41
|
+
}
|
|
42
|
+
function executionContractValue(contract, snakeKey, camelKey) {
|
|
43
|
+
return safeString(contract[snakeKey]) || safeString(contract[camelKey]);
|
|
44
|
+
}
|
|
45
|
+
function executionContractBoolean(contract, snakeKey, camelKey) {
|
|
46
|
+
if (typeof contract[snakeKey] === 'boolean')
|
|
47
|
+
return contract[snakeKey];
|
|
48
|
+
if (typeof contract[camelKey] === 'boolean')
|
|
49
|
+
return contract[camelKey];
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
function executionContractStride(contract) {
|
|
53
|
+
return executionContractValue(contract, 'execution_stride', 'executionStride') || safeString(contract.stride);
|
|
54
|
+
}
|
|
55
|
+
function executionContractCandidates(state) {
|
|
56
|
+
const candidates = [];
|
|
57
|
+
if (hasOwnKey(state, 'execution_contract'))
|
|
58
|
+
candidates.push(state.execution_contract);
|
|
59
|
+
const nested = nestedState(state);
|
|
60
|
+
if (hasOwnKey(nested, 'execution_contract'))
|
|
61
|
+
candidates.push(nested.execution_contract);
|
|
62
|
+
const handoff = safeObject(deepInterviewHandoff(state));
|
|
63
|
+
if (hasOwnKey(handoff, 'execution_contract'))
|
|
64
|
+
candidates.push(handoff.execution_contract);
|
|
65
|
+
return candidates;
|
|
66
|
+
}
|
|
67
|
+
function isExecutionContractPlaceholder(contract) {
|
|
68
|
+
return executionContractStride(contract).length === 0
|
|
69
|
+
&& executionContractValue(contract, 'completion_unit', 'completionUnit').length === 0
|
|
70
|
+
&& executionContractValue(contract, 'stop_condition', 'stopCondition').length === 0;
|
|
71
|
+
}
|
|
72
|
+
function expectedExecutionContractFields(stride) {
|
|
73
|
+
if (stride === 'task') {
|
|
74
|
+
return {
|
|
75
|
+
allowTaskShrink: true,
|
|
76
|
+
acceptanceCoverageScope: 'task',
|
|
77
|
+
shrinkPolicy: 'allowed',
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
if (stride === 'deliverable') {
|
|
81
|
+
return {
|
|
82
|
+
allowTaskShrink: false,
|
|
83
|
+
acceptanceCoverageScope: 'deliverable',
|
|
84
|
+
shrinkPolicy: 'ask_before_shrink',
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
return {
|
|
88
|
+
allowTaskShrink: false,
|
|
89
|
+
acceptanceCoverageScope: 'milestone',
|
|
90
|
+
shrinkPolicy: 'deny_unless_blocked',
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function isExecutionStride(value) {
|
|
94
|
+
return value === 'task' || value === 'deliverable' || value === 'milestone';
|
|
95
|
+
}
|
|
96
|
+
function isValidExecutionContract(contract) {
|
|
97
|
+
if (contract.version !== 1)
|
|
98
|
+
return false;
|
|
99
|
+
const stride = executionContractStride(contract);
|
|
100
|
+
if (!isExecutionStride(stride))
|
|
101
|
+
return false;
|
|
102
|
+
if (safeString(contract.source) !== 'deep-interview')
|
|
103
|
+
return false;
|
|
104
|
+
const selectedBy = executionContractValue(contract, 'selected_by', 'selectedBy');
|
|
105
|
+
if (selectedBy !== 'user' && selectedBy !== 'default')
|
|
106
|
+
return false;
|
|
107
|
+
if (!executionContractValue(contract, 'completion_unit', 'completionUnit'))
|
|
108
|
+
return false;
|
|
109
|
+
if (!executionContractValue(contract, 'stop_condition', 'stopCondition'))
|
|
110
|
+
return false;
|
|
111
|
+
const expected = expectedExecutionContractFields(stride);
|
|
112
|
+
return executionContractBoolean(contract, 'allow_task_shrink', 'allowTaskShrink') === expected.allowTaskShrink
|
|
113
|
+
&& executionContractValue(contract, 'acceptance_coverage_scope', 'acceptanceCoverageScope') === expected.acceptanceCoverageScope
|
|
114
|
+
&& executionContractValue(contract, 'shrink_policy', 'shrinkPolicy') === expected.shrinkPolicy;
|
|
115
|
+
}
|
|
116
|
+
function executionContractStatusForState(state) {
|
|
117
|
+
const handoff = safeObject(deepInterviewHandoff(state));
|
|
118
|
+
if (executionContractRequiredValue(handoff)) {
|
|
119
|
+
if (hasOwnKey(handoff, 'execution_contract')) {
|
|
120
|
+
const handoffContract = safeObject(handoff.execution_contract);
|
|
121
|
+
if (!handoffContract
|
|
122
|
+
|| isExecutionContractPlaceholder(handoffContract)
|
|
123
|
+
|| !isValidExecutionContract(handoffContract)) {
|
|
124
|
+
return 'invalid';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
let hasValidContract = false;
|
|
129
|
+
for (const candidate of executionContractCandidates(state)) {
|
|
130
|
+
const contract = safeObject(candidate);
|
|
131
|
+
if (!contract) {
|
|
132
|
+
return 'invalid';
|
|
133
|
+
}
|
|
134
|
+
if (isExecutionContractPlaceholder(contract))
|
|
135
|
+
return 'invalid';
|
|
136
|
+
if (!isValidExecutionContract(contract))
|
|
137
|
+
return 'invalid';
|
|
138
|
+
hasValidContract = true;
|
|
139
|
+
}
|
|
140
|
+
return hasValidContract ? 'valid' : 'absent';
|
|
141
|
+
}
|
|
142
|
+
function requiresExecutionContract(input, deepState, gate) {
|
|
143
|
+
if (executionContractRequiredMarker(gate))
|
|
144
|
+
return true;
|
|
145
|
+
return allCandidateStates(input, deepState).some((state) => executionContractRequiredMarker(state));
|
|
146
|
+
}
|
|
147
|
+
function executionContractStatusForHandoff(input, deepState) {
|
|
148
|
+
const states = input.nextState
|
|
149
|
+
? [input.nextState, deepState, input.currentState]
|
|
150
|
+
: [deepState, input.currentState];
|
|
151
|
+
for (const state of states) {
|
|
152
|
+
const status = executionContractStatusForState(state);
|
|
153
|
+
if (status !== 'absent')
|
|
154
|
+
return status;
|
|
155
|
+
}
|
|
156
|
+
return 'absent';
|
|
157
|
+
}
|
|
28
158
|
function questionEnforcement(state) {
|
|
29
159
|
return safeObject(state?.question_enforcement);
|
|
30
160
|
}
|
|
@@ -224,6 +354,16 @@ export async function canAdvanceAutopilotDeepInterviewToRalplan(input) {
|
|
|
224
354
|
reason: 'missing deep-interview completion/skip gate for ralplan handoff',
|
|
225
355
|
};
|
|
226
356
|
}
|
|
357
|
+
if (requiresExecutionContract(input, deepState, gate)) {
|
|
358
|
+
const executionContractStatus = executionContractStatusForHandoff(input, deepState);
|
|
359
|
+
if (executionContractStatus !== 'valid') {
|
|
360
|
+
return {
|
|
361
|
+
allowed: false,
|
|
362
|
+
reason: 'missing valid execution_contract for deep-interview ralplan handoff',
|
|
363
|
+
evidence: { gate_status: gate.status, execution_contract_required: true, execution_contract_status: executionContractStatus },
|
|
364
|
+
};
|
|
365
|
+
}
|
|
366
|
+
}
|
|
227
367
|
if (isSkipGate(gate, input.sessionId)) {
|
|
228
368
|
return {
|
|
229
369
|
allowed: true,
|