@andresmassello/uscha 1.51.3 → 1.54.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.
@@ -1,79 +1,147 @@
1
- ---
2
- name: uscha-rubric
3
- description: >
4
- Grade the change against the versioned RUBRIC.md (the ACCEPTANCE of the
5
- non-testable: conventions, error-handling sanity, API ergonomics, doc quality)
6
- and ingest the verdict into the ledger. This skill is a THIN ADAPTER for
7
- Claude Code: the portable core is templates/rubric-grader-prompt.md (works on
8
- Codex, Gemini CLI, Cursor, raw API, or a human) + the vendor-neutral JSON
9
- contract that `qa_ledger.py rubric-ingest` validates. Advisory by default;
10
- gates only when the human declares it. Invoke for "grade the rubric",
11
- "evaluá la rúbrica", "rubric pass".
12
- allowed-tools: Read, Write, Glob, Grep, Bash
13
- disable-model-invocation: false
14
- ---
15
-
16
- # uscha-rubric — grade the non-testable against versioned criteria (adapter)
17
-
18
- **Architecture note (read this first).** You are the Claude Code ADAPTER of a
19
- vendor-neutral layer. The core is: `RUBRIC.md` (versioned criteria) + the JSON
20
- contract + `qa_ledger.py rubric-ingest` (stdlib, runs anywhere). ANY runner can be
21
- the grader — this skill just wraps the neutral prompt so Claude Code users get it
22
- in one command. Never add Claude-specific behavior to the contract.
23
-
24
- ## Protocol
25
-
26
- 1. **Locate the rubric**: `defaults.rubric.file` in `uscha.config.json`, else
27
- `./RUBRIC.md`. If absent, offer to create one from `templates/RUBRIC.md` and STOP
28
- (the criteria are the human's to approve — propose, don't impose).
29
- 2. **Validate structure first** (facts block):
30
-
31
- ```bash
32
- QL="./.claude/skills/uscha-devloop/qa_ledger.py"
33
- [ -f "$QL" ] || QL="$HOME/.codex/skills/uscha-devloop/qa_ledger.py"
34
- [ -f "$QL" ] || QL="$HOME/plugins/uscha/skills/uscha-devloop/qa_ledger.py"
35
- [ -f "$QL" ] || QL="$HOME/.claude/skills/uscha-devloop/qa_ledger.py"
36
- python3 $QL spec-check --rubric RUBRIC.md # exit 1 = fix the rubric before grading
37
- ```
38
-
39
- 3. **Grade with ISOLATED context** — follow `templates/rubric-grader-prompt.md` to
40
- the letter: read ONLY the diff + RUBRIC.md (not the maker's reasoning, not the PR
41
- body). For every criterion emit `pass|fail`; **evidence `file:line` is mandatory
42
- for any verdict that affects the score** (a positive's pass, a negative's fail) —
43
- without it the engine discards the verdict. Anchors calibrate you; when in doubt,
44
- fail (the optimist bias is the failure mode this layer exists to counter).
45
- 4. **Write the contract JSON** to `reports/rubric-grade.json`:
46
-
47
- ```json
48
- {"criteria": [{"id": "RB-01", "verdict": "pass",
49
- "evidence": "src/x.py:42 — ...", "note": "..."}]}
50
- ```
51
-
52
- 5. **Ingest** (the ledger validates IDs, applies evidence-or-nothing, computes the
53
- weighted score vs threshold, and persists — advisory by default):
54
-
55
- ```bash
56
- python3 $QL rubric-ingest --repo <REPO> --report reports/rubric-grade.json \
57
- --iteration <N> # add --gate ONLY if the human declared it
58
- ```
59
-
60
- A below-threshold score with the gate declared (config `defaults.rubric.gate: true`
61
- or `--gate`) blocks convergence and caps readiness ≤65 through the existing ledger
62
- plumbing. Without the declaration it advises — never silently escalate it yourself.
63
-
64
- ## Non-negotiables
65
-
66
- - **Maker ≠ grader**: never grade a change you authored in this same context. Run
67
- the grade in a fresh/isolated pass (that separation is the entire value).
68
- - **Evidence-or-nothing**: a verdict without a `file:line` citation does not count —
69
- the engine enforces it, you comply with it.
70
- - The rubric file is the HUMAN's criterion: propose edits, never rewrite it silently
71
- (tracked-markdown protocol applies).
72
- - This layer never replaces the hard gates (tests, golden, gate-check, simplicity):
73
- it is the structured-guess layer — facts block, guesses advise.
74
-
75
- ## Relationship to the other skills
76
-
77
- - `uscha-devloop` runs this in Phase 3b alongside gate-check when a rubric exists.
78
- - `uscha-discovery` / `uscha-adr-refine` are where the human's quality criteria
79
- crystallize — a RUBRIC.md can be drafted there (step: quality bar).
1
+ ---
2
+ name: uscha-rubric
3
+ description: >
4
+ Grade the change against the versioned RUBRIC.md (the ACCEPTANCE of the
5
+ non-testable: conventions, error-handling sanity, API ergonomics, doc quality)
6
+ and ingest the verdict into the ledger. This skill is a THIN ADAPTER for
7
+ Claude Code: the portable core is templates/rubric-grader-prompt.md (works on
8
+ Codex, Gemini CLI, Cursor, raw API, or a human) + the vendor-neutral JSON
9
+ contract that `qa_ledger.py rubric-ingest` validates. Advisory by default;
10
+ gates only when the human declares it. Invoke for "grade the rubric",
11
+ "evaluá la rúbrica", "rubric pass".
12
+ allowed-tools: Read, Write, Glob, Grep, Bash
13
+ disable-model-invocation: false
14
+ ---
15
+
16
+ # uscha-rubric — grade the non-testable against versioned criteria (adapter)
17
+
18
+ **Architecture note (read this first).** You are the Claude Code ADAPTER of a
19
+ vendor-neutral layer. The core is: `RUBRIC.md` (versioned criteria) + the JSON
20
+ contract + `qa_ledger.py rubric-ingest` (stdlib, runs anywhere). ANY runner can be
21
+ the grader — this skill just wraps the neutral prompt so Claude Code users get it
22
+ in one command. Never add Claude-specific behavior to the contract.
23
+
24
+ ## First contact (show ONCE, then never again)
25
+
26
+ **Only when this project has no uscha artifacts yet** -- no `QA-LEDGER.json`, no `SPEC.md` or
27
+ `ACCEPTANCE.md`, no `docs/adr/` -- open with this block, then start working. If any of those
28
+ exist, the operator already knows the method: skip it entirely and go straight to the
29
+ breadcrumb. Repeating it every run would be exactly the ceremony the method forbids.
30
+
31
+ ```
32
+ [uscha · rubric · START]
33
+ Method: you bring the idea, the method builds the rest. Facts block, guesses advise;
34
+ nothing closes on a checkbox, and the human approves the merge.
35
+ Here: I grade what tests cannot: conventions, error handling, API ergonomics, doc quality -- against your versioned RUBRIC.md.
36
+ Output: a graded verdict ingested into the ledger (advisory unless you declared it a gate)
37
+ Next: back to `/uscha-devloop`, or the human gate if the loop already converged.
38
+ Stop: say so at any point -- whatever is already written stays.
39
+ ```
40
+
41
+ **Bilingual by construction.** The labels (`START`, `Method`, `Here`, `Output`, `Next`,
42
+ `Stop`) stay VERBATIM in English -- they are the method's vocabulary and the smoke suite checks
43
+ for them mechanically, which is only possible if they never move. The wording after each label
44
+ is the canonical English; **render it in the operator's language**. If they are writing to you
45
+ in Spanish, the whole block reads in Spanish under English labels. Do not translate the labels,
46
+ do not leave the content in English when they are not writing in English.
47
+
48
+ Unlike the close block, `Next` here MAY name the nominal route: on a first run there is no
49
+ measured state to derive from yet, so the nominal path is the honest answer. From the close
50
+ block onward, derived state wins.
51
+
52
+ ## Orientation markers (non-negotiable)
53
+
54
+ The operator must never have to ask "where am I?" or "what happens now?". Two markers, always.
55
+ They are navigation, not ceremony: one line per turn, one block at the end.
56
+
57
+ **Open every turn with a breadcrumb**, then the content:
58
+
59
+ `[uscha · rubric · <step> → <target>]`
60
+
61
+ - `<step>` — `Q<n>` for a question, `pass <n>` for a loop iteration, `step <n>` otherwise.
62
+ Count what has actually happened. **Never write a denominator** (`Q4/12`): this phase
63
+ converges, its length is not known in advance, and an invented total is exactly the kind of
64
+ narrated number the method forbids. **When the ledger already measures the count** (the QA
65
+ loop's `loop_count`), use the measured number — never keep a parallel tally of your own.
66
+ - `<target>` — the artifact this turn feeds (`SPEC`, `ADR-003`, `ACCEPTANCE`, `LEDGER`,
67
+ `RECEIVED`, ...). Drop `→ <target>` only when the turn genuinely feeds none.
68
+
69
+ **Close with the close block ONCE, when the skill finishes** — not on every turn. Ending
70
+ without it is a defect, even when the phase converged cleanly:
71
+
72
+ ```
73
+ [uscha · rubric · CLOSED]
74
+ Produced: <files actually written, or "nothing">
75
+ Blocks: <what stands between here and the next phase, or "nothing">
76
+ Next: <the next action, and why it is that one>
77
+ Run: <the exact command or skill to invoke>
78
+ ```
79
+
80
+ This is **not** the implementation handoff some skills also emit: that one is a prompt for
81
+ whoever implements next, this one is navigation for the human operator, and both can appear.
82
+
83
+ `Blocks` and `Next` are **derived from the state you just produced** — never copied from a
84
+ fixed route, **including any `Flow:` line in this file**. Those lines are the nominal path;
85
+ open ADR experiments, an unclosed spike, an unapproved golden or a red gate all change what
86
+ genuinely comes next, and the derived answer wins. If the next phase cannot start yet, name it
87
+ and say exactly what unblocks it.
88
+
89
+ Keep the CONTENT in the conversation's language, but keep the labels (`CLOSED`, `Produced`,
90
+ `Blocks`, `Next`, `Run`) verbatim — they are the method's vocabulary and the smoke checks them.
91
+
92
+ ## Protocol
93
+
94
+ 1. **Locate the rubric**: `defaults.rubric.file` in `uscha.config.json`, else
95
+ `./RUBRIC.md`. If absent, offer to create one from `templates/RUBRIC.md` and STOP
96
+ (the criteria are the human's to approve — propose, don't impose).
97
+ 2. **Validate structure first** (facts block):
98
+
99
+ ```bash
100
+ QL="./.claude/skills/uscha-devloop/qa_ledger.py"
101
+ [ -f "$QL" ] || QL="$HOME/.codex/skills/uscha-devloop/qa_ledger.py"
102
+ [ -f "$QL" ] || QL="$HOME/plugins/uscha/skills/uscha-devloop/qa_ledger.py"
103
+ [ -f "$QL" ] || QL="$HOME/.claude/skills/uscha-devloop/qa_ledger.py"
104
+ python3 $QL spec-check --rubric RUBRIC.md # exit 1 = fix the rubric before grading
105
+ ```
106
+
107
+ 3. **Grade with ISOLATED context** — follow `templates/rubric-grader-prompt.md` to
108
+ the letter: read ONLY the diff + RUBRIC.md (not the maker's reasoning, not the PR
109
+ body). For every criterion emit `pass|fail`; **evidence `file:line` is mandatory
110
+ for any verdict that affects the score** (a positive's pass, a negative's fail) —
111
+ without it the engine discards the verdict. Anchors calibrate you; when in doubt,
112
+ fail (the optimist bias is the failure mode this layer exists to counter).
113
+ 4. **Write the contract JSON** to `reports/rubric-grade.json`:
114
+
115
+ ```json
116
+ {"criteria": [{"id": "RB-01", "verdict": "pass",
117
+ "evidence": "src/x.py:42 — ...", "note": "..."}]}
118
+ ```
119
+
120
+ 5. **Ingest** (the ledger validates IDs, applies evidence-or-nothing, computes the
121
+ weighted score vs threshold, and persists — advisory by default):
122
+
123
+ ```bash
124
+ python3 $QL rubric-ingest --repo <REPO> --report reports/rubric-grade.json \
125
+ --iteration <N> # add --gate ONLY if the human declared it
126
+ ```
127
+
128
+ A below-threshold score with the gate declared (config `defaults.rubric.gate: true`
129
+ or `--gate`) blocks convergence and caps readiness ≤65 through the existing ledger
130
+ plumbing. Without the declaration it advises — never silently escalate it yourself.
131
+
132
+ ## Non-negotiables
133
+
134
+ - **Maker ≠ grader**: never grade a change you authored in this same context. Run
135
+ the grade in a fresh/isolated pass (that separation is the entire value).
136
+ - **Evidence-or-nothing**: a verdict without a `file:line` citation does not count —
137
+ the engine enforces it, you comply with it.
138
+ - The rubric file is the HUMAN's criterion: propose edits, never rewrite it silently
139
+ (tracked-markdown protocol applies).
140
+ - This layer never replaces the hard gates (tests, golden, gate-check, simplicity):
141
+ it is the structured-guess layer — facts block, guesses advise.
142
+
143
+ ## Relationship to the other skills
144
+
145
+ - `uscha-devloop` runs this in Phase 3b alongside gate-check when a rubric exists.
146
+ - `uscha-discovery` / `uscha-adr-refine` are where the human's quality criteria
147
+ crystallize — a RUBRIC.md can be drafted there (step: quality bar).
@@ -19,6 +19,30 @@ skill (**pull** — one screen when the human asks), and the **mirador** (bird's
19
19
  HTML). This skill exists because some surfaces never show a statusline; the answer
20
20
  is the same data, printed in chat when requested.
21
21
 
22
+ ## Orientation markers (non-negotiable)
23
+
24
+ The operator must never have to ask "where am I?" or "what happens now?".
25
+
26
+ This skill is a **one-shot read-only readout**: its block IS the answer. It therefore does NOT
27
+ take the conversational close block — that would be exactly the padding this skill forbids.
28
+ It carries the two minimal markers instead.
29
+
30
+ **Open with a breadcrumb:**
31
+
32
+ `[uscha · status · step <n> → <target>]`
33
+
34
+ **End with the two routing lines, and nothing else:**
35
+
36
+ ```
37
+ Next: <the next action, derived from what this readout just showed>
38
+ Run: <the exact command or skill to invoke>
39
+ ```
40
+
41
+ `Next` is **derived** from the state you just read — never copied from a fixed route,
42
+ including any `Flow:` line in this file. If nothing is actionable, say that plainly rather
43
+ than inventing a step. Keep the CONTENT in the conversation's language and the labels
44
+ (`Next`, `Run`) verbatim — the smoke suite checks for them.
45
+
22
46
  ## Contract
23
47
 
24
48
  - **Read-only over persisted facts.** Never run `readiness`, tests, or gates. The
@@ -1,88 +1,156 @@
1
- ---
2
- name: uscha-sysdoc
3
- description: >
4
- Generate a single self-contained, navigable HTML deck (PowerPoint-style, keyboard +
5
- click navigation) documenting a system in two parallel tracks: a commercial/CEO view
6
- and a technical view. Pulls real metrics from QA-LEDGER.json, includes inline SVG
7
- diagrams, dark control-room aesthetic. Invoke for "document this system",
8
- "make the system deck", "commercial + tech doc". Pairs with the dev-loop skill.
9
- allowed-tools: Read, Write, Glob, Grep, Bash
10
- disable-model-invocation: false
11
- ---
12
-
13
- # sys-doc — two-view system deck generator
14
-
15
- Produce ONE self-contained `.html` file (no external assets, no CDN, no localStorage)
16
- that reads like a slide deck and documents the system on two tracks the reader can
17
- switch between at any time:
18
-
19
- - **Commercial / CEO track** — what the system does, the value, the risk posture, the
20
- status. No code. Plain business language. Money/time/reliability framing.
21
- - **Technical track** — architecture, modules, data flow, contracts, QA results,
22
- coverage, known deferred issues.
23
-
24
- ## Inputs
25
-
26
- 1. **Metrics (authoritative):** run the ledger summary and use its numbers verbatim —
27
- never invent figures.
28
-
29
- ```bash
30
- QL="./.claude/skills/uscha-devloop/qa_ledger.py" # instalacion por proyecto
31
- [ -f "$QL" ] || QL="$HOME/.codex/skills/uscha-devloop/qa_ledger.py" # Codex raw-skills install
32
- [ -f "$QL" ] || QL="$HOME/plugins/uscha/skills/uscha-devloop/qa_ledger.py" # Codex plugin install
33
- [ -f "$QL" ] || QL="$HOME/.claude/skills/uscha-devloop/qa_ledger.py" # Claude global install
34
- python3 $QL summary --json > /tmp/qa-summary.json
35
- python3 $QL readiness --json > /tmp/qa-readiness.json
36
- ```
37
-
38
- From the summary use: `total_steps`, `by_tool`, `by_repo`, `aggregate`, `escalations`.
39
- From readiness use: `score`, `status`, `cap_reason`, `dimensions`, `acceptance`,
40
- `by_repo`. Render readiness as a **semaphore widget** at the top of slide 5 and as a
41
- per-repo readiness column on the technical QA slide: green ≥80, amber 50–79, red <50,
42
- and always print the `cap_reason` when a hard cap is active.
43
-
44
- 2. **System understanding:** read the ADR/PLAN, CLAUDE.md, module layout, and key
45
- contracts to describe architecture and value. If no ledger exists, ask whether to
46
- proceed without QA metrics (the deck still works, just without the QA section).
47
-
48
- 3. **Tracked-markdown protocol:** the HTML output itself is not tracked markdown, so
49
- generate freely. But if asked to also update a tracked `.md`, ask for its current
50
- version first.
51
-
52
- ## Structure (each is one navigable slide)
53
-
54
- 1. **Title** — system name, one-line purpose, date, run id.
55
- 2. **Track switcher** — persistent toggle: Commercial ⇄ Technical (affects which
56
- slides/sections show; default Commercial).
57
- 3. Commercial: **What it does** (plain language, the job it removes).
58
- 4. Commercial: **Value & status** (what's done, what's in flight, risk posture).
59
- 5. Commercial: **Quality at a glance** — coverage %, tests count, a simple
60
- "issues found and resolved" readout from `by_tool`. No jargon.
61
- 6. Technical: **Architecture** — inline SVG: modules/repos as boxes, data flow as
62
- arrows, external systems (DB, external APIs, devices) distinct.
63
- 7. Technical: **Key contracts / interfaces** — the seams between repos/modules.
64
- 8. Technical: **QA results** — per-tool table (reported / fixed / %fixed / deferred /
65
- suppressed), coverage per repo, tests/kLOC, escalations list.
66
- 9. Technical: **Deferred issues** — summarize `ISSUES-DEFERRED.md` honestly.
67
- 10. **Smoke checklist** — the manual verification steps.
68
-
69
- ## Build constraints
70
-
71
- - Single `.html`, all CSS/JS inline. Works opened directly from disk and deployable to
72
- Cloudflare Pages / S3 as-is.
73
- - **No localStorage / sessionStorage** (won't run in some sandboxes). Hold nav state in
74
- JS variables only.
75
- - Navigation: arrow keys (← →), on-screen prev/next, a slide index/dots, and Esc for an
76
- overview grid. Slide counter visible.
77
- - Diagrams are hand-authored inline `<svg>` using `currentColor`/CSS variables so they
78
- theme with the deck. No raster images, no external diagram libs.
79
- - Aesthetic: dark control-room (deep neutral background, one accent, high-contrast
80
- mono for technical figures), but keep the Commercial track clean and uncluttered.
81
- - Accessible: semantic headings, `aria-label`s on nav controls, visible focus, contrast
82
- AA. Readable when printed (print stylesheet flattens slides to a linear document).
83
-
84
- ## Output
85
-
86
- Write to `docs/system-deck.html` (or the path the human gives). Then state the file
87
- path and the two or three things the reader should look at first. Do not paste the HTML
88
- into chat — present the file.
1
+ ---
2
+ name: uscha-sysdoc
3
+ description: >
4
+ Generate a single self-contained, navigable HTML deck (PowerPoint-style, keyboard +
5
+ click navigation) documenting a system in two parallel tracks: a commercial/CEO view
6
+ and a technical view. Pulls real metrics from QA-LEDGER.json, includes inline SVG
7
+ diagrams, dark control-room aesthetic. Invoke for "document this system",
8
+ "make the system deck", "commercial + tech doc". Pairs with the dev-loop skill.
9
+ allowed-tools: Read, Write, Glob, Grep, Bash
10
+ disable-model-invocation: false
11
+ ---
12
+
13
+ # sys-doc — two-view system deck generator
14
+
15
+ Produce ONE self-contained `.html` file (no external assets, no CDN, no localStorage)
16
+ that reads like a slide deck and documents the system on two tracks the reader can
17
+ switch between at any time:
18
+
19
+ - **Commercial / CEO track** — what the system does, the value, the risk posture, the
20
+ status. No code. Plain business language. Money/time/reliability framing.
21
+ - **Technical track** — architecture, modules, data flow, contracts, QA results,
22
+ coverage, known deferred issues.
23
+
24
+ ## First contact (show ONCE, then never again)
25
+
26
+ **Only when this project has no uscha artifacts yet** -- no `QA-LEDGER.json`, no `SPEC.md` or
27
+ `ACCEPTANCE.md`, no `docs/adr/` -- open with this block, then start working. If any of those
28
+ exist, the operator already knows the method: skip it entirely and go straight to the
29
+ breadcrumb. Repeating it every run would be exactly the ceremony the method forbids.
30
+
31
+ ```
32
+ [uscha · sysdoc · START]
33
+ Method: you bring the idea, the method builds the rest. Facts block, guesses advise;
34
+ nothing closes on a checkbox, and the human approves the merge.
35
+ Here: I build a two-track deck (commercial + technical) from what the ledger already measured.
36
+ Output: a single self-contained HTML deck
37
+ Next: nothing -- this is a read-only artifact you share.
38
+ Stop: say so at any point -- whatever is already written stays.
39
+ ```
40
+
41
+ **Bilingual by construction.** The labels (`START`, `Method`, `Here`, `Output`, `Next`,
42
+ `Stop`) stay VERBATIM in English -- they are the method's vocabulary and the smoke suite checks
43
+ for them mechanically, which is only possible if they never move. The wording after each label
44
+ is the canonical English; **render it in the operator's language**. If they are writing to you
45
+ in Spanish, the whole block reads in Spanish under English labels. Do not translate the labels,
46
+ do not leave the content in English when they are not writing in English.
47
+
48
+ Unlike the close block, `Next` here MAY name the nominal route: on a first run there is no
49
+ measured state to derive from yet, so the nominal path is the honest answer. From the close
50
+ block onward, derived state wins.
51
+
52
+ ## Orientation markers (non-negotiable)
53
+
54
+ The operator must never have to ask "where am I?" or "what happens now?". Two markers, always.
55
+ They are navigation, not ceremony: one line per turn, one block at the end.
56
+
57
+ **Open every turn with a breadcrumb**, then the content:
58
+
59
+ `[uscha · sysdoc · <step> → <target>]`
60
+
61
+ - `<step>` — `Q<n>` for a question, `pass <n>` for a loop iteration, `step <n>` otherwise.
62
+ Count what has actually happened. **Never write a denominator** (`Q4/12`): this phase
63
+ converges, its length is not known in advance, and an invented total is exactly the kind of
64
+ narrated number the method forbids. **When the ledger already measures the count** (the QA
65
+ loop's `loop_count`), use the measured number — never keep a parallel tally of your own.
66
+ - `<target>` — the artifact this turn feeds (`SPEC`, `ADR-003`, `ACCEPTANCE`, `LEDGER`,
67
+ `RECEIVED`, ...). Drop `→ <target>` only when the turn genuinely feeds none.
68
+
69
+ **Close with the close block ONCE, when the skill finishes** — not on every turn. Ending
70
+ without it is a defect, even when the phase converged cleanly:
71
+
72
+ ```
73
+ [uscha · sysdoc · CLOSED]
74
+ Produced: <files actually written, or "nothing">
75
+ Blocks: <what stands between here and the next phase, or "nothing">
76
+ Next: <the next action, and why it is that one>
77
+ Run: <the exact command or skill to invoke>
78
+ ```
79
+
80
+ This is **not** the implementation handoff some skills also emit: that one is a prompt for
81
+ whoever implements next, this one is navigation for the human operator, and both can appear.
82
+
83
+ `Blocks` and `Next` are **derived from the state you just produced** — never copied from a
84
+ fixed route, **including any `Flow:` line in this file**. Those lines are the nominal path;
85
+ open ADR experiments, an unclosed spike, an unapproved golden or a red gate all change what
86
+ genuinely comes next, and the derived answer wins. If the next phase cannot start yet, name it
87
+ and say exactly what unblocks it.
88
+
89
+ Keep the CONTENT in the conversation's language, but keep the labels (`CLOSED`, `Produced`,
90
+ `Blocks`, `Next`, `Run`) verbatim — they are the method's vocabulary and the smoke checks them.
91
+
92
+ ## Inputs
93
+
94
+ 1. **Metrics (authoritative):** run the ledger summary and use its numbers verbatim —
95
+ never invent figures.
96
+
97
+ ```bash
98
+ QL="./.claude/skills/uscha-devloop/qa_ledger.py" # instalacion por proyecto
99
+ [ -f "$QL" ] || QL="$HOME/.codex/skills/uscha-devloop/qa_ledger.py" # Codex raw-skills install
100
+ [ -f "$QL" ] || QL="$HOME/plugins/uscha/skills/uscha-devloop/qa_ledger.py" # Codex plugin install
101
+ [ -f "$QL" ] || QL="$HOME/.claude/skills/uscha-devloop/qa_ledger.py" # Claude global install
102
+ python3 $QL summary --json > /tmp/qa-summary.json
103
+ python3 $QL readiness --json > /tmp/qa-readiness.json
104
+ ```
105
+
106
+ From the summary use: `total_steps`, `by_tool`, `by_repo`, `aggregate`, `escalations`.
107
+ From readiness use: `score`, `status`, `cap_reason`, `dimensions`, `acceptance`,
108
+ `by_repo`. Render readiness as a **semaphore widget** at the top of slide 5 and as a
109
+ per-repo readiness column on the technical QA slide: green ≥80, amber 50–79, red <50,
110
+ and always print the `cap_reason` when a hard cap is active.
111
+
112
+ 2. **System understanding:** read the ADR/PLAN, CLAUDE.md, module layout, and key
113
+ contracts to describe architecture and value. If no ledger exists, ask whether to
114
+ proceed without QA metrics (the deck still works, just without the QA section).
115
+
116
+ 3. **Tracked-markdown protocol:** the HTML output itself is not tracked markdown, so
117
+ generate freely. But if asked to also update a tracked `.md`, ask for its current
118
+ version first.
119
+
120
+ ## Structure (each is one navigable slide)
121
+
122
+ 1. **Title** — system name, one-line purpose, date, run id.
123
+ 2. **Track switcher** — persistent toggle: Commercial ⇄ Technical (affects which
124
+ slides/sections show; default Commercial).
125
+ 3. Commercial: **What it does** (plain language, the job it removes).
126
+ 4. Commercial: **Value & status** (what's done, what's in flight, risk posture).
127
+ 5. Commercial: **Quality at a glance** — coverage %, tests count, a simple
128
+ "issues found and resolved" readout from `by_tool`. No jargon.
129
+ 6. Technical: **Architecture** — inline SVG: modules/repos as boxes, data flow as
130
+ arrows, external systems (DB, external APIs, devices) distinct.
131
+ 7. Technical: **Key contracts / interfaces** — the seams between repos/modules.
132
+ 8. Technical: **QA results** — per-tool table (reported / fixed / %fixed / deferred /
133
+ suppressed), coverage per repo, tests/kLOC, escalations list.
134
+ 9. Technical: **Deferred issues** — summarize `ISSUES-DEFERRED.md` honestly.
135
+ 10. **Smoke checklist** — the manual verification steps.
136
+
137
+ ## Build constraints
138
+
139
+ - Single `.html`, all CSS/JS inline. Works opened directly from disk and deployable to
140
+ Cloudflare Pages / S3 as-is.
141
+ - **No localStorage / sessionStorage** (won't run in some sandboxes). Hold nav state in
142
+ JS variables only.
143
+ - Navigation: arrow keys (← →), on-screen prev/next, a slide index/dots, and Esc for an
144
+ overview grid. Slide counter visible.
145
+ - Diagrams are hand-authored inline `<svg>` using `currentColor`/CSS variables so they
146
+ theme with the deck. No raster images, no external diagram libs.
147
+ - Aesthetic: dark control-room (deep neutral background, one accent, high-contrast
148
+ mono for technical figures), but keep the Commercial track clean and uncluttered.
149
+ - Accessible: semantic headings, `aria-label`s on nav controls, visible focus, contrast
150
+ AA. Readable when printed (print stylesheet flattens slides to a linear document).
151
+
152
+ ## Output
153
+
154
+ Write to `docs/system-deck.html` (or the path the human gives). Then state the file
155
+ path and the two or three things the reader should look at first. Do not paste the HTML
156
+ into chat — present the file.
@@ -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.51.3",
4
+ "version": "1.54.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, 29 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.51.3",
3
+ "version": "1.54.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.51.3 <!-- uscha:version --> · **[uscha.dev](https://uscha.dev)**
3
+ **Kit version:** v1.54.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.51.3
1
+ uscha-kit 1.54.0