@deepseek-insight/dsi 0.5.18 → 0.5.20
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/.agents/skills/dsi-adr/SKILL.md +121 -0
- package/.agents/skills/dsi-i18n-migrate/SKILL.md +87 -0
- package/.agents/skills/dsi-ov-setup/SKILL.md +114 -0
- package/.agents/skills/dsi-release/SKILL.md +175 -0
- package/.agents/skills/dsi-spcheck/SKILL.md +188 -0
- package/.agents/skills/dsi-spec/SKILL.md +310 -0
- package/.agents/skills/dsi-spec/references/mermaid-pattern.md +160 -0
- package/.agents/skills/dsi-spec/references/tasks-json-template.md +125 -0
- package/.agents/skills/dsi-task/SKILL.md +287 -0
- package/README.md +5 -23
- package/bin/dsi.mjs +129 -17
- package/bin/lib/mirror-skills.mjs +56 -0
- package/build/client/_app/immutable/assets/0.C4pk9RsQ.css +2 -0
- package/build/client/_app/immutable/assets/{2.GTtLKMiQ.css → 2.Dk-hwaP_.css} +1 -1
- package/build/client/_app/immutable/chunks/CodI3RGj.js +1 -0
- package/build/client/_app/immutable/chunks/{CLNDb8QN.js → CxmtCU9s.js} +1 -1
- package/build/client/_app/immutable/chunks/{Bx7fD5zN.js → DKDzTags.js} +2 -2
- package/build/client/_app/immutable/chunks/{DWBqt9Io.js → azDKH4zi.js} +1 -1
- package/build/client/_app/immutable/chunks/qIBjcgkE.js +1 -0
- package/build/client/_app/immutable/entry/{app.CnWnvioB.js → app.CqYGeqRv.js} +2 -2
- package/build/client/_app/immutable/entry/start.CIXiL_7f.js +1 -0
- package/build/client/_app/immutable/nodes/{0.B3qXb7lb.js → 0.u99aBgpL.js} +1 -1
- package/build/client/_app/immutable/nodes/{1.DdjrT3tT.js → 1.qcRcZCY6.js} +1 -1
- package/build/client/_app/immutable/nodes/2.GgqfB5rv.js +171 -0
- package/build/client/_app/version.json +1 -1
- package/build/handler.js +4 -4
- package/build/index.js +4 -4
- package/build/server/chunks/chunks/{app-config.svelte.js-rN4N5yAI.js → app-config.svelte.js-CFb4kaFl.js} +7 -3
- package/build/server/chunks/chunks/{db.js-DbbYS9o8.js → db.js-9wP1ySFv.js} +2 -2
- package/build/server/chunks/chunks/{db2.js-BQWa7bEG.js → db2.js-B_Un4Zvq.js} +7 -5
- package/build/server/chunks/chunks/{dsh-connection.js-CpcCtA42.js → dsh-connection.js-CwL9I98w.js} +4 -3
- package/build/server/chunks/chunks/{git-probe.js-CvkToKO4.js → git-probe.js-C7z6xDzg.js} +3 -3
- package/build/server/chunks/chunks/{insight-config.js-Dw_Qi0fO.js → insight-config.js-COS9LOWZ.js} +13 -4
- package/build/server/chunks/chunks/{internal.js-DKO0SoY7.js → internal.js-Bf2uRIVS.js} +2 -2
- package/build/server/chunks/chunks/{permission-state.js-yvwUSnug.js → permission-state.js-BoJAoWqi.js} +18 -15
- package/build/server/chunks/chunks/settings-home.js-CqnqJVOu.js +9 -0
- package/build/server/chunks/chunks/settings-home2.js-f75-B6RI.js +102 -0
- package/build/server/chunks/chunks/{state.js-C7gJT4Un.js → state.js-OWX1K3Yj.js} +2 -2
- package/build/server/chunks/chunks/{watcher.js-C97Xyorx.js → watcher.js-Dc9hzRLI.js} +4 -4
- package/build/server/chunks/entries/endpoints/api/a2a/_id_/{_server.ts.js-Cqh1iqgu.js → _server.ts.js-0rfV7w20.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/a2a/{_server.ts.js-DNKD4rZu.js → _server.ts.js-DX0DUIja.js} +6 -5
- package/build/server/chunks/entries/endpoints/api/a2a/register/{_server.ts.js-CJ-FwkrZ.js → _server.ts.js-zB-V9Naa.js} +6 -5
- package/build/server/chunks/entries/endpoints/api/config/{_server.ts.js-CMM4kYVx.js → _server.ts.js-Bo4VgIna.js} +5 -3
- package/build/server/chunks/entries/endpoints/api/dsh/directory/{_server.ts.js-epVplzwB.js → _server.ts.js-_Wc4NU0Q.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/pick-directory/{_server.ts.js-bXHb97gT.js → _server.ts.js-CvoINUYy.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/presets/{_server.ts.js-BNOHhtzy.js → _server.ts.js-B4UwZ8nd.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/attachment/{_server.ts.js-BBi6jeVj.js → _server.ts.js-Hml2J0Bq.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/cancel/{_server.ts.js-N0nKPuqL.js → _server.ts.js-CsZ2u8cs.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/catalog/{_server.ts.js-VGFCPAbs.js → _server.ts.js-BhF1Nzig.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/command/{_server.ts.js-na_sUb0Z.js → _server.ts.js-BGXjV_Ak.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/events/{_server.ts.js-CeNf028P.js → _server.ts.js-BF4vBIja.js} +5 -4
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/fork/{_server.ts.js-DfqO-GO4.js → _server.ts.js-B2OwrEQD.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/goal/{_server.ts.js-Dj9GYNl7.js → _server.ts.js-DboY_7cp.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/history/{_server.ts.js-DqShsRl9.js → _server.ts.js-BpioYdnc.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/models/{_server.ts.js-BQSBUf70.js → _server.ts.js-CLrgUoq0.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/path/{_server.ts.js-CeCKDyKB.js → _server.ts.js-BlZr_mA6.js} +3 -2
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/permission/{_server.ts.js-CadTCNUJ.js → _server.ts.js-BiU_IgYD.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/prompt/{_server.ts.js-BXzgi8xX.js → _server.ts.js-FV-4ougZ.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/rename/{_server.ts.js-BfD5FXiL.js → _server.ts.js-ChxB0XU5.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/respond/{_server.ts.js-CiDPC9TY.js → _server.ts.js-DkSydg_X.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/session/_sessionId_/select-model/{_server.ts.js-DGcZgN96.js → _server.ts.js-Wbuf-vse.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/sessions/{_server.ts.js-DnU1CCOw.js → _server.ts.js-B-BfCKKL.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspace-file/{_server.ts.js-BZ0UV1n2.js → _server.ts.js-fKfv5g19.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspace-file-bytes/{_server.ts.js-lxLpuPFL.js → _server.ts.js-DZpRzvas.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspace-tree/{_server.ts.js-Cw3vl704.js → _server.ts.js-Hn5-fnsU.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspaces/{_server.ts.js-KKnR2UO4.js → _server.ts.js-CtPDRjV7.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/delete/{_server.ts.js-I1eSZn60.js → _server.ts.js-DOp3nIcK.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/dsh/workspaces/_workspaceId_/rename/{_server.ts.js-B0zqAKnV.js → _server.ts.js-DiwcZfK9.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/prompts/_id_/{_server.ts.js-C-QN0enK.js → _server.ts.js-SoNSMvWj.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/prompts/{_server.ts.js-CwTGUPIp.js → _server.ts.js-DIZiiHk-.js} +12 -4
- package/build/server/chunks/entries/endpoints/api/prompts/use/{_server.ts.js-Bvotxm37.js → _server.ts.js-CbsUk0fk.js} +4 -3
- package/build/server/chunks/entries/endpoints/api/settings/{_server.ts.js-CRRLXk0y.js → _server.ts.js-DCeIpzKT.js} +3 -2
- package/build/server/chunks/entries/endpoints/api/settings-home/file/_server.ts.js-C1gSFX1P.js +68 -0
- package/build/server/chunks/entries/endpoints/api/settings-home/file-write/_server.ts.js-Dx0glK_q.js +68 -0
- package/build/server/chunks/entries/endpoints/api/settings-home/tree/_server.ts.js-CAmn2SKB.js +61 -0
- package/build/server/chunks/entries/endpoints/api/workspace/file-write/{_server.ts.js-DY_NDlYl.js → _server.ts.js-Blw1UFX2.js} +6 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-events/{_server.ts.js-DHEaymrG.js → _server.ts.js-yflU8VH2.js} +6 -5
- package/build/server/chunks/entries/endpoints/api/workspace/git-file-head/{_server.ts.js-AQgNkfCV.js → _server.ts.js-q9jXuJ1p.js} +10 -18
- package/build/server/chunks/entries/endpoints/api/workspace/git-map/{_server.ts.js-C9vxPbB3.js → _server.ts.js-YjwnbPfG.js} +12 -20
- package/build/server/chunks/entries/endpoints/api/workspace/git-status/{_server.ts.js-BlMRR11v.js → _server.ts.js-DRQay15h.js} +12 -20
- package/build/server/chunks/entries/endpoints/api/workspace/write-gate/_server.ts.js-BiCzLyNH.js +54 -0
- package/build/server/chunks/entries/pages/{_error.svelte.js-C73uxSol.js → _error.svelte.js-DkmmDHjP.js} +3 -3
- package/build/server/chunks/entries/pages/{_page.server.ts.js-ze2dUhXW.js → _page.server.ts.js-BHW1mzYQ.js} +3 -3
- package/build/server/chunks/entries/pages/{_page.svelte.js-C1cGitkt.js → _page.svelte.js-BSt3-Adz.js} +993 -532
- package/build/server/chunks/{handler-CTOEBU52.js → handler-CEAxnB4f.js} +3 -3
- package/build/server/chunks/{index.js-Bifh9-nS.js → index.js-B-3rUYGC.js} +2 -2
- package/build/server/chunks/{manifest.js-Da5_i6lM.js → manifest.js--ZDTDlzU.js} +71 -43
- package/build/server/chunks/nodes/{0.js-DIgCB7dX.js → 0.js-BQXxAZac.js} +3 -3
- package/build/server/chunks/nodes/1.js-DMcugevB.js +9 -0
- package/build/server/chunks/nodes/{2.js-DXw1-iEf.js → 2.js-BrT7uCAN.js} +9 -8
- package/package.json +3 -2
- package/template/.dsi/config.json +2 -2
- package/template/.dsi/prompts.sqlite-shm +0 -0
- package/template/.dsi/prompts.sqlite-wal +0 -0
- package/template/.dsi/settings.yaml +2 -1
- package/build/client/_app/immutable/assets/0.BQjO3ESU.css +0 -2
- package/build/client/_app/immutable/chunks/CAZxZSEb.js +0 -1
- package/build/client/_app/immutable/chunks/DvLq-YzL.js +0 -1
- package/build/client/_app/immutable/entry/start.DrunaWOx.js +0 -1
- package/build/client/_app/immutable/nodes/2.o9KKAujP.js +0 -170
- package/build/server/chunks/nodes/1.js-DPBXm0Gt.js +0 -9
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dsi-adr
|
|
3
|
+
description: Use when writing, reviewing, extending, or marking done any ADR in deepseek-insight's dev/architectural-decission/ — before drafting the first line, before approving one, and as the final self-audit before claiming an ADR is finished.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DeepSeek Insight ADR Standard
|
|
7
|
+
|
|
8
|
+
Match depth to the decision space, never to the most recent ADR. Recent thin
|
|
9
|
+
ADRs are not authority — the exemplars are. This skill exists because an
|
|
10
|
+
agent under context rot reaches for the nearest template and produces a
|
|
11
|
+
decision record that asserts outcomes without recording why the alternatives
|
|
12
|
+
lost; that document re-litigates itself in six months. It is guidance with a
|
|
13
|
+
hard core: the self-audit in §5 is not optional.
|
|
14
|
+
|
|
15
|
+
Exemplars, in authority order (paths relative to the DSI repo root):
|
|
16
|
+
|
|
17
|
+
1. `dev/architectural-decission/2026-08-27 - The Lineage Pin — Sub-Agents Below Their Spawner, Swap-Proof.md` — the gold standard: D1–D7, sequence + flowchart + state homes + control matrix, glossary, amendments log.
|
|
18
|
+
2. `dev/architectural-decission/2026-08-24 - The Panel Floor — Many Conversations, One Page.md` — decision set with honest give-ups.
|
|
19
|
+
3. `dev/architectural-decission/2026-08-29 - The Prompt Macro — Bang Runs the Shelf, Line by Line.md` — deep format on a composer-scale feature.
|
|
20
|
+
|
|
21
|
+
Read the exemplar closest to your subject before drafting a new ADR kind.
|
|
22
|
+
|
|
23
|
+
## 1. ADR or KB?
|
|
24
|
+
|
|
25
|
+
An ADR records a **decision and its cost** — what we chose, what we rejected,
|
|
26
|
+
what we accept by choosing it. A KB note records **mechanics** — how a
|
|
27
|
+
surface works today, for the newcomer. The pair discipline: a KB that
|
|
28
|
+
documents current behavior ends by naming the open question; the ADR that
|
|
29
|
+
answers it cites the KB as companion. If your draft asserts choices but
|
|
30
|
+
names no rejected alternative, it is a KB note wearing an ADR's filename —
|
|
31
|
+
rehome it or deepen it.
|
|
32
|
+
|
|
33
|
+
## 2. The skeleton (old-guard format)
|
|
34
|
+
|
|
35
|
+
```markdown
|
|
36
|
+
# ADR — <The Name>: <The Claim in One Line>
|
|
37
|
+
|
|
38
|
+
- **Date:** YYYY-MM-DD
|
|
39
|
+
- **Status:** Proposed ← Accepted only after implementation proves it
|
|
40
|
+
- **Companions:** <linked KB notes + ADRs this stands on>
|
|
41
|
+
- **Supersedes:** <what it retires, or "nothing — …">
|
|
42
|
+
- **Question this answers:** *<the operator-visible question, one sentence>*
|
|
43
|
+
|
|
44
|
+
## TL;DR — for the reader in a hurry
|
|
45
|
+
## 1. The problem, in plain words ← operator story, not architecture story
|
|
46
|
+
## 2. What the codebase/host already gives us (the facts) ← numbered, sourced
|
|
47
|
+
## 3. The principle, unfolded ← the rule the decisions instantiate
|
|
48
|
+
## 4. Decisions
|
|
49
|
+
### D1 — <decision as a claim> ← why + REJECTED alternative + why it loses
|
|
50
|
+
### D2 — …
|
|
51
|
+
## 5. <lifecycle sequence diagram> ← wherever state changes hands
|
|
52
|
+
## 6. <flowchart / control matrix / state homes — as the subject needs;
|
|
53
|
+
## split into further numbered sections when several apply>
|
|
54
|
+
## Diagrams: mermaid (flow & sequence) blocks; state homes and control
|
|
55
|
+
## matrices stay markdown tables
|
|
56
|
+
## 7. Consequences ← gains / accepted give-ups / what does NOT change
|
|
57
|
+
## 8. File map (implementation footprint) ← every file + the tests that pin it
|
|
58
|
+
## Glossary (for the layman) ← a newcomer reads without the codebase
|
|
59
|
+
## Post-implementation amendments ← dated entries, never edit the body in place
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
Number the decisions `D1…Dn` and treat the numbers as addresses: later ADRs
|
|
63
|
+
and KB notes cite "D3" instead of re-describing the rule. Diagram menu — pick
|
|
64
|
+
what the subject needs, skip none that applies: sequence (a lifecycle),
|
|
65
|
+
flowchart (branching rules), state-homes table (where a fact lives and which
|
|
66
|
+
copy is authority), control matrix (who may do what per row species). Create
|
|
67
|
+
sequence and flowchart diagrams as mermaid (```mermaid sequenceDiagram /
|
|
68
|
+
flowchart) blocks — the exemplars' house format; state-homes and control
|
|
69
|
+
matrix stay markdown tables. Validate every mermaid block parses (e.g.
|
|
70
|
+
mermaid.parse) before claiming done — mermaid treats `;` as a statement
|
|
71
|
+
separator, so message text cannot carry one.
|
|
72
|
+
|
|
73
|
+
## 3. The depth rule
|
|
74
|
+
|
|
75
|
+
Count the real alternatives BEFORE choosing a length. The honest test:
|
|
76
|
+
|
|
77
|
+
- Name every alternative you actually weighed. If you cannot name at least
|
|
78
|
+
two rejected alternatives across the ADR, either the decision is too small
|
|
79
|
+
for an ADR (write a KB note or a code comment instead) or you have not
|
|
80
|
+
thought hard enough yet. Both happen; only one is excusable.
|
|
81
|
+
- Length follows the alternative space, not a template minimum or maximum.
|
|
82
|
+
The thin five-section format (context / rule / lives / gave-up / proving)
|
|
83
|
+
is acceptable ONLY for mechanical moves with no real alternative space —
|
|
84
|
+
and the absence of alternatives must be a finding, not an oversight.
|
|
85
|
+
- Fusing alternatives into one assertive paragraph is the failure this skill
|
|
86
|
+
exists to prevent. A rejected alternative needs its rejection reason in
|
|
87
|
+
writing, at the decision it lost to.
|
|
88
|
+
|
|
89
|
+
## 4. Fact discipline
|
|
90
|
+
|
|
91
|
+
Every fact in §2 traces to something you actually inspected this session: a
|
|
92
|
+
file and line, a wire capture, a test, a dated ADR. Never carry a fact
|
|
93
|
+
forward from memory of a previous session, and never cite a line number
|
|
94
|
+
without re-reading it. In the final document, keep the sources concrete
|
|
95
|
+
(file paths, ADR names, dated specs) so a reviewer can re-walk the evidence.
|
|
96
|
+
|
|
97
|
+
## 5. The self-audit (before claiming done)
|
|
98
|
+
|
|
99
|
+
Answer each aloud, in the transcript, yes or no:
|
|
100
|
+
|
|
101
|
+
1. Did I enumerate the real alternatives, or fuse them into a paragraph?
|
|
102
|
+
2. Does EVERY decision name what it rejected and why the rejection lost?
|
|
103
|
+
3. Can a newcomer follow the TL;DR + glossary without opening the codebase?
|
|
104
|
+
4. Does every §2 fact carry a source I read THIS session?
|
|
105
|
+
5. Is there a diagram wherever state changes hands or authority moves —
|
|
106
|
+
mermaid (`sequenceDiagram` / `flowchart`) for flows and sequences, and
|
|
107
|
+
does every mermaid block parse clean?
|
|
108
|
+
6. Did I copy a recent ADR's shape instead of matching the trade?
|
|
109
|
+
7. Does Consequences include what does NOT change (so reviewers see the
|
|
110
|
+
blast radius is bounded)?
|
|
111
|
+
8. Does the file map name the tests that will pin the behavior?
|
|
112
|
+
|
|
113
|
+
Any "no" is an unfinished ADR. Fix it or shrink the ADR's claim — never
|
|
114
|
+
declare done with a standing "no".
|
|
115
|
+
|
|
116
|
+
## 6. Reviewing an ADR
|
|
117
|
+
|
|
118
|
+
Run the same audit from the outside. The three rejection reasons that matter
|
|
119
|
+
most: a decision with no named alternative; a fact with no source; a
|
|
120
|
+
consequence section that lists only gains. Style is negotiable; those three
|
|
121
|
+
are not.
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dsi-i18n-migrate
|
|
3
|
+
description: Use when UI copy in deepseek-insight needs migrating to the translation catalogs (new components, raw copy found by verify-ui-i18n, or a new locale being added) — enforces the t(m.x) reactive seat, en/zh/id catalog triples, brand skip-markers, and the full gate list. Delegatable to a subagent for bulk sweeps.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DSI i18n Migration Standard
|
|
7
|
+
|
|
8
|
+
Make UI copy flow through the catalogs — never paste sentences into
|
|
9
|
+
components. This skill packages the procedure proven in waves 1–4 of the
|
|
10
|
+
Three Tongues (companion: ADR 2026-09-12 + KB `dev/kb/translation/`).
|
|
11
|
+
|
|
12
|
+
## 0. Ground rules (read first)
|
|
13
|
+
|
|
14
|
+
- The ONLY files owning copy are `messages/en.json`, `messages/zh.json`,
|
|
15
|
+
`messages/id.json`. Components render via `t(m.key)`.
|
|
16
|
+
- `t` is the reactive seat from `$lib/services/locale/locale-state.svelte` —
|
|
17
|
+
a bare `m.key()` reads no reactive state, so the label would freeze until
|
|
18
|
+
reload. Never ship a bare `m.key()` in a template.
|
|
19
|
+
- Keys are flat camelCase, one per sentence/label; reuse an existing key when
|
|
20
|
+
the English value is identical (check all three catalogs first).
|
|
21
|
+
- Catalog triples are written [en, zh, id] — en = the exact original string;
|
|
22
|
+
zh = Simplified Chinese; id = Indonesian. Concise UI tone; keep proper nouns
|
|
23
|
+
(DSH, DSI, Deepseek, Monaco) as-is; no trailing periods unless the original
|
|
24
|
+
has one.
|
|
25
|
+
- Brand strings (`— deepseek-insight`, `DEEPSEEK INSIGHT`) are never
|
|
26
|
+
translated: mark the flagged line's preceding line with `<!-- i18n-skip:
|
|
27
|
+
brand -->` (same indentation) and skip.
|
|
28
|
+
- Dynamic literals become paraglide placeholders: catalog `"Delete {n} selected"`,
|
|
29
|
+
call site `t(() => m.deleteSelected({ n: selected.size }))` (the deferred
|
|
30
|
+
closure keeps the locale tracking alive).
|
|
31
|
+
- Native-language names (menu entries like 中文 / Bahasa Indonesia) are
|
|
32
|
+
constants, NOT catalog keys — a language menu shows every name in its own
|
|
33
|
+
language.
|
|
34
|
+
|
|
35
|
+
## 1. Inventory
|
|
36
|
+
|
|
37
|
+
Run `pnpm run verify-ui-i18n`. The scanner covers: raw text nodes,
|
|
38
|
+
copy-bearing attributes (title / aria-label / placeholder / *Label…), string
|
|
39
|
+
literals and template quasis inside template expressions, and {#if}
|
|
40
|
+
consequent/alternate blocks. Save the output (e.g. `/tmp/violations.txt`) —
|
|
41
|
+
it is the worklist; every line must end resolved, skip-marked, or explained.
|
|
42
|
+
|
|
43
|
+
Known scanner blind spots to check by hand: lowercase-only literals (e.g.
|
|
44
|
+
`answering…`) fail the natural-text heuristic; copy built in script sections
|
|
45
|
+
is invisible.
|
|
46
|
+
|
|
47
|
+
## 2. Migration
|
|
48
|
+
|
|
49
|
+
For each violation: replace the literal with `t(m.keyName)` /
|
|
50
|
+
`attr={t(m.keyName)}` / `t(() => m.key({ p }))`, add the missing imports
|
|
51
|
+
(`* as m from '$lib/paraglide/messages'`, `t` from the locale-state service —
|
|
52
|
+
note some components have no `<script>` block and need one created).
|
|
53
|
+
Idempotent exact-replacement scripts are fine for bulk sweeps (see
|
|
54
|
+
`scripts/migrate-w3.mjs` in git history for the shape); hand-edit for the
|
|
55
|
+
tricky sites (ternaries, `${}` fragments → split keys).
|
|
56
|
+
|
|
57
|
+
If the sweep is large (>20 files), delegate it to a subagent with this skill
|
|
58
|
+
attached, the inventory file path, and instruction to leave the tree
|
|
59
|
+
uncommitted; the parent verifies gates (step 4) before accepting.
|
|
60
|
+
|
|
61
|
+
## 3. Catalogs and recompile
|
|
62
|
+
|
|
63
|
+
Append the new keys to all three catalogs, then recompile:
|
|
64
|
+
`pnpm exec paraglide-js compile --project ./project.inlang --outdir ./src/lib/paraglide`
|
|
65
|
+
— or run `pnpm build`, which does the same through the vite plugin. Prefer the
|
|
66
|
+
plugin (vitest runs it too); never ship CLI-compiled output as the built
|
|
67
|
+
artifact (it resets cookieName — ADR D6).
|
|
68
|
+
|
|
69
|
+
## 4. Gates (all must pass)
|
|
70
|
+
|
|
71
|
+
1. `pnpm run verify-ui-i18n` → "verify-ui-i18n: clean"
|
|
72
|
+
2. `pnpm vitest run tests/unit/messages-parity.test.ts tests/unit/ui-i18n-clean.test.ts tests/unit/locale-instant-switch.test.ts` → green
|
|
73
|
+
3. `pnpm test` → only the known pre-existing `sessions-list.test.ts` failure
|
|
74
|
+
allowed (document any new failure as yours and fix it)
|
|
75
|
+
4. `pnpm check` → zero diagnostics in files you touched
|
|
76
|
+
5. `pnpm build` → exit 0 (compiled runtime must carry cookieName `dsi.locale`)
|
|
77
|
+
6. `pnpm exec playwright test tests/e2e/locale.spec.ts` → green
|
|
78
|
+
|
|
79
|
+
Report: violations fixed, keys added, files touched, gate results, anything
|
|
80
|
+
skipped with reason.
|
|
81
|
+
|
|
82
|
+
## 5. Adding a locale (not just strings)
|
|
83
|
+
|
|
84
|
+
New language L = one `messages/L.json` (key-complete — the parity test
|
|
85
|
+
enforces it) + add L to `project.inlang/settings.json` locales + `UI_LOCALES`
|
|
86
|
+
in `src/lib/config.ts` + `localeName_L` native name + the locale pickers'
|
|
87
|
+
native-name constants. The ADR D6 compiled-truth rule applies unchanged.
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dsi-ov-setup
|
|
3
|
+
description: Use when OpenViking memory is broken or missing in DeepSeek Harness — server disconnected, server not installed, ov.conf missing, plugin not loaded, or a fresh machine needs the whole OpenViking + DSH memory integration set up (plugin, skill, server). Covers diagnosis, install, config, start, and verification.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# OpenViking + DSH Setup and Recovery
|
|
7
|
+
|
|
8
|
+
Companion KB: `dev/kb/setup/2026-09-16 - OpenViking Server + DSH Memory Plugin — From Cold Start to Recalled Memory.md` — read it for the why behind every step. This skill is the do-path.
|
|
9
|
+
|
|
10
|
+
## 0. Diagnose first — which failure is this?
|
|
11
|
+
|
|
12
|
+
Run in order; stop at the first failing gate:
|
|
13
|
+
|
|
14
|
+
| Gate | Command | Healthy looks like |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| Server process | `curl -s --max-time 3 http://127.0.0.1:1933/health` | `{"status":"ok","healthy":true,...}` |
|
|
17
|
+
| Server config | `ls ~/.openviking/ov.conf` | exists |
|
|
18
|
+
| Client config | `cat ~/.openviking/ovcli.conf` | `url` = `http://127.0.0.1:1933` |
|
|
19
|
+
| Package | `openviking-server --version` | prints a version |
|
|
20
|
+
| MCP connection | harness tool list shows `mcp__openviking__*` | tools present |
|
|
21
|
+
|
|
22
|
+
- Health fails + `ov.conf` missing → **Recovery path (§2)**, the common case.
|
|
23
|
+
- Health fails + `ov.conf` exists → run `openviking-server doctor`, fix what it names, go to §2 step 4.
|
|
24
|
+
- Health ok but MCP disconnected → the plugin reconnects on its own within a turn or two; if not after a full turn, restart the harness session. Do not reinstall anything.
|
|
25
|
+
- Package missing → fresh install: do §2 steps 1–6 from scratch.
|
|
26
|
+
|
|
27
|
+
## 1. Facts to keep straight (most-confused pair)
|
|
28
|
+
|
|
29
|
+
- `~/.openviking/ovcli.conf` — **client** pointer: `{"url": "http://127.0.0.1:1933", "api_key": ""}`. Missing it breaks CLI commands only.
|
|
30
|
+
- `~/.openviking/ov.conf` — **server** model config (embedding + VLM). Missing it means the server process cannot start at all. This is the usual blocker.
|
|
31
|
+
- The DSH plugin (`@openviking/dsh-memory-plugin`, in the profile bundles at `~/.dsh/profiles/web/package.json`) is a **client only** — it never starts the server, and it reconnects automatically once the server is healthy. Never "fix" a disconnected MCP by touching the plugin.
|
|
32
|
+
- `openviking`/`ov` = CLI/SDK; `openviking-server` = the daemon. Same pip package.
|
|
33
|
+
|
|
34
|
+
## 2. Recovery / install path
|
|
35
|
+
|
|
36
|
+
### Step 1 — Install the package (skip if `openviking-server --version` works)
|
|
37
|
+
|
|
38
|
+
```sh
|
|
39
|
+
pip install openviking --upgrade --force-reinstall
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
Entry points land in `~/.local/bin`: `ov`, `openviking`, `openviking-server`, `vikingbot`.
|
|
43
|
+
|
|
44
|
+
### Step 2 — CLI housekeeping
|
|
45
|
+
|
|
46
|
+
```sh
|
|
47
|
+
ov language en # v0.3.23+ refuses most commands without this; writes ovcli.settings.conf
|
|
48
|
+
ov config add custom --name local --url http://127.0.0.1:1933 --activate -o json # only if ovcli.conf missing
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Note: both write under `~/.openviking/` — they fail under a workspace-only file sandbox; run with full file access.
|
|
52
|
+
|
|
53
|
+
### Step 3 — Create the server config: `openviking-server init`
|
|
54
|
+
|
|
55
|
+
Preferred: run it interactively and let the human answer. If driving it with piped answers, the wizard's prompt order is exact and hidden prompts exist — the tested sequence for the recommended local setup:
|
|
56
|
+
|
|
57
|
+
```
|
|
58
|
+
1 # mode: step-by-step
|
|
59
|
+
3 # embedding: lightweight CPU (llama.cpp, bge-small-zh-v1.5-f16, no key)
|
|
60
|
+
1 # embedding model: (only option — EASY TO MISS; missing this shifts every later answer)
|
|
61
|
+
6 # VLM: GLM (subscription API key)
|
|
62
|
+
2 # GLM plan: coding
|
|
63
|
+
<key> # API key — pass via stdin from an env var; NEVER in the command line or logs
|
|
64
|
+
N # query planner via Ollama: no
|
|
65
|
+
1 # bind 127.0.0.1 (dev, no auth)
|
|
66
|
+
1933 # port
|
|
67
|
+
Y # save
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
After saving the wizard echoes the resolved API key in its summary — **redact any captured log** before storing it.
|
|
71
|
+
|
|
72
|
+
Decision guardrails (from the KB §4): embedding `[3]` CPU is the default because it is keyless and tiny; offer `[1]` cloud embedding only when the user cares about retrieval quality and has a key; VLM is the piece worth a strong model — GLM via an existing subscription beats skipping it. `[9]` skip-VLM gives a server that stores but extracts poorly.
|
|
73
|
+
|
|
74
|
+
### Step 4 — Wait out the build
|
|
75
|
+
|
|
76
|
+
Choosing CPU embedding triggers `pip install "openviking[local-embed]"`, which **builds `llama-cpp-python` from source** — several minutes of silent wheel-building. It is not hung. Do not kill it; verify with `ps aux | grep "openviking-server init"`.
|
|
77
|
+
|
|
78
|
+
### Step 5 — Validate and start
|
|
79
|
+
|
|
80
|
+
```sh
|
|
81
|
+
openviking-server doctor # expect: all checks PASS (config, auth, disk ≥ several GB)
|
|
82
|
+
openviking-server # foreground proof; then move to a supervisor
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
For persistence: launchd/nohup/systemd — never rely on an agent shell outliving the session. Verify:
|
|
86
|
+
|
|
87
|
+
```sh
|
|
88
|
+
curl -s http://127.0.0.1:1933/health # {"status":"ok","healthy":true,...}
|
|
89
|
+
ov status # "Connected (Healthy)", queue 0 pending / 0 errors
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
A stale `~/.openviking/pending/` queue (hundreds of files) from the downtime drains on its own — do not delete it.
|
|
93
|
+
|
|
94
|
+
### Step 6 — Confirm the integration
|
|
95
|
+
|
|
96
|
+
Within a turn of the server going healthy, the plugin reconnects (MCP tools answer, `<openviking-context>` appears at the next session start). If MCP tools still error after a full turn: restart the harness session once. Only then suspect the bundle (`~/.dsh/profiles/web/package.json` must list `@openviking/dsh-memory-plugin` in `dsh.profile.bundles`).
|
|
97
|
+
|
|
98
|
+
## 3. Verification checklist (all seven, in order)
|
|
99
|
+
|
|
100
|
+
1. `openviking-server --version` → prints version
|
|
101
|
+
2. `ls ~/.openviking/ov.conf ~/.openviking/ovcli.conf` → both exist
|
|
102
|
+
3. `openviking-server doctor` → all PASS
|
|
103
|
+
4. `curl -s http://127.0.0.1:1933/health` → `"healthy":true`
|
|
104
|
+
5. `ov status` → Connected (Healthy), 0 errors
|
|
105
|
+
6. `ov find "smoke test"` after any resource exists → ranked hits, not a connection error
|
|
106
|
+
7. New session → `<openviking-context>` block present
|
|
107
|
+
|
|
108
|
+
## 4. Known traps
|
|
109
|
+
|
|
110
|
+
- `ov status` saying "Unreachable" while the server is fine → the language gate; run `ov language en` first.
|
|
111
|
+
- Two config files, one directory (§1) — check the right one for the symptom.
|
|
112
|
+
- `auth_mode: "dev"` = no auth, localhost only. Never bind `0.0.0.0` without switching to API-key auth (docs: Authentication guide).
|
|
113
|
+
- Piped `init` answers are prompt-order-fragile (Step 3) — count prompts, don't trust defaults.
|
|
114
|
+
- Re-examine actual prompt output on every version bump; this sequence was tested against OpenViking 0.4.20 / plugin 0.3.2 (2026-09-16) and the wizard's prompts are not a stable contract.
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dsi-release
|
|
3
|
+
description: Use when a DSH release/tag jump needs analyzing for DeepSeek Insight impact — deciding whether DSI owes an update, fix, or feature, and writing the KB release note that records the verdict. Covers fetching the tag range, diffing the three touchpoints (wire, rejection codes, session ledger), probing DSI's matchers, and the report template with self-audit.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# DSH Release → DSI KB Comparison Standard
|
|
7
|
+
|
|
8
|
+
Every DSH alpha/tag jump must be *checked, not trusted*: pre-release, the
|
|
9
|
+
harness renames freely and owes guests no translation layer. This skill runs
|
|
10
|
+
that check mechanically and records the verdict as a KB note in
|
|
11
|
+
`dev/kb/releases/`, so each jump has a written baseline the next one diffs
|
|
12
|
+
from. It exists because the failure mode is a quiet break — the alpha.2
|
|
13
|
+
rejection-code rename kept everything working until a user opened a missing
|
|
14
|
+
session and got a wrong-flavored error card.
|
|
15
|
+
|
|
16
|
+
Exemplars, in authority order (paths relative to the DSI repo root):
|
|
17
|
+
|
|
18
|
+
1. `dev/kb/releases/2026-09-01 - The Alpha Jump — DSH 0.1.2-alpha.1 to alpha.3, What Changed and What DSI Must Adapt.md` — the deep case: a wholesale rename found, five files patched, live probe, dead-code discovery.
|
|
19
|
+
2. `dev/kb/releases/2026-09-03 - The Quiet Jump — DSH 0.1.2-alpha.3 to alpha.5, What Changed and What DSI Owes.md` — the quiet case: 302 commits, nothing owed, one polish item, every "unchanged" diff-verified at the tags.
|
|
20
|
+
|
|
21
|
+
Read the exemplar matching your jump's size before drafting.
|
|
22
|
+
|
|
23
|
+
## 1. Establish the range
|
|
24
|
+
|
|
25
|
+
The previous release KB names the edition DSI was last verified against —
|
|
26
|
+
that tag, not "whatever we remember", is the range start. The new tag is the
|
|
27
|
+
one the host now runs (confirm: `git log -1` on the tag, the running `dsh web`
|
|
28
|
+
process, or the compare URL the operator supplies). If the previous KB stops
|
|
29
|
+
more than one edition back, analyze every missing gap — an untouched middle
|
|
30
|
+
edition is a finding, not a reason to skip it.
|
|
31
|
+
|
|
32
|
+
```sh
|
|
33
|
+
cd ~/agentic-ai/deepseek-harness
|
|
34
|
+
git remote -v # origin may be a fork without dsh-* tags
|
|
35
|
+
git fetch --tags https://github.com/deepseek-ai/deepseek-harness.git
|
|
36
|
+
git tag -l 'dsh-v*'
|
|
37
|
+
git log --oneline <old>..<new> | wc -l
|
|
38
|
+
git log --oneline <old>..<new> | grep -oE '^[a-f0-9]+ [a-z]+\([^)]*\)' \
|
|
39
|
+
| sed 's/^[a-f0-9]* //' | sort | uniq -c | sort -rn # theme census
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## 2. Diff the three touchpoints (the whole compatibility question)
|
|
43
|
+
|
|
44
|
+
DSI touches the host in exactly three places. Diff each **at the tags**, in
|
|
45
|
+
the DSH checkout — commit messages and Agent Notes are claims until grepped.
|
|
46
|
+
|
|
47
|
+
**a. The wire** (method names, argument/result fields, paging semantics):
|
|
48
|
+
|
|
49
|
+
```sh
|
|
50
|
+
git diff <old>..<new> -- packages/api/session-controller/src/client/contract \
|
|
51
|
+
packages/api/session-controller/src/history.ts \
|
|
52
|
+
packages/api/session-controller/src/list.ts \
|
|
53
|
+
packages/api/session-controller/src/commands.ts
|
|
54
|
+
```
|
|
55
|
+
Filter out internal type-branding noise (`SessionSeq`, `SessionLogOffset`,
|
|
56
|
+
`Branded`) — it is compile-time; the notes must say whether numeric wires
|
|
57
|
+
change, and you verify the wire adapter anyway (e.g. `wireHeader()`).
|
|
58
|
+
|
|
59
|
+
**b. The rejection codes** DSI matches (`grep -rn "err.code\|=== '"` in
|
|
60
|
+
DSI's `src/lib/server/`, then):
|
|
61
|
+
|
|
62
|
+
```sh
|
|
63
|
+
git diff <old>..<new> -- packages/api | grep -E "^[+-].*RemoteError\("
|
|
64
|
+
git grep -n '<code-spelling>' <new> -- packages/api
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
**c. The ledger** DSI reads (JSONL contract):
|
|
68
|
+
|
|
69
|
+
```sh
|
|
70
|
+
for t in <old> <new>; do git grep -h 'SESSION_FORMAT_VERSION =' $t -- packages; done
|
|
71
|
+
# Event-type vocabulary has NO single home: SessionEventMap members are declared
|
|
72
|
+
# across capability packages (tool events live in packages/core/tools/src/types.ts),
|
|
73
|
+
# so set-diff the known-type LIST at both tags. Never trust a single file diff -
|
|
74
|
+
# the 2026-09-09 Missed Rename: events.ts diffed empty while the ptc-dispatch
|
|
75
|
+
# rename landed in tools/types.ts. Set-diff the union of declaring files:
|
|
76
|
+
for t in <old> <new>; do
|
|
77
|
+
git grep -h "dispatch\|tool/\|turn/\|step/\|assistant/" $t -- \
|
|
78
|
+
packages/core/session/src/known-event-types.ts \
|
|
79
|
+
"packages/*/[^/]*/src/types.ts" 2>/dev/null | sort -u > /tmp/evt-$t.txt
|
|
80
|
+
done
|
|
81
|
+
diff /tmp/evt-<old>.txt /tmp/evt-<new>.txt # every moved spelling shows here
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Also check `SESSION_FORMAT_VERSION`, the `SessionEventMap` members (a new
|
|
85
|
+
model-visible event type is a DSI rendering opportunity), and the
|
|
86
|
+
`ignorable: true` rule (unknown events required-on-read unless marked).
|
|
87
|
+
|
|
88
|
+
## 3. Check DSI's matchers against the diff
|
|
89
|
+
|
|
90
|
+
For every wire string, code spelling, or validation message that moved,
|
|
91
|
+
grep DSI for who matches it (`src/lib/server/dsh-rpc.ts`,
|
|
92
|
+
`dsh-connection.ts`, route `+page.server.ts`/`+server.ts`, command
|
|
93
|
+
parser/executor prose). Classify each hit: **live matcher** (code compares
|
|
94
|
+
`err.code`), **prose** (docstring/JSDoc naming a code), or **local mirror**
|
|
95
|
+
(DSI re-validates what the host also validates — flag divergence in either
|
|
96
|
+
strictness direction).
|
|
97
|
+
|
|
98
|
+
## 4. Probe and verify before writing the verdict
|
|
99
|
+
|
|
100
|
+
- If matchers changed: patch them, then run the loop:
|
|
101
|
+
`npx vitest run` → `npm run check` → `DSH_LIVE=1 npm run test:live`
|
|
102
|
+
(live tests need a valid cookie against the running host; a dev server
|
|
103
|
+
minted before a restart still works — signed cookies survive host
|
|
104
|
+
restarts, launch tokens do not).
|
|
105
|
+
- If nothing changed: say so with tag-diff evidence, and confirm the
|
|
106
|
+
existing live suite still applies unedited.
|
|
107
|
+
- A matcher that *cannot fire* is a fact worth probing, not keeping (the
|
|
108
|
+
Alpha Jump's `not-pending` and dead-404 discoveries). When in doubt,
|
|
109
|
+
probe through DSI's own stack (the dev server proxying a real call).
|
|
110
|
+
|
|
111
|
+
## 5. The KB note template
|
|
112
|
+
|
|
113
|
+
Filename: `dev/kb/releases/YYYY-MM-DD - <The Name> — DSH <old> to <new>, <What Changed and What DSI Owes/Must Adapt>.md` — date is when the analysis ran.
|
|
114
|
+
|
|
115
|
+
```markdown
|
|
116
|
+
# <The Name> — DSH <old> to <new>, …
|
|
117
|
+
|
|
118
|
+
> KB note, YYYY-MM-DD. Written <the trigger: what jumped, when, what DSI's
|
|
119
|
+
> live-verified claims still described>. Sources: <git ranges with commit
|
|
120
|
+
> counts>, the range's Agent Notes, and tag-vs-tag greps — every claim
|
|
121
|
+
> confirmed in both trees. Successor to <previous release KB>.
|
|
122
|
+
|
|
123
|
+
## The question, restated in plain terms
|
|
124
|
+
<Operator-story framing; the switchboard mental model; the one-sentence
|
|
125
|
+
verdict up front — "nothing owed" or "N spellings across M files".>
|
|
126
|
+
|
|
127
|
+
## The journey, edition by edition
|
|
128
|
+
<mermaid flowchart: one node per edition, child nodes per notable change;
|
|
129
|
+
count the PRs/commits per hop; color the DSI-breaking node(s).>
|
|
130
|
+
|
|
131
|
+
## What changed, by DSI touchpoint
|
|
132
|
+
### The wire (what DSI speaks) — <verdict>
|
|
133
|
+
### The rejection codes (what DSI matches) — <verdict>
|
|
134
|
+
### The ledger (what DSI reads) — <verdict>
|
|
135
|
+
### What the host bought itself (gratitude, not action)
|
|
136
|
+
<Host-internal upside DSI need not copy — recorded so the next jump's
|
|
137
|
+
reader knows it was considered, not missed.>
|
|
138
|
+
|
|
139
|
+
## What DSI owes the new edition
|
|
140
|
+
<Table: item | where (file:line) | why it matters | cost. Old→new spelling
|
|
141
|
+
pairs each verified in both trees. If nothing: the one polish item, or an
|
|
142
|
+
explicit zero with the verification loop restated for the next jump.>
|
|
143
|
+
|
|
144
|
+
## Takeaway
|
|
145
|
+
<The debt paid or the quiet jump confirmed; the operating rule restated.>
|
|
146
|
+
|
|
147
|
+
**Open question:** <a KB ends by naming its open question — the next
|
|
148
|
+
decision this note surfaces but does not answer.>
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
## 6. The self-audit (before claiming done)
|
|
152
|
+
|
|
153
|
+
Answer each aloud, yes or no:
|
|
154
|
+
|
|
155
|
+
1. Did the range start at the edition the previous KB actually verified, and cover every gap since?
|
|
156
|
+
2. Were all three touchpoints diffed at the tags — not read from commit messages or notes alone?
|
|
157
|
+
For the ledger: was the known-event-type SET set-diffed across declaring files (step 2c),
|
|
158
|
+
not one file diff? A per-file diff can pass while the vocabulary moves — the 2026-09-09 Missed Rename.
|
|
159
|
+
3. Does every "unchanged" claim name the files the diff covered?
|
|
160
|
+
4. Was every DSI matcher greped and classified (live / prose / mirrored-validation)?
|
|
161
|
+
5. If matchers moved: did the verification loop run green (unit, check, live)?
|
|
162
|
+
6. Does the note state the verdict in its first screen (a reader in a hurry must not excavate it)?
|
|
163
|
+
7. Does "What the host bought itself" show considered-and-skipped work, not silently-missed work?
|
|
164
|
+
8. Does the note end with a real open question (not a restated takeaway)?
|
|
165
|
+
|
|
166
|
+
Any "no" is an unfinished report. Fix it — never declare done with a
|
|
167
|
+
standing "no".
|
|
168
|
+
|
|
169
|
+
## 7. Mirror discipline
|
|
170
|
+
|
|
171
|
+
The repo-local copy (`.agents/skills/dsi-release-kb/SKILL.md`, DSI repo) is
|
|
172
|
+
the versioned source of truth; the mirror at `~/.agents/skills/dsi-release-kb/`
|
|
173
|
+
makes it visible to every harness host's `skills/list`. After editing the
|
|
174
|
+
repo copy, re-copy it to the mirror — a skill the slash menu never sees is
|
|
175
|
+
a skill nobody invokes (RCA 2026-09-03 — The Skill the Slash Menu Never Saw).
|