@nexus-cortex/core 4.131.1 → 4.131.2

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
@@ -823,6 +823,10 @@ CORTEX_ENDTURN_RESOLVER_ABSTAIN=true
823
823
  # t4w3m/n: true, source env) since the stdb-bench clean-launch formula (cell-m-r1, 09-10) put it in EXTRA_COMMON, and ON in product since
824
824
  # 10-17 via CORTEX_PROFILE=standard (the R219 "safe set"; decision recorded in the CORTEX_PROFILE block, not here). Code default unchanged
825
825
  # (false). Its own efficacy A/B was never run — it has been background in every cell since (audit: .bench/cells/lever-writeback-check.py).
826
+ # [LEDGER 2026-11-06 in tree] empty_active: a COMPLETELY empty turn (no text, no reasoning, no tool call) with budget left now continues with
827
+ # tools too (was: terminal "write your answer, do NOT call any tools"). Evidence: holdout-8 harness runs (.bench/eval/om2w/holdout-harness-*)
828
+ # — gemini-3.8-flash's Browse sub-agent returned an empty FIRST turn on 106/107, got the terminal nudge and invented results it never read
829
+ # (audited). Same bounded ×3 as reasoning_only_active; budget spent → the old terminal nudge. Flag off = unchanged.
826
830
  #CORTEX_EMPTY_TURN_CONTINUE=true
827
831
  #
828
832
  # CORTEX_DEADLINE_EXIT_MENTOR — the "smart deadline". At the WARN rung (~0.9 of the per-turn
@@ -2806,7 +2806,7 @@ export class CortexOrchestrator {
2806
2806
  ? classifyEmptyResponse(currentAssistantCanonicalMessage.content, lastStopReason, loopHasBudget)
2807
2807
  : null;
2808
2808
  const isEmptyContinueKind = EMPTY_TURN_CONTINUE && !!emptyClass
2809
- && (emptyClass.kind === 'truncated' || emptyClass.kind === 'reasoning_only_active');
2809
+ && (emptyClass.kind === 'truncated' || emptyClass.kind === 'reasoning_only_active' || emptyClass.kind === 'empty_active');
2810
2810
  const canRetryEmpty = isEmptyContinueKind
2811
2811
  ? emptyContinueCount < EMPTY_CONTINUE_MAX
2812
2812
  : !emptyResponseRetryUsed;
@@ -5075,7 +5075,7 @@ export class CortexOrchestrator {
5075
5075
  ? classifyEmptyResponse(currentAssistantCanonicalMessage.content, lastStopReason, loopHasBudget)
5076
5076
  : null;
5077
5077
  const isEmptyContinueKind = EMPTY_TURN_CONTINUE && !!emptyClass
5078
- && (emptyClass.kind === 'truncated' || emptyClass.kind === 'reasoning_only_active');
5078
+ && (emptyClass.kind === 'truncated' || emptyClass.kind === 'reasoning_only_active' || emptyClass.kind === 'empty_active');
5079
5079
  const canRetryEmpty = isEmptyContinueKind
5080
5080
  ? emptyContinueCount < EMPTY_CONTINUE_MAX
5081
5081
  : !emptyResponseRetryUsed;