@andresmassello/uscha 2.4.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.
- package/README.md +5 -5
- 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 +455 -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/README.md +34 -3
- package/uscha-kit/VERSION +1 -1
- package/uscha-kit/WORKBENCH.md +1 -1
- 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 +455 -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,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.
|
|
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`,
|
|
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,18 +185,18 @@ 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 (
|
|
188
|
+
**What each arrow is, in the engine (57 subcommands, all measured):**
|
|
189
189
|
|
|
190
190
|
| Leg | Subcommands | What it establishes |
|
|
191
191
|
|---|---|---|
|
|
192
192
|
| Asset → typed graph | `ir-extract`, `ir-render` | the whole package becomes one canonical IR (M2, ADR-015) — deterministic, `UNTYPED` is a measurement not an error |
|
|
193
193
|
| Forward, the compiler | `compile-validate`, `compile-ingest` | any model produces code; the engine validates the output contract and never compiles (M3, ADR-016) |
|
|
194
|
-
| Forward, is it the *same* system? | `bootstrap-oracle`, `bootstrap-variance`, `bench` | a withheld oracle judges blind compilations — **12 archetypes, 8 PASS · 4 PARTIAL**, four blind compilers across two vendors (Haiku · Sonnet · Opus · OpenAI Codex `gpt-5.5`), JS included (M4/M5, ADR-017/018/028/029/042) |
|
|
194
|
+
| Forward, is it the *same* system? | `bootstrap-oracle`, `bootstrap-variance`, `bench` | a withheld oracle judges blind compilations — **12 archetypes, 8 PASS · 4 PARTIAL (measured September 2026)**, four blind compilers across two vendors (Haiku · Sonnet · Opus · OpenAI Codex `gpt-5.5`), JS included (M4/M5, ADR-017/018/028/029/042) |
|
|
195
195
|
| Reverse, facts | `discover`, `golden-diff` (+ the `/uscha-characterize` skill) | system map + mechanically captured golden; typed candidate observations with evidence class (M1, ADR-013) |
|
|
196
196
|
| Reverse, the human gate | `curate`, `promote`, `curation-check`, `bench-curate` | one verdict per candidate, append-only ledger verified against git; unjudged → `pr-ready` blocked naming it (ADR-009/010, INV-CURATION-01) |
|
|
197
197
|
| Fidelity, honestly | `fidelity`, `roundtrip`, `bench-roundtrip`, `bench-r2` | per-compiler fidelity vector, id-level round trip, recoverability **0.815**, and the **noise floor** under every variance claim (ADR-014/022/027/030) |
|
|
198
198
|
|
|
199
|
-
**Read the numbers the way the repo does.** 8 of 12 archetypes regenerate to the same system
|
|
199
|
+
**Read the numbers the way the repo does.** 8 of 12 archetypes (measured September 2026; four blind compilers — Haiku, Sonnet, Opus and OpenAI Codex gpt-5.5) regenerate to the same system
|
|
200
200
|
under an oracle the compilers never saw — that is the closed loop working. It was 9 of 12 until
|
|
201
201
|
1.99.0, when a fourth compiler from a second vendor read one genuinely ambiguous sentence in
|
|
202
202
|
`transformer` the other way and lost a case the three Claude-family models had agreed on
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andresmassello/uscha",
|
|
3
|
-
"version": "2.
|
|
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.
|
|
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.
|
|
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.
|
|
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`.
|