@andresmassello/uscha 1.56.1 → 1.60.1
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 +3 -3
- package/bin/uscha.js +0 -0
- package/package.json +2 -1
- package/uscha-kit/.claude/skills/uscha-characterize/SKILL.md +18 -0
- package/uscha-kit/.claude/skills/uscha-devloop/SKILL.md +21 -0
- package/uscha-kit/.claude/skills/uscha-devloop/qa_ledger.py +636 -0
- package/uscha-kit/.claude/skills/uscha-mirador/SKILL.md +11 -0
- package/uscha-kit/.claude/skills/uscha-mirador/mirador-watch.ps1 +22 -22
- package/uscha-kit/.claude/skills/uscha-mirador/mirador-watch.sh +0 -0
- package/uscha-kit/.claude/skills/uscha-mirador/mirador.template.html +39 -1
- package/uscha-kit/.claude/skills/uscha-status/SKILL.md +8 -0
- package/uscha-kit/.claude-plugin/plugin.json +2 -2
- package/uscha-kit/.codex-plugin/plugin.json +1 -1
- package/uscha-kit/INSTALL.md +128 -128
- package/uscha-kit/README.md +90 -1
- package/uscha-kit/VERSION +1 -1
- package/uscha-kit/hooks/block-approved-writes.py +0 -0
- package/uscha-kit/reports/junit/.fastpath-cases.json +1 -0
- package/uscha-kit/reports/junit/.goldencov-cases.json +1 -0
- package/uscha-kit/reports/junit/.specdrift-cases.json +1 -0
- package/uscha-kit/skills/uscha-characterize/SKILL.md +18 -0
- package/uscha-kit/skills/uscha-devloop/SKILL.md +21 -0
- package/uscha-kit/skills/uscha-devloop/qa_ledger.py +636 -0
- package/uscha-kit/skills/uscha-mirador/SKILL.md +11 -0
- package/uscha-kit/skills/uscha-mirador/mirador-watch.ps1 +22 -22
- package/uscha-kit/skills/uscha-mirador/mirador-watch.sh +0 -0
- package/uscha-kit/skills/uscha-mirador/mirador.template.html +39 -1
- package/uscha-kit/skills/uscha-status/SKILL.md +8 -0
- package/uscha-kit/uscha.config.json +16 -1
- package/uscha-kit/workbench-doctor.sh +0 -0
package/README.md
CHANGED
|
@@ -40,8 +40,8 @@ Requires **Python 3.8+** on the machine (the engine is Python stdlib — no pip
|
|
|
40
40
|
runtime dependencies). The npm package is a thin router; the canonical installer is
|
|
41
41
|
`uscha-kit/install-uscha.py`.
|
|
42
42
|
|
|
43
|
-
**Kit v1.
|
|
44
|
-
[changelog](https://github.com/andresmassello/uscha/blob/main/uscha-kit/CHANGELOG
|
|
43
|
+
**Kit v1.60.1** <!-- uscha:version --> · [uscha.dev](https://uscha.dev) ·
|
|
44
|
+
[changelog](https://github.com/andresmassello/uscha/blob/main/uscha-kit/CHANGELOG.md)
|
|
45
45
|
(the per-release changelogs live in the repo, not in the npm tarball)
|
|
46
46
|
|
|
47
47
|
---
|
|
@@ -76,7 +76,7 @@ and see which file, which test, and when.
|
|
|
76
76
|
| `/uscha-mirador` | Bird's-eye HTML dashboard: readiness, trail, acceptance, loops |
|
|
77
77
|
| `/uscha-status` | One-line progress readout, in chat |
|
|
78
78
|
|
|
79
|
-
**A measurement engine** (`qa_ledger.py`,
|
|
79
|
+
**A measurement engine** (`qa_ledger.py`, 32 subcommands, Python stdlib) that ingests
|
|
80
80
|
evidence from **11 language stacks** — maven, gradle, ant, python, node, go, rust, dotnet,
|
|
81
81
|
cpp, swift, flutter — and computes a readiness score with hard caps and visible provenance.
|
|
82
82
|
|
package/bin/uscha.js
CHANGED
|
File without changes
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andresmassello/uscha",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.60.1",
|
|
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",
|
|
@@ -18,6 +18,7 @@
|
|
|
18
18
|
"!uscha-kit/**/*.pyc",
|
|
19
19
|
"!uscha-kit/**/*.pyo",
|
|
20
20
|
"!uscha-kit/CHANGELOG-*.md",
|
|
21
|
+
"!uscha-kit/CHANGELOG.md",
|
|
21
22
|
"README.md",
|
|
22
23
|
"LICENSE"
|
|
23
24
|
],
|
|
@@ -190,3 +190,21 @@ covered.
|
|
|
190
190
|
|
|
191
191
|
Never overwrite an existing approved golden. If a `.received` already exists, regenerate it;
|
|
192
192
|
if a `.approved` exists, it is the human's — leave it untouched and surface the diff.
|
|
193
|
+
|
|
194
|
+
## Record the coverage map (ADR-006)
|
|
195
|
+
|
|
196
|
+
After the `.received` is produced and while the harness is still the thing that just ran,
|
|
197
|
+
record WHICH source files it exercised — the mapping that lets the fast-path veto a change
|
|
198
|
+
touching code a golden froze:
|
|
199
|
+
|
|
200
|
+
```bash
|
|
201
|
+
python qa_ledger.py golden-coverage --harness <harness> --golden <the .approved sibling>
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
This is **derived measurement, not judgment**: the agent may write `golden.coverage.json`.
|
|
205
|
+
INV-GOLDEN-01 governs the `.approved` bytes, which encode judgment, and nothing here changes
|
|
206
|
+
that — the human still approves the golden itself.
|
|
207
|
+
|
|
208
|
+
`coverage.py` is a capture-time dependency. Without it the command writes **nothing** and exits
|
|
209
|
+
2: an empty map would read as "this golden covers nothing", which is exactly the lie that would
|
|
210
|
+
let the veto pass. Skipping the map is honest; recording an empty one is not.
|
|
@@ -169,6 +169,27 @@ install `hooks/block-approved-writes.py` as a `PreToolUse` hook in
|
|
|
169
169
|
`settings.json`, and add `*.approved.* binary` to `.gitattributes` (ships in
|
|
170
170
|
`templates/.gitattributes`) so line endings can't lie in the byte-compare.
|
|
171
171
|
|
|
172
|
+
## Phase 0a — Fast-path check (ADR-003; run FIRST, before planning ceremony)
|
|
173
|
+
|
|
174
|
+
If `defaults.fast_path` exists in config, run the measured classifier before demanding a
|
|
175
|
+
full spec package:
|
|
176
|
+
|
|
177
|
+
```bash
|
|
178
|
+
python qa_ledger.py fastpath-eval --repo <name> --json # dry-run first
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
- **ALLOW** and the operator wants the shortcut: re-run with
|
|
182
|
+
`--intent "<one sentence: what and why>"` to record it, then skip Phase 0's full-package
|
|
183
|
+
demand. The micro-contract replaces it: the recorded INTENT plus at least one new/modified
|
|
184
|
+
asserting test (readiness stays capped until that test shows up in measured evidence).
|
|
185
|
+
- **DENY**: state WHICH measured signal denied it — echo the engine's breakdown verbatim.
|
|
186
|
+
The skill wires; it never computes and never argues with the verdict. Proceed with the
|
|
187
|
+
normal full path. The operator may always choose the full path over an ALLOW; nothing —
|
|
188
|
+
operator, agent or flag — can force ALLOW over a DENY (INV-RIGOR-02).
|
|
189
|
+
- **Re-evaluate before the PR step** (same command, same intent): thresholds exceeded mid-run
|
|
190
|
+
flip the run to `ESCALATED` — the derived phase blocks pr-ready and readiness is capped.
|
|
191
|
+
Produce the ADR + ACCEPTANCE the change turned out to deserve, then `resolve-escalation`.
|
|
192
|
+
|
|
172
193
|
## Phase 0 — Plan (ADR-first)
|
|
173
194
|
|
|
174
195
|
- **Read `CONSTITUTION.md` first (if present).** It lists the project invariants no SPEC
|