@ngockhoale/ukit 2.3.14 → 2.3.15
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,33 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to UKit are documented here.
|
|
4
4
|
|
|
5
|
+
## 2.3.15 - 2026-09-11
|
|
6
|
+
|
|
7
|
+
Vision-lane root cause, part 4 — native-first dispatch order. Found by mining the user's own
|
|
8
|
+
failing sessions across four real projects (UnicDB, VSDB, BAGuide, AI-Gateway): the API `model`
|
|
9
|
+
field in the transcripts proved failed specialist dispatches landed on `glm-5-turbo` / lite lanes
|
|
10
|
+
(self-reported `MODEL: unic-lite`, `STATUS: WRONG_MODEL`) while the same sessions' main Claude
|
|
11
|
+
lanes read images fine (`STATUS: OK` ×14 in one transcript). Two stacked defects:
|
|
12
|
+
|
|
13
|
+
- **No fallback when the specialist fails.** The honored-lane hint ordered the parent to dispatch
|
|
14
|
+
`ukit-vision-analyst` and simply continue; when the gateway routed the alias to a backend that
|
|
15
|
+
cannot receive the image through the Read tool_result, the analyst returned `WRONG_MODEL` and
|
|
16
|
+
the image ended up unread even though the parent could have read it natively. The hint now
|
|
17
|
+
verifies the parent's own vision FIRST (step 2: Read the materialized files yourself, write the
|
|
18
|
+
receipts, do NOT dispatch), dispatches the specialist only when the parent's own Read yields no
|
|
19
|
+
image (step 3), and defines the fallback: on `WRONG_MODEL`/`NO_IMAGE` re-read natively, analyse
|
|
20
|
+
from your own view for pasted images, and never fabricate when no reader can see it (step 4).
|
|
21
|
+
- **Refusal by name instead of by probe.** The omp analyst template mandated refusing *before
|
|
22
|
+
touching any image* when the runtime model could not be confirmed vision-capable — field
|
|
23
|
+
transcripts show exactly this refusal (`I must refuse to open, describe, or guess`). Both agent
|
|
24
|
+
templates now decide ONLY by the first image Read (the probe): a backend that self-identifies as
|
|
25
|
+
`glm-5-turbo`/`MiniMax-M3`/a lite lane does not license refusal when the probe actually shows
|
|
26
|
+
the image; a vision-sounding name with a failed probe is still `WRONG_MODEL`.
|
|
27
|
+
|
|
28
|
+
Unchanged doctrine: never guess at image contents — the fix removes the two paths that turned
|
|
29
|
+
"don't guess" into "don't read". omp mirrors synced. TDD: `vision-router-hint` tests 13-14 and
|
|
30
|
+
`vision-agent` test 13 written RED first, then GREEN; all vision suites pass.
|
|
31
|
+
|
|
5
32
|
## 2.3.14 - 2026-09-11
|
|
6
33
|
|
|
7
34
|
Vision-lane root cause, part 3 — the decisive one: the extractor could not see images in REAL
|
package/package.json
CHANGED
|
@@ -27,6 +27,12 @@ demonstrated, never assumed from a name:
|
|
|
27
27
|
actually give you the image (error, empty result, or you can only see text you were told about),
|
|
28
28
|
you are not vision-capable right now: emit `STATUS: WRONG_MODEL` and stop immediately. Do not
|
|
29
29
|
describe, summarise, or guess at any image content.
|
|
30
|
+
- Decide ONLY by the probe result — never by the lane's name. A mapping that sounds non-visual
|
|
31
|
+
(e.g. your environment says you are a lite lane) does NOT license refusal when the probe
|
|
32
|
+
actually shows you the image: if you can see it, you are vision-capable right now — report the
|
|
33
|
+
mapping you actually ran on in `MODEL:` and continue. Conversely, a vision-sounding name with a
|
|
34
|
+
failed probe is still `STATUS: WRONG_MODEL`. Refusing by name without probing was the exact
|
|
35
|
+
failure that left images unread in the field.
|
|
30
36
|
- Never guess at image contents. A non-visual "analysis" is worse than no analysis at all, because
|
|
31
37
|
it looks authoritative while being fabricated. Refusing loudly is always safer than guessing
|
|
32
38
|
quietly.
|
|
@@ -283,31 +283,34 @@ const { pathToFileURL } = require('url');
|
|
|
283
283
|
}
|
|
284
284
|
|
|
285
285
|
// Lane honored (or unverified — missing aliasAvailable defaults to today's
|
|
286
|
-
//
|
|
287
|
-
//
|
|
288
|
-
//
|
|
286
|
+
// dispatch). NATIVE-FIRST ordering (2026-09-11): field evidence showed
|
|
287
|
+
// specialist dispatches landing on gateways/backends that could not return
|
|
288
|
+
// the image through the Read tool_result (STATUS: WRONG_MODEL, self-reported
|
|
289
|
+
// unic-lite / glm-5-turbo) while the parent — usually a Claude lane — could
|
|
290
|
+
// have read the image itself. So the hint verifies the parent's own vision
|
|
291
|
+
// FIRST by reading the materialized file, dispatches the specialist only as
|
|
292
|
+
// a fallback, and defines a fallback when the specialist fails anyway —
|
|
293
|
+
// an image must never end up unread just because one lane failed.
|
|
289
294
|
const unicNote = (unicMode === true && gatewayResult?.visionModel)
|
|
290
295
|
? ` (UNIC gateway active — ${gatewayResult.visionModel} routes through it.)`
|
|
291
296
|
: '';
|
|
292
297
|
|
|
293
|
-
const reasonLines = [
|
|
294
|
-
'Advisory: never guess at image contents. If the active model has VERIFIED native',
|
|
295
|
-
'vision for these images it may read them directly; otherwise dispatch the specialist',
|
|
296
|
-
'before relying on them:',
|
|
297
|
-
];
|
|
298
|
-
|
|
299
298
|
const lines = [
|
|
300
299
|
`UKIT VISION ROUTE — new image input detected (${cases.join(', ')}).`,
|
|
301
|
-
|
|
300
|
+
'Advisory: never guess at image contents. Verify a real reader before relying on them:',
|
|
302
301
|
` 1. ${materializeCmd}`,
|
|
303
|
-
' Materialize
|
|
304
|
-
'
|
|
305
|
-
' 2.
|
|
306
|
-
'
|
|
307
|
-
'
|
|
308
|
-
'
|
|
309
|
-
'
|
|
310
|
-
'
|
|
302
|
+
' Materialize to disk (--session targets the PARENT transcript, so a subagent',
|
|
303
|
+
' spawn cannot drop the image).',
|
|
304
|
+
' 2. Read each ABSOLUTE path in images[].path YOURSELF, in the main session. If',
|
|
305
|
+
' the image actually arrives you have VERIFIED native vision: analyse it and',
|
|
306
|
+
' write receipts (analyzed-<sha>.json; sha/sessionId from the extractor output;',
|
|
307
|
+
' model = your actual model). No dispatch.',
|
|
308
|
+
' 3. Only if your own Read shows no image: Agent(subagent_type: "ukit-vision-analyst")',
|
|
309
|
+
' [model: unic-vision] — send paths as TEXT (subagents do NOT inherit image',
|
|
310
|
+
' blocks) plus the task envelope: original prompt, visual question, goal.',
|
|
311
|
+
' 4. Specialist answers WRONG_MODEL or NO_IMAGE → do not leave the image unread:',
|
|
312
|
+
' re-Read yourself; for a pasted image you can see directly, analyse from your',
|
|
313
|
+
' own view. No reader can see it → say so plainly, never fabricate.',
|
|
311
314
|
];
|
|
312
315
|
if (sessionId) {
|
|
313
316
|
lines.push(` Markers armed under sessionId: ${sessionId} (receipts: analyzed-<sha>.json).`);
|
|
@@ -17,19 +17,23 @@ actually in them. You never write, edit, or refactor product code — you analys
|
|
|
17
17
|
- Stay end-user-invisible: this lane is internal UKit orchestration, not something end users invoke
|
|
18
18
|
by name.
|
|
19
19
|
|
|
20
|
-
## 2.
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
20
|
+
## 2. Capability self-check — the first image read is the probe
|
|
21
|
+
|
|
22
|
+
Model names are gateway mappings whose backend can change at any time, so capability is
|
|
23
|
+
demonstrated, never assumed from a name:
|
|
24
|
+
|
|
25
|
+
- Your first `read` of an image file doubles as the capability probe. If the tool result does not
|
|
26
|
+
actually give you the image (error, empty result, or you can only see text you were told about),
|
|
27
|
+
you are not vision-capable right now: emit `STATUS: WRONG_MODEL` in the output block below and
|
|
28
|
+
stop immediately. Do not describe, summarise, or guess at any image content.
|
|
29
|
+
- Decide ONLY by the probe result — never by the lane's name. A backend that self-identifies as
|
|
30
|
+
something else (e.g. `glm-5-turbo`, `MiniMax-M3`, a lite lane) does NOT license refusal when the
|
|
31
|
+
probe actually shows you the image: if you can see it, you are vision-capable right now — report
|
|
32
|
+
what you actually ran on in `MODEL:` and continue. Refusing by name without probing was the
|
|
33
|
+
exact failure that left images unread in the field.
|
|
34
|
+
- Never guess at image contents. A non-visual "analysis" is worse than no analysis at all, because
|
|
35
|
+
it looks authoritative while being fabricated. Refusing loudly is always safer than guessing
|
|
36
|
+
quietly.
|
|
33
37
|
|
|
34
38
|
## 3. Input protocol (priority order)
|
|
35
39
|
|