@skill-map/spec 0.3.0 → 0.5.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/CHANGELOG.md CHANGED
@@ -1,5 +1,81 @@
1
1
  # Spec changelog
2
2
 
3
+ ## 0.5.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 69572fd: Align `spec/index.json` with the manifest changes declared in the `0.3.0` changelog (they had been documented but never written to the file), and fix two small referential drifts surfaced in the same audit pass.
8
+
9
+ **`spec/index.json`** — closes the gap between what `0.3.0` notes promised and what actually shipped:
10
+
11
+ - `specVersion` top-level field renamed to `indexPayloadVersion`. The old name collided semantically with `specPackageVersion` and with every other use of `specVersion` in the spec (compat logic, `scan-result.specVersion`, `sm help --format json`). `indexPayloadVersion` describes the shape of `index.json` itself and bumps only when this manifest's structure changes — pinned at `0.0.1` today. **This is the breaking rename already announced in the `0.3.0` release notes.**
12
+ - `schemas.topLevel` gains `history-stats` (shape for `sm history stats --json`, already referenced from `cli-contract.md` §History and hashed under `integrity.files`).
13
+ - New `schemas.extensions` subsection listing the 7 kind-manifest schemas (`base`, `adapter`, `detector`, `rule`, `action`, `audit`, `renderer`) — already required by `architecture.md` §Extension kinds for load-time manifest validation and already present under `schemas/extensions/`.
14
+
15
+ **`spec/versioning.md` §Change process step 4** — the parenthetical `(see CLAUDE.md: "Every feature: update spec/ first, then src/")` was stale. `CLAUDE.md` has been a bare `@AGENTS.md` pointer since the 18d0c20 dedup; the rule itself lives in `AGENTS.md`. Reference fixed.
16
+
17
+ **`spec/CHANGELOG.md` 0.3.0 entry** — text-only renumber of "decision #40a" → "decision #40". The sub-letter was a leftover from an unreleased draft; the roadmap Decision log uses `40` as the canonical anchor (see companion ROADMAP edit).
18
+
19
+ Classification: minor per §Pre-1.0 (`0.Y.Z`). The `specVersion → indexPayloadVersion` rename is breaking for any consumer that read the old field, but the old name never shipped alongside a file that spelled it `indexPayloadVersion` — the rename is being applied here for the first time, not re-applied. The `topLevel`/`extensions` additions are purely additive.
20
+
21
+ ### Patch Changes
22
+
23
+ - 2699276: Fix the extension-kind schemas so they actually validate against real extension manifests.
24
+
25
+ The six kind schemas (`schemas/extensions/action.schema.json`, `adapter.schema.json`, `audit.schema.json`, `detector.schema.json`, `renderer.schema.json`, `rule.schema.json`) used `additionalProperties: false` together with `allOf: [{ $ref: "base.schema.json" }]` — a classic JSON Schema Draft 2020-12 footgun. `additionalProperties` is evaluated independently per schema in an `allOf`, so when a consumer validated `{ id, kind, version, emitsLinkKinds, defaultConfidence }` against `detector.schema.json`, detector's `additionalProperties: false` rejected `id` / `version` / `description` (defined only on `base`) and base's own `additionalProperties: false` would have rejected `emitsLinkKinds` / `defaultConfidence` — the union of both closures is empty. No real extension could ever pass validation.
26
+
27
+ Discovered during Step 1b while wiring the AJV validators in `skill-map` (kernel plugin loader). The right fix is `unevaluatedProperties: false` — it sees through `allOf` composition and only rejects keys that no sibling schema declared.
28
+
29
+ Changes:
30
+
31
+ - Every kind schema: `additionalProperties: false` → `unevaluatedProperties: false` at the manifest level. Nested `additionalProperties: false` declarations inside `$defs` / `properties` were likewise replaced with `unevaluatedProperties: false` where they participate in `allOf` composition (e.g. `action.schema.json#/$defs/Parameter`, `audit.schema.json` nested items).
32
+ - `extensions/base.schema.json`: closure removed entirely. Closed-content is now enforced only on the kind schemas, which see base's properties as "evaluated" through the `allOf` — adding closure to base too would force every kind to re-list every base key to stay valid.
33
+ - `base.schema.json` description updated to spell out the new composition rule so a future reader does not accidentally re-introduce the footgun.
34
+
35
+ Classification: patch. No normative shape changes — every manifest that was _supposed_ to pass under the old schemas still passes under the new ones, and the authored intent (closed content on kind manifests, additive base fields) is preserved. Consumers that never wired strict JSON Schema validation see zero behavioural change.
36
+
37
+ ## 0.4.0
38
+
39
+ ### Minor Changes
40
+
41
+ - 334c51a: Document `--all` as targeted fan-out, not a global flag, in `spec/cli-contract.md`.
42
+
43
+ `--all` is valid only on verbs whose contract explicitly lists it:
44
+
45
+ - `sm plugins enable <id> | --all` and `sm plugins disable <id> | --all`.
46
+ - `sm job cancel <job.id> | --all` (cancels every `queued` and `running` job).
47
+ - `sm job submit <action> --all` and `sm job run --all`.
48
+
49
+ Unsupported `--all` usage is an operational error (exit `2`), the same as any other unknown or invalid flag.
50
+
51
+ Classification: minor — targeted fan-out semantics are additive for the listed verbs, while avoiding a global flag contract.
52
+
53
+ - 3e89d8f: Audit-driven alignment pass. Multiple normative additions and a casing cleanup:
54
+
55
+ - **Extension schemas**: add `spec/schemas/extensions/{base,adapter,detector,rule,action,audit,renderer}.schema.json` (7 new files). `architecture.md` §Extension kinds now points to them and mandates manifest validation at load time. Unblocks the "contract tests for the 6 kinds" invariant.
56
+ - **Adapter `defaultRefreshAction`**: normatively required on every `Adapter` extension. Maps node `kind` → `actionId` and drives the UI's `🧠 prob` button. Previously mentioned only in ROADMAP (Decision #45); now part of the schema.
57
+ - **Triple protection for mode B**: `db-schema.md` now specifies the exact order — parse → DDL validation → prefix injection → scoped connection. Validation runs **before** the rewrite so kernel-table references are caught under their authored names.
58
+ - **Automatic rename heuristic**: new `db-schema.md` §Rename detection. On scan, `body_hash` match → high-confidence auto-rename with `state_*` FK migration; `frontmatter_hash` match → medium-confidence, same migration + `auto-rename-medium` issue; no match → orphan with issue. Replaces the prior "scan emits orphans, user runs `sm orphans reconcile` manually" flow.
59
+ - **Skill agent envelope**: `job-events.md` now mandates a synthetic `r-ext-<ts>-<hex>` run envelope (`run.started mode=external` → `job.claimed` → `job.callback.received` → `job.completed|failed` → `run.summary`) around jobs claimed by a Skill agent without entering `sm job run`. Keeps the WebSocket broadcaster contract ("every job event inside a run envelope") intact across both runner paths.
60
+ - **"Skill runner" → "Skill agent"**: `architecture.md` and `job-lifecycle.md` clarify that the Skill path is a peer driving adapter (alongside CLI and Server), NOT a `RunnerPort` implementation. Only `ClaudeCliRunner` and its test fake implement the port. Name was misleading; structure unchanged.
61
+ - **Casing**: `db-schema.md` `auto_migrate` → `autoMigrate`; `README.md` prose mention `spec-compat` → `specCompat`. Brings prose into sync with the camelCase rule already enforced by the schemas.
62
+ - **Coverage matrix**: new `spec/conformance/coverage.md` tracks each schema (and each non-schema normative artifact) against its conformance case. 28 schemas + 11 artifact invariants catalogued; 19 schemas and 10 artifacts flagged as missing, each with a step-blocker note. Release gate: v1.0.0 requires every row 🟢 or explicitly deferred.
63
+
64
+ Classification: minor per §Pre-1.0 (`0.Y.Z`). The new required field `defaultRefreshAction` on the Adapter kind is technically breaking — no conforming Adapter ships in the reference impl yet, so the impact is zero. Post-1.0 the same change would be major.
65
+
66
+ ### Patch Changes
67
+
68
+ - 93ffe34: Editorial pass: remove "MVP" terminology from four prose documents.
69
+
70
+ The project shipped two competing readings of "MVP" — sometimes "`v0.5.0`", sometimes "the whole product through `v1.0`". That drift produced contradictions in companion docs (e.g. the summarizer pattern: was `v0.8.0` or `v0.5.0` supposed to ship them?). To close the ambiguity once, `ROADMAP.md` and `AGENTS.md` standardised on explicit versioned releases and `post-v1.0` in the same audit window. This change brings the four spec prose touches that still said "MVP" into the same vocabulary.
71
+
72
+ - **`cli-contract.md` §Jobs**: `sm job run --all` description `(MVP: sequential)` → `(sequential through v1.0; in-runner parallelism deferred)`.
73
+ - **`job-events.md` §Event catalog**: `(post-MVP)` parallel-run note → `(deferred to post-v1.0)`.
74
+ - **`job-lifecycle.md` §Concurrency**: `MVP (v0.x): one job at a time.` → `Through v1.0 (spec v0.x): one job at a time.`
75
+ - **`plugin-kv-api.md` §Backup and retention**: `sm plugins forget <id> (post-MVP)` → `sm plugins forget <id> (deferred to post-v1.0)`.
76
+
77
+ Classification: patch. Editorial only — no schema, exit code, verb signature, or MUST/SHOULD statement changes meaning. All four replacements preserve the technical content; only the label changes from project-scoped ("MVP") to version-scoped (`v1.0`), which is the convention the rest of the spec already uses. Integrity block regenerated.
78
+
3
79
  ## 0.3.0
4
80
 
5
81
  ### Minor Changes
@@ -38,7 +114,7 @@
38
114
  - `tokenizer: string` (default `cl100k_base`) — name of the offline tokenizer; stored alongside counts so consumers know which encoder produced them.
39
115
  - `scan.maxFileSizeBytes: integer` (default `1048576`) — files larger are skipped with an `info` log.
40
116
  - `jobs.ttlSeconds: integer` (default `3600`) — global fallback TTL when an action manifest omits `expectedDurationSeconds` (typically `mode: local` actions where the field is advisory).
41
- - `jobs.perActionPriority: { <actionId>: integer }` — per-action priority overrides. Frozen on `state_jobs.priority` at submit time; overrides action manifest `defaultPriority`; overridden by CLI `--priority`. Ratifies decision #40a in the schema.
117
+ - `jobs.perActionPriority: { <actionId>: integer }` — per-action priority overrides. Frozen on `state_jobs.priority` at submit time; overrides action manifest `defaultPriority`; overridden by CLI `--priority`. Ratifies decision #40 in the schema.
42
118
  - `jobs.retention: { completed, failed }` — GC policy for `state_jobs` rows. Defaults: `completed = 2592000` (30 days), `failed = null` (never auto-prune; keep for post-mortem). `sm job prune` reads these; no implicit pruning during normal verbs.
43
119
 
44
120
  **`job-events.md` — new `Non-job events` section, Stability: experimental across v0.x:**
@@ -345,6 +421,12 @@ Tag convention: `spec-vX.Y.Z` (distinct from CLI tags `cli-vX.Y.Z`).
345
421
 
346
422
  Initial public spec bootstrap (Step 0a phases 1–3).
347
423
 
424
+ ### Changed
425
+
426
+ - `cli-contract.md`: `--all` is no longer a global flag. It is valid only on verbs that explicitly document fan-out semantics: `sm job submit`, `sm job run`, `sm job cancel`, and `sm plugins enable/disable`.
427
+ - `job-events.md`: the common `runId` envelope now explicitly documents the optional mode segment (`r-<mode>-YYYYMMDD-HHMMSS-XXXX`) used by external Skill claims, scan runs, and standalone issue recomputations.
428
+ - `versioning.md` and related prose: replace ambiguous milestone terminology with explicit versioned release language.
429
+
348
430
  ### Added
349
431
 
350
432
  - Foundation:
@@ -370,7 +452,7 @@ Initial public spec bootstrap (Step 0a phases 1–3).
370
452
 
371
453
  - JSON Schema dialect: draft 2020-12.
372
454
  - Casing: camelCase for all JSON keys (domain, configs, manifests, reports); kebab-case for filenames.
373
- - `$id` scheme: `https://skill-map.dev/spec/v<major>/<path>.schema.json`. `v0` throughout pre-1.0; bumps to `v1` at the first stable cut.
455
+ - `$id` scheme: `https://skill-map.dev/spec/v<major>/<path>.schema.json`. `v0` throughout pre-1.0; bumps to `v1` at the first stable release.
374
456
  - Identity: `node.path` (relative to scope root) is the canonical node identifier in v0. Future UUID-based `node.id` lands with write-back.
375
457
  - Required frontmatter: `name`, `description`, `metadata`, `metadata.version`.
376
458
  - Frontmatter: `additionalProperties: true` (rules handle unknown fields). Summaries: `additionalProperties: false` (strict).
package/cli-contract.md CHANGED
@@ -25,7 +25,6 @@ These flags apply to every verb unless marked otherwise.
25
25
  | `--no-color` | boolean | Disable ANSI color codes. Implementations MUST also auto-disable color when stdout is not a TTY. |
26
26
  | `-h` / `--help` | boolean | Print verb-specific or top-level help, exit 0. |
27
27
  | `--db <path>` | string | Override the database file location (escape hatch; primarily for debugging). |
28
- | `--all` | boolean | Universal fan-out. Any verb that accepts a target identifier (node path, job id, plugin id, etc.) MUST accept `--all` as "apply to every eligible target matching the verb's preconditions". Mutually exclusive with a positional target or `-n <path>` on the same invocation. Verbs that inherently target everything (`sm scan` without `-n`, `sm list`, `sm check`, `sm doctor`) accept the flag for script-composition uniformity but treat it as a no-op. Verbs where fan-out is nonsensical (`sm record`, `sm init`, `sm version`, `sm help`, `sm config get/set/reset/show`, `sm db *`, `sm serve`) MUST reject `--all` with exit `2`. |
29
28
 
30
29
  Env-var equivalents are normative:
31
30
 
@@ -40,6 +39,22 @@ CLI flag wins over env var. Env var wins over config file.
40
39
 
41
40
  ---
42
41
 
42
+ ## Targeted fan-out flags
43
+
44
+ `--all` is not global. It is only valid on verbs whose contract explicitly lists it:
45
+
46
+ - `sm job submit <action> --all`
47
+ - `sm job run --all`
48
+ - `sm job cancel --all`
49
+ - `sm plugins enable --all`
50
+ - `sm plugins disable --all`
51
+
52
+ For those verbs, `--all` means "apply to every eligible target matching the verb's preconditions" and is mutually exclusive with a positional target or `-n <path>` on the same invocation.
53
+
54
+ Implementations MUST NOT silently accept `--all` on unrelated verbs. Unsupported `--all` usage is an operational error (exit `2`), the same as any other unknown or invalid flag.
55
+
56
+ ---
57
+
43
58
  ## Exit codes
44
59
 
45
60
  All verbs use this shared table. Additional codes MAY be defined per-verb (documented under the verb).
@@ -2,7 +2,7 @@
2
2
 
3
3
  Authoritative map of JSON Schemas in `spec/schemas/` to the conformance cases that exercise them. Every schema MUST have at least one case before spec v1.0.0 ships — missing case → missing release (AGENTS.md §Rules for AI agents editing spec/).
4
4
 
5
- This file is hand-maintained. A CI check at spec cut-time compares the schema inventory against this table and fails if any schema lacks a case.
5
+ This file is hand-maintained. A CI check before spec release compares the schema inventory against this table and fails if any schema lacks a case.
6
6
 
7
7
  ## Coverage matrix
8
8
 
@@ -62,5 +62,5 @@ These have their own conformance cases even though they are not JSON Schemas.
62
62
  ## Release gates
63
63
 
64
64
  - **spec v0.x**: partial coverage acceptable. Every case added as the reference impl lands the verb that makes it runnable.
65
- - **spec v1.0.0 cut**: all rows above MUST be 🟢 covered or explicitly 🟠 deferred to v1.1 with a linked issue.
65
+ - **spec v1.0.0 release**: all rows above MUST be 🟢 covered or explicitly 🟠 deferred to v1.1 with a linked issue.
66
66
  - **CI check**: [`scripts/check-coverage.mjs`](../../scripts/check-coverage.mjs) compares `spec/schemas/**/*.schema.json` against the matrix above on every PR. A schema without a row here, or a row pointing at a missing schema, fails CI (exit 1 with a `::error::` annotation). Wired into `ci.yml` §validate and into `npm run spec:check`.
package/index.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "specVersion": "0.0.1",
2
+ "indexPayloadVersion": "0.0.1",
3
3
  "dialect": "https://json-schema.org/draft/2020-12/schema",
4
4
  "canonicalUrlPrefix": "https://skill-map.dev/spec/v0",
5
5
  "schemas": {
@@ -43,6 +43,40 @@
43
43
  {
44
44
  "id": "conformance-case",
45
45
  "path": "schemas/conformance-case.schema.json"
46
+ },
47
+ {
48
+ "id": "history-stats",
49
+ "path": "schemas/history-stats.schema.json"
50
+ }
51
+ ],
52
+ "extensions": [
53
+ {
54
+ "id": "extensions/base",
55
+ "path": "schemas/extensions/base.schema.json"
56
+ },
57
+ {
58
+ "id": "extensions/adapter",
59
+ "path": "schemas/extensions/adapter.schema.json"
60
+ },
61
+ {
62
+ "id": "extensions/detector",
63
+ "path": "schemas/extensions/detector.schema.json"
64
+ },
65
+ {
66
+ "id": "extensions/rule",
67
+ "path": "schemas/extensions/rule.schema.json"
68
+ },
69
+ {
70
+ "id": "extensions/action",
71
+ "path": "schemas/extensions/action.schema.json"
72
+ },
73
+ {
74
+ "id": "extensions/audit",
75
+ "path": "schemas/extensions/audit.schema.json"
76
+ },
77
+ {
78
+ "id": "extensions/renderer",
79
+ "path": "schemas/extensions/renderer.schema.json"
46
80
  }
47
81
  ],
48
82
  "frontmatter": [
@@ -156,18 +190,18 @@
156
190
  }
157
191
  ]
158
192
  },
159
- "specPackageVersion": "0.3.0",
193
+ "specPackageVersion": "0.5.0",
160
194
  "integrity": {
161
195
  "algorithm": "sha256",
162
196
  "files": {
163
- "CHANGELOG.md": "a9777384c89405fd2ccf16758f8973fd3f55ce5a78ea76f6f859ff86d5d37f1f",
197
+ "CHANGELOG.md": "adf0e49a213a8996cc2689749c47f2ed27cb9d31b40c18cece07b6d6ef94cd28",
164
198
  "README.md": "a233e6b5ab1c41c13cb4790485f0514f7c111880eb70165e77e1253999069120",
165
199
  "architecture.md": "be4085b7bbb3476f8a9d6df940b5794839b936ac5dd1921203a91558b008c7bc",
166
- "cli-contract.md": "4368f2cdf6884f792607a369b43ed6a8a9674cb2d2f790eb086fc961eb29689c",
200
+ "cli-contract.md": "7657b6e60089afdd3644e7e38d96593158349259ab105d76199ce5eb65993cae",
167
201
  "conformance/README.md": "4e41ff823b55ce3c274a033c5152ae0b2759fc714a714d7815593d8be84c8a4c",
168
202
  "conformance/cases/basic-scan.json": "24623da0cad8c8c54b3ff9b09820ea1276fe8b8f0fc680bf6e8abeb4edb8e424",
169
203
  "conformance/cases/kernel-empty-boot.json": "175524674b14d993d29f10080d7697074b3a2eee25b359ff903344d73c6acc98",
170
- "conformance/coverage.md": "f46b5b20649c169c4f15c721a2a9cd7f7be11566a64f8fbeb8a6b171eb420762",
204
+ "conformance/coverage.md": "405a7ee093d6e54993ec5d9e061489f8b924829c7688fe56951bebf87abb2fae",
171
205
  "conformance/fixtures/minimal-claude/agents/reviewer.md": "d0dd681ba63838301e480116aa09825329f01832b0116de5c5476fdd8a5dcf54",
172
206
  "conformance/fixtures/minimal-claude/commands/status.md": "3f36e053fd1c059ffd902f84a55be8a458c26072f97cb37dd7e97314ae2a9bf5",
173
207
  "conformance/fixtures/minimal-claude/hooks/pre-commit.md": "ec9cec8ac4ce34d40ec055ffd90e8f06ea3e5764d6ec3ee84e0d97de71b930c7",
@@ -176,19 +210,19 @@
176
210
  "conformance/fixtures/preamble-v1.txt": "1e0aeef224b64477bdc13a949c3ad402e68249caf499ecdba1302371677c068b",
177
211
  "db-schema.md": "17de515904b8869ea0fe8d3cd608423376396bed6281b784ee1670f184d29f2c",
178
212
  "interfaces/security-scanner.md": "468f8ee412594b14b389c36cefa9ca75a5dec652adbf03ab8bbc7f57ca980253",
179
- "job-events.md": "2641ef72863a24f590e2ffdb94a352e5ed5ab7123a9f04f42696f96da793bb91",
213
+ "job-events.md": "090733b47dc0bbe62d790a87a29f2a13fe1dbcb9d6a89ea16e1ecff2293e3972",
180
214
  "job-lifecycle.md": "793d34de0793596be17d2ed9042eeb4d532e805bceee25d9f9da0c3cb0b34b1c",
181
- "plugin-kv-api.md": "8079d8b4304ba3d112b5daa40c49e38e8186949b5d4166dadf5a225087b88ce7",
215
+ "plugin-kv-api.md": "fe0c02dcc7eaee0ad711f16247df076fa62348710ee1088e1234764dd3cec82e",
182
216
  "prompt-preamble.md": "9b7478ddce0a77043983f35932677d702319348048fe5d6b1c60257bd1c9f605",
183
217
  "schemas/conformance-case.schema.json": "2740874e00269de6d8121300339401d0283197b6d97dcd77538ec5d108b14de2",
184
218
  "schemas/execution-record.schema.json": "ec0f3acf1d0ce099c059d73eb434936bfd1bcf12023693bd572efb2a7352faa6",
185
- "schemas/extensions/action.schema.json": "d22a98aca9ad3d7bee475b370135372913e5756ad5987084c77e91e04c8472e8",
186
- "schemas/extensions/adapter.schema.json": "882c23b0c914eb37af5d50704268e028eb94e1601ceb5fc61aaf932f1ab82eb2",
187
- "schemas/extensions/audit.schema.json": "a871f96d340a9b72fc4cd3ce6f56a553bb6b56636e342501dcb5d3b724475502",
188
- "schemas/extensions/base.schema.json": "845f0abe723f1916354f05f6c1cd134c4b8da25fd612976f5ca1e205bf0d0fdb",
189
- "schemas/extensions/detector.schema.json": "58957bf96ca58218eadd1fceecfb0203bcc11d93eb8cef6bba90e89deca3e195",
190
- "schemas/extensions/renderer.schema.json": "a8cfc40c8be525fb69e62d53bd98f622b82599bb95e3fac66ec324d4298e46f5",
191
- "schemas/extensions/rule.schema.json": "eca5a877f3eb6d52cbe62e97bbd2ca3ccd2724bbc760e16e63d7473dfb4fa61a",
219
+ "schemas/extensions/action.schema.json": "c7520d3cefecf75d27d3e04473821fd6e5dc5a7924eede147f74275ba6caccad",
220
+ "schemas/extensions/adapter.schema.json": "429b865e738664bb437ac62690a2d7282ce992339fbb300417c73625f5cdb7c8",
221
+ "schemas/extensions/audit.schema.json": "9ec2c68584707696423a1d617bc1e003cf8ee96a2c67b2f008f6647b2927c86c",
222
+ "schemas/extensions/base.schema.json": "c832a8c9976a7ddc70b8f9226a54de14aa3e85d71bc77ed7a8671a77d599c0e4",
223
+ "schemas/extensions/detector.schema.json": "077b9cccb0bd3d58ca53d61d59c609aa42709225d187e341412a857ab341462f",
224
+ "schemas/extensions/renderer.schema.json": "2ec52545c85bb5e36d0f4f67c155b0e1656468b62a1045d2eb268255202306f0",
225
+ "schemas/extensions/rule.schema.json": "dd957deaafd41699309cb073a4620e4e8e45d3ba15541adba0e693e6d85cdf76",
192
226
  "schemas/frontmatter/agent.schema.json": "0e63d7692efb29facccc69472fff48a25f44934618346bfc09738864c6917787",
193
227
  "schemas/frontmatter/base.schema.json": "e68fbb85d3e873c4897af776eaf873860bd6e86b5abc1799e801d35c4f7937cf",
194
228
  "schemas/frontmatter/command.schema.json": "7b8463ce9c83edd2e3073dd4cd1bbeec4b42e53b03b48bc9a59e540136c2de89",
@@ -209,7 +243,7 @@
209
243
  "schemas/summaries/hook.schema.json": "36f876f3b1a60d45be97a0848c79fd18744b434dfdcefc366f033b253d56268c",
210
244
  "schemas/summaries/note.schema.json": "ae510f3ee1b6092c1061625e425c9bb7de9c9caa3f3774770c148f658d505753",
211
245
  "schemas/summaries/skill.schema.json": "f01bab92c51d64ee23e61587e42cf0dc5b37a2f518f5b12b3d1d456390338aa8",
212
- "versioning.md": "37e42e323d0bfed647b72a3bd4ffc1ddd3f71b74dda1ba56025762518f070ccb"
246
+ "versioning.md": "76a38d6b7e245a80274173a3cef791a04432e6ae3017ea3f66d7a37eb550fccf"
213
247
  }
214
248
  }
215
249
  }
package/job-events.md CHANGED
@@ -38,7 +38,7 @@ Every event is a JSON object with this envelope:
38
38
  |---|---|---|
39
39
  | `type` | always | One of the canonical event types below. |
40
40
  | `timestamp` | always | Unix milliseconds when the event was emitted. |
41
- | `runId` | always | Identifier of the `sm job run` invocation. One run emits many events. Format: `r-YYYYMMDD-HHMMSS-XXXX`. |
41
+ | `runId` | always | Identifier of the invocation that emitted the event. CLI runner loops use `r-YYYYMMDD-HHMMSS-XXXX`; synthetic or non-job runs use one optional mode segment: `r-<mode>-YYYYMMDD-HHMMSS-XXXX`. Canonical modes are `ext` (external Skill claims), `scan` (scan runs), and `check` (standalone issue recomputations). |
42
42
  | `jobId` | when job-scoped | The job the event refers to. Null for run-level events (`run.*`). |
43
43
  | `data` | per-event | Event-specific payload, shape defined below. |
44
44
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@skill-map/spec",
3
- "version": "0.3.0",
3
+ "version": "0.5.0",
4
4
  "description": "JSON Schemas, prose contracts, and conformance suite for the skill-map specification.",
5
5
  "license": "MIT",
6
6
  "type": "module",
package/plugin-kv-api.md CHANGED
@@ -197,7 +197,7 @@ Mode A is perfectly isolated at the row level: the accessor physically cannot se
197
197
 
198
198
  Mode B is **isolated against accidents, not hostile code**. The scoped `Database` wrapper rejects cross-namespace queries at runtime. But a malicious plugin running in the same JavaScript process can bypass the wrapper by importing raw engine bindings directly. Plugins are user-placed code; the kernel trusts the user's judgement at install time.
199
199
 
200
- Post-v1.0 work: signed manifest, sandboxed worker-thread isolation, per-plugin DB file. None of these land before cut 1.
200
+ Post-v1.0 work: signed manifest, sandboxed worker-thread isolation, per-plugin DB file. None of these land before `v0.5.0`.
201
201
 
202
202
  ---
203
203
 
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "type": "object",
10
10
  "required": ["id", "kind", "version", "mode", "reportSchemaRef"],
11
- "additionalProperties": false,
11
+ "unevaluatedProperties": false,
12
12
  "properties": {
13
13
  "kind": { "const": "action" },
14
14
  "mode": {
@@ -32,7 +32,7 @@
32
32
  "precondition": {
33
33
  "type": "object",
34
34
  "description": "Declarative filter that nodes must satisfy for this action to be applicable. Consumed by `--all` fan-out, UI button gating, `sm actions show`.",
35
- "additionalProperties": false,
35
+ "unevaluatedProperties": false,
36
36
  "properties": {
37
37
  "kind": {
38
38
  "type": "array",
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "type": "object",
10
10
  "required": ["id", "kind", "version", "emits", "defaultRefreshAction"],
11
- "additionalProperties": false,
11
+ "unevaluatedProperties": false,
12
12
  "properties": {
13
13
  "kind": { "const": "adapter" },
14
14
  "emits": {
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "type": "object",
10
10
  "required": ["id", "kind", "version", "composes", "reportSchemaRef"],
11
- "additionalProperties": false,
11
+ "unevaluatedProperties": false,
12
12
  "properties": {
13
13
  "kind": { "const": "audit" },
14
14
  "composes": {
@@ -18,7 +18,7 @@
18
18
  "items": {
19
19
  "type": "object",
20
20
  "required": ["kind", "id"],
21
- "additionalProperties": false,
21
+ "unevaluatedProperties": false,
22
22
  "properties": {
23
23
  "kind": { "type": "string", "enum": ["rule", "action"] },
24
24
  "id": { "type": "string" },
@@ -37,7 +37,7 @@
37
37
  "exitCodeMap": {
38
38
  "type": "object",
39
39
  "description": "How the audit report maps to CLI exit codes. Absent → standard behaviour: exit 0 on pass, 1 on any error-severity issue, 2 on operational error.",
40
- "additionalProperties": false,
40
+ "unevaluatedProperties": false,
41
41
  "properties": {
42
42
  "pass": { "type": "integer", "default": 0 },
43
43
  "fail": { "type": "integer", "default": 1 }
@@ -2,10 +2,9 @@
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
3
  "$id": "https://skill-map.dev/spec/v0/extensions/base.schema.json",
4
4
  "title": "ExtensionBase",
5
- "description": "Base manifest shape common to every extension kind. Kind-specific schemas (`adapter`, `detector`, `rule`, `action`, `audit`, `renderer`) extend this via `allOf` and add a discriminant `kind` literal plus kind-specific fields. camelCase keys throughout. `additionalProperties: false` the extension manifest shape is kernel-controlled and unknown keys are a bug.",
5
+ "description": "Base manifest shape common to every extension kind. Kind-specific schemas (`adapter`, `detector`, `rule`, `action`, `audit`, `renderer`) extend this via `allOf` and add a discriminant `kind` literal plus kind-specific fields. camelCase keys throughout. Closed-content enforcement (unknown keys = bug) lives on the kind schemas via `unevaluatedProperties: false`; those see base's evaluated keys through the `allOf` composition. Adding closure here too would force every kind schema to re-list every base key, which is the footgun the spec used to trip on before 2026-04-22.",
6
6
  "type": "object",
7
7
  "required": ["id", "kind", "version"],
8
- "additionalProperties": false,
9
8
  "properties": {
10
9
  "id": {
11
10
  "type": "string",
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "type": "object",
10
10
  "required": ["id", "kind", "version", "emitsLinkKinds", "defaultConfidence"],
11
- "additionalProperties": false,
11
+ "unevaluatedProperties": false,
12
12
  "properties": {
13
13
  "kind": { "const": "detector" },
14
14
  "emitsLinkKinds": {
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "type": "object",
10
10
  "required": ["id", "kind", "version", "format"],
11
- "additionalProperties": false,
11
+ "unevaluatedProperties": false,
12
12
  "properties": {
13
13
  "kind": { "const": "renderer" },
14
14
  "format": {
@@ -8,7 +8,7 @@
8
8
  ],
9
9
  "type": "object",
10
10
  "required": ["id", "kind", "version", "emitsRuleIds", "defaultSeverity"],
11
- "additionalProperties": false,
11
+ "unevaluatedProperties": false,
12
12
  "properties": {
13
13
  "kind": { "const": "rule" },
14
14
  "emitsRuleIds": {
package/versioning.md CHANGED
@@ -66,7 +66,7 @@ While the spec is `0.Y.Z`:
66
66
  - Conformance is advisory — failing a conformance case is a bug report, not a spec violation.
67
67
  - `specCompat` in plugins should pin a minor range (`"^0.3.0"` means `>=0.3.0 <0.4.0`), not a major range.
68
68
 
69
- The first stable commitment is `spec-v1.0.0`. That tag ships with CUT 3 / `cli-v1.0.0`.
69
+ The first stable commitment is `spec-v1.0.0`. In the current reference roadmap, that tag ships with `cli-v1.0.0`.
70
70
 
71
71
  ## Independence in practice
72
72
 
@@ -79,7 +79,7 @@ The first stable commitment is `spec-v1.0.0`. That tag ships with CUT 3 / `cli-v
79
79
  1. PR proposes a spec change. Include rationale and classification (patch/minor/major).
80
80
  2. If major, PR includes a migration note draft for `CHANGELOG.md`.
81
81
  3. If the change affects reference-impl behavior, a companion PR in `src/` lands the implementation behind the bumped `specCompat`.
82
- 4. Merge order: spec change first, implementation second. An implementation MUST NOT ship a feature that is not yet in the spec (see `CLAUDE.md`: "Every feature: update spec/ first, then src/").
82
+ 4. Merge order: spec change first, implementation second. An implementation MUST NOT ship a feature that is not yet in the spec (see `AGENTS.md`: "Every feature: update spec/ first, then src/").
83
83
  5. Tag spec release (`spec-vX.Y.Z`) independent from any CLI tag.
84
84
 
85
85
  ## Canonical URLs