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.
Files changed (44) hide show
  1. package/CHANGELOG.md +63 -0
  2. package/README.md +1 -1
  3. package/bin/lib/oxe-manifest.cjs +20 -13
  4. package/bin/lib/oxe-operational.cjs +96 -10
  5. package/bin/lib/oxe-project-health.cjs +77 -18
  6. package/bin/lib/oxe-rationality.cjs +9 -7
  7. package/bin/oxe-cc.js +202 -39
  8. package/lib/runtime/compiler/graph-compiler.js +1 -1
  9. package/lib/runtime/executor/action-tool-map.js +4 -0
  10. package/lib/runtime/executor/built-in-tools.js +27 -0
  11. package/lib/runtime/executor/llm-task-executor.d.ts +4 -1
  12. package/lib/runtime/executor/llm-task-executor.js +41 -5
  13. package/lib/runtime/executor/node-prompt-builder.d.ts +4 -1
  14. package/lib/runtime/executor/node-prompt-builder.js +13 -2
  15. package/lib/runtime/models/failure.d.ts +1 -1
  16. package/lib/runtime/scheduler/scheduler.d.ts +5 -1
  17. package/lib/runtime/scheduler/scheduler.js +82 -14
  18. package/lib/runtime/verification/verification-compiler.js +7 -5
  19. package/lib/sdk/index.cjs +48 -44
  20. package/oxe/templates/PLAN.template.md +23 -9
  21. package/oxe/templates/SPEC.template.md +55 -22
  22. package/oxe/workflows/plan.md +18 -6
  23. package/oxe/workflows/spec.md +31 -9
  24. package/package.json +103 -100
  25. package/packages/runtime/package.json +18 -18
  26. package/packages/runtime/src/compiler/graph-compiler.ts +1 -1
  27. package/packages/runtime/src/evidence/evidence-store.ts +2 -2
  28. package/packages/runtime/src/executor/action-tool-map.ts +4 -0
  29. package/packages/runtime/src/executor/built-in-tools.ts +29 -0
  30. package/packages/runtime/src/executor/llm-task-executor.ts +46 -4
  31. package/packages/runtime/src/executor/node-prompt-builder.ts +18 -1
  32. package/packages/runtime/src/models/failure.ts +2 -0
  33. package/packages/runtime/src/scheduler/scheduler.ts +93 -15
  34. package/packages/runtime/src/verification/verification-compiler.ts +7 -5
  35. package/vscode-extension/package.json +185 -185
  36. package/vscode-extension/oxe-agents-0.9.1.vsix +0 -0
  37. package/vscode-extension/oxe-agents-0.9.2.vsix +0 -0
  38. package/vscode-extension/oxe-agents-1.0.0.vsix +0 -0
  39. package/vscode-extension/oxe-agents-1.4.0.vsix +0 -0
  40. package/vscode-extension/oxe-agents-1.5.0.vsix +0 -0
  41. package/vscode-extension/oxe-agents-1.5.1.vsix +0 -0
  42. package/vscode-extension/oxe-agents-1.6.0.vsix +0 -0
  43. package/vscode-extension/oxe-agents-1.7.0.vsix +0 -0
  44. 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('', 'Execute as ações acima usando as ferramentas disponíveis e confirme o resultado.');
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): Promise<TaskResult>;
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.emit(ctx, {
414
- type: 'WorkItemCompleted',
415
- work_item_id: nodeId,
416
- attempt_id: attemptId,
417
- payload: { attempt_number: attempt, evidence: lastResult.evidence },
418
- });
419
- status.set(nodeId, 'completed');
420
- completed.push(nodeId);
421
- this.recordProgress();
422
- return;
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
- // Split command into program + args (simple split; no shell expansion)
96
- const parts = check.command.split(/\s+/);
97
- const prog = parts[0];
98
- const args = parts.slice(1);
99
- const result = (0, child_process_1.spawnSync)(prog, args, {
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
- const verifyCmdMatch = rest.match(/Comando:\s*`([^`]+)`/i);
98
- const verifyCommand = verifyCmdMatch ? verifyCmdMatch[1] : null;
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
- ## Contexto
23
-
24
- - Repositório / produto: …
25
- - Links úteis: …
26
- - Tipo de demanda: feature | bugfix | refactor | research | ops | mixed
27
- - Incertezas estruturadas: …
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
- ## Suposições
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
 
@@ -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
 
@@ -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