cyber-sdd 0.7.0 → 0.7.2

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.
Files changed (150) hide show
  1. package/.claude-plugin/plugin.json +1 -2
  2. package/.codex-plugin/plugin.json +1 -2
  3. package/CHANGELOG.md +320 -0
  4. package/agents/sdd-scanner.md +1 -1
  5. package/package.json +11 -12
  6. package/plugin.json +55 -0
  7. package/skills/align-spec/SKILL.md +1 -1
  8. package/skills/align-spec/scripts/align-spec.mjs +6755 -12
  9. package/skills/blast-estimate/README.md +3 -3
  10. package/skills/blast-estimate/scripts/blast-estimate.mjs +601 -12
  11. package/skills/check-field-mandates/scripts/check-field-mandates.mjs +253 -12
  12. package/skills/check-partition-quality/scripts/check-partition-quality.mjs +235 -12
  13. package/skills/check-plan-safety/SKILL.md +2 -3
  14. package/skills/check-plan-safety/scripts/check-plan-safety.mjs +109 -12
  15. package/skills/check-plugin-manifests/scripts/check-plugin-manifests.mjs +250 -12
  16. package/skills/check-project-specs/SKILL.md +1 -1
  17. package/skills/check-project-specs/scripts/check-project-specs.mjs +593 -12
  18. package/skills/check-retired-terms/SKILL.md +2 -3
  19. package/skills/check-retired-terms/scripts/check-retired-terms.mjs +186 -12
  20. package/skills/check-scenario-overlap/SKILL.md +1 -2
  21. package/skills/check-scenario-overlap/scripts/check-scenario-overlap.mjs +177 -12
  22. package/skills/check-spec-references/SKILL.md +2 -2
  23. package/skills/check-spec-references/scripts/check-spec-references.mjs +287 -12
  24. package/skills/check-spec-structure/SKILL.md +1 -2
  25. package/skills/check-spec-structure/scripts/check-spec-structure.mjs +243 -12
  26. package/skills/collision-ladder/README.md +2 -2
  27. package/skills/collision-ladder/scripts/collision-ladder.mjs +7047 -12
  28. package/skills/combat-log-governance/SKILL.md +1 -1
  29. package/skills/concept-index/SKILL.md +1 -1
  30. package/skills/concept-index/scripts/concept-index.mjs +183 -12
  31. package/skills/discover-plans/README.md +3 -3
  32. package/skills/discover-plans/SKILL.md +1 -1
  33. package/skills/discover-plans/scripts/discover-plans.mjs +137 -12
  34. package/skills/discover-specs/README.md +3 -3
  35. package/skills/discover-specs/SKILL.md +1 -1
  36. package/skills/discover-specs/scripts/discover-specs.mjs +321 -12
  37. package/skills/doctrine-loop/SKILL.md +1 -1
  38. package/skills/gate-validation-governance/SKILL.md +1 -1
  39. package/skills/init/README.md +2 -2
  40. package/skills/init/scripts/wire-statusline.mjs +168 -12
  41. package/skills/manage-ignore/README.md +3 -3
  42. package/skills/manage-ignore/SKILL.md +1 -2
  43. package/skills/manage-ignore/scripts/manage-ignore.mjs +285 -12
  44. package/skills/manage-scenario-bridge/README.md +3 -3
  45. package/skills/manage-scenario-bridge/SKILL.md +1 -1
  46. package/skills/manage-scenario-bridge/scripts/manage-scenario-bridge.mjs +239 -12
  47. package/skills/manage-spec-anchors/README.md +3 -3
  48. package/skills/manage-spec-anchors/SKILL.md +1 -1
  49. package/skills/manage-spec-anchors/scripts/manage-spec-anchors.mjs +310 -12
  50. package/skills/mission-graph/README.md +2 -2
  51. package/skills/mission-graph/SKILL.md +1 -1
  52. package/skills/mission-graph/scripts/mission-graph.mjs +1040 -12
  53. package/skills/pause-mission/SKILL.md +1 -1
  54. package/skills/place-node/SKILL.md +2 -2
  55. package/skills/place-node/scripts/place-node.mjs +117 -12
  56. package/skills/plan-retirement/README.md +2 -2
  57. package/skills/plan-retirement/scripts/retire-plans.mjs +123 -12
  58. package/skills/resolve-governances/README.md +3 -3
  59. package/skills/resolve-governances/SKILL.md +1 -1
  60. package/skills/resolve-governances/scripts/resolve-governances.mjs +352 -12
  61. package/skills/resolve-tracking/SKILL.md +1 -1
  62. package/skills/resolve-tracking/scripts/resolve-tracking.mjs +152 -12
  63. package/skills/scaffold-project-spec/SKILL.md +1 -1
  64. package/skills/spec-gate/README.md +12 -9
  65. package/skills/spec-gate/SKILL.md +2 -2
  66. package/skills/spec-gate/scripts/check-spec-state.mjs +422 -12
  67. package/skills/spec-gate/scripts/check-suite.mjs +6500 -12
  68. package/skills/spec-gate/scripts/classify-edit-class.mjs +6579 -12
  69. package/skills/spec-producer-governance/SKILL.md +2 -2
  70. package/skills/start-mission/SKILL.md +1 -1
  71. package/skills/suite-format-governance/README.md +1 -1
  72. package/skills/suite-format-governance/SKILL.md +1 -1
  73. package/skills/touch-set-correction/README.md +5 -5
  74. package/skills/touch-set-correction/SKILL.md +1 -1
  75. package/skills/touch-set-correction/scripts/touch-set-correction.mjs +6663 -12
  76. package/skills/verify-scenarios/README.md +6 -6
  77. package/skills/verify-scenarios/scripts/verify-scenarios.mjs +6539 -12
  78. package/.plugin/pins.json +0 -3
  79. package/.plugin/plugin.json +0 -19
  80. package/dist/align-spec/scripts/align-spec.js +0 -102
  81. package/dist/check-project-specs/scripts/check-project-specs.js +0 -312
  82. package/dist/check-scenario-overlap/scripts/check-scenario-overlap.js +0 -175
  83. package/dist/check-spec-references/scripts/check-spec-references.js +0 -285
  84. package/dist/check-spec-structure/scripts/check-spec-structure.js +0 -241
  85. package/dist/concept-index/scripts/concept-index.js +0 -181
  86. package/dist/discover-specs/scripts/discover-specs.js +0 -318
  87. package/dist/spec-gate/scripts/check-spec-state.js +0 -420
  88. package/dist/spec-gate/scripts/check-suite.js +0 -317
  89. package/dist/spec-gate/scripts/classify-edit-class.js +0 -263
  90. package/dist/spec-gate/vendor/gherkin-cli.js +0 -6369
  91. package/skills/align-spec/scripts/align-spec.bundle.mjs +0 -6753
  92. package/skills/align-spec/scripts/align-spec.mts +0 -188
  93. package/skills/blast-estimate/scripts/blast-estimate.bundle.mjs +0 -593
  94. package/skills/blast-estimate/scripts/blast-estimate.mts +0 -586
  95. package/skills/check-field-mandates/scripts/check-field-mandates.bundle.mjs +0 -251
  96. package/skills/check-field-mandates/scripts/check-field-mandates.mts +0 -337
  97. package/skills/check-partition-quality/scripts/check-partition-quality.bundle.mjs +0 -233
  98. package/skills/check-partition-quality/scripts/check-partition-quality.mts +0 -338
  99. package/skills/check-plan-safety/scripts/check-plan-safety.bundle.mjs +0 -107
  100. package/skills/check-plan-safety/scripts/check-plan-safety.mts +0 -148
  101. package/skills/check-plugin-manifests/scripts/check-plugin-manifests.bundle.mjs +0 -248
  102. package/skills/check-plugin-manifests/scripts/check-plugin-manifests.mts +0 -303
  103. package/skills/check-project-specs/scripts/check-project-specs.bundle.mjs +0 -584
  104. package/skills/check-project-specs/scripts/check-project-specs.mts +0 -370
  105. package/skills/check-retired-terms/scripts/check-retired-terms.bundle.mjs +0 -184
  106. package/skills/check-retired-terms/scripts/check-retired-terms.mts +0 -293
  107. package/skills/check-scenario-overlap/scripts/check-scenario-overlap.bundle.mjs +0 -175
  108. package/skills/check-scenario-overlap/scripts/check-scenario-overlap.mts +0 -250
  109. package/skills/check-spec-references/scripts/check-spec-references.bundle.mjs +0 -285
  110. package/skills/check-spec-references/scripts/check-spec-references.mts +0 -422
  111. package/skills/check-spec-structure/scripts/check-spec-structure.bundle.mjs +0 -241
  112. package/skills/check-spec-structure/scripts/check-spec-structure.mts +0 -347
  113. package/skills/collision-ladder/scripts/collision-ladder.bundle.mjs +0 -7041
  114. package/skills/collision-ladder/scripts/collision-ladder.mts +0 -662
  115. package/skills/concept-index/scripts/concept-index.bundle.mjs +0 -181
  116. package/skills/concept-index/scripts/concept-index.mts +0 -246
  117. package/skills/discover-plans/scripts/discover-plans.bundle.mjs +0 -135
  118. package/skills/discover-plans/scripts/discover-plans.mts +0 -215
  119. package/skills/discover-specs/scripts/discover-specs.bundle.mjs +0 -319
  120. package/skills/discover-specs/scripts/discover-specs.mts +0 -420
  121. package/skills/init/scripts/wire-statusline.bundle.mjs +0 -166
  122. package/skills/init/scripts/wire-statusline.mts +0 -279
  123. package/skills/manage-ignore/scripts/manage-ignore.bundle.mjs +0 -244
  124. package/skills/manage-ignore/scripts/manage-ignore.mts +0 -297
  125. package/skills/manage-scenario-bridge/scripts/manage-scenario-bridge.bundle.mjs +0 -237
  126. package/skills/manage-scenario-bridge/scripts/manage-scenario-bridge.mts +0 -159
  127. package/skills/manage-spec-anchors/scripts/manage-spec-anchors.bundle.mjs +0 -308
  128. package/skills/manage-spec-anchors/scripts/manage-spec-anchors.mts +0 -331
  129. package/skills/mission-graph/scripts/mission-graph.bundle.mjs +0 -1038
  130. package/skills/mission-graph/scripts/mission-graph.mts +0 -1333
  131. package/skills/place-node/scripts/place-node.bundle.mjs +0 -115
  132. package/skills/place-node/scripts/place-node.mts +0 -158
  133. package/skills/plan-retirement/scripts/retire-plans.bundle.mjs +0 -121
  134. package/skills/plan-retirement/scripts/retire-plans.mts +0 -205
  135. package/skills/resolve-governances/scripts/resolve-governances.bundle.mjs +0 -350
  136. package/skills/resolve-governances/scripts/resolve-governances.mts +0 -518
  137. package/skills/resolve-tracking/scripts/resolve-tracking.bundle.mjs +0 -150
  138. package/skills/resolve-tracking/scripts/resolve-tracking.mts +0 -214
  139. package/skills/spec-gate/scripts/check-spec-state.bundle.mjs +0 -420
  140. package/skills/spec-gate/scripts/check-spec-state.mts +0 -637
  141. package/skills/spec-gate/scripts/check-suite.bundle.mjs +0 -6498
  142. package/skills/spec-gate/scripts/check-suite.mts +0 -538
  143. package/skills/spec-gate/scripts/classify-edit-class.bundle.mjs +0 -6577
  144. package/skills/spec-gate/scripts/classify-edit-class.mts +0 -414
  145. package/skills/spec-gate/vendor/gherkin-cli.d.mts +0 -2
  146. package/skills/spec-gate/vendor/gherkin-cli.mjs +0 -6545
  147. package/skills/touch-set-correction/scripts/touch-set-correction.bundle.mjs +0 -6655
  148. package/skills/touch-set-correction/scripts/touch-set-correction.mts +0 -429
  149. package/skills/verify-scenarios/scripts/verify-scenarios.bundle.mjs +0 -6537
  150. package/skills/verify-scenarios/scripts/verify-scenarios.mts +0 -470
@@ -1,13 +1,12 @@
1
1
  {
2
- "$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
3
2
  "name": "sdd",
3
+ "version": "0.7.2",
4
4
  "description": "Spec-Driven Development. Scaffold, validate, and maintain behavioral specs (spec.md + .feature files) for software features.",
5
5
  "author": {
6
6
  "name": "unional"
7
7
  },
8
8
  "homepage": "https://github.com/cyberuni/cyber-sdd",
9
9
  "repository": "https://github.com/cyberuni/cyber-sdd",
10
- "version": "0.7.0",
11
10
  "skills": "./skills",
12
11
  "agents": [
13
12
  "./agents/sdd-automaton.md",
@@ -1,13 +1,12 @@
1
1
  {
2
- "$schema": "https://json.schemastore.org/codex-plugin-manifest.json",
3
2
  "name": "sdd",
3
+ "version": "0.7.2",
4
4
  "description": "Spec-Driven Development. Scaffold, validate, and maintain behavioral specs (spec.md + .feature files) for software features.",
5
5
  "author": {
6
6
  "name": "unional"
7
7
  },
8
8
  "homepage": "https://github.com/cyberuni/cyber-sdd",
9
9
  "repository": "https://github.com/cyberuni/cyber-sdd",
10
- "version": "0.7.0",
11
10
  "skills": "./skills",
12
11
  "agents": [
13
12
  "./agents/sdd-automaton.md",
package/CHANGELOG.md ADDED
@@ -0,0 +1,320 @@
1
+ # cyber-sdd
2
+
3
+ ## 0.7.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 60bcb1d: Include `CHANGELOG.md` in the published package.
8
+
9
+ ## 0.7.1
10
+
11
+ ### Patch Changes
12
+
13
+ - 0fbadde: fix(sdd): run the skill engines on Node 22.11 to 22.17
14
+
15
+ Git and marketplace installs ran each engine's `.mts` source directly, which Node runs without a flag only from 22.18. The engines' sources now live in `src/`, and `universal-plugin plugin build` compiles each one into a self-contained `skills/<skill>/scripts/<engine>.mjs` that runs on every install channel and on Node 22.11 or later. The `.mjs` launchers, the `.bundle.mjs` files, and the separate `dist/` build are gone. The `sdd-check-specs` bin now runs the compiled `check-project-specs.mjs`, and the package has no runtime dependencies. The canonical manifest moved from `.plugin/plugin.json` to `plugin.json`.
16
+
17
+ ## 0.7.0
18
+
19
+ ### Minor Changes
20
+
21
+ - a130c6a: Scope the two-level depth rule to capability nodes and give `design/` its own shape: the current design at the top as one file per perspective, an optional project-named version folder (such as `design/next/`) holding a full copy of the next design, a one-commit cut, and a cut trigger recorded in the placement map. The formation Warden and the architect bars judge placement by that rule.
22
+
23
+ ### Patch Changes
24
+
25
+ - 32b25db: Point the sdd Codex manifest `$schema` at the public Codex plugin manifest schema instead of the retired cyberuni/marketplace repo.
26
+ - 522cbbc: Make the skill engines run when the package is installed from npm. Node will not strip types from a file under `node_modules`, so `node <skill>/scripts/<engine>.mts` failed with `ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING`. The skills now document `node <skill>/scripts/<engine>.mjs`, a launcher that runs the `.mts` source in a checkout and a self-contained bundle (built into the package at pack time, with sibling skills inlined) under `node_modules`. `retire-plans` gains `--distilled <ledger-dir>` so the doctrine loop no longer imports the `.mts` directly.
27
+
28
+ ## 0.6.1
29
+
30
+ ### Patch Changes
31
+
32
+ - a35b43d: Align the impl-judge with the plugin contract (it now also loads `gate-validation-governance`), resolve `sdd:automaton` to `sdd:sdd-automaton`, use one `cyberlegion@<version>` form, name the `gherkin-cli` pin once, and drop history asides and repo-only references from agent and skill bodies.
33
+
34
+ ## 0.6.0
35
+
36
+ ### Minor Changes
37
+
38
+ - f4df49c: `check-field-mandates` now catches a field spelled in two cases. A field token is `UPPER_CASE` or
39
+ `snake_case`, and both spell the same field. When a definition's prose names a field in one case and
40
+ its own block declares it in the other, the check reports it as **miscased**. A lowercase word counts
41
+ as a field token only if it contains an underscore, so ordinary words in code spans are never fields.
42
+
43
+ Fixed the mismatch this was widened to catch (#29). The spec-producer's `Output` block now spells its
44
+ field `governances_loaded`, the spelling its prose, the conductor, the spec-judge and the producer
45
+ suite already use. Quill's spec-writer implements the same producer contract, and its block and prose
46
+ now use the same spelling.
47
+
48
+ ## 0.5.0
49
+
50
+ ### Minor Changes
51
+
52
+ - 7c08292: New `check-field-mandates` check: a skill or agent definition's structured blocks and its prose must
53
+ agree on their fields.
54
+
55
+ A definition ships blocks — an `Input`, an `Output`, a dispatch payload — whose fields the prose also
56
+ mandates. The check reads every `plugins/<plugin>/skills/**/SKILL.md` and `plugins/<plugin>/agents/*.md`
57
+ and reports both directions with file, line and token:
58
+
59
+ - **unexplained** — a block declares a field that carries no gloss and the prose never names.
60
+ - **undeclared** — the prose names a known field in a code span that none of the file's blocks declare.
61
+
62
+ A field is explained by a gloss on its declaration or a mention in the prose. A prose line that names
63
+ another agent's field on purpose is excused by a reasoned marker beside it:
64
+ `<!-- field-mandate-ignore: <reason> -->`. There is no allow-list and no report-only mode — a finding
65
+ always exits non-zero.
66
+
67
+ Three shipped definitions (`impl-producer-governance` among them) mandated returning a `BLOCKER` their
68
+ `Output` block had no line for; each now carries it. The bare path fields in the producer and judge
69
+ `Input` blocks now carry a gloss.
70
+
71
+ ## 0.4.2
72
+
73
+ ### Patch Changes
74
+
75
+ - f4a72e2: The spec gate's `check-suite` engine now runs from an installed plugin. It imported gherkin-cli as a package, and an installed plugin has no `node_modules`, so the producer's suite self-check failed with module-not-found. The engine now imports a self-contained gherkin-cli bundle shipped beside it.
76
+ - 770bad2: `classify-edit-class`, `touch-set-correction` and `verify-scenarios` now run from an installed plugin. Each imported gherkin-cli as a package, and an installed plugin has no `node_modules`, so each failed with module-not-found. They now import the same self-contained gherkin-cli bundle the spec gate's `check-suite` uses.
77
+
78
+ ## 0.4.1
79
+
80
+ ### Patch Changes
81
+
82
+ - f3a7f14: `concept-index` keeps whole node paths when `--spec-dir` is `.`, starts with `./`, or ends with `/`. Before, it cut characters off the front of each path, so `cli/` showed as `i/`.
83
+ - c6eaee4: Adapt to gherkin-cli 0.2: use its renamed `diff`, `parse` and `validate` entry points and injectable git reader.
84
+ - 05d4858: The conductor now hands SDD's own judges (`sdd-spec-judge`, `sdd-impl-judge`) to a dispatch capability by their definition file path, `agents/<name>.md` under the SDD plugin root, instead of by name. A capability that looks up definitions only in the project's own agent folder could not find them, so routing a judge through it failed. When the file is not there, the conductor spawns the judge as a portable cold subagent.
85
+ - f069d67: Fix the `sdd-check-specs` bin from an npm install. It pointed at the `.mts` source, which Node refuses to run under `node_modules` (`ERR_UNSUPPORTED_NODE_MODULES_TYPE_STRIPPING`). The bin and every engine it spawns now ship compiled to `dist/`; the skill still runs the `.mts` source in place.
86
+
87
+ ## 0.4.0
88
+
89
+ ### Minor Changes
90
+
91
+ - cabf38b: `start-mission` now splits its governance bars into an entry set the conductor reads before intake
92
+ and a deferred set it reads at the decision that invokes them, and requires the conductor to declare
93
+ the set it actually loaded.
94
+
95
+ The entry set — lifecycle, ownership, spec-format, suite-format, spec-producer, combat-log,
96
+ gate-validation — governs every mission, so reaching intake without it means acting unbound.
97
+ Remediation (on a `change` verdict) and impl-producer (at deliver) stay deferred: naming a governance
98
+ is not loading it. The split is by **reach, not phase** — `gate-validation` fires only at a gate yet
99
+ belongs to the entry set, because the spec-judge's pre-flight derives its expected set from its own
100
+ fixed-universal floor and checks it against the relayed producer declaration, so deferring it would
101
+ fail that pre-flight by construction.
102
+
103
+ The declaration makes the load visible: a skipped governance and a correctly loaded one no longer
104
+ look identical from outside. It is the conductor's own declaration, recorded separately from the
105
+ `producer_governances_declared` set it relays.
106
+
107
+ ## 0.3.1
108
+
109
+ ### Patch Changes
110
+
111
+ - 3f824e5: The plugin manifests carry the package version. They said `0.0.0` since the plugin was scaffolded, so `plugin update` could not tell a newer release apart.
112
+
113
+ ## 0.3.0
114
+
115
+ ### Minor Changes
116
+
117
+ - 9bb913b: A new `check-plugin-manifests` guard: a plugin manifest may declare only components the package
118
+ actually ships.
119
+
120
+ A manifest pointer naming something the package does not carry is valid JSON, satisfies the schema,
121
+ and is copied into every generated vendor manifest — so it fails only on an installer's machine,
122
+ after publish, as a component the host runtime cannot load. Nothing in the repo compared a
123
+ manifest's pointers against what ships.
124
+
125
+ The guard resolves every `./`-prefixed pointer two ways, because a component can fail to arrive in
126
+ two independent ways: against **disk** (does the path exist?) and, for a package that publishes,
127
+ against its **`files` allowlist** (will the tarball carry it?). A directory can exist and be
128
+ excluded; a `files` entry can name a directory nobody created.
129
+
130
+ Keyed on the **value shape** rather than a component-key list, so a key the manifest format adds
131
+ later is covered without editing the engine. Pointers resolve against the **plugin root**, not the
132
+ manifest's own directory, so a generated vendor manifest one level down is read correctly.
133
+
134
+ It joins the root chain as `check:plugins`, so it runs on every `pnpm verify` and in CI. A finding
135
+ always exits non-zero — there is deliberately no report-only mode, because a chain that reports
136
+ green over a defect is treated as clearance to commit.
137
+ - 4a0230a: `check-project-specs` gains a total **corpus scope** and refuses flags it does not define.
138
+
139
+ `--corpus` runs the coverage guard **and** the engine set over every project-spec in the corpus,
140
+ so a repo's commit floor checks the whole tree rather than one project. The two sub-checks compose
141
+ deliberately: the sweep only visits the specs discovery recognizes, so a spec whose lifecycle
142
+ `status` is a typo is invisible to it, while the coverage guard sees that file on disk but says
143
+ nothing about whether the engines pass.
144
+
145
+ **Breaking for callers of `--check-coverage`:** that flag is removed, and an unrecognized flag is
146
+ now an error instead of falling through to project scope. The fall-through was silent — project
147
+ scope at a repo root resolves no governing spec and exits `0` — so a coverage-only flag could guard
148
+ every commit and every CI run while running no engine at all. Replace `--check-coverage` with
149
+ `--corpus`.
150
+
151
+ ## 0.2.1
152
+
153
+ ### Patch Changes
154
+
155
+ - 405b8de: Spec discovery no longer descends into a nested checkout.
156
+
157
+ The filesystem walk was guarded by a name blocklist — `node_modules`, `.git`, `dist`, `.turbo`,
158
+ `.next`, `coverage`. A name list can say "this is called X"; it cannot say "this is where the tree
159
+ stops". A nested git checkout is a full copy of the repository inside the repository, and nothing
160
+ stopped the walk from descending into one, so every spec in the corpus was discovered once per
161
+ nested checkout.
162
+
163
+ The guard was also one level off from where it was needed: `.git` was already in the blocklist, so
164
+ the walk skipped the **metadata directory** while descending straight into the **checkout that
165
+ directory marks**.
166
+
167
+ Agent harnesses that isolate work in a git worktree check the repo out inside itself, which is how
168
+ this surfaced: seven such worktrees turned a 10-spec corpus into 38 discovered spec files. The loud
169
+ symptom was `check-project-specs` failing with "`packages/x` is claimed by 8 specs — a project has
170
+ exactly one spec", breaking `pnpm verify`. The quiet symptom was worse: `check-suite`,
171
+ `concept-index`, `check-scenario-overlap`, `check-spec-structure`, and the formation Warden all
172
+ reported green over a corpus nearly 4x duplicated. A guard passing over a corpus nobody has is worse
173
+ than one that fails.
174
+
175
+ Discovery now skips any directory that is itself a checkout — one carrying its own `.git`, whether a
176
+ **directory** (a clone) or a **file** holding a `gitdir:` pointer (a worktree or a submodule). Both
177
+ forms matter: guarding only on the directory form would miss the worktree case that caused this.
178
+
179
+ The rule is structural rather than a name, so it also covers submodules, vendored clones, and
180
+ whatever the next harness invents, without naming any of them. A directory that merely _resembles_ a
181
+ checkout by name but carries no `.git` of its own is still part of this tree and is still scanned.
182
+
183
+ All three walk sites are guarded: the fixed-convention scan, the `**` any-depth expansion behind
184
+ extra anchors, and the `<project>` glob frontier.
185
+
186
+ ## 0.2.0
187
+
188
+ ### Minor Changes
189
+
190
+ - 3b8b39a: The `## Use Cases` section now carries actor, goal, and extensions — not just entry points.
191
+
192
+ A use case was defined as an **entry point**: one row per way the capability is invoked, given as
193
+ trigger / inputs / outcome and named to its implementation surface. That definition had stood since
194
+ the section was introduced. It never drifted; it was narrow from the origin.
195
+
196
+ The requirements-engineering definition is actor + goal + main success path + **extensions** — the
197
+ alternate, error and divergence paths. Extensions is where "what can go wrong for this actor" and
198
+ "which of these inputs may be combined" live, and a trigger / inputs / outcome row has nowhere to
199
+ put any of it. The practical cost: a spec could satisfy the bar completely and still carry no
200
+ analysis of why each element of a designed surface exists, what breaks it, or which combinations
201
+ are valid. A judge would then confirm the section existed and each row mapped to a scenario, and
202
+ pass it — coverage of what is present cannot detect what should not be present.
203
+
204
+ What changes for spec authors:
205
+ - **Use cases are enumerated by actor, never by entry point.** Walking the interface returns only
206
+ the use cases that interface already implies, and is structurally blind to the one nobody built.
207
+ List the actors first — including whoever is affected by the outcome without invoking it — then
208
+ their goals, then map goals to entry points. Both mismatches are findings: a goal no entry point
209
+ serves, and an entry point no listed goal reaches. The enumeration is checkable in both
210
+ directions. On a backfill, source yields only the _served_ use cases by construction, and an
211
+ inferred set is never reported as complete.
212
+ - **A use case carries four parts** — actor / goal (one line each, not a persona), the entry point
213
+ (trigger / inputs / outcome, unchanged), and its **extensions**. An extension is _any path from
214
+ the trigger that does not reach the success outcome_, stated with its cause and outcome. The
215
+ recurring kinds (refusal, error, boundary, partial result, contended or absent input) are a
216
+ prompt to search with, **not a closed set**.
217
+ - **`extensions: none — <why>` is written explicitly** when a use case has no divergence, so the
218
+ claim is contestable rather than silently absent.
219
+ - **Every element of the public surface traces to a use case that needs it** — each flag, option,
220
+ parameter, prop, or event names the use case requiring it and the elements it may not be combined
221
+ with. An element no use case needs is an **orphan**: cut it or name the use case. This is the same
222
+ orphan-detection discipline as `## Scenario map`, one level up.
223
+ - **Degenerate surfaces stay cheap.** A capability with one entry point and no optional elements
224
+ records the trace in a line, never a table — the obligation is that nothing on the surface is
225
+ unaccounted for, not that a table exists.
226
+
227
+ The three spec-gate actor bars each take a duty in their own domain rather than a shared copy:
228
+ **Oracle** rules cut-or-justify on unbought surface and treats an actor or goal that restates the
229
+ mechanism as an unanswered Why; **Builder** requires every stated extension to be a
230
+ path in the control-flow graph, so the graph supplies the scenario rather than the prose, and judges
231
+ `extensions: none` as a claim; **Architect** requires the graph to reach every stated extension,
232
+ since an extension with no edge is a dangling branch read from the prose side. **Oracle**
233
+ additionally grades the actor enumeration in both directions.
234
+
235
+ **The CFG remains the single source scenarios derive from.** Extensions are a _discovery
236
+ instrument_, not a parallel specification: a graph drawn from an implementation reproduces what the
237
+ code already does and can never say a branch is missing, whereas asking what can go wrong for this
238
+ actor finds it. So an extension earns its scenario by being a path in the graph — never by being
239
+ drawn from the stated list, which would make the suite 1:1 with that list by construction and
240
+ unable to surface a hole. A use case is therefore **not** 1:1 with a scenario.
241
+
242
+ Existing specs are **not** swept — the restored shape applies to new and revised nodes, so no
243
+ in-flight change inherits a bar its node has not adopted. Backfilling the existing corpus one node
244
+ at a time is tracked separately.
245
+
246
+ ## 0.1.0
247
+
248
+ ### Minor Changes
249
+
250
+ - 4f6dd97: Rename the package from `@cyberplace/sdd-plugin` to `cyber-sdd` and make it self-sufficient for a
251
+ standalone install: `gherkin-cli` is now a real dependency (imported directly, no longer shelled
252
+ out via `npx`), and `package.json#files` ships the right surface (skills, agents, plugin manifests)
253
+ for `npm install`.
254
+
255
+ Fixes a bug where concurrent `.feature` checks could corrupt the shared `npx` install cache under
256
+ load, intermittently breaking `check:spec`.
257
+
258
+ - 1c91b5c: Add `check-retired-terms` — a declared registry of retired paths and conventions (`.agents/sdd/retired-terms.toml`) plus a verify-time sweep over every git-tracked file that reports each surviving occurrence as `file:line:term` with its replacement and exits non-zero. Narrowed by built-in exclusions (the guard's own definition, durable provenance), a per-entry scope, and a two-form allow list. A malformed registry fails loud rather than falling back — the registry is the check.
259
+ - a9c5528: The doctrine-loop Scanner now cross-checks each plan brief's own `todos-all-done` against its
260
+ declared `source-closed` during its pass, and derives a **retirement clearance set** from
261
+ agreement — feeding it to `plan-retirement`'s existing `--retire` clearance-set input instead of a
262
+ human hand-assembling it. It never autofixes a plan brief's frontmatter `status` (no legal terminal
263
+ value exists for that field); a disagreement between the two signals is excluded from the clearance
264
+ set and surfaced as a flagged finding in the Scanner's pass summary instead.
265
+ - 1884751: Add the plan-brief finalize backstop to the SDD conductor: a mission that lands now reconciles its plan brief's `todos` and `## NEXT` anchor to the landed state, in the same change as the work, rather than leaving the drift to a later retro.
266
+
267
+ The reconcile is a backstop — it runs in one pass over the whole brief even when nothing updated it mid-flight — and it reconciles _to the landed state_, never _marks everything done_: a todo whose work was held out of scope stays un-completed and rides the follow-up machinery. It writes the brief and nothing else, including no terminal value in the plan-level `status` dispatch flag, which stays `active | approved` with terminal-ness derived. A mission that halts is checkpointed at its true in-progress state, not reconciled as landed.
268
+
269
+ - b9ee04d: The SDD spec-judge now emits a non-blocking spec-format conformance warning when a behavioral
270
+ `spec.md` is missing a required section — especially `## Use Cases`, `## Control Flow` (CFG), or
271
+ `## Scenario map`. The warning is surfaced in the spec-gate report and never blocks the gate, sets
272
+ `ALIGNED: false`, or short-circuits the lenses on its own. Reference and descriptive nodes raise no
273
+ warning.
274
+
275
+ ### Patch Changes
276
+
277
+ - 05e1f1a: SDD combat-log: off-enum cause visibility nudge (`cause-candidate` flag) + reconcile gate stop-cause enum to `dimension|clearance|ceiling` (discharges 263-op6-m2).
278
+ - ebee17d: SDD cold-instrument doctrine: mutation-sweep-first for instrument subjects; non-author evidence for rule-level decisions; new/revived rules stated abstractly + ablation-tested before landing.
279
+ - 9d3ff29: **Fix** — SDD skill-script CLIs silently no-opped on the supported Node floor. The entrypoint
280
+ guard used `import.meta.main`, added only in Node 24.2.0, while the engines floor is `>=22`; on
281
+ Node 22/23 the guard was `undefined`, so the `bin` ran nothing and exited 0. Switched all 19
282
+ affected scripts — and 7 more that used the `file://${process.argv[1]}` concat, which breaks on
283
+ any install path holding a space, `#`, `?`, or `%`, and under the symlink npm creates for a `bin`
284
+ — to the portable `pathToFileURL(realpathSync(process.argv[1])).href === import.meta.url`
285
+ entrypoint check. Adds a guard test so no shipped script can regress to either form. Fixes #272.
286
+ - ff85de9: verify-scenarios: bind a scenario whose test title differs only by punctuation or whitespace
287
+
288
+ A curly apostrophe pasted where the frozen `.feature` has a straight one used to land the same
289
+ scenario in BOTH the UNBOUND list and the EXTRA list, with nothing saying the two were the same
290
+ binding — so a real signal read as an unbound scenario and got hand-judged at every impl gate. The
291
+ fold now retries an unmatched key against unclaimed results on a punctuation- and whitespace-folded
292
+ comparison key (curly quotes/apostrophes, dashes, ellipsis), and reports the bind as a **probable
293
+ title mismatch** naming both verbatim titles so the typo still gets fixed. Titles are never
294
+ rewritten, an exact match always wins, case is not folded, and an ambiguous fold stays UNBOUND.
295
+
296
+ Closes #312.
297
+
298
+ - a3c25a6: SDD spec-gate checks escalate malformed input instead of failing open. A root `spec.md` whose `status` is missing or outside the lifecycle enum is now a `check-spec-state` violation, and a per-project `check-project-specs` run that finds such a spec escalates instead of reporting "no spec governs — skipped" with exit 0 (#316). A `## Use Cases` data row whose `Scenario` cell is empty or absent is reported like an un-backticked one, rather than skipped (#364). Also drops the dangling spec-tree pointers shipped scripts and skills cited — a repo-only path is a broken link for every installed user (#290).
299
+ - 59e08d9: **Fix** — `plugin-contract-governance`'s role-loads table dropped `architect-spec` from the
300
+ spec-producer row, so plugin authors built agents that loaded three bars and were graded against
301
+ four.
302
+
303
+ The table contradicted its own preamble two lines above it, which states the spec-gate lens set as
304
+ `{oracle, builder, architect}` and that "a producer self-aligns to exactly the bars its judge
305
+ grades". The impl-producer row one line below correctly carried its `architect-impl` bar against its
306
+ own `{builder, architect}` set, which is what identifies the spec-producer row as a dropped cell
307
+ rather than a deliberate narrowing. `spec-producer-governance` — the procedural authority — and
308
+ `design/specialists-and-squads.md` — the table's declared owner — both name all three bars.
309
+
310
+ The cost was measured, not theoretical: six of six cold spec-judges blocked at governance pre-flight
311
+ on a plugin built to this row, and when the affected nodes were re-authored with the missing bar
312
+ loaded, six of six carried a real defect only that bar caught.
313
+
314
+ Also notes in the table's preamble that it is a shipped copy of a spec-owned table, restated because
315
+ a governance loads standalone and cannot reach the spec tree — so a row missing part of its lens set
316
+ should be read as a transcription slip.
317
+
318
+ - b9260f8: Scanner detects an already-distilled mission by parsing the ledger as JSONL, never a substring grep (reuses `distilledCrRefs`; no engine change).
319
+ - 1acc068: Codify Rule 1 (doctrine keep): a fold/aggregation node whose rule combines two or more interacting conditions states its rule in closed form — and re-derives its soundness against the real data model — before deriving scenarios; single-condition folds may be by example. Buys convergence, not coverage: pair with a mutation sweep and a safety dual. Includes the matrix corollary (draw every independent cell as a CFG branch, exclude degenerate cells). Realized in `suite-format-governance`, `spec-producer-governance` (fold instruction before scenario authoring), and `builder-spec-governance`.
320
+ - 946429d: SDD doctrine: sanity-check a split's organizing axis against a real capability boundary (#388); prove a Clearance repair isn't a back-fit via pre-repair-draft failure (#389).
@@ -82,7 +82,7 @@ count** maintained in the ledger.
82
82
  idempotent: **before drafting**, detect whether the mission was **already distilled** (a prior
83
83
  `strategy` entry whose `distills` equals its `<cr-ref>`) and if so **draft nothing**. Decide this by a
84
84
  **structured JSONL parse, never a substring/regex text match** — **reuse** the exported
85
- `distilledCrRefs` engine from `../skills/plan-retirement/scripts/retire-plans.mts` over the project
85
+ `distilledCrRefs` engine from `../skills/plan-retirement/scripts/retire-plans.mjs` over the project
86
86
  `ledger/` directory and membership-test the `<cr-ref>`. It parses each line with `JSON.parse`, so it
87
87
  is correct against a **pretty-printed** entry (a space after the colon), a wrapped or reordered
88
88
  object — a naive no-space grep (`"distills":"<cr-ref>"`) silently under-counts and re-drafts an
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cyber-sdd",
3
- "version": "0.7.0",
3
+ "version": "0.7.2",
4
4
  "description": "Spec-Driven Development. Scaffold, validate, and maintain behavioral specs (spec.md + .feature files) for software features.",
5
5
  "repository": {
6
6
  "type": "git",
@@ -10,32 +10,31 @@
10
10
  "license": "MIT",
11
11
  "type": "module",
12
12
  "bin": {
13
- "sdd-check-specs": "./dist/check-project-specs/scripts/check-project-specs.js"
13
+ "sdd-check-specs": "./skills/check-project-specs/scripts/check-project-specs.mjs"
14
14
  },
15
15
  "files": [
16
- "dist",
17
16
  "skills",
18
17
  "agents",
19
- ".plugin",
18
+ "plugin.json",
20
19
  ".codex-plugin",
21
20
  ".claude-plugin",
22
- "!skills/**/*.test.mts"
21
+ "CHANGELOG.md"
23
22
  ],
24
- "dependencies": {
25
- "gherkin-cli": "0.2.1"
26
- },
27
23
  "homepage": "https://github.com/cyberuni/cyber-sdd",
28
24
  "devDependencies": {
29
- "tsdown": "^0.23.0"
25
+ "gherkin-cli": "0.2.1",
26
+ "tsdown": "^0.23.0",
27
+ "universal-plugin": "^0.16.0"
30
28
  },
31
29
  "engines": {
32
30
  "node": ">=22.11"
33
31
  },
34
32
  "scripts": {
35
- "build": "tsdown && node scripts/build-skill-engines.mjs",
33
+ "build:skills": "universal-plugin plugin build",
36
34
  "build:vendor": "tsdown -c tsdown.vendor.config.ts",
37
- "check:spec": "node ./skills/check-project-specs/scripts/check-project-specs.mts",
38
- "test": "node --test \"skills/*/scripts/*.test.mts\"",
35
+ "check:scripts": "universal-plugin plugin build --check",
36
+ "check:spec": "node ./src/check-project-specs/check-project-specs.mts",
37
+ "test": "node --test \"src/**/*.test.mts\"",
39
38
  "typecheck": "tsc -p tsconfig.json"
40
39
  }
41
40
  }
package/plugin.json ADDED
@@ -0,0 +1,55 @@
1
+ {
2
+ "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json",
3
+ "name": "sdd",
4
+ "version": "0.7.2",
5
+ "description": "Spec-Driven Development. Scaffold, validate, and maintain behavioral specs (spec.md + .feature files) for software features.",
6
+ "author": {
7
+ "name": "unional"
8
+ },
9
+ "homepage": "https://github.com/cyberuni/cyber-sdd",
10
+ "repository": "https://github.com/cyberuni/cyber-sdd",
11
+ "skills": "./skills",
12
+ "agents": [
13
+ "./agents/sdd-automaton.md",
14
+ "./agents/sdd-impl-judge.md",
15
+ "./agents/sdd-scanner.md",
16
+ "./agents/sdd-spec-judge.md",
17
+ "./agents/sdd-warden.md"
18
+ ],
19
+ "extensions": {
20
+ "org.cyberuni.universal-plugin": {
21
+ "vendors": ["claude-code", "codex"],
22
+ "scripts": {
23
+ "skills/align-spec/scripts/align-spec.mjs": "src/align-spec/align-spec.mts",
24
+ "skills/blast-estimate/scripts/blast-estimate.mjs": "src/blast-estimate/blast-estimate.mts",
25
+ "skills/check-field-mandates/scripts/check-field-mandates.mjs": "src/check-field-mandates/check-field-mandates.mts",
26
+ "skills/check-partition-quality/scripts/check-partition-quality.mjs": "src/check-partition-quality/check-partition-quality.mts",
27
+ "skills/check-plan-safety/scripts/check-plan-safety.mjs": "src/check-plan-safety/check-plan-safety.mts",
28
+ "skills/check-plugin-manifests/scripts/check-plugin-manifests.mjs": "src/check-plugin-manifests/check-plugin-manifests.mts",
29
+ "skills/check-project-specs/scripts/check-project-specs.mjs": "src/check-project-specs/check-project-specs.mts",
30
+ "skills/check-retired-terms/scripts/check-retired-terms.mjs": "src/check-retired-terms/check-retired-terms.mts",
31
+ "skills/check-scenario-overlap/scripts/check-scenario-overlap.mjs": "src/check-scenario-overlap/check-scenario-overlap.mts",
32
+ "skills/check-spec-references/scripts/check-spec-references.mjs": "src/check-spec-references/check-spec-references.mts",
33
+ "skills/check-spec-structure/scripts/check-spec-structure.mjs": "src/check-spec-structure/check-spec-structure.mts",
34
+ "skills/collision-ladder/scripts/collision-ladder.mjs": "src/collision-ladder/collision-ladder.mts",
35
+ "skills/concept-index/scripts/concept-index.mjs": "src/concept-index/concept-index.mts",
36
+ "skills/discover-plans/scripts/discover-plans.mjs": "src/discover-plans/discover-plans.mts",
37
+ "skills/discover-specs/scripts/discover-specs.mjs": "src/discover-specs/discover-specs.mts",
38
+ "skills/init/scripts/wire-statusline.mjs": "src/init/wire-statusline.mts",
39
+ "skills/manage-ignore/scripts/manage-ignore.mjs": "src/manage-ignore/manage-ignore.mts",
40
+ "skills/manage-scenario-bridge/scripts/manage-scenario-bridge.mjs": "src/manage-scenario-bridge/manage-scenario-bridge.mts",
41
+ "skills/manage-spec-anchors/scripts/manage-spec-anchors.mjs": "src/manage-spec-anchors/manage-spec-anchors.mts",
42
+ "skills/mission-graph/scripts/mission-graph.mjs": "src/mission-graph/mission-graph.mts",
43
+ "skills/place-node/scripts/place-node.mjs": "src/place-node/place-node.mts",
44
+ "skills/plan-retirement/scripts/retire-plans.mjs": "src/plan-retirement/retire-plans.mts",
45
+ "skills/resolve-governances/scripts/resolve-governances.mjs": "src/resolve-governances/resolve-governances.mts",
46
+ "skills/resolve-tracking/scripts/resolve-tracking.mjs": "src/resolve-tracking/resolve-tracking.mts",
47
+ "skills/spec-gate/scripts/check-spec-state.mjs": "src/spec-gate/check-spec-state.mts",
48
+ "skills/spec-gate/scripts/check-suite.mjs": "src/spec-gate/check-suite.mts",
49
+ "skills/spec-gate/scripts/classify-edit-class.mjs": "src/spec-gate/classify-edit-class.mts",
50
+ "skills/touch-set-correction/scripts/touch-set-correction.mjs": "src/touch-set-correction/touch-set-correction.mts",
51
+ "skills/verify-scenarios/scripts/verify-scenarios.mjs": "src/verify-scenarios/verify-scenarios.mts"
52
+ }
53
+ }
54
+ }
55
+ }
@@ -35,7 +35,7 @@ node "<skill>/scripts/align-spec.mjs" [--spec-dir <spec>] [--nodes <a,b,...>] [-
35
35
 
36
36
  ## The procedure — Detect
37
37
 
38
- Detect has two layers, and this skill's engine (`scripts/align-spec.mts`) ships code for only
38
+ Detect has two layers, and this skill's engine (`scripts/align-spec.mjs`) ships code for only
39
39
  the mechanical one:
40
40
 
41
41
  1. **Mechanical scenario-diff (engine code)** — for each node's `.feature`, run the same