@andresmassello/uscha 1.66.0 → 1.67.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.66.0** <!-- uscha:version --> · [uscha.dev](https://uscha.dev) ·
43
+ **Kit v1.67.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
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andresmassello/uscha",
3
- "version": "1.66.0",
3
+ "version": "1.67.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",
@@ -665,8 +665,8 @@ function renderModes(){
665
665
  ledger fact visible. BOTH keys are conditional in dashboard --json, so a project
666
666
  that never used either sees no card at all (absent block = identical view). */
667
667
  const card=$("#card-modes");if(!card)return;
668
- const fp=DATA.fast_path,sd=DATA.spec_drift;
669
- if(!fp&&!sd){card.hidden=true;return;}
668
+ const fp=DATA.fast_path,sd=DATA.spec_drift,cr=DATA.clean_room;
669
+ if(!fp&&!sd&&!cr){card.hidden=true;return;}
670
670
  const host=$("#modes");host.replaceChildren();
671
671
  const parts=[];
672
672
  if(fp){
@@ -677,6 +677,16 @@ function renderModes(){
677
677
  node("span","chip "+(cls[e.verdict]||"st-todo"),String(e.verdict||"?"))));});
678
678
  parts.push(Object.keys(fp).length+" repo"+(Object.keys(fp).length>1?"s":""));
679
679
  }
680
+ if(cr){
681
+ const cls={GREEN:"st-done",RED:"st-block"};
682
+ Object.keys(cr).forEach(r=>{const e=cr[r]||{};
683
+ const sha=(e.ref||"").slice(0,8)||"?";
684
+ const wall=(typeof e.wall_ms==="number")?(" · "+(e.wall_ms/1000).toFixed(1)+"s"):"";
685
+ append(host,append(node("div","spec"),node("span","id","clean-room"),
686
+ node("span","t",r+" @ "+sha+wall),
687
+ node("span","chip "+(cls[e.status]||"st-prog"),String(e.status||"?"))));});
688
+ parts.push("clean-room ×"+Object.keys(cr).length);
689
+ }
680
690
  if(sd){
681
691
  const cls={SPEC_STALE:"st-block",CLEAN:"st-done",UNMAPPED:"st-todo",UNTRACKED:"st-todo"};
682
692
  const res=sd.results||[];
@@ -100,6 +100,11 @@ nothing and gates nothing.
100
100
  `spec-drift: N stale / M docs (advisory)` — or `spec-drift: no drift measured` when zero are
101
101
  stale. Always label it advisory; it never explains a blocked phase. Absent key → no line.
102
102
 
103
+ **Clean-room (ADR-008):** if the ledger carries `clean_room` runs, add ONE line with the
104
+ latest run per repo: `clean-room: GREEN @ <sha8> (12.3s)` / `RED @ <sha8>`. When the gate is
105
+ declared (`mode: "final"`) and the latest run does not match the current HEAD, append
106
+ `(stale for gate)`. Absent key → no line.
107
+
103
108
  **Roundtrip (ADR-009 slice 2):** if the ledger carries a `roundtrip` run, add ONE line:
104
109
  `roundtrip: N/M promoted traceable by uscha-spec id (advisory)`. Absent key → no line —
105
110
  silence is honest when the loop was never measured.
@@ -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.66.0",
4
+ "version": "1.67.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, 35 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.66.0",
3
+ "version": "1.67.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.66.0 <!-- uscha:version --> · **[uscha.dev](https://uscha.dev)**
3
+ **Kit version:** v1.67.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.66.0
1
+ uscha-kit 1.67.0
@@ -665,8 +665,8 @@ function renderModes(){
665
665
  ledger fact visible. BOTH keys are conditional in dashboard --json, so a project
666
666
  that never used either sees no card at all (absent block = identical view). */
667
667
  const card=$("#card-modes");if(!card)return;
668
- const fp=DATA.fast_path,sd=DATA.spec_drift;
669
- if(!fp&&!sd){card.hidden=true;return;}
668
+ const fp=DATA.fast_path,sd=DATA.spec_drift,cr=DATA.clean_room;
669
+ if(!fp&&!sd&&!cr){card.hidden=true;return;}
670
670
  const host=$("#modes");host.replaceChildren();
671
671
  const parts=[];
672
672
  if(fp){
@@ -677,6 +677,16 @@ function renderModes(){
677
677
  node("span","chip "+(cls[e.verdict]||"st-todo"),String(e.verdict||"?"))));});
678
678
  parts.push(Object.keys(fp).length+" repo"+(Object.keys(fp).length>1?"s":""));
679
679
  }
680
+ if(cr){
681
+ const cls={GREEN:"st-done",RED:"st-block"};
682
+ Object.keys(cr).forEach(r=>{const e=cr[r]||{};
683
+ const sha=(e.ref||"").slice(0,8)||"?";
684
+ const wall=(typeof e.wall_ms==="number")?(" · "+(e.wall_ms/1000).toFixed(1)+"s"):"";
685
+ append(host,append(node("div","spec"),node("span","id","clean-room"),
686
+ node("span","t",r+" @ "+sha+wall),
687
+ node("span","chip "+(cls[e.status]||"st-prog"),String(e.status||"?"))));});
688
+ parts.push("clean-room ×"+Object.keys(cr).length);
689
+ }
680
690
  if(sd){
681
691
  const cls={SPEC_STALE:"st-block",CLEAN:"st-done",UNMAPPED:"st-todo",UNTRACKED:"st-todo"};
682
692
  const res=sd.results||[];
@@ -100,6 +100,11 @@ nothing and gates nothing.
100
100
  `spec-drift: N stale / M docs (advisory)` — or `spec-drift: no drift measured` when zero are
101
101
  stale. Always label it advisory; it never explains a blocked phase. Absent key → no line.
102
102
 
103
+ **Clean-room (ADR-008):** if the ledger carries `clean_room` runs, add ONE line with the
104
+ latest run per repo: `clean-room: GREEN @ <sha8> (12.3s)` / `RED @ <sha8>`. When the gate is
105
+ declared (`mode: "final"`) and the latest run does not match the current HEAD, append
106
+ `(stale for gate)`. Absent key → no line.
107
+
103
108
  **Roundtrip (ADR-009 slice 2):** if the ledger carries a `roundtrip` run, add ONE line:
104
109
  `roundtrip: N/M promoted traceable by uscha-spec id (advisory)`. Absent key → no line —
105
110
  silence is honest when the loop was never measured.
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.66.0",
2
+ "version": "1.67.0",
3
3
  "project": null,
4
4
  "defaults": {
5
5
  "coverage_threshold": 60,