@ngockhoale/ukit 2.6.5 → 2.6.7

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.
@@ -0,0 +1,376 @@
1
+ version: 1
2
+ generated: false
3
+ description: >-
4
+ Canonical rule-ID catalog for the root instruction contracts. Marker comments
5
+ <!-- RULE: ID --> tag normative behavior; semantic tests prove delivery.
6
+ # marker_in values are drawn from the fixed set of the four marker-bearing
7
+ # contract files {templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md}.
8
+ # templates/.omp/RULES.md and .omp/RULES.md are marker-free by SPEC §7.1 policy
9
+ # and must never appear here.
10
+ # DEVIATION from SPEC §7.2 table: OWN-01 is marker_in: AGENTS set only (not
11
+ # SHARED) — its anchor `PROJECT_IMPORTANT.md` does not exist in the CLAUDE
12
+ # files, and markers are comment-only (no prose edits allowed). AGENTS-set
13
+ # coverage matches the HOST-OC-01/HOST-OWN-01 rows that tag the same overlay.
14
+ rules:
15
+ - id: CORE-01
16
+ title: One remembered command — ukit install
17
+ kind: critical
18
+ statement: >-
19
+ Human-facing UKit workflow collapses to one remembered command:
20
+ `ukit install`; after install, work in natural language inside the
21
+ supported harnesses.
22
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
23
+ anchor: 'ukit install'
24
+ - id: CORE-02
25
+ title: Quality first, then speed, then token discipline
26
+ kind: supporting
27
+ statement: >-
28
+ Ordering of priorities for all work: quality first, then speed, then
29
+ token discipline.
30
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
31
+ - id: CLS-01
32
+ title: Trivial lane acts directly
33
+ kind: critical
34
+ statement: >-
35
+ Trivial tasks (typo, label, small rename, spacing, toggle flag, obvious
36
+ config change) act directly — no doc reads, planning, index, or agents.
37
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
38
+ anchor: 'Act directly'
39
+ - id: CLS-02
40
+ title: Simple lane pulls smallest useful context
41
+ kind: critical
42
+ statement: >-
43
+ Simple tasks (1-2 files, clear scope, existing pattern) are handled
44
+ directly, pulling only the smallest useful context.
45
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
46
+ anchor: 'smallest useful context'
47
+ - id: CLS-03
48
+ title: Non-trivial lane verifies harder
49
+ kind: supporting
50
+ statement: >-
51
+ Non-trivial/risky tasks read deeper, verify harder, and use the
52
+ index-first loop then skill activation then targeted verification.
53
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
54
+ - id: EXEC-01
55
+ title: Continue until write evidence or blocker
56
+ kind: critical
57
+ statement: >-
58
+ For explicit implement/apply/fix requests, continue until the actual edit
59
+ is made or a real blocker is found; never stop after read-only steps.
60
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
61
+ anchor: 'actual edit is made'
62
+ - id: EXEC-02
63
+ title: No done-claims without Edit/Write evidence
64
+ kind: critical
65
+ statement: >-
66
+ Completion wording requires concrete Edit/Write evidence in the current
67
+ turn, plus verification when the scope is risky.
68
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
69
+ anchor: 'concrete Edit/Write evidence'
70
+ - id: EXEC-03
71
+ title: Routed continuation is not a stopping point
72
+ kind: supporting
73
+ statement: >-
74
+ Routed states like pull-indexed-context or continuation-required are
75
+ internal continuation steps; finish the named milestone before widening.
76
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
77
+ - id: EXEC-04
78
+ title: Every stop names its reason
79
+ kind: critical
80
+ statement: >-
81
+ When a turn ends on a user-only action, open the reply with a
82
+ `WAITING ON YOU:` line and schedule a one-shot wakeup when available.
83
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
84
+ anchor: 'WAITING ON YOU'
85
+ - id: LONG-01
86
+ title: LAND one thing, DEFER the rest, DELEGATE broad work
87
+ kind: supporting
88
+ statement: >-
89
+ Near token-cap, land one in-flight item end-to-end, defer the rest into
90
+ docs/STATUS.md or bounded handoff tasks, delegate broad work to subagents.
91
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
92
+ - id: LONG-02
93
+ title: Post-compact continuity from disk state
94
+ kind: supporting
95
+ statement: >-
96
+ After any compact or handoff, continue from persisted disk state without
97
+ rereading pre-compact context; delegate and keep replies short.
98
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
99
+ - id: IDX-01
100
+ title: Check index freshness before code context
101
+ kind: critical
102
+ statement: >-
103
+ For tasks needing code context, check the index is fresh and refresh it
104
+ when stale or missing.
105
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
106
+ anchor: 'index is fresh'
107
+ - id: IDX-02
108
+ title: Open top 1-3 suspect files first
109
+ kind: critical
110
+ statement: >-
111
+ Open only the top 1-3 suspect files first, then widen if needed; use the
112
+ outline block to jump straight to the relevant region.
113
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
114
+ anchor: 'top 1-3 suspect files'
115
+ - id: IDX-03
116
+ title: Outlines locate code; code to be changed must still be read
117
+ kind: critical
118
+ statement: >-
119
+ The outline locates code but does not describe behaviour; any code about
120
+ to be changed must still be read.
121
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
122
+ anchor: 'must still be read'
123
+ - id: SKILL-01
124
+ title: Auto-activate the matching skill
125
+ kind: critical
126
+ statement: >-
127
+ On every non-trivial task, inspect installed project-local skills and
128
+ auto-activate the matching skill immediately; end users should not need
129
+ to know skill names.
130
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
131
+ anchor: 'auto-activate the matching skill'
132
+ - id: SKILL-02
133
+ title: Smallest effective skill set
134
+ kind: supporting
135
+ statement: >-
136
+ Use the smallest effective set of skills, usually 1-2.
137
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
138
+ - id: SKILL-03
139
+ title: Upgrade skill choice on sharper evidence
140
+ kind: supporting
141
+ statement: >-
142
+ If evidence becomes more specific than the original prompt, upgrade the
143
+ active skill choice immediately.
144
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
145
+ - id: HELP-01
146
+ title: Prefer internal helper commands for routing/context/verify
147
+ kind: supporting
148
+ statement: >-
149
+ Prefer the index helper scripts (route-task, resolve-context,
150
+ verify-context) for routing, related-file context, and verification.
151
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
152
+ - id: HELP-02
153
+ title: Never ask contributors to run internal helpers
154
+ kind: critical
155
+ statement: >-
156
+ Do not ask normal contributors to run internal helper commands or
157
+ memorize maintainer commands; run them yourself or tell them to rerun
158
+ `ukit install`.
159
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
160
+ anchor: 'Do not ask normal contributors'
161
+ - id: OWN-01
162
+ title: PROJECT_IMPORTANT.md is the canonical owner-instruction source
163
+ kind: critical
164
+ statement: >-
165
+ Read and follow the root PROJECT_IMPORTANT.md before project work; it is
166
+ the canonical project-owner instruction source.
167
+ marker_in: [templates/AGENTS.md, AGENTS.md]
168
+ anchor: 'PROJECT_IMPORTANT.md'
169
+ - id: SAFE-01
170
+ title: Preserve byte-level file details on edit
171
+ kind: critical
172
+ statement: >-
173
+ Preserve UTF-8 BOM/no-BOM and LF/CRLF for existing multilingual or
174
+ user-authored files.
175
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
176
+ anchor: 'BOM/no-BOM'
177
+ - id: SAFE-02
178
+ title: Prefer unique current-file anchors for risky edits
179
+ kind: critical
180
+ statement: >-
181
+ For risky/shared/large edits, prefer unique current-file anchors over
182
+ line numbers or stale pasted blocks.
183
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
184
+ anchor: 'unique current-file anchors'
185
+ - id: SAFE-03
186
+ title: Ask on missing or ambiguous stale specs
187
+ kind: supporting
188
+ statement: >-
189
+ Do not silently merge stale specs: if old_string is missing or ambiguous,
190
+ re-read current source and ask whether to apply, adapt, or skip.
191
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
192
+ - id: CTX-01
193
+ title: Deterministic segment bytes
194
+ kind: critical
195
+ statement: >-
196
+ Keep prompt-segment bytes deterministic so provider prompt prefixes can
197
+ be reused.
198
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
199
+ anchor: 'CTX-01'
200
+ - id: CTX-02
201
+ title: Keep roles and order
202
+ kind: critical
203
+ statement: >-
204
+ Keep message roles and order stable across calls.
205
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
206
+ anchor: 'CTX-02'
207
+ - id: CTX-03
208
+ title: Keep tool IDs and continuation state
209
+ kind: critical
210
+ statement: >-
211
+ Keep tool IDs and continuation state stable for prefix reuse.
212
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
213
+ anchor: 'CTX-03'
214
+ - id: CTX-04
215
+ title: No clock/random IDs in static blocks
216
+ kind: critical
217
+ statement: >-
218
+ Static prompt blocks must not contain clock values or random IDs.
219
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
220
+ anchor: 'CTX-04'
221
+ - id: CTX-05
222
+ title: Compaction starts a new epoch
223
+ kind: critical
224
+ statement: >-
225
+ Compaction starts a new cache epoch; do not expect prefix reuse across it.
226
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
227
+ anchor: 'CTX-05'
228
+ - id: CTX-06
229
+ title: Never change data to match a cache
230
+ kind: critical
231
+ statement: >-
232
+ Never mutate data to make it match a cache entry.
233
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
234
+ anchor: 'CTX-06'
235
+ - id: CTX-07
236
+ title: No unconfirmed cache fields
237
+ kind: critical
238
+ statement: >-
239
+ Do not rely on cache fields that have not been confirmed for the route in
240
+ use.
241
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
242
+ anchor: 'CTX-07'
243
+ - id: CTX-08
244
+ title: Tool-result reuse needs valid freshness
245
+ kind: critical
246
+ statement: >-
247
+ Reuse of tool results requires valid freshness.
248
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
249
+ anchor: 'CTX-08'
250
+ - id: CTX-09
251
+ title: Missing usage is unknown, not zero
252
+ kind: critical
253
+ statement: >-
254
+ Missing cache-usage reporting means unknown, not zero savings.
255
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
256
+ anchor: 'CTX-09'
257
+ - id: CTX-10
258
+ title: Never cut a required check to reduce calls
259
+ kind: critical
260
+ statement: >-
261
+ Never skip a required verification or check just to reduce call count.
262
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
263
+ anchor: 'CTX-10'
264
+ - id: HAND-01
265
+ title: Handoff Quality Gate is opt-in via docs/AI_HANDOFF
266
+ kind: supporting
267
+ statement: >-
268
+ The handoff quality gate activates only when a task goes through
269
+ docs/AI_HANDOFF; daily prompts keep the old flow.
270
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
271
+ - id: HAND-02
272
+ title: RUN.md is the authoritative handoff run cursor
273
+ kind: critical
274
+ statement: >-
275
+ docs/AI_HANDOFF/RUN.md is the authoritative run cursor; only the
276
+ HANDOFF FULLSTACK COMPLETE/BLOCKED markers after Phase done/blocked end
277
+ a run.
278
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
279
+ anchor: 'RUN.md'
280
+ - id: BUDGET-01
281
+ title: Context budget per task class
282
+ kind: critical
283
+ statement: >-
284
+ Context + verification budget rows: Trivial reads no docs, Simple reads
285
+ MEMORY only, Non-trivial adds PROJECT and CODE_MAP.
286
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
287
+ anchor: '**Trivial**: no docs'
288
+ - id: BUDGET-02
289
+ title: STATUS.md only for open-ended or continuation prompts
290
+ kind: supporting
291
+ statement: >-
292
+ docs/STATUS.md is used for open-ended status/continue prompts or
293
+ meaningful continuation context; stale status is orientation only.
294
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
295
+ - id: BUDGET-03
296
+ title: WORKLOG recent entries only
297
+ kind: supporting
298
+ statement: >-
299
+ docs/WORKLOG.md is read for recent relevant entries only; archive oldest
300
+ entries when over limits.
301
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
302
+ - id: STATUS-01
303
+ title: STATUS.md is not source truth
304
+ kind: supporting
305
+ statement: >-
306
+ docs/STATUS.md captures compact current state; it is not source truth and
307
+ must not replace source/index-first investigation.
308
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
309
+ - id: SUBAG-01
310
+ title: Delegate only on meaningful context or parallel gains
311
+ kind: supporting
312
+ statement: >-
313
+ Keep direct execution as default for trivial/simple work; delegate only
314
+ when it shrinks context or enables useful parallel progress.
315
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
316
+ - id: SUBAG-02
317
+ title: Small-task maintainer is a sidecar lane
318
+ kind: supporting
319
+ statement: >-
320
+ The ukit-small-task-maintainer subagent handles safe/reversible UKit
321
+ chores as a sidecar lane and hands risky work back to the main model.
322
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
323
+ - id: AUTO-01
324
+ title: autonomy.level controls how much UKit acts without asking
325
+ kind: supporting
326
+ statement: >-
327
+ autonomy.level in .ukit/storage/config.json controls how much UKit acts
328
+ without asking first; end users should not need to change it.
329
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
330
+ - id: TIER-01
331
+ title: Tiers bind through agent definitions
332
+ kind: critical
333
+ statement: >-
334
+ A model tier takes effect only when work is handed to an agent whose own
335
+ definition binds that model; the main session model never changes
336
+ mid-turn.
337
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
338
+ anchor: 'model:'
339
+ - id: TIER-02
340
+ title: Escalate one tier after repeated failure
341
+ kind: supporting
342
+ statement: >-
343
+ When the same file or symbol fails debugLoopThreshold times in one
344
+ session, route the next attempt one tier higher, capped at smart.
345
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
346
+ - id: HOST-OC-01
347
+ title: OpenCode must explicitly read the triggered SKILL.md
348
+ kind: critical
349
+ statement: >-
350
+ OpenCode reads AGENTS.md at session start only and does not auto-load
351
+ skills; the model must explicitly read the triggered SKILL.md.
352
+ marker_in: [templates/AGENTS.md, AGENTS.md]
353
+ anchor: 'read the triggered SKILL.md'
354
+ - id: HOST-OWN-01
355
+ title: Codex/OpenCode read the root owner instructions
356
+ kind: critical
357
+ statement: >-
358
+ When running in Codex or OpenCode, read and follow the root
359
+ PROJECT_IMPORTANT.md before doing project work.
360
+ marker_in: [templates/AGENTS.md, AGENTS.md]
361
+ anchor: 'read and follow the root'
362
+ - id: DURA-01
363
+ title: DuraOne skill activates only when installed
364
+ kind: supporting
365
+ statement: >-
366
+ The DuraOne skill is active only when the duraone pack is installed or
367
+ .claude/skills/duraone/SKILL.md exists; otherwise use generic standards.
368
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
369
+ - id: FALLBACK-01
370
+ title: Missing/corrupt runtime → rerun ukit install
371
+ kind: critical
372
+ statement: >-
373
+ If the workspace needs a refresh or runtime files are missing or corrupt,
374
+ tell maintainers to rerun `ukit install`.
375
+ marker_in: [templates/CLAUDE.md, templates/AGENTS.md, CLAUDE.md, AGENTS.md]
376
+ anchor: 'rerun `ukit install`'
@@ -246,6 +246,21 @@ items:
246
246
  packs:
247
247
  - core
248
248
 
249
+ # Shipped internal-orchestration detail (tier tables, subagent policy, sidecar review,
250
+ # small-task maintainer, helper/runtime/budget/status detail, DuraOne). Extracted from
251
+ # templates/instructions/core.md in DOC-104; `overwrite_with_backup` so `ukit update`
252
+ # refreshes it alongside the root contracts that point at it.
253
+ - id: docs-ukit-internals
254
+ type: config
255
+ sourceTemplate: docs/UKIT_INTERNALS.md
256
+ targetPath: docs/UKIT_INTERNALS.md
257
+ requires: []
258
+ mergeStrategy: overwrite_with_backup
259
+ variables: []
260
+ enabledByDefault: true
261
+ packs:
262
+ - core
263
+
249
264
  - id: core-skill-delivery
250
265
  type: skill
251
266
  sourceTemplate: .claude/skills/delivery/SKILL.md
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ngockhoale/ukit",
3
- "version": "2.6.5",
3
+ "version": "2.6.7",
4
4
  "description": "Install/update an index-first AI workspace for Claude Code, OpenAI Codex, OpenCode, and omp (Oh My Pi).",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -55,7 +55,9 @@
55
55
  "index:query": "node ./scripts/index/query-index.mjs",
56
56
  "bug:triage": "node ./scripts/bug/triage.mjs",
57
57
  "skill:audit": "node ./scripts/skill/audit-skill.mjs",
58
- "test:artifact": "vitest run tests/integration/packageArtifact.test.js",
58
+ "docs:render": "node scripts/docs/render-instructions.mjs --write",
59
+ "docs:render:check": "node scripts/docs/render-instructions.mjs --check",
60
+ "test:artifact": "vitest run tests/integration/packageArtifact.test.js tests/integration/artifactReferenceIntegrity.test.js",
59
61
  "test:release-core": "vitest run --exclude tests/integration/packageArtifact.test.js",
60
62
  "release:verify": "node ./scripts/release/verify-release.mjs",
61
63
  "test": "vitest run",
@@ -0,0 +1,42 @@
1
+ #!/usr/bin/env node
2
+ // DOC-102 renderer CLI (SPEC §8.2).
3
+ // node scripts/docs/render-instructions.mjs --write (default) regenerate all outputs
4
+ // node scripts/docs/render-instructions.mjs --check print DRIFT <path> per mismatch, exit 1
5
+ import path from 'node:path';
6
+ import { fileURLToPath } from 'node:url';
7
+
8
+ import {
9
+ renderInstructionsFromDisk,
10
+ checkRenderedInstructions,
11
+ } from '../../src/render/instructionRenderer.js';
12
+
13
+ const repoRoot = path.resolve(path.dirname(fileURLToPath(import.meta.url)), '../..');
14
+
15
+ const USAGE = 'usage: render-instructions.mjs [--write|--check]';
16
+
17
+ const args = process.argv.slice(2);
18
+ const unknown = args.filter((a) => a !== '--write' && a !== '--check');
19
+ if (unknown.length > 0) {
20
+ console.error(`${USAGE}\nunknown flag: ${unknown[0]}`);
21
+ process.exit(2);
22
+ }
23
+
24
+ const mode = args.includes('--check') ? 'check' : 'write';
25
+
26
+ try {
27
+ if (mode === 'check') {
28
+ const drift = await checkRenderedInstructions({ repoRoot });
29
+ for (const target of drift) {
30
+ console.log(`DRIFT ${target}`);
31
+ }
32
+ process.exit(drift.length > 0 ? 1 : 0);
33
+ }
34
+
35
+ const rendered = await renderInstructionsFromDisk({ repoRoot, write: true });
36
+ for (const [target, content] of rendered) {
37
+ console.log(`WROTE ${target} (${content.split('\n').length - 1} lines)`);
38
+ }
39
+ } catch (err) {
40
+ console.error(err && err.message ? err.message : err);
41
+ process.exit(1);
42
+ }
@@ -2,7 +2,7 @@
2
2
  * projectImportant.js (TASK-037)
3
3
  *
4
4
  * Source-side inspector + deterministic envelope renderer for
5
- * PROJECT_IMPORTANT.md per docs/PROJECT_IMPORTANT_SPEC.md §3, §4, §5.2, §6,
5
+ * PROJECT_IMPORTANT.md per docs/archive/specs/PROJECT_IMPORTANT_SPEC.md §3, §4, §5.2, §6,
6
6
  * §12.1.
7
7
  *
8
8
  * Guarantees:
@@ -16,7 +16,7 @@ import { PROJECT_IMPORTANT_FILENAME } from './projectImportant.js';
16
16
  // tracked/followed. Before any destructive uninstall step a regular source gets a
17
17
  // raw-byte backup beside it at the project root (never under .claude/.ukit/.codex/
18
18
  // .omp — those may be deleted): `<name>.ukit-backup`, then `.ukit-backup.1`, `.2`, …
19
- // via bounded exclusive-create collision walk. See docs/PROJECT_IMPORTANT_SPEC.md §15.
19
+ // via bounded exclusive-create collision walk. See docs/archive/specs/PROJECT_IMPORTANT_SPEC.md §15.
20
20
  const IMPORTANT_BACKUP_SUFFIX = '.ukit-backup';
21
21
  const IMPORTANT_BACKUP_COLLISION_LIMIT = 100;
22
22