@andresmassello/uscha 2.5.0 → 2.6.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.
Files changed (29) hide show
  1. package/README.md +3 -3
  2. package/package.json +1 -1
  3. package/uscha-kit/.claude/skills/uscha-adr-refine/SKILL.md +1 -1
  4. package/uscha-kit/.claude/skills/uscha-characterize/SKILL.md +1 -1
  5. package/uscha-kit/.claude/skills/uscha-devloop/SKILL.md +35 -1
  6. package/uscha-kit/.claude/skills/uscha-devloop/qa_ledger.py +452 -22
  7. package/uscha-kit/.claude/skills/uscha-discovery/SKILL.md +1 -1
  8. package/uscha-kit/.claude/skills/uscha-mirador/SKILL.md +1 -1
  9. package/uscha-kit/.claude/skills/uscha-reverse-discovery/SKILL.md +1 -1
  10. package/uscha-kit/.claude/skills/uscha-rubric/SKILL.md +1 -1
  11. package/uscha-kit/.claude/skills/uscha-status/SKILL.md +1 -1
  12. package/uscha-kit/.claude/skills/uscha-sysdoc/SKILL.md +1 -1
  13. package/uscha-kit/.claude-plugin/plugin.json +2 -2
  14. package/uscha-kit/.codex-plugin/plugin.json +1 -1
  15. package/uscha-kit/README.md +34 -3
  16. package/uscha-kit/VERSION +1 -1
  17. package/uscha-kit/WORKBENCH.md +1 -1
  18. package/uscha-kit/skills/uscha-adr-refine/SKILL.md +1 -1
  19. package/uscha-kit/skills/uscha-characterize/SKILL.md +1 -1
  20. package/uscha-kit/skills/uscha-devloop/SKILL.md +35 -1
  21. package/uscha-kit/skills/uscha-devloop/qa_ledger.py +452 -22
  22. package/uscha-kit/skills/uscha-discovery/SKILL.md +1 -1
  23. package/uscha-kit/skills/uscha-mirador/SKILL.md +1 -1
  24. package/uscha-kit/skills/uscha-reverse-discovery/SKILL.md +1 -1
  25. package/uscha-kit/skills/uscha-rubric/SKILL.md +1 -1
  26. package/uscha-kit/skills/uscha-status/SKILL.md +1 -1
  27. package/uscha-kit/skills/uscha-sysdoc/SKILL.md +1 -1
  28. package/uscha-kit/templates/CONSTITUTION.md +14 -0
  29. package/uscha-kit/uscha.config.json +2 -1
package/README.md CHANGED
@@ -45,7 +45,7 @@ runtime dependencies). The npm package is a thin router; the canonical installer
45
45
  `uscha-kit/install-uscha.py`. `init` also writes a minimal, per-repo-type `.gitignore` when the
46
46
  project has none (kit 2.4.0) — it never lists `reports/`, the ledger's own evidence.
47
47
 
48
- **Kit v2.5.0** <!-- uscha:version --> · [uscha.dev](https://uscha.dev) ·
48
+ **Kit v2.6.0** <!-- uscha:version --> · [uscha.dev](https://uscha.dev) ·
49
49
  [changelog](https://github.com/andresmassello/uscha/blob/main/uscha-kit/CHANGELOG.md)
50
50
  (the per-release changelogs live in the repo, not in the npm tarball)
51
51
 
@@ -81,7 +81,7 @@ and see which file, which test, and when.
81
81
  | `/uscha-mirador` | Bird's-eye HTML dashboard: readiness, trail, acceptance, loops |
82
82
  | `/uscha-status` | One-line progress readout, in chat |
83
83
 
84
- **A measurement engine** (`qa_ledger.py`, 56 subcommands, Python stdlib) that ingests
84
+ **A measurement engine** (`qa_ledger.py`, 57 subcommands, Python stdlib) that ingests
85
85
  evidence from **11 language stacks** — maven, gradle, ant, python, node, go, rust, dotnet,
86
86
  cpp, swift, flutter — and computes a readiness score with hard caps and visible provenance.
87
87
 
@@ -185,7 +185,7 @@ automatic tool can perform: a human verdict.
185
185
  from the compiled code: 0.815 measured (12 archetypes) — names AND behaviour
186
186
  ```
187
187
 
188
- **What each arrow is, in the engine (kit 1.96.0, 56 subcommands, all measured):**
188
+ **What each arrow is, in the engine (57 subcommands, all measured):**
189
189
 
190
190
  | Leg | Subcommands | What it establishes |
191
191
  |---|---|---|
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andresmassello/uscha",
3
- "version": "2.5.0",
3
+ "version": "2.6.0",
4
4
  "description": "Spec-driven development for LLM coding agents: 9 skills + a stdlib evidence engine. Facts block, guesses advise; the human approves.",
5
5
  "author": {
6
6
  "name": "Andres Massello",
@@ -19,7 +19,7 @@ phases. **You are NOT a generator. You are an interrogator that distills.** The
19
19
  is in the questions, not in agreeing.
20
20
 
21
21
  <!-- uscha:orientation-block:begin -->
22
- <!-- uscha kit: 2.5.0 -- generated region: edit tools/skill-blocks/, then run `python tools/gen-skill-blocks.py` (never this block by hand) -->
22
+ <!-- uscha kit: 2.6.0 -- generated region: edit tools/skill-blocks/, then run `python tools/gen-skill-blocks.py` (never this block by hand) -->
23
23
 
24
24
  ## First contact (show ONCE, then never again)
25
25
 
@@ -19,7 +19,7 @@ what the code DOES, mechanically, by running it — never what it should do.** Y
19
19
  the capture harness; you may NOT create, rename, or edit any `.approved` file.
20
20
 
21
21
  <!-- uscha:orientation-block:begin -->
22
- <!-- uscha kit: 2.5.0 -- generated region: edit tools/skill-blocks/, then run `python tools/gen-skill-blocks.py` (never this block by hand) -->
22
+ <!-- uscha kit: 2.6.0 -- generated region: edit tools/skill-blocks/, then run `python tools/gen-skill-blocks.py` (never this block by hand) -->
23
23
 
24
24
  ## First contact (show ONCE, then never again)
25
25
 
@@ -27,7 +27,7 @@ artifacts; these can block) and **self-reported** agent counts (log-step — nar
27
27
  recorded for the retrospective; a measured red always overrides a narrated green).
28
28
 
29
29
  <!-- uscha:orientation-block:begin -->
30
- <!-- uscha kit: 2.5.0 -- generated region: edit tools/skill-blocks/, then run `python tools/gen-skill-blocks.py` (never this block by hand) -->
30
+ <!-- uscha kit: 2.6.0 -- generated region: edit tools/skill-blocks/, then run `python tools/gen-skill-blocks.py` (never this block by hand) -->
31
31
 
32
32
  ## First contact (show ONCE, then never again)
33
33
 
@@ -207,6 +207,34 @@ install `hooks/block-approved-writes.py` as a `PreToolUse` hook in
207
207
  `settings.json`, and add `*.approved.* binary` to `.gitattributes` (ships in
208
208
  `templates/.gitattributes`) so line endings can't lie in the byte-compare.
209
209
 
210
+ ### QA-tool pre-flight (ADR-051; run BEFORE Phase 0a)
211
+
212
+ Phase 3 runs QA tools the kit ORCHESTRATES but does not ship (`qa_tools_order`). Before any
213
+ planning, verify they are actually installed — the devloop never assumed this before, and a loop
214
+ must not converge trusting a QA tool that never ran:
215
+
216
+ ```bash
217
+ python3 $QL qa-tools-check --repo <REPO>
218
+ ```
219
+
220
+ Every tool resolves to a source — a project skill, a global skill under ANY agent root the
221
+ installer knows (`~/.claude/skills` or `$CLAUDE_CONFIG_DIR/skills`, Codex `~/plugins/uscha/skills`,
222
+ pi `~/.agents/skills`, cursor, copilot, gemini, cline — the row names the root that hit), an
223
+ installed+enabled plugin, a harness built-in (`code-review`, assumed and reported honestly as
224
+ *not measured*), a tool you declared in `defaults.qa_tools_external`, or **MISSING**. A MISSING
225
+ tool exits 1 and persists `gate:qa-tools` (readiness cap ≤ 65, convergence blocked,
226
+ `phase --require pr-ready` refuses naming it). If a tool is MISSING, **STOP** and tell the human
227
+ the named tool: install it, enable the plugin that provides it, or declare it in
228
+ `defaults.qa_tools_external` of the project's `uscha.config.json` if it is harness-provided, then
229
+ re-run `qa-tools-check`. A LIVE config that declares this one key wins over the ledger's frozen
230
+ copy (it is a fact about the machine, not a run parameter), so no re-init is needed; a live
231
+ config that omits it leaves the frozen declaration standing, an explicit `[]` withdraws it, and
232
+ a value that is not a list of unique nonempty strings is refused by name; `doctor` and the
233
+ check print the same value and origin (`live-config` / `frozen` / `default`). The gate is written
234
+ ONLY by `qa-tools-check` — `log-gate --kind qa-tools` does not exist. A step logged while its
235
+ tool was MISSING stays `unverified` after the tool is installed: re-log it. With no
236
+ `qa_tools_order` declared the check reports UNMEASURED and persists nothing.
237
+
210
238
  ## Phase 0a — Fast-path check (ADR-003; run FIRST, before planning ceremony)
211
239
 
212
240
  If `defaults.fast_path` exists in config, run the measured classifier before demanding a
@@ -389,6 +417,12 @@ config, so `qa_tools_order` is often absent there and resolves from `defaults.ri
389
417
  project on **profile A runs `code-review` only** — do NOT invoke judgment-day or improve there,
390
418
  and convergence must not wait for them.
391
419
 
420
+ These tools are **resolved, not assumed** (ADR-051): the QA-tool pre-flight already proved each
421
+ one is a project/global skill, an installed+enabled plugin, a harness built-in, or
422
+ declared-external — and `log-step` stamps every step with its tool's resolved `source`. A step
423
+ whose tool is MISSING is recorded `unverified` and cannot satisfy convergence, so this loop never
424
+ closes on a QA pass from a tool that is not installed.
425
+
392
426
  After **each** tool pass:
393
427
 
394
428
  1. Apply only fixes at/above the severity gate. Send the rest to `ISSUES-DEFERRED.md`.