@nexus-cortex/core 4.114.0 → 4.114.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.
package/.env.defaults CHANGED
@@ -979,6 +979,9 @@ CORTEX_ENDTURN_GATE=true
979
979
  # adjudication). VETO=opinion restores the R165 policy; VETO=never records only. Events: endturn_resolver gains {vetoMode, evidenceCap,
980
980
  # namedRanNow}.
981
981
  # [LEDGER 2026-09-17 @4.114.0] BUILT + unit-tested (endTurnResolver.test.ts R166 policy table). Field: PENDING (next TB4.0 cell).
982
+ # R166b (4.114.1): a check is EVIDENCE only when it completed, exited non-zero AND printed output — a TIMED OUT check (45 s cap) or a
983
+ # silent non-zero exit (the A/B's broken judge-authored commands: exit 1, no output, on a passing solution) is inconclusive and cannot
984
+ # hold a finish. Event field namedInconclusive.
982
985
  #CORTEX_JUDGE_VETO=
983
986
  #CORTEX_JUDGE_EVIDENCE_MAX_VETOES=
984
987
  # (no lever) 4.110.0 closes the 4.109.0 disclosures (2026-09-16): R154 image-rejection heal now also covers the STREAMING loop
@@ -41,7 +41,7 @@ import { TurnEvidence, evaluateEndTurnGates, buildMissingEndTurnReminder } from
41
41
  import { resolveCompactionResume, pickDropped, buildCompactionResumeReminder, isCompactionResumeMessage, resolveTaskText, resumeMemoryTargetTokens, coversAll, buildRollingSeedMessage, memoryIndexLine, upsertMemoryIndex, scaleEstimateToRequestView, approxCharsOf, anchoredRequestEstimate, resolveCompactionHandoffQA, resolveHandoffQAMaxQuestions, runHandoffQA } from './compactionResume.js';
42
42
  import { renderResumeMemoryPrompt, buildRebuildInstructions, resolveCheckpointBand, resolveRearmBand } from './compactionResumeTemplate.js';
43
43
  import { resolveCortexStateDir, cortexStatePath } from '../utils/stateDir.js';
44
- import { collectWorkspaceDelta, detectCheckCommand, runCheck, resolveJudgeGroundingConfig } from '../training/judgeEvidence.js';
44
+ import { collectWorkspaceDelta, detectCheckCommand, runCheck, resolveJudgeGroundingConfig, classifyCheckRun } from '../training/judgeEvidence.js';
45
45
  import { resolveMentorRoleConfig, describeMentorWire, describeMentorDelivery, mentorSurfaceTimeoutMs } from '../training/mentorRole.js';
46
46
  import { resolveOuterToolDeadlineMs, resolveOuterToolTimeoutFloorMs } from './outerToolTimeout.js';
47
47
  import { resolveSubAgentTimeoutMs } from './subAgentTimeout.js';
@@ -641,15 +641,21 @@ export class CortexOrchestrator {
641
641
  let namedRan = 0;
642
642
  let namedPassed = 0;
643
643
  let namedFailed = 0;
644
- let namedResults = '';
644
+ let namedInconclusive = 0;
645
+ let namedResults = ''; // R166b: timeouts / silent non-zero exits are not evidence
645
646
  if (cfg.semantic && this.judgeNamedChecks.length > 0) {
646
647
  for (const c of this.judgeNamedChecks.slice(0, 3)) {
647
648
  const r = runCheck(judgeCwd, c, jcfg);
648
649
  namedRan += 1;
649
- if (/→ PASSED/.test(r))
650
- namedPassed += 1;
651
- else
652
- namedFailed += 1;
650
+ {
651
+ const k = classifyCheckRun(r);
652
+ if (k === 'passed')
653
+ namedPassed += 1;
654
+ else if (k === 'failed')
655
+ namedFailed += 1;
656
+ else
657
+ namedInconclusive += 1;
658
+ } // R166b
653
659
  namedResults += (namedResults ? '\n\n' : '') + r;
654
660
  }
655
661
  }
@@ -687,10 +693,15 @@ export class CortexOrchestrator {
687
693
  const r = runCheck(judgeCwd, c, jcfg);
688
694
  namedRanNow += 1;
689
695
  namedRan += 1;
690
- if (/→ PASSED/.test(r))
691
- namedPassed += 1;
692
- else
693
- namedFailed += 1;
696
+ {
697
+ const k = classifyCheckRun(r);
698
+ if (k === 'passed')
699
+ namedPassed += 1;
700
+ else if (k === 'failed')
701
+ namedFailed += 1;
702
+ else
703
+ namedInconclusive += 1;
704
+ } // R166b
694
705
  namedResultsNow += (namedResultsNow ? '\n\n' : '') + r;
695
706
  }
696
707
  }
@@ -730,7 +741,7 @@ export class CortexOrchestrator {
730
741
  planChars: verdict.plan.length, rejects: this.endTurnResolverRejects, parsed: verdict.parsed,
731
742
  cap: resolverCap, capLiveness: cfg.maxRejects, capBudgeted: cfg.maxRejectsBudgeted, remainingFrac: resolverRemainingFrac === null ? null : Number(resolverRemainingFrac.toFixed(3)), // R160
732
743
  semantic: cfg.semantic, action, confidence: verdict.confidence, namedChecks: verdict.checks.length, namedRan, namedPassed, namedFailed, callsSince, progressed, escalated: this.judgeEscalated, // R165
733
- vetoMode: cfg.vetoMode, evidenceCap: cfg.evidenceCap, namedRanNow, // R166
744
+ vetoMode: cfg.vetoMode, evidenceCap: cfg.evidenceCap, namedRanNow, namedInconclusive, // R166 / R166b
734
745
  latencyMs, rawLen: (text ?? '').length,
735
746
  deltaChars: workspaceDelta.length, checkRan: !!checkResult, checkPassed: checkResult ? /→ PASSED/.test(checkResult) : null,
736
747
  liftPlanChars: this.liftPlanText.length,