@ngockhoale/ukit 2.7.0 → 2.7.1
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 +21 -0
- package/package.json +1 -1
- package/src/core/ompConfigMerge.js +36 -7
- package/src/core/runtimeConfig.js +5 -3
- package/templates/.claude/commands/ukit/handoff-create.md +1 -1
- package/templates/.claude/commands/ukit/handoff-fullstack.md +2 -2
- package/templates/.claude/commands/ukit/handoff-implement.md +1 -1
- package/templates/.claude/commands/ukit/handoff-review.md +1 -1
- package/templates/.omp/README.md +11 -7
- package/templates/.omp/RULES.md +7 -6
- package/templates/.omp/agents/bug-debugger.md +1 -1
- package/templates/.omp/agents/code-reviewer.md +1 -1
- package/templates/.omp/agents/feature-implementer.md +1 -1
- package/templates/.omp/agents/handoff-planner.md +1 -1
- package/templates/.omp/agents/ukit-small-task-maintainer.md +2 -2
- package/templates/.omp/config.yml +10 -4
- package/templates/AGENTS.md +1 -1
- package/templates/CLAUDE.md +1 -1
- package/templates/docs/UKIT_INTERNALS.md +1 -1
- package/templates/instructions/core.md +1 -1
- package/templates/instructions/overlays/omp-rules.md +7 -6
- package/templates/ukit/storage/config.json +7 -3
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,27 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to UKit are documented here.
|
|
4
4
|
|
|
5
|
+
## 2.7.1 - 2026-09-20
|
|
6
|
+
|
|
7
|
+
omp native-tier steering — cycle C36 (TASK-001..005).
|
|
8
|
+
|
|
9
|
+
- `templates/.omp/config.yml` modelRoles now pins omp's native cost tiers
|
|
10
|
+
`smol`/`default`/`slow` (→ `unic-lite`/`unic-code`/`unic-smart`) so omp's
|
|
11
|
+
built-in tier steering resolves UKit's gateway aliases directly; `vision`
|
|
12
|
+
stays `unic-vision` (capability lane — unic-code/unic-smart cannot read
|
|
13
|
+
images on this gateway).
|
|
14
|
+
- Back-compat: `lite`/`code`/`smart` kept as independent alias keys (not
|
|
15
|
+
references) resolving to the same unic-* values — a maintainer overriding
|
|
16
|
+
a cost tier must edit the matching alias too.
|
|
17
|
+
- `.omp/agents/*.md` rebound from direct unic-* names to `@smol`/`@default`/
|
|
18
|
+
`@slow`/`@vision` frontmatter so agents follow the modelRoles map.
|
|
19
|
+
- Migration: `mergeOmpConfig` merges `modelRoles` per key (user-pinned keys
|
|
20
|
+
preserved, newly added template keys recorded via `addedModelRoleKeys`)
|
|
21
|
+
instead of clobbering the whole map.
|
|
22
|
+
- `orchestration.modelTiers.*.ompRole` added to the runtime config template
|
|
23
|
+
+ `runtimeConfig.js` so each tier declares which modelRoles key it binds
|
|
24
|
+
(lite→smol, code→default, smart→slow, vision→vision).
|
|
25
|
+
|
|
5
26
|
## 2.7.0 - 2026-09-20
|
|
6
27
|
|
|
7
28
|
OMP fully autonomous / unattended mode — cycle C35 (TASK-008..014).
|
package/package.json
CHANGED
|
@@ -20,6 +20,7 @@ function emptyReport() {
|
|
|
20
20
|
strippedPromptApprovals: [],
|
|
21
21
|
coercedPromptPatterns: [],
|
|
22
22
|
preservedModelRoles: false,
|
|
23
|
+
addedModelRoleKeys: [],
|
|
23
24
|
preservedTopLevelKeys: [],
|
|
24
25
|
preservedPatterns: [],
|
|
25
26
|
parseError: null,
|
|
@@ -141,14 +142,42 @@ export function mergeOmpConfig(existingText, renderedText) {
|
|
|
141
142
|
|
|
142
143
|
const lines = renderedText.split('\n');
|
|
143
144
|
|
|
144
|
-
// §7.3 — modelRoles
|
|
145
|
-
//
|
|
145
|
+
// §7.3 / FR-004 — modelRoles per-key union: existing entries win verbatim,
|
|
146
|
+
// rendered keys absent from existing are appended (rendered order) so new
|
|
147
|
+
// template roles (e.g. smol/default/slow) reach pre-existing installs while
|
|
148
|
+
// user-owned roles and overrides survive. The block is regenerated via
|
|
149
|
+
// YAML.stringify under `modelRoles:`; rendered header comments above the
|
|
150
|
+
// `modelRoles:` line are untouched. Known limitation: comments *inside* the
|
|
151
|
+
// existing modelRoles block are dropped — values are preserved, comment
|
|
152
|
+
// text is not (SPEC §10).
|
|
146
153
|
const renderedRoles = extractScalarMapSpan(lines, 'modelRoles');
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
154
|
+
if (renderedRoles && isPlainObject(existing.modelRoles)) {
|
|
155
|
+
const merged = { ...existing.modelRoles };
|
|
156
|
+
const renderedMap = isPlainObject(rendered?.modelRoles) ? rendered.modelRoles : {};
|
|
157
|
+
for (const [key, value] of Object.entries(renderedMap)) {
|
|
158
|
+
if (!(key in merged)) {
|
|
159
|
+
merged[key] = value;
|
|
160
|
+
report.addedModelRoleKeys.push(key);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
// Skip regeneration when existing contributed nothing the rendered block
|
|
164
|
+
// doesn't already state — identical keys and values means the rendered
|
|
165
|
+
// block (interior comments included) already IS the merged result.
|
|
166
|
+
// Regenerating here would byte-shift installs whose file matches the
|
|
167
|
+
// template and break install idempotency.
|
|
168
|
+
const renderedKeys = Object.keys(renderedMap);
|
|
169
|
+
const mergedKeys = Object.keys(merged);
|
|
170
|
+
const identicalToRendered =
|
|
171
|
+
mergedKeys.length === renderedKeys.length &&
|
|
172
|
+
mergedKeys.every((k) => k in renderedMap && merged[k] === renderedMap[k]);
|
|
173
|
+
if (!identicalToRendered) {
|
|
174
|
+
const fragment = YAML.stringify(merged, { indent: 2 })
|
|
175
|
+
.trimEnd()
|
|
176
|
+
.split('\n')
|
|
177
|
+
.map((line) => ` ${line}`);
|
|
178
|
+
lines.splice(renderedRoles.start, renderedRoles.end - renderedRoles.start, 'modelRoles:', ...fragment);
|
|
179
|
+
report.preservedModelRoles = true;
|
|
180
|
+
}
|
|
152
181
|
}
|
|
153
182
|
|
|
154
183
|
// §7.2 splice — append preserved allow/deny keys to the rendered
|
|
@@ -144,12 +144,14 @@ export function buildDefaultRuntimeConfig(overrides = {}) {
|
|
|
144
144
|
permissionMode: 'unattended',
|
|
145
145
|
contracts: buildConfigContracts(),
|
|
146
146
|
modelTiers: {
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
147
|
+
// ompRole is the .omp/config.yml modelRoles key this tier binds to.
|
|
148
|
+
lite: { claudeModel: 'claude-haiku-4-5', genericModel: 'unic-lite', ompRole: 'smol' },
|
|
149
|
+
code: { claudeModel: 'claude-sonnet-5', genericModel: 'unic-code', ompRole: 'default' },
|
|
150
|
+
smart: { claudeModel: 'claude-opus-5', genericModel: 'unic-smart', ompRole: 'slow' },
|
|
150
151
|
vision: {
|
|
151
152
|
claudeModel: 'unic-vision',
|
|
152
153
|
genericModel: 'unic-vision',
|
|
154
|
+
ompRole: 'vision',
|
|
153
155
|
fallbackModel: 'claude-sonnet-5',
|
|
154
156
|
capabilityTier: true,
|
|
155
157
|
note: 'Capability tier, not a cost tier. Orthogonal to lite/code/smart — never insert into escalation.tierOrder. fallbackModel is used when unicMode is off.',
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
- Read/understand → lite model (haiku · unic-lite · cheapest available)
|
|
7
7
|
- Write plan + tasks → strong model (Opus · unic-smart · strongest available)
|
|
8
8
|
|
|
9
|
-
> **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@
|
|
9
|
+
> **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@smol` / `@default` / `@slow`.
|
|
10
10
|
|
|
11
11
|
## Problem / feature
|
|
12
12
|
$ARGUMENTS
|
|
@@ -13,9 +13,9 @@
|
|
|
13
13
|
|
|
14
14
|
> Claude Code: spawn `ukit-small-task-maintainer` (haiku) for light steps; spawn `handoff-planner` (opus) for planning; spawn `feature-implementer` (sonnet) agents for implementation; spawn `code-reviewer` (opus) per task for review.
|
|
15
15
|
>
|
|
16
|
-
> omp: same four agents, launched with the `task` tool (`agent: "<name>"`). They live in `.omp/agents/` and bind their tier through `model: "@
|
|
16
|
+
> omp: same four agents, launched with the `task` tool (`agent: "<name>"`). They live in `.omp/agents/` and bind their tier through `model: "@smol"` / `"@default"` / `"@slow"`, resolved via `modelRoles` in `.omp/config.yml` — you do not pass a model name.
|
|
17
17
|
|
|
18
|
-
> **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@
|
|
18
|
+
> **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@smol` / `@default` / `@slow`.
|
|
19
19
|
|
|
20
20
|
---
|
|
21
21
|
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
**Tool: any** (Claude Code / Codex / omp / Kilo / OpenCode — your choice)
|
|
5
5
|
**Model: code model** (Sonnet · unic-code · cheap-smart)
|
|
6
6
|
|
|
7
|
-
> **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@
|
|
7
|
+
> **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@smol` / `@default` / `@slow`.
|
|
8
8
|
|
|
9
9
|
## Target (optional)
|
|
10
10
|
$ARGUMENTS
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
**Tool: any** (Claude Code / Codex / omp / Kilo / OpenCode — your choice)
|
|
5
5
|
**Model: strong model, MUST differ from executor** (Opus · unic-smart · strongest available)
|
|
6
6
|
|
|
7
|
-
> **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@
|
|
7
|
+
> **omp model tiers:** the tiers above map to `.omp/config.yml`'s `modelRoles`, referenced from agent frontmatter as `@smol` / `@default` / `@slow`.
|
|
8
8
|
|
|
9
9
|
## Target (optional)
|
|
10
10
|
$ARGUMENTS
|
package/templates/.omp/README.md
CHANGED
|
@@ -26,19 +26,23 @@ whatever was there before, so local edits are never silently lost — they move,
|
|
|
26
26
|
|
|
27
27
|
## Model roles
|
|
28
28
|
|
|
29
|
-
`.omp/config.yml` defines
|
|
30
|
-
|
|
29
|
+
`.omp/config.yml` defines omp's native roles `smol` / `default` / `slow` / `vision` plus
|
|
30
|
+
back-compat aliases `lite` / `code` / `smart` that resolve to the same models. Agent frontmatter
|
|
31
|
+
references the native roles as `@smol` / `@default` / `@slow` / `@vision`, so retargeting a whole
|
|
32
|
+
tier is a one-line edit in one file — but remember the matching `lite`/`code`/`smart` alias is an
|
|
33
|
+
independent key: edit it too, or it keeps resolving to the old value.
|
|
31
34
|
|
|
32
35
|
| Role | Default model | Agents using it |
|
|
33
36
|
|------|---------------|-----------------|
|
|
34
|
-
| `lite` | `unic-lite` | `ukit-small-task-maintainer` |
|
|
35
|
-
| `code` | `unic-code` | `feature-implementer`, `bug-debugger` |
|
|
36
|
-
| `smart` | `unic-smart` | `handoff-planner`, `code-reviewer` |
|
|
37
|
+
| `smol` (alias `lite`) | `unic-lite` | `ukit-small-task-maintainer` |
|
|
38
|
+
| `default` (alias `code`) | `unic-code` | `feature-implementer`, `bug-debugger` |
|
|
39
|
+
| `slow` (alias `smart`) | `unic-smart` | `handoff-planner`, `code-reviewer` |
|
|
37
40
|
| `vision` | `unic-vision` | `ukit-vision-analyst` |
|
|
38
41
|
|
|
39
42
|
These are **literal model names on the UNIC gateway, not aliases**, and they ship as the installed
|
|
40
|
-
default. If this project does not run against UNIC, a maintainer swaps the three cost tiers
|
|
41
|
-
|
|
43
|
+
default. If this project does not run against UNIC, a maintainer swaps the three cost tiers
|
|
44
|
+
(`smol`/`default`/`slow` — and their `lite`/`code`/`smart` aliases) for the values in
|
|
45
|
+
`orchestration.modelTiers[*].claudeModel` in `.ukit/storage/config.json`.
|
|
42
46
|
|
|
43
47
|
`vision` is the exception and stays `unic-vision` either way: it is a *capability* lane, not a cost
|
|
44
48
|
tier. `unic-code` and `unic-smart` cannot read images on this gateway, so substituting one of them
|
package/templates/.omp/RULES.md
CHANGED
|
@@ -40,12 +40,12 @@ work really is, read the matching `SKILL.md` without being asked. Users never na
|
|
|
40
40
|
## 6. Delegate to bind a model tier
|
|
41
41
|
|
|
42
42
|
Your own model does not change mid-turn. A tier only applies when work is handed to a task-agent in
|
|
43
|
-
`.omp/agents/`, whose `model:` field (`@
|
|
43
|
+
`.omp/agents/`, whose `model:` field (`@smol` / `@default` / `@slow` / `@vision`) resolves through
|
|
44
44
|
`modelRoles` in `.omp/config.yml`.
|
|
45
45
|
|
|
46
|
-
- `tiny-fix` → `@
|
|
47
|
-
`@
|
|
48
|
-
- Images: `@vision` only. `@
|
|
46
|
+
- `tiny-fix` → `@smol` · `local-fix`, `local-build`, `shared-edit`, `find-cause`, `map-impact` →
|
|
47
|
+
`@default` · `review-release` → `@slow`
|
|
48
|
+
- Images: `@vision` only. `@default`/`@slow` cannot see images on the UNIC gateway and must never
|
|
49
49
|
guess at their contents — hand every image to `ukit-vision-analyst` first.
|
|
50
50
|
|
|
51
51
|
Doing everything inline is exactly what makes UKit look like it only has one model. Keep direct
|
|
@@ -73,5 +73,6 @@ last thing you emit is one short line naming what is unfinished and what you nee
|
|
|
73
73
|
a status — the user cannot distinguish it from a crash.
|
|
74
74
|
|
|
75
75
|
> Maintainer note, not a per-turn rule: `modelRoles` in `.omp/config.yml` ships UNIC gateway names.
|
|
76
|
-
> On a non-UNIC provider, edit only the three cost tiers — `
|
|
77
|
-
> which stays `unic-vision`
|
|
76
|
+
> On a non-UNIC provider, edit only the three cost tiers — `smol`, `default`, `slow` — never `vision`,
|
|
77
|
+
> which stays `unic-vision` (capability lane, not a cost tier). Old keys `lite`/`code`/`smart` remain
|
|
78
|
+
> as compat aliases — edit each alias alongside its tier (smol↔lite, default↔code, slow↔smart).
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: bug-debugger
|
|
3
3
|
description: "Debugging specialist for reproducible errors, failing tests, and unexpected behavior. Use proactively when investigation will involve noisy logs, stack traces, or a self-contained reproduce-trace-fix-verify loop. Do not use for trivial obvious fixes or broad architecture ideation."
|
|
4
|
-
model: "@
|
|
4
|
+
model: "@default"
|
|
5
5
|
tools: ["read","grep","glob","bash","edit","ast_edit"]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: code-reviewer
|
|
3
3
|
description: "Independent reviewer for handoff Phase 3, for spec/plan documents, and for non-blocking sidecar diff review of daily-flow edits. For code (default): use after executor reports STATUS: DONE on a handoff task, MUST run with a model different from the executor (configured in .ukit/storage/config.json → handoff.reviewer.model, default unic-smart), produces a verdict: APPROVED | APPROVED-WITH-MINOR | CHANGES-REQUESTED | CRITICAL. For spec/plan documents (set REVIEW_TARGET_TYPE=spec or plan): reviews a docs/plans/*.md file for completeness/consistency/clarity/scope/YAGNI, produces Status: Approved | Issues Found. For sidecar diff review (set REVIEW_TARGET_TYPE=diff): reviews the current uncommitted git diff after a local-build/shared-edit task, runs in the background and never blocks the main task, produces STATUS: clean | issues-found."
|
|
4
|
-
model: "@
|
|
4
|
+
model: "@slow"
|
|
5
5
|
tools: ["read","grep","glob","bash"]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: feature-implementer
|
|
3
3
|
description: "Implementation specialist for clear, self-contained coding tasks. Use proactively when the approach is clear and the work can be completed in a bounded pass with a concise summary. Do not use for trivial one-file tweaks or tightly coupled exploratory work."
|
|
4
|
-
model: "@
|
|
4
|
+
model: "@default"
|
|
5
5
|
tools: ["read","edit","write","ast_edit","grep","glob","bash"]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: handoff-planner
|
|
3
3
|
description: "Handoff planning specialist for Phase 1+2. Use when creating a new handoff cycle: writes PLAN.md with full test plan, splits into TASK-xxx.md files with TDD-embedded test cases, and updates INDEX.md. Always use the strongest available model (Opus/unic-smart)."
|
|
4
|
-
model: "@
|
|
4
|
+
model: "@slow"
|
|
5
5
|
tools: ["read","edit","write","ast_edit","glob","bash"]
|
|
6
6
|
---
|
|
7
7
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: ukit-small-task-maintainer
|
|
3
3
|
description: "Internal UKit maintenance subagent for low-risk, reversible UKit decisions. Use proactively when UKit needs to decide or perform safe cleanup such as pruning docs/TASKS.md, classifying queued work, choosing whether compact/summarization is appropriate, summarizing local docs/status, or maintaining small UKit runtime queues. Do not use for product implementation, security, release/publish, data-loss, architecture, or risky/shared code changes."
|
|
4
|
-
model: "@
|
|
4
|
+
model: "@smol"
|
|
5
5
|
tools: ["read","grep","glob","edit","write","ast_edit"]
|
|
6
6
|
blocking: false
|
|
7
7
|
---
|
|
@@ -11,7 +11,7 @@ You are UKit's internal small-task maintainer. You run as a sidecar/parallel/non
|
|
|
11
11
|
## Model Policy
|
|
12
12
|
|
|
13
13
|
- Use the model selected by `subagents.smallTaskModel` when the host supports model selection for this subagent.
|
|
14
|
-
- Default intended model: `unic-lite`.
|
|
14
|
+
- Default intended model: `unic-lite` (frontmatter `@smol` resolves to `unic-lite` via `.omp/config.yml` modelRoles).
|
|
15
15
|
- If the host cannot bind a model from config directly, still follow this role and report that the configured model is a hint.
|
|
16
16
|
- This lane must run separately from the user's main task model. It must never replace, pause, or slow down the main task.
|
|
17
17
|
|
|
@@ -2,17 +2,23 @@
|
|
|
2
2
|
# models may change during development; orchestration must not branch on vendor names.
|
|
3
3
|
# Do NOT substitute sonnet/opus/haiku here. See PLAN.md §3 D15.
|
|
4
4
|
#
|
|
5
|
-
# Non-UNIC omp provider? A maintainer edits the three cost tiers
|
|
6
|
-
# orchestration.modelTiers[*].claudeModel (.ukit/storage/config.json) —
|
|
7
|
-
# lite: claude-haiku-4-5, code: claude-sonnet-5, smart: claude-opus-5.
|
|
5
|
+
# Non-UNIC omp provider? A maintainer edits the three cost tiers — smol, default, slow —
|
|
6
|
+
# to the values in orchestration.modelTiers[*].claudeModel (.ukit/storage/config.json) —
|
|
7
|
+
# currently lite: claude-haiku-4-5, code: claude-sonnet-5, smart: claude-opus-5.
|
|
8
8
|
# `vision` STAYS unic-vision: its claudeModel is already unic-vision, because
|
|
9
9
|
# unic-code/unic-smart cannot read images on this gateway. claude-sonnet-5 is only
|
|
10
10
|
# modelTiers.vision.fallbackModel, used when unicMode is off — never a drop-in here.
|
|
11
11
|
modelRoles:
|
|
12
|
+
smol: unic-lite
|
|
13
|
+
default: unic-code
|
|
14
|
+
slow: unic-smart
|
|
15
|
+
vision: unic-vision
|
|
16
|
+
# Back-compat aliases — INDEPENDENT keys, not references. A maintainer overriding a
|
|
17
|
+
# cost tier above must edit the matching alias too (smol↔lite, default↔code,
|
|
18
|
+
# slow↔smart), or the alias keeps resolving to the old unic-* value.
|
|
12
19
|
lite: unic-lite
|
|
13
20
|
code: unic-code
|
|
14
21
|
smart: unic-smart
|
|
15
|
-
vision: unic-vision
|
|
16
22
|
|
|
17
23
|
tools:
|
|
18
24
|
# TASK-009 / SPEC FR-003: the unattended approval surface is pinned HERE —
|
package/templates/AGENTS.md
CHANGED
|
@@ -136,7 +136,7 @@ CHỈ kích hoạt khi task đi qua `docs/AI_HANDOFF/` (user nói "execute task
|
|
|
136
136
|
| code | `unic-code` | claude-sonnet | Normal coding, local fixes, shared edits, builds, debugging, impact mapping |
|
|
137
137
|
| smart | `unic-smart` | claude-opus | Release review/audit, escalated deep reasoning after repeated failure |
|
|
138
138
|
|
|
139
|
-
- A tier takes effect only when work is handed to an agent whose definition binds that model (`model:` frontmatter in `.claude/agents/*.md`; `model:` `@
|
|
139
|
+
- A tier takes effect only when work is handed to an agent whose definition binds that model (`model:` frontmatter in `.claude/agents/*.md`; `model:` `@smol`/`@default`/`@slow`/`@vision` in `.omp/agents/*.md` via `modelRoles`) — the main session model never changes mid-turn.
|
|
140
140
|
- Contract map: `tiny-fix` → lite · `local-fix`, `local-build`, `shared-edit`, `find-cause`, `map-impact` → code · `review-release` → smart. Escalation: same file/symbol failing `debugLoopThreshold` (default 2) times routes the next attempt one tier higher, capped at `smart`.
|
|
141
141
|
- `unic-vision` is a capability lane, not a cost tier — unverified vision must never guess image contents; route images to `ukit-vision-analyst`. Harness table: `docs/UKIT_INTERNALS.md`.
|
|
142
142
|
|
package/templates/CLAUDE.md
CHANGED
|
@@ -136,7 +136,7 @@ CHỈ kích hoạt khi task đi qua `docs/AI_HANDOFF/` (user nói "execute task
|
|
|
136
136
|
| code | `unic-code` | claude-sonnet | Normal coding, local fixes, shared edits, builds, debugging, impact mapping |
|
|
137
137
|
| smart | `unic-smart` | claude-opus | Release review/audit, escalated deep reasoning after repeated failure |
|
|
138
138
|
|
|
139
|
-
- A tier takes effect only when work is handed to an agent whose definition binds that model (`model:` frontmatter in `.claude/agents/*.md`; `model:` `@
|
|
139
|
+
- A tier takes effect only when work is handed to an agent whose definition binds that model (`model:` frontmatter in `.claude/agents/*.md`; `model:` `@smol`/`@default`/`@slow`/`@vision` in `.omp/agents/*.md` via `modelRoles`) — the main session model never changes mid-turn.
|
|
140
140
|
- Contract map: `tiny-fix` → lite · `local-fix`, `local-build`, `shared-edit`, `find-cause`, `map-impact` → code · `review-release` → smart. Escalation: same file/symbol failing `debugLoopThreshold` (default 2) times routes the next attempt one tier higher, capped at `smart`.
|
|
141
141
|
- `unic-vision` is a capability lane, not a cost tier — unverified vision must never guess image contents; route images to `ukit-vision-analyst`. Harness table: `docs/UKIT_INTERNALS.md`.
|
|
142
142
|
|
|
@@ -179,7 +179,7 @@ whose own definition binds that model.
|
|
|
179
179
|
| Harness | Agent definitions | How to launch one |
|
|
180
180
|
|---------|-------------------|-------------------|
|
|
181
181
|
| Claude Code | `.claude/agents/*.md` (`model:` frontmatter) | Agent tool, `subagent_type: "<name>"` |
|
|
182
|
-
| omp | `.omp/agents/*.md` (`model: "@
|
|
182
|
+
| omp | `.omp/agents/*.md` (`model: "@smol"` / `"@default"` / `"@slow"` / `"@vision"`, resolved through `modelRoles` in `.omp/config.yml`) | task-agent `<name>` |
|
|
183
183
|
|
|
184
184
|
When a task's contract maps to a tier other than the current session model, hand it to the
|
|
185
185
|
matching agent instead of doing it inline. Doing everything inline is exactly what makes
|
|
@@ -133,7 +133,7 @@ CHỈ kích hoạt khi task đi qua `docs/AI_HANDOFF/` (user nói "execute task
|
|
|
133
133
|
| code | `unic-code` | claude-sonnet | Normal coding, local fixes, shared edits, builds, debugging, impact mapping |
|
|
134
134
|
| smart | `unic-smart` | claude-opus | Release review/audit, escalated deep reasoning after repeated failure |
|
|
135
135
|
|
|
136
|
-
- A tier takes effect only when work is handed to an agent whose definition binds that model (`model:` frontmatter in `.claude/agents/*.md`; `model:` `@
|
|
136
|
+
- A tier takes effect only when work is handed to an agent whose definition binds that model (`model:` frontmatter in `.claude/agents/*.md`; `model:` `@smol`/`@default`/`@slow`/`@vision` in `.omp/agents/*.md` via `modelRoles`) — the main session model never changes mid-turn.
|
|
137
137
|
- Contract map: `tiny-fix` → lite · `local-fix`, `local-build`, `shared-edit`, `find-cause`, `map-impact` → code · `review-release` → smart. Escalation: same file/symbol failing `debugLoopThreshold` (default 2) times routes the next attempt one tier higher, capped at `smart`.
|
|
138
138
|
- `unic-vision` is a capability lane, not a cost tier — unverified vision must never guess image contents; route images to `ukit-vision-analyst`. Harness table: `docs/UKIT_INTERNALS.md`.
|
|
139
139
|
|
|
@@ -37,12 +37,12 @@ work really is, read the matching `SKILL.md` without being asked. Users never na
|
|
|
37
37
|
## 6. Delegate to bind a model tier
|
|
38
38
|
|
|
39
39
|
Your own model does not change mid-turn. A tier only applies when work is handed to a task-agent in
|
|
40
|
-
`.omp/agents/`, whose `model:` field (`@
|
|
40
|
+
`.omp/agents/`, whose `model:` field (`@smol` / `@default` / `@slow` / `@vision`) resolves through
|
|
41
41
|
`modelRoles` in `.omp/config.yml`.
|
|
42
42
|
|
|
43
|
-
- `tiny-fix` → `@
|
|
44
|
-
`@
|
|
45
|
-
- Images: `@vision` only. `@
|
|
43
|
+
- `tiny-fix` → `@smol` · `local-fix`, `local-build`, `shared-edit`, `find-cause`, `map-impact` →
|
|
44
|
+
`@default` · `review-release` → `@slow`
|
|
45
|
+
- Images: `@vision` only. `@default`/`@slow` cannot see images on the UNIC gateway and must never
|
|
46
46
|
guess at their contents — hand every image to `ukit-vision-analyst` first.
|
|
47
47
|
|
|
48
48
|
Doing everything inline is exactly what makes UKit look like it only has one model. Keep direct
|
|
@@ -70,5 +70,6 @@ last thing you emit is one short line naming what is unfinished and what you nee
|
|
|
70
70
|
a status — the user cannot distinguish it from a crash.
|
|
71
71
|
|
|
72
72
|
> Maintainer note, not a per-turn rule: `modelRoles` in `.omp/config.yml` ships UNIC gateway names.
|
|
73
|
-
> On a non-UNIC provider, edit only the three cost tiers — `
|
|
74
|
-
> which stays `unic-vision`
|
|
73
|
+
> On a non-UNIC provider, edit only the three cost tiers — `smol`, `default`, `slow` — never `vision`,
|
|
74
|
+
> which stays `unic-vision` (capability lane, not a cost tier). Old keys `lite`/`code`/`smart` remain
|
|
75
|
+
> as compat aliases — edit each alias alongside its tier (smol↔lite, default↔code, slow↔smart).
|
|
@@ -147,19 +147,23 @@
|
|
|
147
147
|
"modelTiers": {
|
|
148
148
|
"lite": {
|
|
149
149
|
"claudeModel": "claude-haiku-4-5",
|
|
150
|
-
"genericModel": "unic-lite"
|
|
150
|
+
"genericModel": "unic-lite",
|
|
151
|
+
"ompRole": "smol"
|
|
151
152
|
},
|
|
152
153
|
"code": {
|
|
153
154
|
"claudeModel": "claude-sonnet-5",
|
|
154
|
-
"genericModel": "unic-code"
|
|
155
|
+
"genericModel": "unic-code",
|
|
156
|
+
"ompRole": "default"
|
|
155
157
|
},
|
|
156
158
|
"smart": {
|
|
157
159
|
"claudeModel": "claude-opus-5",
|
|
158
|
-
"genericModel": "unic-smart"
|
|
160
|
+
"genericModel": "unic-smart",
|
|
161
|
+
"ompRole": "slow"
|
|
159
162
|
},
|
|
160
163
|
"vision": {
|
|
161
164
|
"claudeModel": "unic-vision",
|
|
162
165
|
"genericModel": "unic-vision",
|
|
166
|
+
"ompRole": "vision",
|
|
163
167
|
"fallbackModel": "claude-sonnet-5",
|
|
164
168
|
"capabilityTier": true,
|
|
165
169
|
"note": "Capability tier, not a cost tier. Orthogonal to lite/code/smart — never insert into escalation.tierOrder. fallbackModel is used when unicMode is off."
|