oxe-cc 1.8.0 → 1.9.1

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 (52) hide show
  1. package/AGENTS.md +1 -1
  2. package/CHANGELOG.md +94 -0
  3. package/README.md +15 -12
  4. package/bin/lib/oxe-manifest.cjs +20 -13
  5. package/bin/lib/oxe-operational.cjs +305 -79
  6. package/bin/lib/oxe-project-health.cjs +79 -18
  7. package/bin/lib/oxe-rationality.cjs +9 -7
  8. package/bin/lib/oxe-release.cjs +26 -0
  9. package/bin/oxe-cc.js +224 -52
  10. package/docs/RELEASE-READINESS.md +6 -1
  11. package/lib/runtime/compiler/graph-compiler.js +1 -1
  12. package/lib/runtime/executor/action-tool-map.js +4 -0
  13. package/lib/runtime/executor/built-in-tools.js +27 -0
  14. package/lib/runtime/executor/llm-task-executor.d.ts +4 -1
  15. package/lib/runtime/executor/llm-task-executor.js +41 -5
  16. package/lib/runtime/executor/node-prompt-builder.d.ts +4 -1
  17. package/lib/runtime/executor/node-prompt-builder.js +13 -2
  18. package/lib/runtime/models/failure.d.ts +1 -1
  19. package/lib/runtime/scheduler/multi-agent-coordinator.d.ts +39 -0
  20. package/lib/runtime/scheduler/multi-agent-coordinator.js +222 -13
  21. package/lib/runtime/scheduler/scheduler.d.ts +5 -1
  22. package/lib/runtime/scheduler/scheduler.js +82 -14
  23. package/lib/runtime/verification/verification-compiler.js +7 -5
  24. package/lib/runtime/workspace/strategies/git-worktree.js +18 -9
  25. package/lib/sdk/index.cjs +48 -44
  26. package/oxe/templates/PLAN.template.md +23 -9
  27. package/oxe/templates/SPEC.template.md +55 -22
  28. package/oxe/workflows/plan.md +18 -6
  29. package/oxe/workflows/spec.md +31 -9
  30. package/package.json +106 -100
  31. package/packages/runtime/package.json +18 -18
  32. package/packages/runtime/src/compiler/graph-compiler.ts +1 -1
  33. package/packages/runtime/src/evidence/evidence-store.ts +2 -2
  34. package/packages/runtime/src/executor/action-tool-map.ts +4 -0
  35. package/packages/runtime/src/executor/built-in-tools.ts +29 -0
  36. package/packages/runtime/src/executor/llm-task-executor.ts +46 -4
  37. package/packages/runtime/src/executor/node-prompt-builder.ts +18 -1
  38. package/packages/runtime/src/models/failure.ts +2 -0
  39. package/packages/runtime/src/scheduler/multi-agent-coordinator.ts +320 -46
  40. package/packages/runtime/src/scheduler/scheduler.ts +93 -15
  41. package/packages/runtime/src/verification/verification-compiler.ts +7 -5
  42. package/packages/runtime/src/workspace/strategies/git-worktree.ts +24 -16
  43. package/vscode-extension/package.json +185 -185
  44. package/vscode-extension/oxe-agents-0.9.1.vsix +0 -0
  45. package/vscode-extension/oxe-agents-0.9.2.vsix +0 -0
  46. package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
  47. package/vscode-extension/oxe-agents-1.4.0.vsix +0 -0
  48. package/vscode-extension/oxe-agents-1.5.0.vsix +0 -0
  49. package/vscode-extension/oxe-agents-1.5.1.vsix +0 -0
  50. package/vscode-extension/oxe-agents-1.6.0.vsix +0 -0
  51. package/vscode-extension/oxe-agents-1.7.0.vsix +0 -0
  52. package/vscode-extension/oxe-agents-1.8.0.vsix +0 -0
package/package.json CHANGED
@@ -1,100 +1,106 @@
1
- {
2
- "name": "oxe-cc",
3
- "version": "1.8.0",
4
- "description": "OXE — spec-driven workflows in .oxe/ with runtime enterprise, evidence-first verification and multi-runtime integrations (npx)",
5
- "license": "MIT",
6
- "author": "",
7
- "homepage": "https://www.npmjs.com/package/oxe-cc",
8
- "bugs": {
9
- "url": "https://github.com/propagno/oxe-build/issues"
10
- },
11
- "repository": {
12
- "type": "git",
13
- "url": "git+https://github.com/propagno/oxe-build.git"
14
- },
15
- "keywords": [
16
- "cursor",
17
- "github-copilot",
18
- "copilot",
19
- "claude",
20
- "claude-code",
21
- "opencode",
22
- "gemini-cli",
23
- "codex",
24
- "windsurf",
25
- "antigravity",
26
- "spec-driven",
27
- "context-engineering",
28
- "ai-agents",
29
- "oxe"
30
- ],
31
- "engines": {
32
- "node": ">=18.0.0"
33
- },
34
- "main": "lib/sdk/index.cjs",
35
- "exports": {
36
- ".": "./lib/sdk/index.cjs",
37
- "./package.json": "./package.json"
38
- },
39
- "types": "lib/sdk/index.d.ts",
40
- "bin": {
41
- "oxe-cc": "bin/oxe-cc.js",
42
- "oxe": "bin/oxe-cc.js"
43
- },
44
- "files": [
45
- "bin",
46
- "lib",
47
- "oxe",
48
- "assets",
49
- ".cursor",
50
- ".github",
51
- "commands",
52
- "vscode-extension",
53
- "docs",
54
- "QUICKSTART.md",
55
- "packages/runtime/src",
56
- "packages/runtime/package.json",
57
- "packages/runtime/tsconfig.json",
58
- "AGENTS.md",
59
- "README.md",
60
- "CHANGELOG.md"
61
- ],
62
- "scripts": {
63
- "build:runtime": "cd packages/runtime && npm run build",
64
- "sync:runtime-metadata": "node scripts/sync-runtime-metadata.cjs",
65
- "sync:cursor": "node scripts/sync-cursor-from-prompts.cjs",
66
- "release:doctor": "node scripts/release-doctor.cjs",
67
- "release:manifest": "node scripts/release-doctor.cjs --write-manifest",
68
- "test:root": "node --test tests/install.test.cjs tests/oxe-project-health.test.cjs tests/oxe-dashboard.test.cjs tests/oxe-operational.test.cjs tests/oxe-azure.test.cjs tests/oxe-sdk.test.cjs tests/oxe-manifest.test.cjs tests/oxe-agent-install.test.cjs tests/oxe-install-resolve-full.test.cjs tests/oxe-health-extended.test.cjs tests/oxe-workflows-edge.test.cjs tests/oxe-sdk-edge.test.cjs tests/oxe-cli-edge.test.cjs tests/oxe-npm-version.test.cjs tests/oxe-scripts.test.cjs tests/oxe-retro-health.test.cjs tests/oxe-security-permissions.test.cjs tests/oxe-runtime-semantics.test.cjs tests/oxe-plugins.test.cjs",
69
- "test:runtime": "cd packages/runtime && npm test",
70
- "test:runtime-smoke": "node scripts/runtime-smoke-matrix.cjs",
71
- "test:recovery-fixtures": "node scripts/run-recovery-fixtures.cjs",
72
- "test:multi-agent-soak": "node scripts/run-multi-agent-soak.cjs",
73
- "test": "npm run build:runtime && npm run test:root && npm run test:runtime && npm run test:runtime-smoke && npm run test:recovery-fixtures && npm run test:multi-agent-soak",
74
- "test:coverage": "c8 --check-coverage --lines 82 --functions 85 --branches 58 --statements 82 npm test",
75
- "scan:assets": "node scripts/oxe-assets-scan.cjs",
76
- "build:vscode-ext": "cd vscode-extension && npx @vscode/vsce package --no-yarn --allow-missing-repository",
77
- "prepublishOnly": "npm test && npm run scan:assets && npm run build:vscode-ext && npm run release:manifest && node bin/oxe-cc.js --version"
78
- },
79
- "c8": {
80
- "all": true,
81
- "include": [
82
- "bin/oxe-cc.js",
83
- "bin/lib/**/*.cjs",
84
- "lib/**/*.cjs",
85
- "scripts/**/*.cjs"
86
- ],
87
- "exclude": [
88
- "**/node_modules/**"
89
- ],
90
- "reporter": [
91
- "text-summary"
92
- ]
93
- },
94
- "devDependencies": {
95
- "c8": "^11.0.0"
96
- },
97
- "dependencies": {
98
- "semver": "^7.7.4"
99
- }
100
- }
1
+ {
2
+ "name": "oxe-cc",
3
+ "version": "1.9.1",
4
+ "description": "OXE — spec-driven workflows in .oxe/ with runtime enterprise, evidence-first verification and multi-runtime integrations (npx)",
5
+ "license": "MIT",
6
+ "author": "",
7
+ "homepage": "https://www.npmjs.com/package/oxe-cc",
8
+ "bugs": {
9
+ "url": "https://github.com/propagno/oxe-build/issues"
10
+ },
11
+ "repository": {
12
+ "type": "git",
13
+ "url": "git+https://github.com/propagno/oxe-build.git"
14
+ },
15
+ "keywords": [
16
+ "cursor",
17
+ "github-copilot",
18
+ "copilot",
19
+ "claude",
20
+ "claude-code",
21
+ "opencode",
22
+ "gemini-cli",
23
+ "codex",
24
+ "windsurf",
25
+ "antigravity",
26
+ "spec-driven",
27
+ "context-engineering",
28
+ "ai-agents",
29
+ "oxe"
30
+ ],
31
+ "engines": {
32
+ "node": ">=18.0.0"
33
+ },
34
+ "main": "lib/sdk/index.cjs",
35
+ "exports": {
36
+ ".": "./lib/sdk/index.cjs",
37
+ "./package.json": "./package.json"
38
+ },
39
+ "types": "lib/sdk/index.d.ts",
40
+ "bin": {
41
+ "oxe-cc": "bin/oxe-cc.js",
42
+ "oxe": "bin/oxe-cc.js"
43
+ },
44
+ "files": [
45
+ "bin",
46
+ "lib",
47
+ "oxe",
48
+ "assets",
49
+ ".cursor",
50
+ ".github",
51
+ "commands",
52
+ "vscode-extension/package.json",
53
+ "vscode-extension/.vscodeignore",
54
+ "vscode-extension/LICENSE",
55
+ "vscode-extension/src",
56
+ "docs",
57
+ "QUICKSTART.md",
58
+ "packages/runtime/src",
59
+ "packages/runtime/package.json",
60
+ "packages/runtime/tsconfig.json",
61
+ "AGENTS.md",
62
+ "README.md",
63
+ "CHANGELOG.md"
64
+ ],
65
+ "scripts": {
66
+ "build:runtime": "cd packages/runtime && npm run build",
67
+ "sync:runtime-metadata": "node scripts/sync-runtime-metadata.cjs",
68
+ "sync:cursor": "node scripts/sync-cursor-from-prompts.cjs",
69
+ "release:doctor": "node scripts/release-doctor.cjs",
70
+ "release:manifest": "node scripts/release-doctor.cjs --write-manifest",
71
+ "test:root": "node --test tests/install.test.cjs tests/oxe-project-health.test.cjs tests/oxe-dashboard.test.cjs tests/oxe-operational.test.cjs tests/oxe-azure.test.cjs tests/oxe-sdk.test.cjs tests/oxe-manifest.test.cjs tests/oxe-agent-install.test.cjs tests/oxe-install-resolve-full.test.cjs tests/oxe-health-extended.test.cjs tests/oxe-workflows-edge.test.cjs tests/oxe-sdk-edge.test.cjs tests/oxe-cli-edge.test.cjs tests/oxe-npm-version.test.cjs tests/oxe-scripts.test.cjs tests/oxe-retro-health.test.cjs tests/oxe-security-permissions.test.cjs tests/oxe-runtime-semantics.test.cjs tests/oxe-plugins.test.cjs",
72
+ "test:runtime": "cd packages/runtime && npm test",
73
+ "test:runtime-smoke": "node scripts/runtime-smoke-matrix.cjs",
74
+ "test:runtime-real": "node scripts/runtime-real-suite.cjs",
75
+ "test:recovery-fixtures": "node scripts/run-recovery-fixtures.cjs",
76
+ "test:multi-agent-soak": "node scripts/run-multi-agent-soak.cjs",
77
+ "test:multi-agent-real": "node scripts/run-multi-agent-real.cjs",
78
+ "test": "npm run build:runtime && npm run test:root && npm run test:runtime && npm run test:runtime-smoke && npm run test:runtime-real && npm run test:recovery-fixtures && npm run test:multi-agent-soak && npm run test:multi-agent-real",
79
+ "test:coverage": "c8 --check-coverage --lines 82 --functions 85 --branches 58 --statements 82 npm test",
80
+ "scan:assets": "node scripts/oxe-assets-scan.cjs",
81
+ "release:pack-check": "node scripts/release-pack-check.cjs",
82
+ "build:vscode-ext": "cd vscode-extension && npx @vscode/vsce package --no-yarn --allow-missing-repository",
83
+ "prepublishOnly": "npm test && npm run scan:assets && npm run build:vscode-ext && npm run release:manifest && npm run release:pack-check && node bin/oxe-cc.js --version"
84
+ },
85
+ "c8": {
86
+ "all": true,
87
+ "include": [
88
+ "bin/oxe-cc.js",
89
+ "bin/lib/**/*.cjs",
90
+ "lib/**/*.cjs",
91
+ "scripts/**/*.cjs"
92
+ ],
93
+ "exclude": [
94
+ "**/node_modules/**"
95
+ ],
96
+ "reporter": [
97
+ "text-summary"
98
+ ]
99
+ },
100
+ "devDependencies": {
101
+ "c8": "^11.0.0"
102
+ },
103
+ "dependencies": {
104
+ "semver": "^7.7.4"
105
+ }
106
+ }
@@ -1,18 +1,18 @@
1
- {
2
- "name": "@oxe/runtime",
3
- "version": "1.8.0",
4
- "private": true,
5
- "license": "MIT",
6
- "description": "OXE agentic execution engine — enterprise runtime core",
7
- "main": "../../lib/runtime/index.js",
8
- "types": "../../lib/runtime/index.d.ts",
9
- "scripts": {
10
- "build": "tsc",
11
- "test": "tsc --project tsconfig.test.json && node --test dist-tests/tests/*.test.js",
12
- "clean": "node -e \"const fs=require('fs');['../../lib/runtime','dist-tests'].forEach(d=>{try{fs.rmSync(d,{recursive:true})}catch{}});\""
13
- },
14
- "devDependencies": {
15
- "@types/node": "^25.6.0",
16
- "typescript": "^5.4.5"
17
- }
18
- }
1
+ {
2
+ "name": "@oxe/runtime",
3
+ "version": "1.9.1",
4
+ "private": true,
5
+ "license": "MIT",
6
+ "description": "OXE agentic execution engine — enterprise runtime core",
7
+ "main": "../../lib/runtime/index.js",
8
+ "types": "../../lib/runtime/index.d.ts",
9
+ "scripts": {
10
+ "build": "tsc",
11
+ "test": "tsc --project tsconfig.test.json && node --test dist-tests/tests/*.test.js",
12
+ "clean": "node -e \"const fs=require('fs');['../../lib/runtime','dist-tests'].forEach(d=>{try{fs.rmSync(d,{recursive:true})}catch{}});\""
13
+ },
14
+ "devDependencies": {
15
+ "@types/node": "^25.6.0",
16
+ "typescript": "^5.4.5"
17
+ }
18
+ }
@@ -123,7 +123,7 @@ export function compile(
123
123
  mutation_scope: task.files,
124
124
  actions: buildActions(task),
125
125
  verify: {
126
- must_pass: task.verifyCommand ? ['tests'] : [],
126
+ must_pass: task.verifyCommand ? (task.aceite.length > 0 ? task.aceite : ['tests']) : [],
127
127
  acceptance_refs: task.aceite,
128
128
  command: task.verifyCommand,
129
129
  },
@@ -75,8 +75,8 @@ export class EvidenceStore {
75
75
  const ext = EXT_MAP[type] ?? 'bin';
76
76
 
77
77
  const existing = this.readIndex(run_id, work_item_id, attempt_number);
78
- const seq = existing.filter((e) => e.type === type).length + 1;
79
- const filename = seq === 1 ? `${type}.${ext}` : `${type}-${seq}.${ext}`;
78
+ const seq = existing.filter((e) => e.type === type).length + 1;
79
+ const filename = seq === 1 ? `${type}.${ext}` : `${type}-${seq}.${ext}`;
80
80
  const filePath = path.join(dir, filename);
81
81
 
82
82
  fs.writeFileSync(filePath, buf);
@@ -42,5 +42,9 @@ export function selectToolsForActions(actions: Action[]): ToolSchema[] {
42
42
  }
43
43
  }
44
44
  }
45
+ // finish_task is always available so the LLM can signal authoritative completion
46
+ if (!seen.has('finish_task') && BUILT_IN_TOOLS.finish_task) {
47
+ result.push(BUILT_IN_TOOLS.finish_task.schema);
48
+ }
45
49
  return result;
46
50
  }
@@ -262,6 +262,34 @@ function runShell(command: string, cwd: string, timeoutMs: number): Promise<stri
262
262
  });
263
263
  }
264
264
 
265
+ // ─── finish_task ──────────────────────────────────────────────────────────────
266
+
267
+ const finishTask: BuiltInToolHandler = {
268
+ idempotent: true,
269
+ schema: {
270
+ type: 'function',
271
+ function: {
272
+ name: 'finish_task',
273
+ description: 'Signal that the task is complete. Call this when ALL required actions have been performed.',
274
+ parameters: {
275
+ type: 'object',
276
+ properties: {
277
+ summary: { type: 'string', description: 'Summary of what was accomplished' },
278
+ evidence_paths: { type: 'array', items: { type: 'string' }, description: 'Paths to files created or modified' },
279
+ },
280
+ required: ['summary'],
281
+ },
282
+ },
283
+ },
284
+ async execute(args, _cwd) {
285
+ return JSON.stringify({
286
+ __finish_task__: true,
287
+ summary: String(args.summary || ''),
288
+ evidence_paths: Array.isArray(args.evidence_paths) ? args.evidence_paths : [],
289
+ });
290
+ },
291
+ };
292
+
265
293
  // ─── Registry ─────────────────────────────────────────────────────────────────
266
294
 
267
295
  export const BUILT_IN_TOOLS: Record<string, BuiltInToolHandler> = {
@@ -271,6 +299,7 @@ export const BUILT_IN_TOOLS: Record<string, BuiltInToolHandler> = {
271
299
  glob,
272
300
  grep,
273
301
  run_command: runCommand,
302
+ finish_task: finishTask,
274
303
  };
275
304
 
276
305
  export const ALL_BUILT_IN_SCHEMAS: ToolSchema[] = Object.values(BUILT_IN_TOOLS).map((t) => t.schema);
@@ -32,9 +32,13 @@ export interface LlmExecutorEvent {
32
32
  detail?: Record<string, unknown>;
33
33
  }
34
34
 
35
+ export interface LlmExecuteOptions {
36
+ previousError?: string | null;
37
+ }
38
+
35
39
  const DEFAULT_SYSTEM_PROMPT =
36
40
  'You are a precise software engineering agent. Use the tools provided to complete the task. ' +
37
- 'When the task is done, summarize what was accomplished in your final message without calling any tools.';
41
+ 'When all actions are done, call finish_task with a summary of what was accomplished.';
38
42
 
39
43
  export class LlmTaskExecutor implements TaskExecutor {
40
44
  constructor(
@@ -48,8 +52,9 @@ export class LlmTaskExecutor implements TaskExecutor {
48
52
  lease: WorkspaceLease,
49
53
  runId: string,
50
54
  attempt: number,
55
+ options: LlmExecuteOptions = {},
51
56
  ): Promise<TaskResult> {
52
- const prompt = buildNodePrompt(node, lease, runId, attempt);
57
+ const prompt = buildNodePrompt(node, lease, runId, attempt, { previousError: options.previousError ?? null });
53
58
  const tools = selectToolsForActions(node.actions);
54
59
  const cwd = lease.root_path;
55
60
  const maxTurns = this.provider.maxTurns ?? 10;
@@ -62,8 +67,11 @@ export class LlmTaskExecutor implements TaskExecutor {
62
67
 
63
68
  let finalOutput = '';
64
69
  const evidencePaths: string[] = [];
70
+ let completedByFinishTask = false;
71
+ let finishTaskSummary = '';
65
72
 
66
- for (let turn = 0; turn < maxTurns; turn++) {
73
+ let turn = 0;
74
+ for (; turn < maxTurns; turn++) {
67
75
  this.emit({ type: 'turn_start', nodeId: node.id, attempt, detail: { turn } });
68
76
 
69
77
  let response;
@@ -105,13 +113,47 @@ export class LlmTaskExecutor implements TaskExecutor {
105
113
  }
106
114
 
107
115
  messages.push(...concurrentResults, ...serialResults);
116
+
117
+ // Detect finish_task call — authoritative completion signal
118
+ const allResults = [...concurrentResults, ...serialResults];
119
+ const finishResult = allResults.find((r) => r.name === 'finish_task');
120
+ if (finishResult) {
121
+ try {
122
+ const parsed = JSON.parse(finishResult.content as string);
123
+ if (parsed.__finish_task__) {
124
+ completedByFinishTask = true;
125
+ finishTaskSummary = parsed.summary || '';
126
+ if (Array.isArray(parsed.evidence_paths)) {
127
+ evidencePaths.push(...parsed.evidence_paths.filter((p: unknown) => typeof p === 'string'));
128
+ }
129
+ }
130
+ } catch { /* ignore parse errors */ }
131
+ if (completedByFinishTask) break;
132
+ }
133
+ }
134
+
135
+ const completedBy = completedByFinishTask
136
+ ? 'finish_task'
137
+ : turn < maxTurns
138
+ ? 'no_tool_call'
139
+ : 'turn_limit_exhausted';
140
+
141
+ if (completedBy === 'turn_limit_exhausted') {
142
+ return {
143
+ success: false,
144
+ failure_class: 'llm',
145
+ evidence: evidencePaths,
146
+ output: finalOutput || `Task exhausted ${maxTurns} turns without calling finish_task`,
147
+ completed_by: completedBy,
148
+ };
108
149
  }
109
150
 
110
151
  return {
111
152
  success: true,
112
153
  failure_class: null,
113
154
  evidence: evidencePaths,
114
- output: finalOutput,
155
+ output: completedByFinishTask ? (finishTaskSummary || finalOutput) : finalOutput,
156
+ completed_by: completedBy,
115
157
  };
116
158
  }
117
159
 
@@ -1,11 +1,16 @@
1
1
  import type { GraphNode } from '../compiler/graph-compiler';
2
2
  import type { WorkspaceLease } from '../models/workspace';
3
3
 
4
+ export interface NodePromptOptions {
5
+ previousError?: string | null;
6
+ }
7
+
4
8
  export function buildNodePrompt(
5
9
  node: GraphNode,
6
10
  lease: WorkspaceLease,
7
11
  runId: string,
8
12
  attempt: number,
13
+ options: NodePromptOptions = {},
9
14
  ): string {
10
15
  const lines: string[] = [
11
16
  `# Tarefa: ${node.title}`,
@@ -18,6 +23,15 @@ export function buildNodePrompt(
18
23
  lines.push(`**Escopo de mutação:** ${node.mutation_scope.join(', ')}`);
19
24
  }
20
25
 
26
+ if (attempt > 1 && options.previousError) {
27
+ lines.push('', '## Contexto da tentativa anterior');
28
+ lines.push(`Esta é a tentativa **${attempt}**. A tentativa anterior falhou:`);
29
+ lines.push('', '```');
30
+ lines.push(String(options.previousError).slice(0, 2000));
31
+ lines.push('```', '');
32
+ lines.push('Analise o erro e tente uma abordagem diferente.');
33
+ }
34
+
21
35
  if (node.actions.length > 0) {
22
36
  lines.push('', '## Ações requeridas');
23
37
  for (const action of node.actions) {
@@ -39,7 +53,10 @@ export function buildNodePrompt(
39
53
  lines.push('', `**Verificação:** \`${node.verify.command}\``);
40
54
  }
41
55
 
42
- lines.push('', 'Execute as ações acima usando as ferramentas disponíveis e confirme o resultado.');
56
+ lines.push('', '## Conclusão da tarefa');
57
+ lines.push('Quando **todas** as ações estiverem concluídas, chame `finish_task` com um resumo do que foi realizado.');
58
+ lines.push('NÃO chame `finish_task` antes de completar todas as ações requeridas.');
59
+ lines.push('', 'Execute as ações acima usando as ferramentas disponíveis.');
43
60
 
44
61
  return lines.join('\n');
45
62
  }
@@ -8,4 +8,6 @@ export type FailureClass =
8
8
  | 'test' // verification / acceptance test failed
9
9
  | 'timeout' // task or run exceeded time budget
10
10
  | 'evidence_missing' // required evidence was not collected
11
+ | 'verify' // inline verification command failed after execution
12
+ | 'llm' // LLM exhausted turn budget without calling finish_task
11
13
  | null; // success — no failure