@ngockhoale/ukit 2.6.4 → 2.6.6

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,79 @@
2
2
 
3
3
  All notable changes to UKit are documented here.
4
4
 
5
+ ## 2.6.6 - 2026-09-19
6
+
7
+ Documentation-hardening release — first slice of the
8
+ DOCUMENTATION_IMPROVEMENT_ROADMAP (cycle C24, DOC-001..006). No runtime
9
+ behavior changes: new manifest, new test lanes, doc cleanup, and a shipped
10
+ registry the remaining roadmap items build on.
11
+
12
+ - **DOC-001 — documentation ownership/source registry**: new
13
+ `manifests/documentation.yaml` classifies every active/template/adapter
14
+ documentation surface (owner, source_of_truth, merge_strategy, budget);
15
+ `tests/consistency/docRegistry.test.js` enforces schema, coverage,
16
+ manifest-skip consistency, and `error`-level budgets.
17
+ - **DOC-002 — cross-agent benchmark corpus**: spec + fixtures at
18
+ `tests/fixtures/doc-benchmark/` (corpus index, 4 host files, 9+ task files);
19
+ `tests/benchmarks/docBenchmarkCorpus.test.js` validates structure and
20
+ registry cross-references. Host execution deferred — every host recorded
21
+ `untested` (roadmap-permitted).
22
+ - **DOC-003 — artifact reference-integrity checks**:
23
+ `tests/integration/artifactReferenceIntegrity.test.js` fails when a shipped
24
+ instruction/skill doc references an internal command/file that does not
25
+ resolve into the `npm pack` artifact (or the declared runtime-generated
26
+ allowlist); wired into `yarn test:artifact`.
27
+ - **DOC-004 — owner-file preservation lifecycle tests**:
28
+ `tests/integration/ownerPreservation.test.js` proves install/update/uninstall
29
+ preserve exact bytes and symlink posture of every registry
30
+ `merge_strategy: skip` file, including BOM/CRLF and absent-seed cases.
31
+ - **DOC-005 — STATUS.md live snapshot**: `docs/STATUS.md` shrunk to a ≤150-line
32
+ live snapshot; historical body preserved verbatim at
33
+ `docs/archive/status/STATUS-2026-09-19.md` with two-way links; registry
34
+ budget for STATUS.md flipped to `error`.
35
+ - **DOC-006 — adapter stale-version cleanup**: zero stale `vX.Y.Z` literals on
36
+ adapter doc surfaces (`templates/.codex/README.md`, `.codex/README.md`,
37
+ `templates/ukit/README.md`, `.ukit/README.md`); Codex-specific mechanics
38
+ retained; `tests/consistency/staleVersionProse.test.js` enforces.
39
+
40
+ ## 2.6.5 - 2026-09-19
41
+
42
+ Stability release — third full audit pass on the 2.6.4 base (cycle C23). 15
43
+ confirmed hang / freeze / silent-idle / silent-hook defects fixed with root
44
+ causes (full register: `docs/AI_HANDOFF/BUGS-2.6.5.md`). Headline: the
45
+ cycle-lockout mechanism observed live — stall-breaker streak erased on every
46
+ Stop (BUG-C23-08) — is fixed, plus every blocking/degrading hook exit now
47
+ announces on stdout per the §8 contract.
48
+
49
+ - **Handoff stall-breaker streak erased every Stop (BUG-C23-08)**: the
50
+ stop-coordinator dedupe write dropped the `handoff` streak slot, so a wedged
51
+ RUN.md blocked forever; the merge now preserves the slot.
52
+ - **Silent non-zero hook failures (BUG-C23-01, -03, -07)**: stderr-only crash
53
+ reasons in `output-compression`/`reinject-context`/`post-edit-verify`/
54
+ `stale-spec-check` + safe-patch exit-2 blocks + skill-router/vision-router/
55
+ task-watchdog crash paths now emit a stdout `systemMessage` before exit —
56
+ stderr reaches the model, not reliably the user.
57
+ - **Lost/silent deadline emissions (BUG-C23-02, -04)**: compact-threshold's
58
+ same-tick `stdout.write` + `process.exit(0)` discarded the announce on pipes
59
+ (now `writeSync(1)`); deadline-expiry `exit 0` in four called `.mjs` modules
60
+ and `handoff-resume.sh` now announces the abandoned work.
61
+ - **Fail-open/crash-posture defects (BUG-C23-05, -06)**: context-hardcap-gate's
62
+ internal-error catch now announces its fail-open degrade on stdout;
63
+ completion-gate's stop-coordinator spawn is deadline-bounded with forced
64
+ kill routed to the crash-streak path.
65
+ - **Silent data loss + hot-path waste (BUG-C23-09, -10, -13, -15)**:
66
+ compact-threshold double capacity read collapsed to one; sweep failures
67
+ announce (bounded) instead of `.catch(() => {})` swallow; unguarded `main()`
68
+ no longer runs on `import()`; route-audit merges stage to an append-only
69
+ sidecar with a locked + exit fold instead of silently dropping entries.
70
+ - **Unbounded growth + unbounded stalls (BUG-C23-11, -12, -14)**: memory
71
+ project archives capped; `permission-audit.log` rotates inside the prune
72
+ pass; `bin/ukit` runCli got an overall deadline watchdog.
73
+
74
+ Regression gate: 138 files / 2360 tests green, liveness 120/120, §8 sweep
75
+ clean, template↔installed parity byte-identical, async-caller census clean,
76
+ all 25 C22 verdicts re-confirmed.
77
+
5
78
  ## 2.6.4 - 2026-09-19
6
79
 
7
80
  Stability release — second full audit pass on the 2.6.3 base (cycle C22). 25
package/bin/ukit CHANGED
@@ -11,17 +11,37 @@ async function readPackageVersion(packageRoot) {
11
11
  return packageJson.version;
12
12
  }
13
13
 
14
+ const DEFAULT_CLI_DEADLINE_MS = 120_000;
15
+
16
+ function resolveCliDeadlineMs() {
17
+ const raw = Number(process.env.UKIT_CLI_DEADLINE_MS);
18
+ return Number.isFinite(raw) && raw > 0 ? raw : DEFAULT_CLI_DEADLINE_MS;
19
+ }
20
+
14
21
  async function main() {
15
- const currentFile = fileURLToPath(import.meta.url);
16
- const packageRoot = path.resolve(path.dirname(currentFile), '..');
17
- const packageVersion = await readPackageVersion(packageRoot);
18
-
19
- await runCli({
20
- argv: process.argv.slice(2),
21
- packageRoot,
22
- projectRoot: process.cwd(),
23
- packageVersion,
24
- });
22
+ // Overall wall-clock watchdog: individual fs/readline awaits inside runCli are
23
+ // unbounded, so a wedged .ukit/external mount would park the CLI forever.
24
+ const deadlineMs = resolveCliDeadlineMs();
25
+ const watchdog = setTimeout(() => {
26
+ console.error(`[UKit] timed out after ${deadlineMs}ms — likely wedged filesystem; retry`);
27
+ process.exit(1);
28
+ }, deadlineMs);
29
+ watchdog.unref();
30
+
31
+ try {
32
+ const currentFile = fileURLToPath(import.meta.url);
33
+ const packageRoot = path.resolve(path.dirname(currentFile), '..');
34
+ const packageVersion = await readPackageVersion(packageRoot);
35
+
36
+ await runCli({
37
+ argv: process.argv.slice(2),
38
+ packageRoot,
39
+ projectRoot: process.cwd(),
40
+ packageVersion,
41
+ });
42
+ } finally {
43
+ clearTimeout(watchdog);
44
+ }
25
45
  }
26
46
 
27
47
  main().catch((error) => {