@ngockhoale/ukit 3.4.52 → 3.4.53
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,15 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to UKit are documented here.
|
|
4
4
|
|
|
5
|
+
## 3.4.53 - 2026-10-22
|
|
6
|
+
|
|
7
|
+
**Stop-level closure of the UNPROVEN verdict (follow-up to 3.4.52).**
|
|
8
|
+
- `recoveryInstruction`: a non-current `unproven` verdict no longer yields "verdict is stale, re-run at current head"; it names the real gap (masked pipe, exit status unproven) and never "fix the failure".
|
|
9
|
+
- `stop-coordinator`: the `verify:pass` predicate and `goalVerificationVerdict` treat `unproven` as unmet but report "unproven (exit status not proven)", not a verified failure; `unproven` never counts as a pass.
|
|
10
|
+
- New Stop-level regressions (`tests/hooks/executionLedgerStopLifecycle.test.js`, GC-03e): UNPROVEN neither failure nor PASS; exhausted retry budget ends visibly without a recovery loop or write demand; same-task same-command PASS clears its own blocker, a different command / UNPROVEN rerun / another task does not; a superseded failure stops producing recovery text.
|
|
11
|
+
- Note: `tests/handoff/**` is excluded from `vitest`; run `tests/handoff/goalCompletion.test.js` with `node --test` (vitest exits 1 with "No test files found").
|
|
12
|
+
- Verified offline on macOS/Node 22; no live host proof.
|
|
13
|
+
|
|
5
14
|
## 3.4.52 - 2026-10-22
|
|
6
15
|
|
|
7
16
|
**Verification-loop ledger integrity (post-3.4.51 follow-up).**
|
package/package.json
CHANGED
|
@@ -3483,7 +3483,9 @@ function recoveryInstruction(missingEvidence, ledger = {}, routeSummary = {}, {
|
|
|
3483
3483
|
if (!instruction && ledger.verdict && typeof ledger.verdict === 'object') {
|
|
3484
3484
|
if (ledger.verdict.kind === 'check-only') {
|
|
3485
3485
|
instruction = 'check-only does not satisfy this lane; verify on the real surface (run the feature / inspect the artifact).';
|
|
3486
|
-
} else {
|
|
3486
|
+
} else if (ledger.verdict.kind !== 'unproven') {
|
|
3487
|
+
// An UNPROVEN verdict never satisfied the gate, so its currency is irrelevant: the
|
|
3488
|
+
// gap is the missing exit status (named below), not a stale head.
|
|
3487
3489
|
const currency = verdictCurrent(ledger.verdict, { cwd });
|
|
3488
3490
|
if (currency.current !== true) {
|
|
3489
3491
|
const sha = ledger.verdict.headSha ? String(ledger.verdict.headSha).slice(0, 12) : 'unknown';
|
|
@@ -1065,9 +1065,14 @@ async function evalVerifyPass(projectRoot) {
|
|
|
1065
1065
|
for (let i = receipts.length - 1; i >= 0; i -= 1) {
|
|
1066
1066
|
const r = receipts[i];
|
|
1067
1067
|
if (!r || typeof r !== 'object' || r.kind !== 'verification') continue;
|
|
1068
|
-
if (r.success === true && r.verdict?.kind !== 'failed') {
|
|
1068
|
+
if (r.success === true && r.verdict?.kind !== 'failed' && r.verdict?.kind !== 'unproven') {
|
|
1069
1069
|
return { pass: true, detail: 'last verification passed' };
|
|
1070
1070
|
}
|
|
1071
|
+
// A masked-pipe run (exit status unproven) is not a verified failure: same fail-closed
|
|
1072
|
+
// result, but the detail must say what is actually missing.
|
|
1073
|
+
if (r.exitStatusUnproven === true || r.verdict?.kind === 'unproven') {
|
|
1074
|
+
return { pass: false, detail: 'last verification unproven (exit status not proven)' };
|
|
1075
|
+
}
|
|
1071
1076
|
return { pass: false, detail: 'last verification failed' };
|
|
1072
1077
|
}
|
|
1073
1078
|
return { pass: false, detail: 'no verification receipt recorded' };
|
|
@@ -1136,6 +1141,7 @@ function goalVerificationVerdict(ledger) {
|
|
|
1136
1141
|
const verdict = typeof ledger.verdict === 'string' ? ledger.verdict.trim().toLowerCase() : null;
|
|
1137
1142
|
if (verdict === 'pass' || verdict === 'passed' || verdict === 'verified') return { pass: true, detail: 'verification verdict: pass' };
|
|
1138
1143
|
if (verdict === 'fail' || verdict === 'failed') return { pass: false, detail: 'verification verdict: fail' };
|
|
1144
|
+
if (verdict === 'unproven') return { pass: false, detail: 'verification verdict: unproven (exit status not proven)' };
|
|
1139
1145
|
if (ledger.verified === true) return { pass: true, detail: 'verification: verified' };
|
|
1140
1146
|
if (ledger.verified === false) return { pass: false, detail: 'verification: not verified' };
|
|
1141
1147
|
if (typeof ledger.verify === 'string' && ledger.verify.trim().toLowerCase() === 'pass') return { pass: true, detail: 'verify: pass' };
|