@ngockhoale/ukit 3.4.55 → 3.4.56

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,14 @@
2
2
 
3
3
  All notable changes to UKit are documented here.
4
4
 
5
+ ## 3.4.56 - 2026-10-22
6
+
7
+ **Completion Gate: a stale self-classified contract is re-derived from the task's own prompt on continuation.**
8
+ - Field case: after the 3.4.55 classifier fix, an in-flight task kept its previously stored MIXED contract (continuations reused `routeSummary.executionContract` verbatim), so the gate still demanded `operation-verification` the user's prompt never ordered.
9
+ - Fix (`persistRouteState` in `skill-router.sh`): on a non-system continuation whose stored contract was classified by the router (`contractOrigin` != `carried-system`, not a status report), the contract is re-classified from `lastExplicitUserPromptText`; it is replaced only when the taskKind differs. Genuine contracts re-classify identically and are kept; system-carried contracts are never touched. No gate loosening, no receipts added.
10
+ - Regression: `tests/hooks/staleContractRederive.test.js` (stale MIXED corrected, genuine MIXED retained, carried-system untouched, new task classified on its own).
11
+ - Verified offline on macOS/Node 22; hook replay, not a live host.
12
+
5
13
  ## 3.4.55 - 2026-10-22
6
14
 
7
15
  **Completion Gate: preference, conditional-future and prohibition-list text is not an order (field false-block).**
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngockhoale/ukit",
3
- "version": "3.4.55",
3
+ "version": "3.4.56",
4
4
  "description": "Install/update an index-first AI workspace for Claude Code, OpenAI Codex and omp (Oh My Pi).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -3920,7 +3920,22 @@ function applyTaskSemantics(contract, semantic) {
3920
3920
  }
3921
3921
  if (previous.requestKey) persisted.requestKey = previous.requestKey;
3922
3922
  }
3923
- const semantic = continuingTask && previous.routeSummary?.executionContract?.taskKind
3923
+ // A stored contract this router classified itself (never a carried-system one) is a cache of
3924
+ // classifyTaskSemantics(lastExplicitUserPromptText): when the classifier has since been fixed
3925
+ // the cache is stale and would keep enforcing evidence the user's own prompt never ordered.
3926
+ // Re-derive from the task's own prompt; genuine contracts re-classify identically and stay.
3927
+ let semanticFromPrompt = null;
3928
+ const storedContract = previous.routeSummary?.executionContract;
3929
+ if (continuingTask && !systemOriginTurn && storedContract?.taskKind && previous.contractOrigin !== 'carried-system'
3930
+ && !storedContract.statusReport && previous.routingContext?.lastExplicitUserPromptText) {
3931
+ try {
3932
+ const fresh = classifyTaskSemantics({ promptText: previous.routingContext.lastExplicitUserPromptText, targetFile: persisted.routingContext?.targetFile });
3933
+ if (fresh?.taskKind && fresh.taskKind !== storedContract.taskKind) semanticFromPrompt = fresh;
3934
+ } catch {}
3935
+ }
3936
+ const semantic = semanticFromPrompt
3937
+ ? semanticFromPrompt
3938
+ : continuingTask && previous.routeSummary?.executionContract?.taskKind
3924
3939
  ? previous.routeSummary.executionContract
3925
3940
  : classifyTaskSemantics({ promptText: extractPrompt(payload) || persisted.routingContext?.lastExplicitUserPromptText, targetFile: persisted.routingContext?.targetFile });
3926
3941
  const informationalTurn = !continuingTask && persisted.routingContext?.executionMode === 'informational'