@klhapp/skillmux 1.1.0 → 1.3.0

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/docs/cli.md ADDED
@@ -0,0 +1,350 @@
1
+ # CLI reference and automation
2
+
3
+ The Bun package and standalone Linux executable expose the same CLI. Native
4
+ management belongs on the machine that owns the client skill directories:
5
+ use the built-in `local` target for `init`, `install`, pinning, and `sync`.
6
+ Named remote contexts administer shared-server configuration through its
7
+ administrative API only; they do not install, pin, or synchronize skills in
8
+ client directories.
9
+
10
+ In this guide, **local target** means the filesystem and process selected by
11
+ the built-in CLI context. It does not describe local inference. A local target
12
+ can call remote inference endpoints.
13
+
14
+ For task-oriented workflows, start with [Getting started](getting-started.md)
15
+ or [Managing skills](skill-management.md).
16
+
17
+ ## Global options and target resolution
18
+
19
+ Every target-aware command resolves its execution target deterministically in this order:
20
+
21
+ 1. Explicit flags: `--context <name>` or `--server <url>`
22
+ 2. Environment variables: `SKILLMUX_CONTEXT` or `SKILLMUX_SERVER`
23
+ 3. Default context configured in `~/.config/skillmux/contexts.toml`
24
+ 4. Built-in `local` context
25
+
26
+ > [!IMPORTANT]
27
+ > Supplying both `--context` and `--server` (or both `SKILLMUX_CONTEXT` and `SKILLMUX_SERVER`) is rejected as ambiguous. Plaintext HTTP admin targets on non-loopback addresses are rejected unless `--allow-insecure` is supplied.
28
+
29
+ | Flag | Description |
30
+ |------|-------------|
31
+ | `--context <name>` | Select a target context stored in `contexts.toml` |
32
+ | `--server <url>` | Select an explicit remote server URL |
33
+ | `--json` | Emit line-stable JSON envelopes (schema version 1) to stdout |
34
+ | `--allow-insecure` | Allow plaintext HTTP admin requests to non-loopback addresses |
35
+ | `--verbose` | Output diagnostic stack traces for errors |
36
+
37
+ ---
38
+
39
+ ## Context management (`skillmux context`)
40
+
41
+ Contexts store named server targets without embedding raw credentials. Token environment variable names (`token_env`) may be associated with a context.
42
+
43
+ ```sh
44
+ # List all configured contexts (includes reserved 'local' context)
45
+ skillmux context list
46
+
47
+ # View the currently active context
48
+ skillmux context current
49
+
50
+ # Add a remote context
51
+ skillmux context add prod --server https://skillmux.internal:3000 --token-env PROD_ADMIN_TOKEN
52
+
53
+ # Switch default context
54
+ skillmux context use prod
55
+
56
+ # Remove a context (reserved 'local' context cannot be removed)
57
+ skillmux context remove prod
58
+ ```
59
+
60
+ ---
61
+
62
+ ## Configuration management (`skillmux config`)
63
+
64
+ Local and remote targets share the server configuration read and status
65
+ subcommands. `config init` is local-only because it creates machine
66
+ configuration and selects a local vault.
67
+
68
+ ```sh
69
+ # Create the machine config after validating a populated vault
70
+ skillmux config init --vault ~/skills --yes
71
+
72
+ # View current configuration and source attribution (default, toml, environment)
73
+ skillmux config show
74
+
75
+ # Get a specific schema-known dotted key value
76
+ skillmux config get recall.k_lexical
77
+
78
+ # Validate effective configuration schema and runtime readiness
79
+ skillmux config validate
80
+
81
+ # View effective configuration diff against defaults
82
+ skillmux config diff
83
+
84
+ # Set a dotted key value (previews diff and validates before saving)
85
+ skillmux config set recall.k_lexical 30
86
+
87
+ # Perform dry-run validation without writing or activating changes
88
+ skillmux config set recall.k_lexical 30 --dry-run
89
+
90
+ # Inspect runtime status, revision hashes, and readiness
91
+ skillmux config status
92
+ ```
93
+
94
+ `config init` writes only `vault_path`. It leaves an existing config unchanged
95
+ and does not add `local_vault_paths`. Remote contexts administer the deployed
96
+ server configuration; they never administer client skill installation, pins,
97
+ or sync.
98
+
99
+ ---
100
+
101
+ ## Setup planner (`skillmux init`)
102
+
103
+ Run `skillmux init` with no arguments in a terminal to start guided setup.
104
+ Skillmux preselects clients it can detect from filesystem evidence, asks for
105
+ core skills, prints one complete review, and applies after one confirmation.
106
+ The prompt stays line-oriented and does not use an alternate terminal screen.
107
+
108
+ Select clients by product name:
109
+
110
+ ```sh
111
+ skillmux init --client claude-code --client codex --core csv-formatter --dry-run
112
+ skillmux init --client claude-code --client codex --core csv-formatter --yes
113
+ ```
114
+
115
+ Skillmux supports these client IDs:
116
+
117
+ | Client | Skill delivery |
118
+ |--------|----------------|
119
+ | `claude-code` | `~/.claude/skills` |
120
+ | `codex` | `$CODEX_HOME/skills`, falling back to `~/.codex/skills` |
121
+ | `gemini-cli`, `opencode`, `github-copilot`, `windsurf` | Shared `~/.agents/skills` surface |
122
+ | `antigravity` | `~/.gemini/config/skills` |
123
+ | `goose`, `hermes` | Manual full-vault configuration |
124
+ | `skillmux-mcp` | Manual MCP registration |
125
+
126
+ Direct target IDs are `agent-skills`, `claude-code`, `codex`, and `custom`.
127
+ Custom targets require `--dir <dir>`. The legacy `agents` and `claude` IDs
128
+ print deprecation warnings and retain their manifest names.
129
+
130
+ `--dry-run` prints the config, target, instruction, and core plan without
131
+ prompting or writing. `--json` emits one schema-versioned plan or result
132
+ object. Noninteractive writes require `--yes`. `--interactive` forces the
133
+ wizard and seeds it with supplied flags. `--no-instructions` skips managed
134
+ instruction files; `--no-sync` saves setup without materializing links.
135
+
136
+ Skillmux rejects a target that currently links to the whole vault. Convert it
137
+ only after reviewing the smaller post-sync skill set:
138
+
139
+ ```sh
140
+ skillmux init --client claude-code --migrate-full-vault \
141
+ --core csv-formatter --dry-run
142
+ skillmux init --client claude-code --migrate-full-vault \
143
+ --core csv-formatter --yes
144
+ ```
145
+
146
+ Client instruction adapters append one managed discovery block and preserve
147
+ the rest of each file. Skillmux uses `.hermes.md` for Hermes and refuses
148
+ `SOUL.md` or Hermes's installed-source `AGENTS.md`. A client without a safe
149
+ user-level convention reports manual setup.
150
+
151
+ ---
152
+
153
+ ## Project setup (`skillmux project init`)
154
+
155
+ Run the guided flow from a project directory:
156
+
157
+ ```sh
158
+ skillmux project init
159
+ ```
160
+
161
+ Skillmux resolves the project directory from an explicit positional path, then
162
+ the current Git root, then the current directory. It suggests the directory
163
+ basename as the project-group name.
164
+
165
+ The noninteractive form accepts repeatable client and skill flags:
166
+
167
+ ```sh
168
+ skillmux project init ~/code/skillmux \
169
+ --name skillmux \
170
+ --client claude-code \
171
+ --client codex \
172
+ --skill sdd-tdd \
173
+ --skill code-context \
174
+ --yes
175
+ ```
176
+
177
+ `--client` maps product names to configured, deduplicated targets. Advanced
178
+ callers can attach a configured target with repeated `--target <name>`.
179
+ Re-running the command merges missing paths, skills, and target attachments.
180
+ It validates the complete manifest before an atomic write and runs `sync` by
181
+ default. Use `--no-sync` when another process will materialize the links.
182
+
183
+ Direct project commands support later maintenance:
184
+
185
+ ```sh
186
+ skillmux project list
187
+ skillmux project show skillmux
188
+ skillmux project add-path skillmux ~/code/skillmux --yes
189
+ skillmux project remove-path skillmux ~/old/skillmux --yes
190
+ skillmux project pin skillmux sdd-tdd code-context --yes
191
+ skillmux project unpin skillmux old-skill --yes
192
+ skillmux project attach skillmux --client claude-code --client codex --yes
193
+ skillmux project detach skillmux --target codex --yes
194
+ ```
195
+
196
+ `add-path` and `remove-path` detect the current Git root when the path is
197
+ omitted. Client attachments map to configured physical targets and deduplicate
198
+ clients that share `~/.agents/skills`. Mutating commands validate the complete
199
+ manifest and replace it atomically. Run `skillmux sync` after direct
200
+ maintenance commands to materialize the new state.
201
+
202
+ ---
203
+
204
+ ## Advanced targets (`skillmux target`)
205
+
206
+ Most users should select products with `init --client`. Use `target` commands
207
+ for custom delivery directories and manifest inspection:
208
+
209
+ ```sh
210
+ skillmux target list
211
+ skillmux target show claude-code
212
+ skillmux target add custom-agent --dir /srv/custom-agent/skills --yes
213
+ skillmux target remove custom-agent --yes
214
+ ```
215
+
216
+ `target add` uses the same ownership, symlink, full-vault, rollback, and
217
+ current-host scoping checks as `skillmux init`. `target remove` removes the
218
+ manifest entry and preserves the directory, marker, and skill files. The
219
+ command prints the preserved path so cleanup remains an explicit user action.
220
+
221
+ ---
222
+
223
+ ## Core skills (`skillmux core`)
224
+
225
+ Pin or unpin skills into `[core]` — the tier every target receives by
226
+ default, capped at 25 skills:
227
+
228
+ ```sh
229
+ skillmux core pin csv-formatter --yes
230
+ skillmux core pin csv-formatter pdf-extractor terraform-plans --yes
231
+ skillmux core unpin csv-formatter --yes
232
+ ```
233
+
234
+ One or more `skill_id` arguments are accepted per call and applied
235
+ atomically against a single in-memory manifest: if any one of them is
236
+ already pinned elsewhere (or, for `unpin`, not currently pinned), the
237
+ whole call fails and the manifest file is left untouched. To pin into a
238
+ `[project.<group>]` tier instead, use `skillmux project pin` (see
239
+ [Project Setup](#project-setup-skillmux-project-init)).
240
+
241
+ ### Reloadable and restart-required keys
242
+
243
+ Config changes are categorized into live-reloadable and restart-required settings:
244
+
245
+ - **Reloadable**: `vault_path`, `recall.*`, `thresholds.*`, `inference.embedding.*`, `server.rate_limit.*`
246
+ - **Restart Required**: `server.hostname`, `server.auth_enabled`, `server.auth_token_env`, `server.admin.enabled`, `server.admin.token_env`, `inference.mode`, `state_dir`
247
+
248
+ ---
249
+
250
+ ## Skill introspection (`skillmux skill which`)
251
+
252
+ Show which root actually serves a skill_id, and every root it shadows:
253
+
254
+ ```sh
255
+ skillmux skill which csv-formatter
256
+ ```
257
+
258
+ ---
259
+
260
+ ## Policy calibration (`skillmux calibrate`)
261
+
262
+ Calibrate decision thresholds (`match_score`, `match_margin`, `candidate_floor`) against synthetic or labeled query datasets.
263
+ Calibration is local-only in this release. Remote targets advertise the
264
+ capability as unavailable and return `not_implemented`; a local dataset path is
265
+ never uploaded or represented as remotely executed. See
266
+ [`docs/calibration.md`](calibration.md) for dataset responsibilities,
267
+ certification gates, run evidence, reference values, and the complete operator
268
+ lifecycle.
269
+
270
+ ```sh
271
+ # Run calibration on a dataset
272
+ skillmux calibrate run --dataset ./eval/queries.json
273
+
274
+ # List stored calibration runs in the evidence store
275
+ skillmux calibrate list
276
+
277
+ # Inspect detailed metrics and confusion matrix for a run
278
+ skillmux calibrate show <run_id>
279
+
280
+ # Apply calibrated thresholds to configuration (with fingerprint validation)
281
+ skillmux calibrate apply <run_id>
282
+
283
+ # Generate a synthetic decision dataset from vault skills
284
+ skillmux calibrate generate-dataset --out ./eval/queries.json
285
+ ```
286
+
287
+ ---
288
+
289
+ ## Administrative HTTP API (`/admin/v1/*`)
290
+
291
+ Remote servers expose administrative control endpoints under `/admin/v1/*` when enabled in configuration:
292
+
293
+ ```toml
294
+ [server.admin]
295
+ enabled = true
296
+ token_env = "SKILLMUX_ADMIN_TOKEN"
297
+ ```
298
+
299
+ Requests require `Authorization: Bearer <token>` where `<token>` matches the environment variable named by `server.admin.token_env`.
300
+
301
+ | Endpoint | Method | Description |
302
+ |----------|--------|-------------|
303
+ | `/admin/v1/capabilities` | `GET` | Advertises server features (`config_read`, `config_write`, `calibration`, `persistence`) |
304
+ | `/admin/v1/config` | `GET` | Returns desired/effective config, sources, and `ETag` revision hash |
305
+ | `/admin/v1/config` | `PATCH` | Applies dotted-key updates; requires matching `If-Match` header |
306
+ | `/admin/v1/calibrations` | `GET`, `POST` | Returns `501 not_implemented` (calibration is local-only) |
307
+ | `/admin/v1/calibrations/{run_id}` | `GET` | Returns `501 not_implemented`; raw evaluation queries are not exposed |
308
+ | `/admin/v1/calibrations/{run_id}/apply` | `POST` | Returns `501 not_implemented` |
309
+
310
+ ---
311
+
312
+ ## Automation and JSON output (`--json`)
313
+
314
+ When `--json` or `SKILLMUX_JSON=true` is set, all output is emitted to `stdout` in a stable envelope:
315
+
316
+ ```json
317
+ {
318
+ "schema_version": 1,
319
+ "ok": true,
320
+ "target": "local",
321
+ "data": { ... },
322
+ "error": null
323
+ }
324
+ ```
325
+
326
+ ### Exit codes
327
+
328
+ | Code | Meaning | Examples |
329
+ |------|---------|----------|
330
+ | `0` | Success | Command completed cleanly |
331
+ | `2` | Usage / Validation Error | Unknown key, malformed value, missing option, invalid command |
332
+ | `3` | Target Unreachable / Unauthenticated | Connection refused, HTTP 401 Unauthorized, HTTP 403 Forbidden |
333
+ | `4` | Conflict / Governance Gate | HTTP 409 `CONFIG_REVISION_CONFLICT` or `CONFIG_EXTERNALLY_MANAGED` |
334
+
335
+ ---
336
+
337
+ ## Shell completions (`skillmux completions`)
338
+
339
+ Generate tab-completions for `bash`, `zsh`, or `fish`:
340
+
341
+ ```sh
342
+ # Bash
343
+ skillmux completions bash > ~/.local/share/bash-completion/completions/skillmux
344
+
345
+ # Zsh
346
+ skillmux completions zsh > ~/.zsh/completion/_skillmux
347
+
348
+ # Fish
349
+ skillmux completions fish > ~/.config/fish/completions/skillmux.fish
350
+ ```
@@ -0,0 +1,165 @@
1
+ # Concepts
2
+
3
+ Skillmux separates three decisions:
4
+
5
+ | Decision | Choices |
6
+ | --- | --- |
7
+ | Skill delivery | Native core/project pins or routed MCP retrieval |
8
+ | Process location | On the client machine or as a shared HTTP service |
9
+ | Packaging | Skillmux CLI installation or Skillmux server deployment |
10
+
11
+ Retrieval capability is a fourth, independent concern: lexical, hybrid,
12
+ reranked, or exact retrieval.
13
+
14
+ These decisions are independent. A local CLI can manage native pins and serve
15
+ stdio MCP at the same time. A shared service uses HTTP MCP and can run local or
16
+ remote inference.
17
+
18
+ ## Canonical vault
19
+
20
+ The vault is the source collection for Skillmux. Each direct child directory
21
+ represents one skill and contains a `SKILL.md`.
22
+
23
+ The default path is `~/skills`. Set `vault_path` in
24
+ `~/.config/skillmux/config.toml` when you keep the collection elsewhere.
25
+
26
+ Skillmux commands interact with the vault in two ways:
27
+
28
+ - management commands such as `install` and explicit config operations write
29
+ to documented paths;
30
+ - MCP retrieval reads skill content and stores indexes and audit records under
31
+ `state_dir`.
32
+
33
+ MCP delivery reads the current file bytes. It does not copy an indexed
34
+ `SKILL.md` body from the state database.
35
+
36
+ ## Delivery tiers
37
+
38
+ Skillmux applies three policies to one vault:
39
+
40
+ | Tier | Scope | Delivery |
41
+ | --- | --- | --- |
42
+ | Core | Each configured target | Native client skill directory |
43
+ | Project | Selected project paths and targets | Project-local native skill directory |
44
+ | Routed | Full indexed vault | MCP on demand |
45
+
46
+ Core and project skills are **pinned**. `skillmux sync` creates managed
47
+ symlinks for them. Routed skills stay in the vault until an MCP client asks for
48
+ one.
49
+
50
+ One skill can serve different roles across machines or projects, but the
51
+ shared manifest prevents conflicting core and project assignments. Core stays
52
+ capped at 25 skills to protect client startup context.
53
+
54
+ Delivery tiers do not select a deployment. A local Skillmux process can serve
55
+ routed skills over stdio, while a shared Skillmux process can serve the same
56
+ vault over HTTP.
57
+
58
+ ## Deployment topologies
59
+
60
+ | Topology | Process location | Transport | Typical installation |
61
+ | --- | --- | --- | --- |
62
+ | Native management | Client machine | Filesystem links | Skillmux CLI |
63
+ | Local MCP | Beside one client | stdio | Skillmux CLI |
64
+ | Shared MCP | Server or container host | Streamable HTTP | Full Skillmux server image |
65
+
66
+ The **Skillmux CLI** is available as either the Bun package or the standalone
67
+ Linux executable; both expose the same commands. The **full Skillmux server
68
+ image** is the default shared-service deployment. The **slim image** is an
69
+ advanced variant for configured remote embeddings or intentional lexical-only
70
+ retrieval. The CLI can also serve HTTP, and Docker can serve stdio for clients
71
+ that support a container command. Those combinations use the same MCP tools;
72
+ the table lists the shortest setup for each use case.
73
+
74
+ The full Docker image bundles GTE-small. The slim image contains no model
75
+ files, so it uses configured remote embeddings or lexical fallback. The Bun
76
+ CLI distributions download and cache GTE-small when local inference
77
+ first loads it; `skillmux models download` prefetches it. Neither Docker image
78
+ bundles a local reranker; configure one remotely when needed.
79
+
80
+ ## Clients and targets
81
+
82
+ A **client** is a supported product name such as `claude-code` or `codex`.
83
+ Skillmux maps it to the product's skill directory and safe instruction-file
84
+ conventions.
85
+
86
+ A **target** is a physical directory managed by sync. Several clients can map
87
+ to one target. Gemini CLI, OpenCode, GitHub Copilot, and Windsurf share
88
+ `~/.agents/skills`, so Skillmux deduplicates that directory.
89
+
90
+ Custom targets let you manage another directory without adding a product
91
+ adapter:
92
+
93
+ ```sh
94
+ skillmux target add custom-agent --dir /srv/custom-agent/skills --yes
95
+ ```
96
+
97
+ ## Ownership markers
98
+
99
+ Each managed target contains a `.skillmux` marker. The marker records the
100
+ target name, vault, schema version, and entries created by Skillmux.
101
+
102
+ Sync removes only recorded entries. It refuses to adopt an unmarked directory,
103
+ overwrite unmanaged collisions, or treat a local overlay marker as a target
104
+ marker.
105
+
106
+ Run `skillmux init --dry-run` before changing a target. Read
107
+ [Managing skills](skill-management.md#target-ownership-and-recovery) before
108
+ undoing an adopted target.
109
+
110
+ ## Project groups
111
+
112
+ A project group connects:
113
+
114
+ - one or more local project paths;
115
+ - a set of skill IDs;
116
+ - selected targets.
117
+
118
+ Skillmux materializes each group inside the project using the target's path
119
+ relative to the user's home directory. A shared `skillmux.toml` can list
120
+ checkout paths from several machines. Sync skips paths that do not exist on
121
+ the current machine.
122
+
123
+ ## Local vault overlays
124
+
125
+ `local_vault_paths` layer machine-specific skill copies over the canonical
126
+ vault. Skillmux checks overlay paths in order, then falls back to `vault_path`.
127
+
128
+ Use overlays for work in progress or machine-specific variants. Keep portable
129
+ core and project pins in the canonical vault because another machine may not
130
+ have the overlay.
131
+
132
+ ## Inference and retrieval capabilities
133
+
134
+ Inference location and deployment location use separate settings. Local
135
+ inference runs GTE-small inside the Skillmux process. Remote inference calls
136
+ configured embedding and reranker endpoints. Either inference choice can back
137
+ an HTTP MCP deployment.
138
+
139
+ Skillmux reports the active retrieval capability:
140
+
141
+ | Capability | Behavior |
142
+ | --- | --- |
143
+ | `lexical` | SQLite FTS5 and BM25 produce an ordered shortlist |
144
+ | `hybrid` | Reciprocal-rank fusion combines lexical and embedding results |
145
+ | `reranked` | A configured reranker reorders the fused candidates |
146
+ | `exact` | An exact skill ID resolves directly |
147
+
148
+ A reranker does not enable automatic matches by itself. Skillmux needs
149
+ calibrated `match_score`, `match_margin`, and `candidate_floor` thresholds
150
+ before it returns a semantic result as `matched`.
151
+
152
+ ## Retrieval outcomes
153
+
154
+ `resolve_skill` returns one of three outcomes:
155
+
156
+ - `matched`: one skill passed the calibrated policy, so Skillmux delivers its
157
+ `SKILL.md` body inline;
158
+ - `ambiguous`: Skillmux returns an ordered candidate list and the calling model
159
+ chooses one with `fetch_skill`;
160
+ - `no_match`: no candidate passed the policy and the agent continues without a
161
+ skill.
162
+
163
+ Embedding or reranker failures reduce the active capability. Vault and index
164
+ failures make the server unready because Skillmux can no longer guarantee
165
+ valid retrieval.
@@ -1,8 +1,23 @@
1
1
  # Configuration
2
2
 
3
- Skillmux defaults to FTS5 plus local GTE-small semantic retrieval. Most users need no config file.
3
+ Skillmux manages one canonical vault and defaults to FTS5 plus GTE-small
4
+ running in the Skillmux process. Most users need no config file.
4
5
 
5
- For detailed CLI command reference, target resolution, policy calibration, and automation envelopes, see [`docs/cli.md`](cli.md).
6
+ Deployment and inference use separate terms:
7
+
8
+ - **local deployment**: Skillmux runs beside a client, usually over stdio;
9
+ - **shared deployment**: Skillmux serves clients over HTTP;
10
+ - **local inference**: the Skillmux process runs the embedding model;
11
+ - **remote inference**: Skillmux calls configured inference endpoints.
12
+
13
+ A shared HTTP deployment can use local inference. A local stdio deployment can
14
+ use remote inference.
15
+
16
+ Read [Concepts](concepts.md) for the vault and delivery model. For detailed CLI
17
+ commands, target resolution, and automation envelopes, see
18
+ [CLI reference](cli.md). For labelled datasets, threshold certification,
19
+ reference values, and the apply lifecycle, see
20
+ [Policy calibration](calibration.md).
6
21
 
7
22
  ## Machine config bootstrap
8
23
 
@@ -23,14 +38,21 @@ It validates that the path resolves to a directory with at least one
23
38
  `local_vault_paths` unset. `skillmux init --vault ~/skills --yes` uses the
24
39
  same bootstrap when the machine config does not exist.
25
40
 
26
- ## Local mode
41
+ ## Local inference
27
42
 
28
43
  ```toml
29
44
  [inference]
30
45
  mode = "local"
31
46
  ```
32
47
 
33
- The versioned `gte-small-v1` bundle uses normalized, mean-pooled `Xenova/gte-small` embeddings (384 dimensions), quantized to q8 on CPU. Models are cached in `~/.cache/skillmux/models`. FTS5 and cosine result lists are combined with reciprocal-rank fusion; without a reranker the calling LLM selects from the ordered shortlist.
48
+ The versioned `gte-small-v1` configuration uses normalized, mean-pooled
49
+ `Xenova/gte-small` embeddings with 384 dimensions, quantized to q8 on CPU.
50
+ Skillmux CLI installations download the model when inference first
51
+ loads it and cache it in `~/.cache/skillmux/models`. The full Docker image
52
+ already contains the model.
53
+
54
+ Skillmux combines FTS5 and cosine result lists with reciprocal-rank fusion.
55
+ Without a reranker, the calling model selects from the ordered shortlist.
34
56
 
35
57
  Advanced local overrides:
36
58
 
@@ -47,9 +69,10 @@ dtype = "q8"
47
69
 
48
70
  ```
49
71
 
50
- Use `skillmux models download` to prefetch models and `skillmux doctor` to verify readiness.
72
+ Use `skillmux models download` to prefetch the model and `skillmux doctor` to
73
+ verify readiness.
51
74
 
52
- ## Remote mode
75
+ ## Remote inference
53
76
 
54
77
  See [`config.remote.example.toml`](../config.remote.example.toml). Embeddings
55
78
  must implement the OpenAI-compatible `{ model, input }` contract. Configure the
@@ -105,7 +128,13 @@ candidate list returned to the calling LLM after retrieval, reranking, and
105
128
  threshold filtering. It does not change retrieval depth or the matched,
106
129
  ambiguous, or no-match classification.
107
130
 
108
- Reranker thresholds have no universal default because score distributions are model-specific. When configuring a reranker, provide calibrated `inference.thresholds.match_score`, `inference.thresholds.match_margin`, and `inference.thresholds.candidate_floor`; otherwise configuration is rejected rather than silently applying unsuitable values.
131
+ Reranker thresholds have no universal default because score distributions are
132
+ model-specific. Without `inference.thresholds`, Skillmux still uses the
133
+ reranker to order candidates but keeps outcomes ambiguous rather than
134
+ auto-matching. Use `skillmux calibrate run` to select
135
+ `match_score`, `match_margin`, and `candidate_floor`, then explicitly apply the
136
+ certified run. The [calibration guide](calibration.md) also publishes a
137
+ clearly-scoped BGE reference profile for smoke tests.
109
138
 
110
139
  ## HTTP server
111
140
 
@@ -128,7 +157,11 @@ Before exposing HTTP beyond localhost, set `hostname` to a reachable interface,
128
157
 
129
158
  ## Tiers and the manifest
130
159
 
131
- `skillmux init`/`sync` manage an optional second delivery path pinning a subset of skills as real symlinks inside an agent's own skill directory, instead of routing every request through `resolve_skill`. See the README's [Tiers](../README.md#tiers-routed-vs-pinned) section for the concept and a walkthrough; this is the manifest reference.
160
+ `skillmux init` and `skillmux sync` manage native delivery by pinning selected
161
+ skills as symlinks inside an agent's skill directory. Routed skills remain
162
+ available through `resolve_skill`. Read [Concepts](concepts.md#delivery-tiers)
163
+ for the model and [Managing skills](skill-management.md) for the workflow.
164
+ This section defines the manifest.
132
165
 
133
166
  ### `skillmux.toml`
134
167