@andresmassello/uscha 1.40.1 → 1.43.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.
Files changed (40) hide show
  1. package/README.md +21 -13
  2. package/bin/uscha.js +19 -7
  3. package/package.json +1 -1
  4. package/uscha-kit/.claude/skills/uscha-adr-refine/SKILL.md +2 -2
  5. package/uscha-kit/.claude/skills/uscha-devloop/SKILL.md +3 -1
  6. package/uscha-kit/.claude/skills/uscha-devloop/qa_ledger.py +729 -155
  7. package/uscha-kit/.claude/skills/uscha-mirador/SKILL.md +22 -7
  8. package/uscha-kit/.claude/skills/uscha-mirador/mirador-render.py +44 -5
  9. package/uscha-kit/.claude/skills/uscha-mirador/mirador-watch.ps1 +1 -1
  10. package/uscha-kit/.claude/skills/uscha-mirador/mirador-watch.sh +1 -1
  11. package/uscha-kit/.claude/skills/uscha-mirador/mirador.template.html +666 -586
  12. package/uscha-kit/.claude-plugin/plugin.json +1 -1
  13. package/uscha-kit/.codex-plugin/plugin.json +1 -1
  14. package/uscha-kit/CHANGELOG-1.40.2.md +13 -0
  15. package/uscha-kit/CHANGELOG-1.41.0.md +18 -0
  16. package/uscha-kit/CHANGELOG-1.41.1.md +53 -0
  17. package/uscha-kit/CHANGELOG-1.41.2.md +34 -0
  18. package/uscha-kit/CHANGELOG-1.41.3.md +30 -0
  19. package/uscha-kit/CHANGELOG-1.42.0.md +41 -0
  20. package/uscha-kit/CHANGELOG-1.43.0.md +37 -0
  21. package/uscha-kit/INSTALL.md +120 -0
  22. package/uscha-kit/README.md +40 -69
  23. package/uscha-kit/VERSION +1 -1
  24. package/uscha-kit/WORKBENCH.md +19 -5
  25. package/uscha-kit/hooks/block-approved-writes.py +25 -0
  26. package/uscha-kit/install-uscha.py +534 -267
  27. package/uscha-kit/skills/uscha-adr-refine/SKILL.md +2 -2
  28. package/uscha-kit/skills/uscha-devloop/SKILL.md +3 -1
  29. package/uscha-kit/skills/uscha-devloop/qa_ledger.py +729 -155
  30. package/uscha-kit/skills/uscha-mirador/SKILL.md +22 -7
  31. package/uscha-kit/skills/uscha-mirador/mirador-render.py +44 -5
  32. package/uscha-kit/skills/uscha-mirador/mirador-watch.ps1 +1 -1
  33. package/uscha-kit/skills/uscha-mirador/mirador-watch.sh +1 -1
  34. package/uscha-kit/skills/uscha-mirador/mirador.template.html +666 -586
  35. package/uscha-kit/templates/CONSTITUTION.md +4 -4
  36. package/uscha-kit/templates/docs/adr/README.md +19 -19
  37. package/uscha-kit/tests/ledger-integrity-regressions.py +136 -0
  38. package/uscha-kit/tests/smoke-engine.sh +1312 -29
  39. package/uscha-kit/uscha.config.json +1 -1
  40. package/uscha-kit/workbench-doctor.sh +47 -3
package/README.md CHANGED
@@ -12,13 +12,15 @@ instantiation in Claude Code, the **uscha-kit**.
12
12
 
13
13
  ```
14
14
  SpecLoop/
15
- ├── uscha-kit/ # canonical SOURCE of the kit (v1.40.1)
15
+ ??? package.json # npm package: @andresmassello/uscha
16
+ ??? bin/uscha.js # thin npx router to uscha-kit/install-uscha.py
17
+ ├── uscha-kit/ # ★ canonical SOURCE of the kit (v1.43.0)
16
18
  │ ├── .claude/skills/ # 8 skills: uscha-discovery · uscha-adr-refine · uscha-devloop · uscha-sysdoc
17
19
  │ │ # uscha-reverse-discovery · uscha-characterize · uscha-rubric · uscha-mirador
18
20
  │ ├── .claude/skills/uscha-devloop/qa_ledger.py # evidence engine (29 subcommands, stdlib)
19
21
  │ ├── hooks/ # PreToolUse: the agent never writes .approved (INV-GOLDEN-01)
20
22
  │ ├── templates/ # CLAUDE.md · CONSTITUTION.md · .gitattributes · docs/adr
21
- │ └── CHANGELOG-*.md # 1.2.x → 1.3.0 ("facts block, wired") → 1.4.0 (python) → 1.5.0 (node) → 1.6.0 (go) → 1.7.0 (rust+dotnet) → 1.8.0 (cpp) → 1.9.0 (gradle+swift) → 1.10.0 (traceable acceptance) → 1.11.0 (tests outside the budget) → 1.12.0 (secret-scan) → 1.13.0 (atomic ledger) → 1.14.0 (plateau/stop-signal) → 1.15.0 (golden scrub) → 1.16.0 (regression-capture) → 1.17.0 (threshold provenance) → 1.18.0 (derived FSM) → 1.19.0 (spikes — PragProg backlog CLOSED) → 1.20.0 (global install) → 1.21.0 (namespace uscha-*) → 1.22.0 (doctor) → 1.23.0 (rubric layer) → 1.24.0 (Claude Code plugin) → 1.25.0 (anti-ceremony) → 1.26.0 (waste-check REUSE-FIRST) → 1.27.0 (FTY) → 1.28.0 (measured acceptance %) → 1.29.0 (rebrand → Uscha) → 1.30.0 (dependency gate) → 1.31.0 (evidence freshness + doc-version gate) → 1.32.0 (mirador — bird's-eye view + dashboard --json) → 1.33.0 (mirador telemetry — per-model tokens/time/model + transcript extractor) → 1.34.0 (mirador: project name from config + live watch/auto-refresh) -> 1.35.0 (execution-policy routing) -> 1.36.0 (discovery-intake: production findings + spec-doubt) -> 1.37.0 (ADR experiments: visible hypotheses) -> 1.38.0 (contract closure: SCR bridge + golden labels + calibration) -> 1.39.0 (universal Codex/Claude installer) -> 1.40.1 (npm/npx router)
23
+ │ └── CHANGELOG-*.md # 1.2.x → 1.3.0 ("facts block, wired") → 1.4.0 (python) → 1.5.0 (node) → 1.6.0 (go) → 1.7.0 (rust+dotnet) → 1.8.0 (cpp) → 1.9.0 (gradle+swift) → 1.10.0 (traceable acceptance) → 1.11.0 (tests outside the budget) → 1.12.0 (secret-scan) → 1.13.0 (atomic ledger) → 1.14.0 (plateau/stop-signal) → 1.15.0 (golden scrub) → 1.16.0 (regression-capture) → 1.17.0 (threshold provenance) → 1.18.0 (derived FSM) → 1.19.0 (spikes — PragProg backlog CLOSED) → 1.20.0 (global install) → 1.21.0 (namespace uscha-*) → 1.22.0 (doctor) → 1.23.0 (rubric layer) → 1.24.0 (Claude Code plugin) → 1.25.0 (anti-ceremony) → 1.26.0 (waste-check REUSE-FIRST) → 1.27.0 (FTY) → 1.28.0 (measured acceptance %) → 1.29.0 (rebrand → Uscha) → 1.30.0 (dependency gate) → 1.31.0 (evidence freshness + doc-version gate) → 1.32.0 (mirador — bird's-eye view + dashboard --json) → 1.33.0 (mirador telemetry — per-model tokens/time/model + transcript extractor) → 1.34.0 (mirador: project name from config + live watch/auto-refresh) -> 1.35.0 (execution-policy routing) -> 1.36.0 (discovery-intake: production findings + spec-doubt) -> 1.37.0 (ADR experiments: visible hypotheses) -> 1.38.0 (contract closure: SCR bridge + golden labels + calibration) -> 1.39.0 (universal Codex/Claude installer) -> 1.40.0 (npm/npx router) -> 1.40.1 (npm package hygiene) -> 1.40.2 (install docs) -> 1.41.0 (safety release) -> 1.41.1 (adversarial-review hardening: JUnit/integration evidence + Codex rollback) -> 1.41.2 (mirador launch UX: self-resolving render + auto-open + honest readiness title) -> 1.41.3 (mirador live view no longer spams browser tabs) -> 1.42.0 (mirador status story: how it's going / what's blocking / what's next) -> 1.43.0 (uscha mirador verb: one command, no python)
22
24
  ├── docs/ # published artifacts (canonical here; Downloads = snapshots)
23
25
  │ ├── uscha-claude-code-doc-FINAL.html # long deck ES (36 slides)
24
26
  │ ├── uscha-claude-code-doc-EN.html # long deck EN
@@ -38,9 +40,9 @@ SpecLoop/
38
40
  └── verificacion-team-pitch.json # 3 lenses over the pitch
39
41
  ```
40
42
 
41
- ## Status (2026-07-05)
43
+ ## Status (2026-07-10)
42
44
 
43
- - **Kit v1.40.1** <!-- uscha:version --> — the fact-gates are WIRED into the engine (1.3.0: `log-gate`,
45
+ - **Kit v1.43.0** <!-- uscha:version --> — the fact-gates are WIRED into the engine (1.3.0: `log-gate`,
44
46
  `flag-blocker`, `resolve-escalation`; UNMEASURED; per-tool convergence with a veto from
45
47
  the measured snapshot) and the engine measures **Python** repos (1.4.0: pytest/Cobertura + ruff +
46
48
  mypy) **TypeScript/JS** (1.5.0: lcov + jest-junit + eslint + tsc) **Go** (1.6.0: native cover
@@ -62,13 +64,13 @@ SpecLoop/
62
64
  headline — M5). **Derived FSM** (1.18.0: `phase` computes the workflow state
63
65
  from the ledger's facts, never declared; the PR is gated with `--require
64
66
  pr-ready` — M4). **Formal spikes** (1.19.0: a `spike/*` branch never passes the PR
65
- gate; the legitimate output is an ADR with lessons — M10). **Execution policy routing** (1.35.0: phase-level methodology/model/effort metadata for the operator and Mirador, not readiness scoring). **Discovery intake** (1.36.0: production findings + spec-doubt/SPEC-WRONG enter the ledger and reopen discovery instead of disappearing into narration). **ADR experiments** (1.37.0: `Status: Experiment` is visible/advisory in dashboard/Mirador with feedback/review metadata, not a readiness score). **Contract closure** (1.38.0: structured `spec-change-request`, golden intended vs observed-accidental labels, and post-merge calibration metrics). **Universal installer** (1.39.0: one machine installer for Codex plugin adoption and Claude global install, with dry-run/doctor/version checks). **npm/npx router** (1.40.1: `@andresmassello/uscha` exposes `uscha`/`uscha-kit` and delegates to the canonical Python installer). Smoke suite 224/224 green.
67
+ gate; the legitimate output is an ADR with lessons — M10). **Execution policy routing** (1.35.0: phase-level methodology/model/effort metadata for the operator and Mirador, not readiness scoring). **Discovery intake** (1.36.0: production findings + spec-doubt/SPEC-WRONG enter the ledger and reopen discovery instead of disappearing into narration). **ADR experiments** (1.37.0: `Status: Experiment` is visible/advisory in dashboard/Mirador with feedback/review metadata, not a readiness score). **Contract closure** (1.38.0: structured `spec-change-request`, golden intended vs observed-accidental labels, and post-merge calibration metrics). **Universal installer** (1.39.0: one machine installer for Codex plugin adoption and Claude global install, with dry-run/doctor/version checks). **npm/npx router** (1.40.0: `@andresmassello/uscha` exposes `uscha`/`uscha-kit` and delegates to the canonical Python installer). **Safety release** (1.41.0: WU1–WU7 plus post-audit P0/P1 hardening for evidence freshness, fail-closed reports, Mirador safety, installer transactions, ledger integrity, and current documentation). Smoke suite 361/361 green.
66
68
  **The PragProg backlog is CLOSED: 10 of 10** (see
67
69
  `docs/analisis-pragmatic-programmer.md`).
68
70
  License: MIT. The principle "facts block, guesses advise" is an enforced property,
69
71
  not a slogan.
70
72
  - **Docs** — passed through truth-pass against the real engine: every claim describes what
71
- v1.40.1 does; the references appendix has **fetch-verified links** to the 10
73
+ v1.41.0 does; the references appendix has **fetch-verified links** to the 10
72
74
  sources. Status convention in the docs: `in the kit` / `new` / `proposal`.
73
75
  - **In progress** — dogfooding on a real case (pilot project, Python): the 1.4.0 adapter unblocked it;
74
76
  what remains is the read-only dry-run (criterion 2 of the python-adapter HANDOFF) and the on-ramp.
@@ -76,17 +78,23 @@ SpecLoop/
76
78
  profiles).
77
79
 
78
80
 
79
- ## Install from npm/npx
81
+ ## Install
82
+
83
+ Recommended for Codex and Claude Code:
80
84
 
81
85
  ```bash
82
- npx @andresmassello/uscha@latest install --target codex
83
- npx @andresmassello/uscha@latest doctor --target codex
84
- # or both Codex + Claude:
85
- npx @andresmassello/uscha@latest install --target both
86
+ npx --yes @andresmassello/uscha@latest install --target codex
87
+ npx --yes @andresmassello/uscha@latest doctor --target codex
88
+ # or both Codex + Claude Code:
89
+ npx --yes @andresmassello/uscha@latest install --target both
90
+ npx --yes @andresmassello/uscha@latest doctor --target both
86
91
  ```
87
92
 
88
- The npm package is only a router. The canonical installer remains
89
- `uscha-kit/install-uscha.py`, and Python 3.8+ is still required on the target machine.
93
+ Full install guide: [`uscha-kit/INSTALL.md`](uscha-kit/INSTALL.md).
94
+
95
+ The npm package is only a thin router. The canonical installer remains
96
+ `uscha-kit/install-uscha.py`, and Python 3.8+ is still required on the target
97
+ machine.
90
98
 
91
99
  ## How the kit is re-packaged
92
100
 
package/bin/uscha.js CHANGED
@@ -8,17 +8,29 @@ const candidates = process.platform === 'win32'
8
8
  ? [ ['python', []], ['py', ['-3']] ]
9
9
  : [ ['python3', []], ['python', []] ];
10
10
 
11
+ function supportsPython38(command, prefix) {
12
+ const result = spawnSync(command, [...prefix, '--version'], {
13
+ encoding: 'utf8',
14
+ stdio: ['ignore', 'pipe', 'pipe'],
15
+ });
16
+ if (result.error || result.status !== 0) return false;
17
+
18
+ const output = `${result.stdout || ''}\n${result.stderr || ''}`;
19
+ const match = output.match(/Python\s+(\d+)\.(\d+)/i);
20
+ return match !== null && (Number(match[1]) > 3
21
+ || (Number(match[1]) === 3 && Number(match[2]) >= 8));
22
+ }
23
+
11
24
  let lastError = null;
12
- for (const [cmd, prefix] of candidates) {
13
- const result = spawnSync(cmd, [...prefix, script, ...args], { stdio: 'inherit' });
14
- if (!result.error) {
15
- process.exit(result.status === null ? 1 : result.status);
16
- }
17
- if (result.error.code !== 'ENOENT') {
25
+ for (const [command, prefix] of candidates) {
26
+ if (!supportsPython38(command, prefix)) continue;
27
+
28
+ const result = spawnSync(command, [...prefix, script, ...args], { stdio: 'inherit' });
29
+ if (result.error) {
18
30
  lastError = result.error;
19
31
  break;
20
32
  }
21
- lastError = result.error;
33
+ process.exit(result.status === null ? 1 : result.status);
22
34
  }
23
35
 
24
36
  console.error('[uscha] Python 3.8+ is required but was not found in PATH.');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@andresmassello/uscha",
3
- "version": "1.40.1",
3
+ "version": "1.43.0",
4
4
  "description": "Uscha installer for Codex and Claude coding-agent workflows.",
5
5
  "bin": {
6
6
  "uscha": "bin/uscha.js",
@@ -124,8 +124,8 @@ ADR where it could later be "traded away"):
124
124
  ```markdown
125
125
  # Acceptance — <feature>
126
126
  ## Definition of Done
127
- - [ ] <verifiable criterion>
128
- - [ ]
127
+ - [ ] AC-01 — <verifiable criterion>
128
+ - [ ] AC-02 — <verifiable criterion>
129
129
  ## How we measure success
130
130
  - <objective metric: p95, cost, zero orphans, …>
131
131
  ## Out of scope
@@ -418,7 +418,9 @@ BLOCKER/CRITICAL open → ≤65, unresolved escalation → ≤75 (held until
418
418
  `resolve-escalation` — a recorded event, not an implication). A `CONSTITUTION.md`
419
419
  breach does NOT reach the engine by itself: **you MUST log it** —
420
420
  `flag-blocker --repo <REPO> --kind constitution --note "<invariant breached>"` — and
421
- once logged it caps readiness ≤65 and blocks convergence until `--resolve`. Bands:
421
+ once logged it caps readiness ≤65 and blocks convergence until resolved with
422
+ `flag-blocker --repo <REPO> --kind constitution --resolve --escape-analysis
423
+ "Added a regression test for the invariant."`. Bands:
422
424
  <50 NOT READY, 50–79 IN PROGRESS, 80–94 RELEASE CANDIDATE, 95–100 READY.
423
425
 
424
426
  **Acceptance traceability (the DOMINANT dimension — kit 1.10.0).** Each ACCEPTANCE