oxe-cc 1.8.0 → 1.8.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +63 -0
- package/README.md +1 -1
- package/bin/lib/oxe-manifest.cjs +20 -13
- package/bin/lib/oxe-operational.cjs +96 -10
- package/bin/lib/oxe-project-health.cjs +77 -18
- package/bin/lib/oxe-rationality.cjs +9 -7
- package/bin/oxe-cc.js +202 -39
- package/lib/runtime/compiler/graph-compiler.js +1 -1
- package/lib/runtime/executor/action-tool-map.js +4 -0
- package/lib/runtime/executor/built-in-tools.js +27 -0
- package/lib/runtime/executor/llm-task-executor.d.ts +4 -1
- package/lib/runtime/executor/llm-task-executor.js +41 -5
- package/lib/runtime/executor/node-prompt-builder.d.ts +4 -1
- package/lib/runtime/executor/node-prompt-builder.js +13 -2
- package/lib/runtime/models/failure.d.ts +1 -1
- package/lib/runtime/scheduler/scheduler.d.ts +5 -1
- package/lib/runtime/scheduler/scheduler.js +82 -14
- package/lib/runtime/verification/verification-compiler.js +7 -5
- package/lib/sdk/index.cjs +48 -44
- package/oxe/templates/PLAN.template.md +23 -9
- package/oxe/templates/SPEC.template.md +55 -22
- package/oxe/workflows/plan.md +18 -6
- package/oxe/workflows/spec.md +31 -9
- package/package.json +103 -100
- package/packages/runtime/package.json +18 -18
- package/packages/runtime/src/compiler/graph-compiler.ts +1 -1
- package/packages/runtime/src/evidence/evidence-store.ts +2 -2
- package/packages/runtime/src/executor/action-tool-map.ts +4 -0
- package/packages/runtime/src/executor/built-in-tools.ts +29 -0
- package/packages/runtime/src/executor/llm-task-executor.ts +46 -4
- package/packages/runtime/src/executor/node-prompt-builder.ts +18 -1
- package/packages/runtime/src/models/failure.ts +2 -0
- package/packages/runtime/src/scheduler/scheduler.ts +93 -15
- package/packages/runtime/src/verification/verification-compiler.ts +7 -5
- package/vscode-extension/package.json +185 -185
- package/vscode-extension/oxe-agents-0.9.1.vsix +0 -0
- package/vscode-extension/oxe-agents-0.9.2.vsix +0 -0
- package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
- package/vscode-extension/oxe-agents-1.4.0.vsix +0 -0
- package/vscode-extension/oxe-agents-1.5.0.vsix +0 -0
- package/vscode-extension/oxe-agents-1.5.1.vsix +0 -0
- package/vscode-extension/oxe-agents-1.6.0.vsix +0 -0
- package/vscode-extension/oxe-agents-1.7.0.vsix +0 -0
- package/vscode-extension/oxe-agents-1.8.0.vsix +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.buildNodePrompt = buildNodePrompt;
|
|
4
|
-
function buildNodePrompt(node, lease, runId, attempt) {
|
|
4
|
+
function buildNodePrompt(node, lease, runId, attempt, options = {}) {
|
|
5
5
|
const lines = [
|
|
6
6
|
`# Tarefa: ${node.title}`,
|
|
7
7
|
'',
|
|
@@ -11,6 +11,14 @@ function buildNodePrompt(node, lease, runId, attempt) {
|
|
|
11
11
|
if (node.mutation_scope.length > 0) {
|
|
12
12
|
lines.push(`**Escopo de mutação:** ${node.mutation_scope.join(', ')}`);
|
|
13
13
|
}
|
|
14
|
+
if (attempt > 1 && options.previousError) {
|
|
15
|
+
lines.push('', '## Contexto da tentativa anterior');
|
|
16
|
+
lines.push(`Esta é a tentativa **${attempt}**. A tentativa anterior falhou:`);
|
|
17
|
+
lines.push('', '```');
|
|
18
|
+
lines.push(String(options.previousError).slice(0, 2000));
|
|
19
|
+
lines.push('```', '');
|
|
20
|
+
lines.push('Analise o erro e tente uma abordagem diferente.');
|
|
21
|
+
}
|
|
14
22
|
if (node.actions.length > 0) {
|
|
15
23
|
lines.push('', '## Ações requeridas');
|
|
16
24
|
for (const action of node.actions) {
|
|
@@ -31,6 +39,9 @@ function buildNodePrompt(node, lease, runId, attempt) {
|
|
|
31
39
|
if (node.verify.command) {
|
|
32
40
|
lines.push('', `**Verificação:** \`${node.verify.command}\``);
|
|
33
41
|
}
|
|
34
|
-
lines.push('', '
|
|
42
|
+
lines.push('', '## Conclusão da tarefa');
|
|
43
|
+
lines.push('Quando **todas** as ações estiverem concluídas, chame `finish_task` com um resumo do que foi realizado.');
|
|
44
|
+
lines.push('NÃO chame `finish_task` antes de completar todas as ações requeridas.');
|
|
45
|
+
lines.push('', 'Execute as ações acima usando as ferramentas disponíveis.');
|
|
35
46
|
return lines.join('\n');
|
|
36
47
|
}
|
|
@@ -2,4 +2,4 @@
|
|
|
2
2
|
* Canonical failure classification used by TaskResult and VerificationManifest.
|
|
3
3
|
* Both must import from this file — never redefine inline.
|
|
4
4
|
*/
|
|
5
|
-
export type FailureClass = 'env' | 'policy' | 'test' | 'timeout' | 'evidence_missing' | null;
|
|
5
|
+
export type FailureClass = 'env' | 'policy' | 'test' | 'timeout' | 'evidence_missing' | 'verify' | 'llm' | null;
|
|
@@ -14,9 +14,12 @@ export interface TaskResult {
|
|
|
14
14
|
failure_class: FailureClass;
|
|
15
15
|
evidence: string[];
|
|
16
16
|
output: string;
|
|
17
|
+
completed_by?: string;
|
|
17
18
|
}
|
|
18
19
|
export interface TaskExecutor {
|
|
19
|
-
execute(node: GraphNode, lease: WorkspaceLease, runId: string, attemptNumber: number
|
|
20
|
+
execute(node: GraphNode, lease: WorkspaceLease, runId: string, attemptNumber: number, options?: {
|
|
21
|
+
previousError?: string | null;
|
|
22
|
+
}): Promise<TaskResult>;
|
|
20
23
|
}
|
|
21
24
|
export interface SchedulerOptions {
|
|
22
25
|
maxRunDurationMs?: number;
|
|
@@ -70,6 +73,7 @@ export declare class Scheduler {
|
|
|
70
73
|
getJournal(): RunJournal | null;
|
|
71
74
|
static loadJournal(projectRoot: string, runId: string): RunJournal | null;
|
|
72
75
|
private executeNode;
|
|
76
|
+
private verifyNode;
|
|
73
77
|
private evaluatePolicyForNode;
|
|
74
78
|
private requestGateForNode;
|
|
75
79
|
private blockNode;
|
|
@@ -12,6 +12,7 @@ const audit_trail_1 = require("../audit/audit-trail");
|
|
|
12
12
|
const run_journal_1 = require("./run-journal");
|
|
13
13
|
const decision_memo_1 = require("../decision/decision-memo");
|
|
14
14
|
const capability_adapter_1 = require("../plugins/capability-adapter");
|
|
15
|
+
const verification_compiler_1 = require("../verification/verification-compiler");
|
|
15
16
|
class Scheduler {
|
|
16
17
|
constructor() {
|
|
17
18
|
this.cancelled = false;
|
|
@@ -350,6 +351,7 @@ class Scheduler {
|
|
|
350
351
|
});
|
|
351
352
|
let lease = null;
|
|
352
353
|
let lastResult = null;
|
|
354
|
+
let lastError = null;
|
|
353
355
|
const maxAttempts = node.policy.max_retries + 1;
|
|
354
356
|
const quotaBlocked = this.consumeQuotaForNode(ctx, node);
|
|
355
357
|
if (quotaBlocked) {
|
|
@@ -408,19 +410,31 @@ class Scheduler {
|
|
|
408
410
|
attempt_id: attemptId,
|
|
409
411
|
payload: { workspace_id: lease.workspace_id, strategy: lease.strategy },
|
|
410
412
|
});
|
|
411
|
-
lastResult = await this.executeNode(node, lease, ctx, attempt, attemptId);
|
|
413
|
+
lastResult = await this.executeNode(node, lease, ctx, attempt, attemptId, { previousError: lastError });
|
|
412
414
|
if (lastResult.success) {
|
|
413
|
-
this.
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
415
|
+
const verifyResult = await this.verifyNode(node, lease, ctx, attemptId, attempt);
|
|
416
|
+
if (verifyResult && verifyResult.status === 'failed') {
|
|
417
|
+
lastResult = {
|
|
418
|
+
success: false,
|
|
419
|
+
failure_class: 'verify',
|
|
420
|
+
evidence: lastResult.evidence,
|
|
421
|
+
output: `Verification failed: ${(verifyResult.gaps || []).join('; ') || 'checks did not pass'}`,
|
|
422
|
+
};
|
|
423
|
+
}
|
|
424
|
+
else {
|
|
425
|
+
this.emit(ctx, {
|
|
426
|
+
type: 'WorkItemCompleted',
|
|
427
|
+
work_item_id: nodeId,
|
|
428
|
+
attempt_id: attemptId,
|
|
429
|
+
payload: { attempt_number: attempt, evidence: lastResult.evidence },
|
|
430
|
+
});
|
|
431
|
+
status.set(nodeId, 'completed');
|
|
432
|
+
completed.push(nodeId);
|
|
433
|
+
this.recordProgress();
|
|
434
|
+
return;
|
|
435
|
+
}
|
|
423
436
|
}
|
|
437
|
+
lastError = lastResult.output || (lastResult.failure_class ?? 'unknown error');
|
|
424
438
|
if (lastResult.failure_class === 'policy')
|
|
425
439
|
break;
|
|
426
440
|
if (attempt < maxAttempts) {
|
|
@@ -454,6 +468,7 @@ class Scheduler {
|
|
|
454
468
|
evidence: [],
|
|
455
469
|
output: `[error_boundary] ${message}`,
|
|
456
470
|
};
|
|
471
|
+
lastError = lastResult.output;
|
|
457
472
|
if (attempt < maxAttempts) {
|
|
458
473
|
const backoffMs = Math.min(1000 * Math.pow(2, attempt - 1) + Math.random() * 500, 30000);
|
|
459
474
|
await new Promise(resolve => setTimeout(resolve, backoffMs));
|
|
@@ -509,11 +524,11 @@ class Scheduler {
|
|
|
509
524
|
static loadJournal(projectRoot, runId) {
|
|
510
525
|
return (0, run_journal_1.loadJournal)(projectRoot, runId);
|
|
511
526
|
}
|
|
512
|
-
async executeNode(node, lease, ctx, attempt, attemptId) {
|
|
527
|
+
async executeNode(node, lease, ctx, attempt, attemptId, options = {}) {
|
|
513
528
|
const primaryAction = pickPrimaryAction(node, ctx.pluginRegistry);
|
|
514
529
|
const provider = primaryAction ? ctx.pluginRegistry?.toolProviderFor(primaryAction.type) : null;
|
|
515
530
|
if (!provider || !primaryAction) {
|
|
516
|
-
return ctx.executor.execute(node, lease, ctx.runId, attempt);
|
|
531
|
+
return ctx.executor.execute(node, lease, ctx.runId, attempt, options);
|
|
517
532
|
}
|
|
518
533
|
ctx.auditTrail?.record('plugin_invoked', ctx.policyActor ?? 'runtime', {
|
|
519
534
|
runId: ctx.runId,
|
|
@@ -573,6 +588,57 @@ class Scheduler {
|
|
|
573
588
|
output: result.output,
|
|
574
589
|
};
|
|
575
590
|
}
|
|
591
|
+
async verifyNode(node, lease, ctx, attemptId, attempt) {
|
|
592
|
+
if (!node.verify?.command)
|
|
593
|
+
return null;
|
|
594
|
+
this.emit(ctx, {
|
|
595
|
+
type: 'VerificationStarted',
|
|
596
|
+
work_item_id: node.id,
|
|
597
|
+
payload: { command: node.verify.command, attempt_number: attempt },
|
|
598
|
+
});
|
|
599
|
+
const suite = {
|
|
600
|
+
checks: [{
|
|
601
|
+
id: `inline-${node.id}`,
|
|
602
|
+
type: 'custom',
|
|
603
|
+
command: node.verify.command,
|
|
604
|
+
evidence_type_expected: 'stdout',
|
|
605
|
+
acceptance_ref: null,
|
|
606
|
+
description: `Verify ${node.id}`,
|
|
607
|
+
}],
|
|
608
|
+
compiled_at: new Date().toISOString(),
|
|
609
|
+
spec_hash: '',
|
|
610
|
+
plan_hash: '',
|
|
611
|
+
};
|
|
612
|
+
let result;
|
|
613
|
+
try {
|
|
614
|
+
result = await (0, verification_compiler_1.verifyRun)({
|
|
615
|
+
suite,
|
|
616
|
+
cwd: lease.root_path,
|
|
617
|
+
timeoutMs: ctx.options?.verifyTimeoutMs ?? 60000,
|
|
618
|
+
runId: ctx.runId,
|
|
619
|
+
workItemId: node.id,
|
|
620
|
+
attemptNumber: attempt,
|
|
621
|
+
projectRoot: ctx.projectRoot,
|
|
622
|
+
pluginRegistry: ctx.pluginRegistry,
|
|
623
|
+
});
|
|
624
|
+
}
|
|
625
|
+
catch (err) {
|
|
626
|
+
this.emit(ctx, {
|
|
627
|
+
type: 'VerificationCompleted',
|
|
628
|
+
work_item_id: node.id,
|
|
629
|
+
attempt_id: attemptId,
|
|
630
|
+
payload: { status: 'error', error: String(err) },
|
|
631
|
+
});
|
|
632
|
+
return null;
|
|
633
|
+
}
|
|
634
|
+
this.emit(ctx, {
|
|
635
|
+
type: 'VerificationCompleted',
|
|
636
|
+
work_item_id: node.id,
|
|
637
|
+
attempt_id: attemptId,
|
|
638
|
+
payload: { status: result.status },
|
|
639
|
+
});
|
|
640
|
+
return result;
|
|
641
|
+
}
|
|
576
642
|
evaluatePolicyForNode(node, ctx) {
|
|
577
643
|
if (!ctx.policyEngine)
|
|
578
644
|
return null;
|
|
@@ -603,8 +669,10 @@ class Scheduler {
|
|
|
603
669
|
return persisted;
|
|
604
670
|
}
|
|
605
671
|
async requestGateForNode(node, ctx, decision) {
|
|
606
|
-
if (!ctx.gateManager)
|
|
672
|
+
if (!ctx.gateManager) {
|
|
673
|
+
console.warn('[scheduler] ctx.gateManager not configured — gates will not be persisted');
|
|
607
674
|
return 'gate-missing-manager';
|
|
675
|
+
}
|
|
608
676
|
const scope = inferGateScope(node);
|
|
609
677
|
const primaryAction = pickPrimaryAction(node, ctx.pluginRegistry);
|
|
610
678
|
const gate = await ctx.gateManager.request(scope, {
|
|
@@ -92,15 +92,17 @@ async function runCheck(check, cwd, timeoutMs = 60000) {
|
|
|
92
92
|
}
|
|
93
93
|
const start = Date.now();
|
|
94
94
|
try {
|
|
95
|
-
//
|
|
96
|
-
const
|
|
97
|
-
const
|
|
98
|
-
const
|
|
99
|
-
const result = (0, child_process_1.spawnSync)(
|
|
95
|
+
// Use shell so the full command string is interpreted (handles quotes, &&, node -e "...")
|
|
96
|
+
const isWin = process.platform === 'win32';
|
|
97
|
+
const shell = isWin ? 'cmd' : 'sh';
|
|
98
|
+
const shellArgs = isWin ? ['/c', check.command] : ['-c', check.command];
|
|
99
|
+
const result = (0, child_process_1.spawnSync)(shell, shellArgs, {
|
|
100
100
|
cwd,
|
|
101
101
|
encoding: 'utf8',
|
|
102
102
|
timeout: timeoutMs,
|
|
103
103
|
maxBuffer: 2 * 1024 * 1024,
|
|
104
|
+
// On Windows, prevent Node from re-quoting the args (preserves double-quotes inside node -e "...")
|
|
105
|
+
windowsVerbatimArguments: isWin,
|
|
104
106
|
});
|
|
105
107
|
const duration_ms = Date.now() - start;
|
|
106
108
|
const status = result.status === 0 ? 'pass' : 'fail';
|
package/lib/sdk/index.cjs
CHANGED
|
@@ -17,10 +17,10 @@ const plugins = require('../../bin/lib/oxe-plugins.cjs');
|
|
|
17
17
|
const dashboard = require('../../bin/lib/oxe-dashboard.cjs');
|
|
18
18
|
const operational = require('../../bin/lib/oxe-operational.cjs');
|
|
19
19
|
const azure = require('../../bin/lib/oxe-azure.cjs');
|
|
20
|
-
const context = require('../../bin/lib/oxe-context-engine.cjs');
|
|
21
|
-
const runtimeSemantics = require('../../bin/lib/oxe-runtime-semantics.cjs');
|
|
22
|
-
const release = require('../../bin/lib/oxe-release.cjs');
|
|
23
|
-
const rationality = require('../../bin/lib/oxe-rationality.cjs');
|
|
20
|
+
const context = require('../../bin/lib/oxe-context-engine.cjs');
|
|
21
|
+
const runtimeSemantics = require('../../bin/lib/oxe-runtime-semantics.cjs');
|
|
22
|
+
const release = require('../../bin/lib/oxe-release.cjs');
|
|
23
|
+
const rationality = require('../../bin/lib/oxe-rationality.cjs');
|
|
24
24
|
|
|
25
25
|
const PACKAGE_ROOT = path.join(__dirname, '..', '..');
|
|
26
26
|
|
|
@@ -94,8 +94,12 @@ function parsePlan(planMd) {
|
|
|
94
94
|
? filesMatch[1].match(/`([^`]+)`/g)?.map((s) => s.replace(/`/g, '')) || []
|
|
95
95
|
: [];
|
|
96
96
|
|
|
97
|
-
|
|
98
|
-
|
|
97
|
+
// Accept: "Comando: `...`" (PT), "**Verify command:** `...`", "**Verificação:** `...`", "**Verification:** `...`"
|
|
98
|
+
// Use [^`]+ with dotAll so multiline commands inside backticks are captured
|
|
99
|
+
const verifyCmdMatch = rest.match(
|
|
100
|
+
/(?:Comando|Verify\s+command|Verificação|Verification):\s*`([^`]+)`/is
|
|
101
|
+
);
|
|
102
|
+
const verifyCommand = verifyCmdMatch ? verifyCmdMatch[1].trim() : null;
|
|
99
103
|
|
|
100
104
|
const aceiteMatch = rest.match(/\*\*Aceite\s+vinculado:\*\*\s*([^\n]+)/i);
|
|
101
105
|
const aceite = aceiteMatch
|
|
@@ -542,23 +546,23 @@ module.exports = {
|
|
|
542
546
|
/** Parsing de artefatos OXE (PLAN, SPEC, STATE, hypotheses, confidence, lessons). */
|
|
543
547
|
parsePlan,
|
|
544
548
|
parseSpec,
|
|
545
|
-
parseHypotheses: context.parseHypotheses,
|
|
546
|
-
parseConfidenceVector: context.parseConfidenceVector,
|
|
547
|
-
parseExecutionPlanTasks: rationality.parsePlanTasks,
|
|
548
|
-
parseState,
|
|
549
|
+
parseHypotheses: context.parseHypotheses,
|
|
550
|
+
parseConfidenceVector: context.parseConfidenceVector,
|
|
551
|
+
parseExecutionPlanTasks: rationality.parsePlanTasks,
|
|
552
|
+
parseState,
|
|
549
553
|
validateDecisionFidelity,
|
|
550
554
|
parseLessonsMetrics,
|
|
551
555
|
updateLessonMetric,
|
|
552
556
|
deprecateLowEffectiveness,
|
|
553
557
|
|
|
554
558
|
/** Estado do projeto, SPEC/PLAN, fase, config. */
|
|
555
|
-
health: {
|
|
556
|
-
loadOxeConfigMerged: health.loadOxeConfigMerged,
|
|
557
|
-
validateConfigShape: health.validateConfigShape,
|
|
558
|
-
buildHealthReport: health.buildHealthReport,
|
|
559
|
-
detectWorkspaceMode: health.detectWorkspaceMode,
|
|
560
|
-
shouldSuppressExecutionWorkspaceGates: health.shouldSuppressExecutionWorkspaceGates,
|
|
561
|
-
suggestNextStep: health.suggestNextStep,
|
|
559
|
+
health: {
|
|
560
|
+
loadOxeConfigMerged: health.loadOxeConfigMerged,
|
|
561
|
+
validateConfigShape: health.validateConfigShape,
|
|
562
|
+
buildHealthReport: health.buildHealthReport,
|
|
563
|
+
detectWorkspaceMode: health.detectWorkspaceMode,
|
|
564
|
+
shouldSuppressExecutionWorkspaceGates: health.shouldSuppressExecutionWorkspaceGates,
|
|
565
|
+
suggestNextStep: health.suggestNextStep,
|
|
562
566
|
oxePaths: health.oxePaths,
|
|
563
567
|
parseStatePhase: health.parseStatePhase,
|
|
564
568
|
parseLastScanDate: health.parseLastScanDate,
|
|
@@ -572,11 +576,11 @@ module.exports = {
|
|
|
572
576
|
planAgentsWarnings: health.planAgentsWarnings,
|
|
573
577
|
phaseCoherenceWarnings: health.phaseCoherenceWarnings,
|
|
574
578
|
specSectionWarnings: health.specSectionWarnings,
|
|
575
|
-
planWaveWarningsFixed: health.planWaveWarningsFixed,
|
|
576
|
-
planTaskAceiteWarnings: health.planTaskAceiteWarnings,
|
|
577
|
-
buildExecutionRationality: health.buildExecutionRationality,
|
|
578
|
-
executionRationalityWarningsFromSummary: health.executionRationalityWarningsFromSummary,
|
|
579
|
-
verifyGapsWithoutSummaryWarning: health.verifyGapsWithoutSummaryWarning,
|
|
579
|
+
planWaveWarningsFixed: health.planWaveWarningsFixed,
|
|
580
|
+
planTaskAceiteWarnings: health.planTaskAceiteWarnings,
|
|
581
|
+
buildExecutionRationality: health.buildExecutionRationality,
|
|
582
|
+
executionRationalityWarningsFromSummary: health.executionRationalityWarningsFromSummary,
|
|
583
|
+
verifyGapsWithoutSummaryWarning: health.verifyGapsWithoutSummaryWarning,
|
|
580
584
|
expandExecutionProfile: health.expandExecutionProfile,
|
|
581
585
|
ALLOWED_CONFIG_KEYS: health.ALLOWED_CONFIG_KEYS,
|
|
582
586
|
EXECUTION_PROFILES: health.EXECUTION_PROFILES,
|
|
@@ -643,28 +647,28 @@ module.exports = {
|
|
|
643
647
|
},
|
|
644
648
|
|
|
645
649
|
/** Dashboard local: contexto consolidado e persistência de revisão do plano. */
|
|
646
|
-
dashboard: {
|
|
647
|
-
loadDashboardContext: dashboard.loadDashboardContext,
|
|
648
|
-
savePlanReviewStatus: dashboard.savePlanReviewStatus,
|
|
649
|
-
addPlanReviewComment: dashboard.addPlanReviewComment,
|
|
650
|
-
updatePlanReviewCommentStatus: dashboard.updatePlanReviewCommentStatus,
|
|
651
|
-
},
|
|
652
|
-
|
|
653
|
-
/** Release readiness: manifest, smoke matrix e checks de consistência antes de publicar. */
|
|
654
|
-
release: {
|
|
655
|
-
REQUIRED_RUNTIMES: release.REQUIRED_RUNTIMES,
|
|
656
|
-
WRAPPER_TARGETS: release.WRAPPER_TARGETS,
|
|
657
|
-
releasePaths: release.releasePaths,
|
|
658
|
-
collectWrapperHashes: release.collectWrapperHashes,
|
|
659
|
-
loadRuntimeSmokeReport: release.loadRuntimeSmokeReport,
|
|
660
|
-
loadRecoveryFixtureReport: release.loadRecoveryFixtureReport,
|
|
661
|
-
loadMultiAgentSoakReport: release.loadMultiAgentSoakReport,
|
|
662
|
-
buildReleaseManifest: release.buildReleaseManifest,
|
|
663
|
-
inspectCanonicalSource: release.inspectCanonicalSource,
|
|
664
|
-
evaluateReleaseManifest: release.evaluateReleaseManifest,
|
|
665
|
-
inspectReleaseReadiness: release.inspectReleaseReadiness,
|
|
666
|
-
checkReleaseConsistency: release.checkReleaseConsistency,
|
|
667
|
-
},
|
|
650
|
+
dashboard: {
|
|
651
|
+
loadDashboardContext: dashboard.loadDashboardContext,
|
|
652
|
+
savePlanReviewStatus: dashboard.savePlanReviewStatus,
|
|
653
|
+
addPlanReviewComment: dashboard.addPlanReviewComment,
|
|
654
|
+
updatePlanReviewCommentStatus: dashboard.updatePlanReviewCommentStatus,
|
|
655
|
+
},
|
|
656
|
+
|
|
657
|
+
/** Release readiness: manifest, smoke matrix e checks de consistência antes de publicar. */
|
|
658
|
+
release: {
|
|
659
|
+
REQUIRED_RUNTIMES: release.REQUIRED_RUNTIMES,
|
|
660
|
+
WRAPPER_TARGETS: release.WRAPPER_TARGETS,
|
|
661
|
+
releasePaths: release.releasePaths,
|
|
662
|
+
collectWrapperHashes: release.collectWrapperHashes,
|
|
663
|
+
loadRuntimeSmokeReport: release.loadRuntimeSmokeReport,
|
|
664
|
+
loadRecoveryFixtureReport: release.loadRecoveryFixtureReport,
|
|
665
|
+
loadMultiAgentSoakReport: release.loadMultiAgentSoakReport,
|
|
666
|
+
buildReleaseManifest: release.buildReleaseManifest,
|
|
667
|
+
inspectCanonicalSource: release.inspectCanonicalSource,
|
|
668
|
+
evaluateReleaseManifest: release.evaluateReleaseManifest,
|
|
669
|
+
inspectReleaseReadiness: release.inspectReleaseReadiness,
|
|
670
|
+
checkReleaseConsistency: release.checkReleaseConsistency,
|
|
671
|
+
},
|
|
668
672
|
|
|
669
673
|
/** Runtime operacional: tracing, active run, catálogo de capabilities e memória em camadas. */
|
|
670
674
|
operational: {
|
|
@@ -24,12 +24,14 @@ evidence_expectation: manifest | command | manual | mixed
|
|
|
24
24
|
|
|
25
25
|
> Gerado a partir de `.oxe/SPEC.md`. Cada tarefa deve ter bloco **Verificar**.
|
|
26
26
|
|
|
27
|
-
## Resumo
|
|
28
|
-
|
|
29
|
-
- **Spec vinculada:** (data ou versão informal)
|
|
30
|
-
- **Ondas:** (número)
|
|
31
|
-
- **Tarefas:** (número)
|
|
32
|
-
- **Artefatos racionais:** `IMPLEMENTATION-PACK`, `REFERENCE-ANCHORS`, `FIXTURE-PACK`
|
|
27
|
+
## Resumo
|
|
28
|
+
|
|
29
|
+
- **Spec vinculada:** (data ou versão informal)
|
|
30
|
+
- **Ondas:** (número)
|
|
31
|
+
- **Tarefas:** (número)
|
|
32
|
+
- **Artefatos racionais:** `IMPLEMENTATION-PACK`, `REFERENCE-ANCHORS`, `FIXTURE-PACK`
|
|
33
|
+
- **Público / outcome da spec:** …
|
|
34
|
+
- **Padrão de validação dominante:** testes | smoke | manual guiado | mixed
|
|
33
35
|
|
|
34
36
|
## Autoavaliação do Plano
|
|
35
37
|
|
|
@@ -48,6 +50,7 @@ evidence_expectation: manifest | command | manual | mixed
|
|
|
48
50
|
- **Alternativas descartadas:** (1–2 linhas)
|
|
49
51
|
- **Condição para replanejar:** (critério objetivo)
|
|
50
52
|
- **Bloqueadores de execução:** nenhum | listar gaps críticos
|
|
53
|
+
- **Densidade operacional mínima confirmada:** paths | symbols | fixtures | anchors | checks
|
|
51
54
|
|
|
52
55
|
<confidence_vector cycle="C-NN" generated_at="YYYY-MM-DDTHH:MM:SSZ">
|
|
53
56
|
<dim name="requirements" score="0.92" weight="25" note="completude dos requisitos" />
|
|
@@ -80,9 +83,17 @@ evidence_expectation: manifest | command | manual | mixed
|
|
|
80
83
|
</hypothesis>
|
|
81
84
|
-->
|
|
82
85
|
|
|
83
|
-
## Dependências globais
|
|
84
|
-
|
|
85
|
-
- (ex.: branch base, feature flags, migrations)
|
|
86
|
+
## Dependências globais
|
|
87
|
+
|
|
88
|
+
- (ex.: branch base, feature flags, migrations)
|
|
89
|
+
|
|
90
|
+
## Contrato operacional da solução
|
|
91
|
+
|
|
92
|
+
- **Write-set principal:** módulos/paths que concentram a mutação
|
|
93
|
+
- **Modelo de conteúdo / dados a materializar:** …
|
|
94
|
+
- **Interações ou fluxos obrigatórios:** …
|
|
95
|
+
- **Persistência local/remota:** none | localStorage | API | outro
|
|
96
|
+
- **Responsividade / acessibilidade obrigatória:** …
|
|
86
97
|
|
|
87
98
|
## Artefatos racionais de execução
|
|
88
99
|
|
|
@@ -118,18 +129,21 @@ evidence_expectation: manifest | command | manual | mixed
|
|
|
118
129
|
### T1 — (título)
|
|
119
130
|
|
|
120
131
|
- **Arquivos alvo:** `src/exato.ts`
|
|
132
|
+
- **Símbolos alvo:** `função`, `classe`, `componente`, `builder`, `schema`
|
|
121
133
|
- **Depende de:** —
|
|
122
134
|
- **Onda:** 1
|
|
123
135
|
- **Complexidade:** S
|
|
124
136
|
- **Risco:** low | medium | high | critical
|
|
125
137
|
- **Evidência de entrada:** SPEC A1 | DISCUSS D-01 | RESEARCH RA-01 | codebase path
|
|
126
138
|
- **Checkpoint:** nenhum | CHK-01
|
|
139
|
+
- **Estado/fluxo coberto:** loading | empty | success | error | interação X
|
|
127
140
|
- **Verificar:**
|
|
128
141
|
- Comando: `…`
|
|
129
142
|
- Manual: (opcional) …
|
|
130
143
|
- **Implementar:** o mínimo para fazer a verificação acima passar.
|
|
131
144
|
- **Aceite vinculado:** A1, A2 (IDs da tabela de critérios em SPEC.md)
|
|
132
145
|
- **Contrato racional:** ver `IMPLEMENTATION-PACK.json` (task `T1`)
|
|
146
|
+
- **Fixture/anchor obrigatório:** FX-01 | RA-01 | not_applicable
|
|
133
147
|
- **Rollback/contensão:** obrigatório para risco high/critical; `not_applicable` se low/medium.
|
|
134
148
|
|
|
135
149
|
---
|
|
@@ -15,16 +15,31 @@ inputs: []
|
|
|
15
15
|
|
|
16
16
|
> Substitua os placeholders. Remova seções vazias se não se aplicarem.
|
|
17
17
|
|
|
18
|
-
## Objetivo
|
|
19
|
-
|
|
20
|
-
(Uma frase: o que entregar.)
|
|
21
|
-
|
|
22
|
-
##
|
|
23
|
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
|
|
18
|
+
## Objetivo
|
|
19
|
+
|
|
20
|
+
(Uma frase: o que entregar.)
|
|
21
|
+
|
|
22
|
+
## Outcome esperado
|
|
23
|
+
|
|
24
|
+
- Usuário ou operador principal: …
|
|
25
|
+
- Resultado observável ao final da entrega: …
|
|
26
|
+
- Medida de sucesso principal: …
|
|
27
|
+
|
|
28
|
+
## Contexto
|
|
29
|
+
|
|
30
|
+
- Repositório / produto: …
|
|
31
|
+
- Links úteis: …
|
|
32
|
+
- Tipo de demanda: feature | bugfix | refactor | research | ops | mixed
|
|
33
|
+
- Incertezas estruturadas: …
|
|
34
|
+
- Restrições técnicas obrigatórias: …
|
|
35
|
+
- Tecnologias proibidas ou evitadas: …
|
|
36
|
+
|
|
37
|
+
## Público e experiência
|
|
38
|
+
|
|
39
|
+
- Público-alvo primário: …
|
|
40
|
+
- Nível de conhecimento esperado: iniciante | intermediário | avançado
|
|
41
|
+
- Contexto de uso: desktop | mobile | ambos | CLI | backoffice | batch
|
|
42
|
+
- Tom ou padrão de experiência esperado: …
|
|
28
43
|
|
|
29
44
|
## Escopo
|
|
30
45
|
|
|
@@ -36,26 +51,44 @@ inputs: []
|
|
|
36
51
|
|
|
37
52
|
- …
|
|
38
53
|
|
|
39
|
-
## Critérios de aceite
|
|
40
|
-
|
|
41
|
-
Use **IDs estáveis** (A1, A2, …) para o plano e o verify vincularem cada tarefa a um critério. Cada critério deve ser **testável ou observável** (comando, checklist ou critério objetivo).
|
|
54
|
+
## Critérios de aceite
|
|
55
|
+
|
|
56
|
+
Use **IDs estáveis** (A1, A2, …) para o plano e o verify vincularem cada tarefa a um critério. Cada critério deve ser **testável ou observável** (comando, checklist ou critério objetivo).
|
|
42
57
|
|
|
43
58
|
| ID | Critério | Como verificar |
|
|
44
59
|
|----|----------|----------------|
|
|
45
|
-
| A1 | (ex.: Dado … quando … então …) | (ex.: `npm test`, teste manual X) |
|
|
46
|
-
| A2 | … | … |
|
|
47
|
-
|
|
48
|
-
##
|
|
49
|
-
|
|
50
|
-
- …
|
|
60
|
+
| A1 | (ex.: Dado … quando … então …) | (ex.: `npm test`, teste manual X) |
|
|
61
|
+
| A2 | … | … |
|
|
62
|
+
|
|
63
|
+
## Setup externo e pré-condições
|
|
64
|
+
|
|
65
|
+
- Contas, variáveis de ambiente, filas, bancos, VPN, dashboards ou recursos cloud necessários: …
|
|
66
|
+
- Pré-condições bloqueantes para executar ou validar: …
|
|
67
|
+
|
|
68
|
+
## Conteúdo e fluxos obrigatórios
|
|
69
|
+
|
|
70
|
+
- Fluxos obrigatórios da v1: …
|
|
71
|
+
- Estados obrigatórios: loading | empty | error | success | disabled | not_applicable
|
|
72
|
+
- Conteúdo mínimo obrigatório por área/módulo: …
|
|
73
|
+
- Exemplos concretos que devem existir na entrega: …
|
|
74
|
+
|
|
75
|
+
## Suposições
|
|
76
|
+
|
|
77
|
+
- …
|
|
51
78
|
|
|
52
79
|
## Riscos
|
|
53
80
|
|
|
54
81
|
- …
|
|
55
82
|
|
|
56
|
-
## Referências no código
|
|
57
|
-
|
|
58
|
-
- Caminhos / módulos: …
|
|
83
|
+
## Referências no código
|
|
84
|
+
|
|
85
|
+
- Caminhos / módulos: …
|
|
86
|
+
|
|
87
|
+
## Contratos esperados para o plano
|
|
88
|
+
|
|
89
|
+
- Arquivos ou áreas que o plano deverá fechar com write-set explícito: …
|
|
90
|
+
- Fixtures, anchors ou exemplos locais obrigatórios antes de executar: …
|
|
91
|
+
- Decisões que não podem ser deixadas para o executor: …
|
|
59
92
|
|
|
60
93
|
---
|
|
61
94
|
|
package/oxe/workflows/plan.md
CHANGED
|
@@ -48,11 +48,16 @@ Fixtures mínimos por fluxo/tarefa de risco:
|
|
|
48
48
|
- queries/checks de validação e smoke commands.
|
|
49
49
|
- negative cases mínimos para validação de erro, limite ou regressão principal.
|
|
50
50
|
|
|
51
|
-
Regra de readiness:
|
|
52
|
-
- `IMPLEMENTATION-PACK` precisa estar `ready`;
|
|
53
|
-
- `REFERENCE-ANCHORS` não pode ter âncora crítica em `missing|stale|conflicting`;
|
|
54
|
-
- `FIXTURE-PACK` é obrigatório para tarefas mutáveis com parser/layout/integração/transformação/fila/migração/builder;
|
|
55
|
-
- qualquer `critical_gap` aberto derruba a prontidão executável do plano.
|
|
51
|
+
Regra de readiness:
|
|
52
|
+
- `IMPLEMENTATION-PACK` precisa estar `ready`;
|
|
53
|
+
- `REFERENCE-ANCHORS` não pode ter âncora crítica em `missing|stale|conflicting`;
|
|
54
|
+
- `FIXTURE-PACK` é obrigatório para tarefas mutáveis com parser/layout/integração/transformação/fila/migração/builder;
|
|
55
|
+
- qualquer `critical_gap` aberto derruba a prontidão executável do plano.
|
|
56
|
+
|
|
57
|
+
**Contrato adicional para app/UI estático:** quando a trilha for página HTML/CSS/JS, dashboard, microsite, app sem framework ou experiência educacional:
|
|
58
|
+
- o `IMPLEMENTATION-PACK` deve fechar seções obrigatórias da interface, comportamento por interação, estado persistido e modelo de conteúdo;
|
|
59
|
+
- o `REFERENCE-ANCHORS` deve apontar para snippets, predecessores ou contratos locais/materializados que reduzam improviso visual e estrutural;
|
|
60
|
+
- o `FIXTURE-PACK` deve incluir ao menos exemplos de conteúdo, estados da interface e checks de responsividade/console limpo quando a UI for parte central do aceite.
|
|
56
61
|
</execution_rational_artifacts>
|
|
57
62
|
|
|
58
63
|
<plan_iteration_contract>
|
|
@@ -177,7 +182,14 @@ Depois do resumo e antes das tarefas, o `PLAN.md` deve conter também:
|
|
|
177
182
|
|
|
178
183
|
**Princípio test-first:** escreva o `Verificar` antes de escrever o `Implementar`. A pergunta é: "Como saberei que está pronto?" — a resposta define o target; `Implementar` é o caminho mínimo até esse target.
|
|
179
184
|
|
|
180
|
-
**Contrato racional por tarefa:** se a tarefa for mutável ou tecnicamente relevante, o `PLAN.md` sozinho não basta. O `IMPLEMENTATION-PACK` deve fechar o write-set, os symbols e os checks; o `REFERENCE-ANCHORS` deve materializar evidência externa; o `FIXTURE-PACK` deve reduzir improviso em parsing/integração/transformação.
|
|
185
|
+
**Contrato racional por tarefa:** se a tarefa for mutável ou tecnicamente relevante, o `PLAN.md` sozinho não basta. O `IMPLEMENTATION-PACK` deve fechar o write-set, os symbols e os checks; o `REFERENCE-ANCHORS` deve materializar evidência externa; o `FIXTURE-PACK` deve reduzir improviso em parsing/integração/transformação.
|
|
186
|
+
|
|
187
|
+
**Contrato racional de densidade operacional:** plano com tarefa mutável ainda vaga (`...`, "ajustar onde necessário", "melhorar interface", "organizar conteúdo") não sustenta `Confiança > 90%`. Para passar do gate, o plano precisa fechar:
|
|
188
|
+
- arquivos alvo exatos ou padrão restrito;
|
|
189
|
+
- symbols/estruturas esperadas;
|
|
190
|
+
- sequência mínima de implementação;
|
|
191
|
+
- verificação observável por tarefa;
|
|
192
|
+
- fixture ou anchor quando o risco for de UI, integração, parsing, contrato ou transformação.
|
|
181
193
|
|
|
182
194
|
**Projetos sem suíte de testes única (legado):** o bloco **Verificar** pode usar `Comando: —` e **Manual** com Grep, leitura de paths ou checklist — ver exemplos em **`oxe/workflows/references/legacy-brownfield.md`**. Todo critério **A*** da SPEC deve aparecer em **Aceite vinculado** de alguma tarefa ou como gap explícito.
|
|
183
195
|
|
package/oxe/workflows/spec.md
CHANGED
|
@@ -30,9 +30,24 @@ Se **`.oxe/config.json`** tiver `discuss_before_plan: true`: mencionar no final
|
|
|
30
30
|
|
|
31
31
|
**Discovery adaptativo:** antes da primeira pergunta, aplicar `oxe/workflows/references/adaptive-discovery.md`. Classificar a demanda, modular os blocos de perguntas conforme o domínio, limitar rodadas e consolidar incertezas estruturadas que depois alimentarão a confiança do plano.
|
|
32
32
|
|
|
33
|
-
**Rastreabilidade forte:** todo requisito `R-ID` precisa apontar para pelo menos um critério `A*` verificável, ou aparecer como v2/fora com justificativa. Critério sem método de verificação não entra como v1.
|
|
34
|
-
|
|
35
|
-
**Setup externo:** quando o sucesso depender de conta, variável de ambiente, dashboard, fila, banco, credencial, VPN ou recurso cloud, registrar em SPEC a seção **Setup externo e pré-condições**. O plano deve transformar isso em checkpoint ou tarefa explícita; não deixar como suposição solta.
|
|
33
|
+
**Rastreabilidade forte:** todo requisito `R-ID` precisa apontar para pelo menos um critério `A*` verificável, ou aparecer como v2/fora com justificativa. Critério sem método de verificação não entra como v1.
|
|
34
|
+
|
|
35
|
+
**Setup externo:** quando o sucesso depender de conta, variável de ambiente, dashboard, fila, banco, credencial, VPN ou recurso cloud, registrar em SPEC a seção **Setup externo e pré-condições**. O plano deve transformar isso em checkpoint ou tarefa explícita; não deixar como suposição solta.
|
|
36
|
+
|
|
37
|
+
**Contrato de indução da SPEC:** a SPEC deve sair forte o suficiente para que o usuário não precise compensar lacunas "no braço" durante o PLAN. Sempre extrair ou materializar explicitamente:
|
|
38
|
+
- público-alvo primário;
|
|
39
|
+
- outcome esperado observável;
|
|
40
|
+
- restrições técnicas obrigatórias e proibições relevantes;
|
|
41
|
+
- fluxos obrigatórios da v1;
|
|
42
|
+
- conteúdo mínimo exigido por área;
|
|
43
|
+
- exemplos mínimos esperados quando o pedido tocar UI, app, material didático, integração ou contrato público.
|
|
44
|
+
|
|
45
|
+
**Demandas de produto/app/UI:** quando o pedido for uma aplicação, página, dashboard, fluxo visual ou experiência educacional, a SPEC deve congelar antes do PLAN:
|
|
46
|
+
- blocos obrigatórios da interface;
|
|
47
|
+
- estados principais (`loading`, `empty`, `error`, `success` quando aplicável);
|
|
48
|
+
- interações mínimas esperadas;
|
|
49
|
+
- regras objetivas de responsividade e acessibilidade;
|
|
50
|
+
- critérios de aceite verificáveis por comportamento visível, não só por intenção narrativa.
|
|
36
51
|
|
|
37
52
|
**Resolução de sessão:** antes de ler ou escrever artefatos desta trilha, resolver `active_session` em `.oxe/STATE.md` conforme `oxe/workflows/references/session-path-resolution.md`. Com sessão ativa:
|
|
38
53
|
- `SPEC.md`, `ROADMAP.md` e `DISCUSS.md` vivem em `.oxe/<active_session>/spec/`
|
|
@@ -183,7 +198,7 @@ Complemento adaptativo para a Fase 1. Quando o domínio for confirmado (via scan
|
|
|
183
198
|
|
|
184
199
|
---
|
|
185
200
|
|
|
186
|
-
### Domínio: UI e Frontend
|
|
201
|
+
### Domínio: UI e Frontend
|
|
187
202
|
|
|
188
203
|
*Adicionar ao Bloco B quando o escopo toca interface de usuário:*
|
|
189
204
|
|
|
@@ -195,11 +210,18 @@ Complemento adaptativo para a Fase 1. Quando o domínio for confirmado (via scan
|
|
|
195
210
|
- Há internacionalização (i18n) ou múltiplos idiomas a suportar?
|
|
196
211
|
- Qual a estratégia de tratamento de erros visível ao usuário?
|
|
197
212
|
|
|
198
|
-
*Critérios A* a sugerir:*
|
|
199
|
-
- `A-N: Componente exibe loading state enquanto dados carregam`
|
|
200
|
-
- `A-N: Erro de API exibe mensagem legível, não stack trace`
|
|
201
|
-
- `A-N: Formulário desabilita submit enquanto request está em andamento`
|
|
202
|
-
- `A-N: Todos os campos de formulário têm label associada (WCAG básico)`
|
|
213
|
+
*Critérios A* a sugerir:*
|
|
214
|
+
- `A-N: Componente exibe loading state enquanto dados carregam`
|
|
215
|
+
- `A-N: Erro de API exibe mensagem legível, não stack trace`
|
|
216
|
+
- `A-N: Formulário desabilita submit enquanto request está em andamento`
|
|
217
|
+
- `A-N: Todos os campos de formulário têm label associada (WCAG básico)`
|
|
218
|
+
|
|
219
|
+
*Para páginas estáticas, apps sem framework ou experiências didáticas, também perguntar:*
|
|
220
|
+
- Quais blocos da página são obrigatórios acima da dobra e abaixo da dobra?
|
|
221
|
+
- O conteúdo é mais exploratório, guiado passo a passo, ou ambos?
|
|
222
|
+
- Quais interações precisam existir obrigatoriamente na v1?
|
|
223
|
+
- O progresso do usuário precisa persistir entre reloads?
|
|
224
|
+
- Há exemplos de conteúdo, visualização ou exercícios mínimos que a aplicação precisa materializar?
|
|
203
225
|
|
|
204
226
|
---
|
|
205
227
|
|