@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 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.94.1** <!-- uscha:version --> · [uscha.dev](https://uscha.dev) ·
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.94.1, 53 subcommands, all measured):**
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.94.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
- try:
7057
- with open(os.path.join(arm_dir, "oracle", "ORACLE.json"), "rb") as fh:
7058
- return hashlib.sha256(fh.read()).hexdigest()
7059
- except OSError:
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 _band(score):
7552
- for floor, label in BANDS:
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 "NOT READY"
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
- unmeasured = _n("UNMEASURED") + _n("TRACED")
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
- for floor, label in SIMPLICITY_BANDS:
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
- for floor, label in REBUILD_BANDS:
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
- for floor, label in WASTE_BANDS:
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.94.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": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uscha",
3
- "version": "1.94.1",
3
+ "version": "1.95.0",
4
4
  "description": "Uscha spec-driven development methodology for coding agents. Includes npm/npx router.",
5
5
  "author": {
6
6
  "name": "Andres Massello",
@@ -1,6 +1,6 @@
1
1
  # uscha-kit
2
2
 
3
- **Kit version:** v1.94.1 <!-- uscha:version --> · **[uscha.dev](https://uscha.dev)**
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.94.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
- try:
7057
- with open(os.path.join(arm_dir, "oracle", "ORACLE.json"), "rb") as fh:
7058
- return hashlib.sha256(fh.read()).hexdigest()
7059
- except OSError:
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 _band(score):
7552
- for floor, label in BANDS:
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 "NOT READY"
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
- unmeasured = _n("UNMEASURED") + _n("TRACED")
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
- for floor, label in SIMPLICITY_BANDS:
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
- for floor, label in REBUILD_BANDS:
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
- for floor, label in WASTE_BANDS:
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,5 +1,5 @@
1
1
  {
2
- "version": "1.94.1",
2
+ "version": "1.95.0",
3
3
  "project": null,
4
4
  "defaults": {
5
5
  "coverage_threshold": 60,