@andresmassello/uscha 2.5.0 → 2.7.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/README.md +14 -3
- package/package.json +1 -1
- package/uscha-kit/.claude/skills/uscha-adr-refine/SKILL.md +1 -1
- package/uscha-kit/.claude/skills/uscha-characterize/SKILL.md +1 -1
- package/uscha-kit/.claude/skills/uscha-devloop/SKILL.md +35 -1
- package/uscha-kit/.claude/skills/uscha-devloop/qa_ledger.py +469 -22
- package/uscha-kit/.claude/skills/uscha-discovery/SKILL.md +1 -1
- package/uscha-kit/.claude/skills/uscha-mirador/SKILL.md +1 -1
- package/uscha-kit/.claude/skills/uscha-reverse-discovery/SKILL.md +1 -1
- package/uscha-kit/.claude/skills/uscha-rubric/SKILL.md +1 -1
- package/uscha-kit/.claude/skills/uscha-status/SKILL.md +1 -1
- package/uscha-kit/.claude/skills/uscha-sysdoc/SKILL.md +1 -1
- package/uscha-kit/.claude-plugin/plugin.json +2 -2
- package/uscha-kit/.codex-plugin/plugin.json +1 -1
- package/uscha-kit/INSTALL.md +7 -0
- package/uscha-kit/README.md +49 -3
- package/uscha-kit/VERSION +1 -1
- package/uscha-kit/WORKBENCH.md +1 -1
- package/uscha-kit/install-uscha.py +215 -2
- package/uscha-kit/skills/uscha-adr-refine/SKILL.md +1 -1
- package/uscha-kit/skills/uscha-characterize/SKILL.md +1 -1
- package/uscha-kit/skills/uscha-devloop/SKILL.md +35 -1
- package/uscha-kit/skills/uscha-devloop/qa_ledger.py +469 -22
- package/uscha-kit/skills/uscha-discovery/SKILL.md +1 -1
- package/uscha-kit/skills/uscha-mirador/SKILL.md +1 -1
- package/uscha-kit/skills/uscha-reverse-discovery/SKILL.md +1 -1
- package/uscha-kit/skills/uscha-rubric/SKILL.md +1 -1
- package/uscha-kit/skills/uscha-status/SKILL.md +1 -1
- package/uscha-kit/skills/uscha-sysdoc/SKILL.md +1 -1
- package/uscha-kit/templates/CONSTITUTION.md +14 -0
- package/uscha-kit/uscha.config.json +2 -1
package/README.md
CHANGED
|
@@ -45,7 +45,18 @@ 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
|
-
|
|
48
|
+
The kit declares no dependencies and installs none. Since kit 2.7.0 (ADR-052) `install` ends
|
|
49
|
+
with an **extras report** and the installer's `doctor` repeats it as an advisory section: how
|
|
50
|
+
the dev loop's QA tools (`code-review`, `judgment-day`, `improve`, the kit default order) resolve
|
|
51
|
+
on the target machine — through the engine's own resolver, so `code-review` reads "assumed,
|
|
52
|
+
harness-provided, not measured" — and whether the optional engram (uscha does not require it)
|
|
53
|
+
is present, with the commands to add it. Present means usable from Claude: the engram plugin
|
|
54
|
+
installed and enabled, or an MCP server named `engram` in the Claude configuration; a bare
|
|
55
|
+
binary on PATH reads "binary found, not wired into Claude". The MCP check reads only the Claude
|
|
56
|
+
configuration, for `--target codex` too. It only reports: it installs nothing, asks nothing and
|
|
57
|
+
runs none of the commands it prints, and it never changes an exit code.
|
|
58
|
+
|
|
59
|
+
**Kit v2.7.0** <!-- uscha:version --> · [uscha.dev](https://uscha.dev) ·
|
|
49
60
|
[changelog](https://github.com/andresmassello/uscha/blob/main/uscha-kit/CHANGELOG.md)
|
|
50
61
|
(the per-release changelogs live in the repo, not in the npm tarball)
|
|
51
62
|
|
|
@@ -81,7 +92,7 @@ and see which file, which test, and when.
|
|
|
81
92
|
| `/uscha-mirador` | Bird's-eye HTML dashboard: readiness, trail, acceptance, loops |
|
|
82
93
|
| `/uscha-status` | One-line progress readout, in chat |
|
|
83
94
|
|
|
84
|
-
**A measurement engine** (`qa_ledger.py`,
|
|
95
|
+
**A measurement engine** (`qa_ledger.py`, 57 subcommands, Python stdlib) that ingests
|
|
85
96
|
evidence from **11 language stacks** — maven, gradle, ant, python, node, go, rust, dotnet,
|
|
86
97
|
cpp, swift, flutter — and computes a readiness score with hard caps and visible provenance.
|
|
87
98
|
|
|
@@ -185,7 +196,7 @@ automatic tool can perform: a human verdict.
|
|
|
185
196
|
from the compiled code: 0.815 measured (12 archetypes) — names AND behaviour
|
|
186
197
|
```
|
|
187
198
|
|
|
188
|
-
**What each arrow is, in the engine (
|
|
199
|
+
**What each arrow is, in the engine (57 subcommands, all measured):**
|
|
189
200
|
|
|
190
201
|
| Leg | Subcommands | What it establishes |
|
|
191
202
|
|---|---|---|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andresmassello/uscha",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.7.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.
|
|
22
|
+
<!-- uscha kit: 2.7.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.
|
|
22
|
+
<!-- uscha kit: 2.7.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.
|
|
30
|
+
<!-- uscha kit: 2.7.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`.
|