@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
|
@@ -3920,7 +3920,22 @@ function applyTaskSemantics(contract, semantic) {
|
|
|
3920
3920
|
}
|
|
3921
3921
|
if (previous.requestKey) persisted.requestKey = previous.requestKey;
|
|
3922
3922
|
}
|
|
3923
|
-
|
|
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'
|