@andresmassello/uscha 1.94.1 → 1.95.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 +2 -2
- package/package.json +1 -1
- package/uscha-kit/.claude/skills/uscha-devloop/qa_ledger.py +20 -21
- package/uscha-kit/.claude-plugin/plugin.json +1 -1
- package/uscha-kit/.codex-plugin/plugin.json +1 -1
- package/uscha-kit/README.md +1 -1
- package/uscha-kit/VERSION +1 -1
- package/uscha-kit/skills/uscha-devloop/qa_ledger.py +20 -21
- package/uscha-kit/uscha.config.json +1 -1
package/README.md
CHANGED
|
@@ -40,7 +40,7 @@ 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.
|
|
43
|
+
**Kit v1.95.0** <!-- uscha:version --> · [uscha.dev](https://uscha.dev) ·
|
|
44
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
|
|
|
@@ -85,7 +85,7 @@ automatic tool can perform: a human verdict.
|
|
|
85
85
|
from the compiled code: 0.828 measured (12 archetypes) — names AND behaviour
|
|
86
86
|
```
|
|
87
87
|
|
|
88
|
-
**What each arrow is, in the engine (kit 1.
|
|
88
|
+
**What each arrow is, in the engine (kit 1.95.0, 53 subcommands, all measured):**
|
|
89
89
|
|
|
90
90
|
| Leg | Subcommands | What it establishes |
|
|
91
91
|
|---|---|---|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@andresmassello/uscha",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.95.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",
|
|
@@ -7053,11 +7053,10 @@ def _struct_distance(a, b):
|
|
|
7053
7053
|
|
|
7054
7054
|
|
|
7055
7055
|
def _oracle_hash(arm_dir):
|
|
7056
|
-
|
|
7057
|
-
|
|
7058
|
-
|
|
7059
|
-
|
|
7060
|
-
return None
|
|
7056
|
+
# the arm's withheld oracle, hashed by exact bytes -- an arm whose oracle differs by one
|
|
7057
|
+
# byte is a different experiment (cmd_lang_compare refuses the pair). Same rule, and now the
|
|
7058
|
+
# same code, as a manifest unit: `_sha256_file`.
|
|
7059
|
+
return _sha256_file(os.path.join(arm_dir, "oracle", "ORACLE.json"))
|
|
7061
7060
|
|
|
7062
7061
|
|
|
7063
7062
|
def cmd_lang_compare(args):
|
|
@@ -7548,11 +7547,18 @@ DEFAULT_STATIC_ZERO_AT = 10 # gated-open count at which the static dimension hi
|
|
|
7548
7547
|
BANDS = [(95, "READY"), (80, "RELEASE CANDIDATE"), (50, "IN PROGRESS"), (0, "NOT READY")]
|
|
7549
7548
|
|
|
7550
7549
|
|
|
7551
|
-
def
|
|
7552
|
-
|
|
7550
|
+
def _banded(score, bands):
|
|
7551
|
+
"""The label of the highest floor the score reaches. Every band table ends at floor 0, so
|
|
7552
|
+
the last row IS the default -- named once here instead of being restated as a trailing
|
|
7553
|
+
`return` in four callers, where it read as a fifth band nobody could reach (1.95.0)."""
|
|
7554
|
+
for floor, label in bands:
|
|
7553
7555
|
if score >= floor:
|
|
7554
7556
|
return label
|
|
7555
|
-
return
|
|
7557
|
+
return bands[-1][1]
|
|
7558
|
+
|
|
7559
|
+
|
|
7560
|
+
def _band(score):
|
|
7561
|
+
return _banded(score, BANDS)
|
|
7556
7562
|
|
|
7557
7563
|
|
|
7558
7564
|
_AC_ID = re.compile(r"(?i)^[*_`]*\s*AC[-_]?0*(\d+)\b[*_`]*[\s.:—–·-]*")
|
|
@@ -9216,7 +9222,9 @@ def cmd_top(args):
|
|
|
9216
9222
|
|
|
9217
9223
|
total = len(obligations)
|
|
9218
9224
|
done, fail, quar = _n("MEASURED_PASS"), _n("MEASURED_FAIL"), _n("QUARANTINE")
|
|
9219
|
-
|
|
9225
|
+
# TRACED/TAGGED are declared in TOP_STATES for the renderer and NEVER assigned above
|
|
9226
|
+
# (v0.1 has no source for either), so only UNMEASURED can carry a count here.
|
|
9227
|
+
unmeasured = _n("UNMEASURED")
|
|
9220
9228
|
pct = _top_pct(done, total)
|
|
9221
9229
|
# INV-TOP-06 (ADR-038): DONE never publishes 100% while the seal is MEASURED broken --
|
|
9222
9230
|
# every criterion green against evidence that no longer belongs to this code state is
|
|
@@ -9780,17 +9788,11 @@ _FUNC_RE = re.compile(
|
|
|
9780
9788
|
|
|
9781
9789
|
|
|
9782
9790
|
def _simplicity_band(score):
|
|
9783
|
-
|
|
9784
|
-
if score >= floor:
|
|
9785
|
-
return label
|
|
9786
|
-
return "OVERBUILT"
|
|
9791
|
+
return _banded(score, SIMPLICITY_BANDS)
|
|
9787
9792
|
|
|
9788
9793
|
|
|
9789
9794
|
def _rebuild_band(score):
|
|
9790
|
-
|
|
9791
|
-
if score >= floor:
|
|
9792
|
-
return label
|
|
9793
|
-
return "DIVERGE"
|
|
9795
|
+
return _banded(score, REBUILD_BANDS)
|
|
9794
9796
|
|
|
9795
9797
|
|
|
9796
9798
|
def _test_file_set(repo_path, repo_type):
|
|
@@ -10349,10 +10351,7 @@ _WASTE_COMMENT = ("//", "#", "*", "--", "/*", "*/", '"""', "'''", ";;", "<!--")
|
|
|
10349
10351
|
|
|
10350
10352
|
|
|
10351
10353
|
def _waste_band(score):
|
|
10352
|
-
|
|
10353
|
-
if score >= floor:
|
|
10354
|
-
return label
|
|
10355
|
-
return "WASTEFUL"
|
|
10354
|
+
return _banded(score, WASTE_BANDS)
|
|
10356
10355
|
|
|
10357
10356
|
|
|
10358
10357
|
def _path_allowed(rel, allow_paths):
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$schema": "https://json.schemastore.org/claude-code-plugin-manifest.json",
|
|
3
3
|
"name": "uscha",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.95.0",
|
|
5
5
|
"displayName": "Uscha",
|
|
6
6
|
"description": "Spec-driven development for LLM coding agents: 9 skills (discovery, adr-refine, reverse-discovery, characterize, devloop, sysdoc, rubric, mirador, status) + a stdlib measurement engine (qa_ledger.py, 53 subcommands + universal installer + npm/npx router). Facts block, guesses advise; the human approves.",
|
|
7
7
|
"author": {
|
package/uscha-kit/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# uscha-kit
|
|
2
2
|
|
|
3
|
-
**Kit version:** v1.
|
|
3
|
+
**Kit version:** v1.95.0 <!-- uscha:version --> · **[uscha.dev](https://uscha.dev)**
|
|
4
4
|
|
|
5
5
|
Spec-driven orchestrator + multi-repo QA for Claude Code, with a deterministic ledger.
|
|
6
6
|
**Nine skills** (`uscha-discovery`, `uscha-adr-refine`, `uscha-devloop`, `uscha-sysdoc`, `uscha-reverse-discovery`,
|
package/uscha-kit/VERSION
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
uscha-kit 1.
|
|
1
|
+
uscha-kit 1.95.0
|
|
@@ -7053,11 +7053,10 @@ def _struct_distance(a, b):
|
|
|
7053
7053
|
|
|
7054
7054
|
|
|
7055
7055
|
def _oracle_hash(arm_dir):
|
|
7056
|
-
|
|
7057
|
-
|
|
7058
|
-
|
|
7059
|
-
|
|
7060
|
-
return None
|
|
7056
|
+
# the arm's withheld oracle, hashed by exact bytes -- an arm whose oracle differs by one
|
|
7057
|
+
# byte is a different experiment (cmd_lang_compare refuses the pair). Same rule, and now the
|
|
7058
|
+
# same code, as a manifest unit: `_sha256_file`.
|
|
7059
|
+
return _sha256_file(os.path.join(arm_dir, "oracle", "ORACLE.json"))
|
|
7061
7060
|
|
|
7062
7061
|
|
|
7063
7062
|
def cmd_lang_compare(args):
|
|
@@ -7548,11 +7547,18 @@ DEFAULT_STATIC_ZERO_AT = 10 # gated-open count at which the static dimension hi
|
|
|
7548
7547
|
BANDS = [(95, "READY"), (80, "RELEASE CANDIDATE"), (50, "IN PROGRESS"), (0, "NOT READY")]
|
|
7549
7548
|
|
|
7550
7549
|
|
|
7551
|
-
def
|
|
7552
|
-
|
|
7550
|
+
def _banded(score, bands):
|
|
7551
|
+
"""The label of the highest floor the score reaches. Every band table ends at floor 0, so
|
|
7552
|
+
the last row IS the default -- named once here instead of being restated as a trailing
|
|
7553
|
+
`return` in four callers, where it read as a fifth band nobody could reach (1.95.0)."""
|
|
7554
|
+
for floor, label in bands:
|
|
7553
7555
|
if score >= floor:
|
|
7554
7556
|
return label
|
|
7555
|
-
return
|
|
7557
|
+
return bands[-1][1]
|
|
7558
|
+
|
|
7559
|
+
|
|
7560
|
+
def _band(score):
|
|
7561
|
+
return _banded(score, BANDS)
|
|
7556
7562
|
|
|
7557
7563
|
|
|
7558
7564
|
_AC_ID = re.compile(r"(?i)^[*_`]*\s*AC[-_]?0*(\d+)\b[*_`]*[\s.:—–·-]*")
|
|
@@ -9216,7 +9222,9 @@ def cmd_top(args):
|
|
|
9216
9222
|
|
|
9217
9223
|
total = len(obligations)
|
|
9218
9224
|
done, fail, quar = _n("MEASURED_PASS"), _n("MEASURED_FAIL"), _n("QUARANTINE")
|
|
9219
|
-
|
|
9225
|
+
# TRACED/TAGGED are declared in TOP_STATES for the renderer and NEVER assigned above
|
|
9226
|
+
# (v0.1 has no source for either), so only UNMEASURED can carry a count here.
|
|
9227
|
+
unmeasured = _n("UNMEASURED")
|
|
9220
9228
|
pct = _top_pct(done, total)
|
|
9221
9229
|
# INV-TOP-06 (ADR-038): DONE never publishes 100% while the seal is MEASURED broken --
|
|
9222
9230
|
# every criterion green against evidence that no longer belongs to this code state is
|
|
@@ -9780,17 +9788,11 @@ _FUNC_RE = re.compile(
|
|
|
9780
9788
|
|
|
9781
9789
|
|
|
9782
9790
|
def _simplicity_band(score):
|
|
9783
|
-
|
|
9784
|
-
if score >= floor:
|
|
9785
|
-
return label
|
|
9786
|
-
return "OVERBUILT"
|
|
9791
|
+
return _banded(score, SIMPLICITY_BANDS)
|
|
9787
9792
|
|
|
9788
9793
|
|
|
9789
9794
|
def _rebuild_band(score):
|
|
9790
|
-
|
|
9791
|
-
if score >= floor:
|
|
9792
|
-
return label
|
|
9793
|
-
return "DIVERGE"
|
|
9795
|
+
return _banded(score, REBUILD_BANDS)
|
|
9794
9796
|
|
|
9795
9797
|
|
|
9796
9798
|
def _test_file_set(repo_path, repo_type):
|
|
@@ -10349,10 +10351,7 @@ _WASTE_COMMENT = ("//", "#", "*", "--", "/*", "*/", '"""', "'''", ";;", "<!--")
|
|
|
10349
10351
|
|
|
10350
10352
|
|
|
10351
10353
|
def _waste_band(score):
|
|
10352
|
-
|
|
10353
|
-
if score >= floor:
|
|
10354
|
-
return label
|
|
10355
|
-
return "WASTEFUL"
|
|
10354
|
+
return _banded(score, WASTE_BANDS)
|
|
10356
10355
|
|
|
10357
10356
|
|
|
10358
10357
|
def _path_allowed(rel, allow_paths):
|