@ngockhoale/ukit 2.6.2 → 2.6.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 CHANGED
@@ -2,6 +2,18 @@
2
2
 
3
3
  All notable changes to UKit are documented here.
4
4
 
5
+ ## 2.6.3 - 2026-09-18
6
+
7
+ - **Informational side-questions no longer self-block at the Stop gate.** A no-route
8
+ question ("còn task nào dang dở không", "is anything left?") carries the previous
9
+ prompt's `routeSummary` + completion contract forward by design — but the prompt
10
+ re-key also empties the effective ledger, so the gate unconditionally demanded
11
+ write+verification evidence that a text answer can never produce. `evaluateCompletion`
12
+ now releases silently when the turn is informational (routed `executionMode` or the
13
+ no-route branch's `routingContext.executionMode` marker). The carried contract stays
14
+ on disk, so real work after the question is still gated. One fix covers Claude Code
15
+ and omp (shared `execution-ledger.mjs`). 3 regression tests.
16
+
5
17
  ## 2.6.2 - 2026-09-18
6
18
 
7
19
  Stability release — 17 confirmed hang / silent-idle / silent-hook defects fixed with
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngockhoale/ukit",
3
- "version": "2.6.2",
3
+ "version": "2.6.3",
4
4
  "description": "Install/update an index-first AI workspace for Claude Code, OpenAI Codex, OpenCode, and omp (Oh My Pi).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -1357,6 +1357,22 @@ export function evaluateCompletion({ state = {}, ledger = {} } = {}) {
1357
1357
  // (e.g. the omp bridge for a session it does not own) must not be force-notified.
1358
1358
  return { continue: false, notify: false, missingEvidence: [] };
1359
1359
  }
1360
+ // An informational turn carries no completion contract of its own. Two paths land here:
1361
+ // a fully-routed informational prompt (routeSummary.executionMode === 'informational',
1362
+ // contract null) and a no-route side-question that CARRIES the previous prompt's
1363
+ // routeSummary + contract forward — skill-router marks exactly this case via
1364
+ // routingContext.executionMode === 'informational' (skill-router.sh no-route branch).
1365
+ // Enforcing the carried write+verify debt against a question turn is a guaranteed
1366
+ // self-block: the prompt re-key empties the effective ledger (sameRequest below), so a
1367
+ // mid-session status question like "còn task nào dang dở không" can never produce the
1368
+ // evidence the old contract demands. Release silently — the carried routeSummary stays
1369
+ // on disk, so the previous contract still survives until a real route replaces it.
1370
+ if (
1371
+ mode === 'informational'
1372
+ || state?.routingContext?.executionMode === 'informational'
1373
+ ) {
1374
+ return { continue: false, notify: false, complete: true, missingEvidence: [] };
1375
+ }
1360
1376
  if (evidence.length === 0) {
1361
1377
  // A route with no completion evidence has no actionable block reason — blocking would
1362
1378
  // loop unboundedly. Release loud instead of ending indistinguishable from a stall.