@andresmassello/uscha 1.40.2 → 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 (39) hide show
  1. package/README.md +6 -6
  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.41.0.md +18 -0
  15. package/uscha-kit/CHANGELOG-1.41.1.md +53 -0
  16. package/uscha-kit/CHANGELOG-1.41.2.md +34 -0
  17. package/uscha-kit/CHANGELOG-1.41.3.md +30 -0
  18. package/uscha-kit/CHANGELOG-1.42.0.md +41 -0
  19. package/uscha-kit/CHANGELOG-1.43.0.md +37 -0
  20. package/uscha-kit/INSTALL.md +120 -101
  21. package/uscha-kit/README.md +24 -13
  22. package/uscha-kit/VERSION +1 -1
  23. package/uscha-kit/WORKBENCH.md +19 -5
  24. package/uscha-kit/hooks/block-approved-writes.py +25 -0
  25. package/uscha-kit/install-uscha.py +534 -267
  26. package/uscha-kit/skills/uscha-adr-refine/SKILL.md +2 -2
  27. package/uscha-kit/skills/uscha-devloop/SKILL.md +3 -1
  28. package/uscha-kit/skills/uscha-devloop/qa_ledger.py +729 -155
  29. package/uscha-kit/skills/uscha-mirador/SKILL.md +22 -7
  30. package/uscha-kit/skills/uscha-mirador/mirador-render.py +44 -5
  31. package/uscha-kit/skills/uscha-mirador/mirador-watch.ps1 +1 -1
  32. package/uscha-kit/skills/uscha-mirador/mirador-watch.sh +1 -1
  33. package/uscha-kit/skills/uscha-mirador/mirador.template.html +666 -586
  34. package/uscha-kit/templates/CONSTITUTION.md +4 -4
  35. package/uscha-kit/templates/docs/adr/README.md +19 -19
  36. package/uscha-kit/tests/ledger-integrity-regressions.py +136 -0
  37. package/uscha-kit/tests/smoke-engine.sh +1312 -29
  38. package/uscha-kit/uscha.config.json +1 -1
  39. package/uscha-kit/workbench-doctor.sh +47 -3
package/README.md CHANGED
@@ -14,13 +14,13 @@ instantiation in Claude Code, the **uscha-kit**.
14
14
  SpecLoop/
15
15
  ??? package.json # npm package: @andresmassello/uscha
16
16
  ??? bin/uscha.js # thin npx router to uscha-kit/install-uscha.py
17
- ├── uscha-kit/ # ★ canonical SOURCE of the kit (v1.40.2)
17
+ ├── uscha-kit/ # ★ canonical SOURCE of the kit (v1.43.0)
18
18
  │ ├── .claude/skills/ # 8 skills: uscha-discovery · uscha-adr-refine · uscha-devloop · uscha-sysdoc
19
19
  │ │ # uscha-reverse-discovery · uscha-characterize · uscha-rubric · uscha-mirador
20
20
  │ ├── .claude/skills/uscha-devloop/qa_ledger.py # evidence engine (29 subcommands, stdlib)
21
21
  │ ├── hooks/ # PreToolUse: the agent never writes .approved (INV-GOLDEN-01)
22
22
  │ ├── templates/ # CLAUDE.md · CONSTITUTION.md · .gitattributes · docs/adr
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)
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)
24
24
  ├── docs/ # published artifacts (canonical here; Downloads = snapshots)
25
25
  │ ├── uscha-claude-code-doc-FINAL.html # long deck ES (36 slides)
26
26
  │ ├── uscha-claude-code-doc-EN.html # long deck EN
@@ -40,9 +40,9 @@ SpecLoop/
40
40
  └── verificacion-team-pitch.json # 3 lenses over the pitch
41
41
  ```
42
42
 
43
- ## Status (2026-07-05)
43
+ ## Status (2026-07-10)
44
44
 
45
- - **Kit v1.40.2** <!-- 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`,
46
46
  `flag-blocker`, `resolve-escalation`; UNMEASURED; per-tool convergence with a veto from
47
47
  the measured snapshot) and the engine measures **Python** repos (1.4.0: pytest/Cobertura + ruff +
48
48
  mypy) **TypeScript/JS** (1.5.0: lcov + jest-junit + eslint + tsc) **Go** (1.6.0: native cover
@@ -64,13 +64,13 @@ SpecLoop/
64
64
  headline — M5). **Derived FSM** (1.18.0: `phase` computes the workflow state
65
65
  from the ledger's facts, never declared; the PR is gated with `--require
66
66
  pr-ready` — M4). **Formal spikes** (1.19.0: a `spike/*` branch never passes the PR
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). **Install docs** (1.40.2: npx-first guide for Codex, Claude Code, and mixed-machine setups). 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.
68
68
  **The PragProg backlog is CLOSED: 10 of 10** (see
69
69
  `docs/analisis-pragmatic-programmer.md`).
70
70
  License: MIT. The principle "facts block, guesses advise" is an enforced property,
71
71
  not a slogan.
72
72
  - **Docs** — passed through truth-pass against the real engine: every claim describes what
73
- v1.40.2 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
74
74
  sources. Status convention in the docs: `in the kit` / `new` / `proposal`.
75
75
  - **In progress** — dogfooding on a real case (pilot project, Python): the 1.4.0 adapter unblocked it;
76
76
  what remains is the read-only dry-run (criterion 2 of the python-adapter HANDOFF) and the on-ramp.
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.2",
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