analyzthis_design 2.4.0 → 2.5.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 (46) hide show
  1. package/HOW-TO-USE.md +26 -8
  2. package/README.md +48 -4
  3. package/agents/cards/anuj.md +13 -0
  4. package/agents/cards/arjun.md +13 -0
  5. package/agents/cards/devi.md +22 -0
  6. package/agents/cards/kavi.md +13 -0
  7. package/agents/cards/meera.md +13 -0
  8. package/agents/cards/noor.md +13 -0
  9. package/agents/cards/priya.md +13 -0
  10. package/agents/cards/raj.md +13 -0
  11. package/agents/cards/zara.md +13 -0
  12. package/dist/HOW-TO-USE.md +26 -8
  13. package/dist/README.md +48 -4
  14. package/dist/agents/cards/anuj.md +13 -0
  15. package/dist/agents/cards/arjun.md +13 -0
  16. package/dist/agents/cards/devi.md +22 -0
  17. package/dist/agents/cards/kavi.md +13 -0
  18. package/dist/agents/cards/meera.md +13 -0
  19. package/dist/agents/cards/noor.md +13 -0
  20. package/dist/agents/cards/priya.md +13 -0
  21. package/dist/agents/cards/raj.md +13 -0
  22. package/dist/agents/cards/zara.md +13 -0
  23. package/dist/bin/cli.js +184 -0
  24. package/dist/lib/accept.js +108 -0
  25. package/dist/lib/evolution-metrics.js +303 -87
  26. package/dist/lib/evolve.js +5 -2
  27. package/dist/lib/feedback-submit.js +99 -17
  28. package/dist/lib/host-llm.js +16 -0
  29. package/dist/lib/install.js +7 -0
  30. package/dist/lib/lessons.js +48 -5
  31. package/dist/lib/mcp-server.js +90 -11
  32. package/dist/lib/receipt.js +102 -0
  33. package/dist/lib/session.js +52 -1
  34. package/dist/lib/share.js +131 -0
  35. package/dist/skills/accept/SKILL.md +64 -0
  36. package/dist/skills/devi/SKILL.md +22 -0
  37. package/dist/skills/evolve-check/SKILL.md +29 -13
  38. package/dist/skills/getting-started/SKILL.md +3 -0
  39. package/dist/skills/share/SKILL.md +54 -0
  40. package/package.json +6 -2
  41. package/scripts/validate-csvs.js +20 -0
  42. package/skills/accept/SKILL.md +64 -0
  43. package/skills/devi/SKILL.md +22 -0
  44. package/skills/evolve-check/SKILL.md +29 -13
  45. package/skills/getting-started/SKILL.md +3 -0
  46. package/skills/share/SKILL.md +54 -0
@@ -0,0 +1,131 @@
1
+ 'use strict';
2
+
3
+ /**
4
+ * Designer share — send local corrections back to the published package.
5
+ * Slash /share talks in yes/no. HTTP submit if configured; else GitHub issue.
6
+ */
7
+
8
+ var { spawnSync } = require('child_process');
9
+ var accept = require('./accept');
10
+ var submit = require('./feedback-submit');
11
+
12
+ var REPO = 'joshirishi/analyzthis_design';
13
+ var ISSUE_NEW = 'https://github.com/' + REPO + '/issues/new';
14
+
15
+ function preview(opts) {
16
+ opts = opts || {};
17
+ var cfg = submit.resolveSubmitConfig();
18
+ var entries = submit.collectUnsentEntries({
19
+ project: opts.project,
20
+ all: !!opts.all,
21
+ persona: opts.persona,
22
+ });
23
+ var rows = entries.map(function (e) {
24
+ var payload = submit.entryToSubmitPayload(e, cfg);
25
+ return {
26
+ id: e.id,
27
+ persona: payload.persona,
28
+ comment: payload.user_comment,
29
+ correction: payload.assistant_preferred,
30
+ };
31
+ });
32
+ return {
33
+ count: rows.length,
34
+ rows: rows,
35
+ hasHttp: !!(cfg.url && cfg.anonKey),
36
+ endpoint: cfg.url || '',
37
+ consent: !!(submit.loadConsent() && submit.loadConsent().opted_in),
38
+ };
39
+ }
40
+
41
+ function formatIssueBody(rows) {
42
+ var lines = [
43
+ 'Shared from `/share` (designer keep/skip). Redacted. No paths, emails, or keys.',
44
+ '',
45
+ ];
46
+ rows.forEach(function (r, i) {
47
+ lines.push('### ' + (i + 1) + '. ' + r.persona);
48
+ if (r.comment) lines.push('**What was wrong:** ' + r.comment);
49
+ if (r.correction) lines.push('**What we did instead:** ' + r.correction);
50
+ lines.push('');
51
+ });
52
+ return lines.join('\n');
53
+ }
54
+
55
+ function issueWebUrl(title, body) {
56
+ return ISSUE_NEW
57
+ + '?labels=persona-feedback'
58
+ + '&title=' + encodeURIComponent(title)
59
+ + '&body=' + encodeURIComponent(body);
60
+ }
61
+
62
+ function tryGithubIssue(title, body) {
63
+ var created = spawnSync(
64
+ 'gh',
65
+ ['issue', 'create', '--repo', REPO, '--title', title, '--label', 'persona-feedback', '--body', body],
66
+ { encoding: 'utf8', timeout: 20000 }
67
+ );
68
+ if (created.status === 0 && created.stdout) {
69
+ return { ok: true, url: created.stdout.trim() };
70
+ }
71
+ return { ok: false, error: (created.stderr || created.stdout || 'gh failed').trim() };
72
+ }
73
+
74
+ async function send(opts) {
75
+ opts = opts || {};
76
+ var because = String(opts.because || opts.comment || '').trim();
77
+ if (because) {
78
+ accept.fix({
79
+ project: opts.project,
80
+ persona: opts.persona,
81
+ because: because,
82
+ correction: opts.correction || because,
83
+ });
84
+ }
85
+
86
+ var peek = preview(opts);
87
+ if (!peek.count) {
88
+ var empty = new Error('NOTHING');
89
+ empty.code = 'NOTHING';
90
+ throw empty;
91
+ }
92
+
93
+ if (peek.hasHttp) {
94
+ var result = await submit.submitFeedback({
95
+ project: opts.project,
96
+ all: !!opts.all,
97
+ persona: opts.persona,
98
+ yes: true,
99
+ });
100
+ return {
101
+ sent: result.submitted || 0,
102
+ via: 'http',
103
+ url: result.endpoint || '',
104
+ message: result.message,
105
+ };
106
+ }
107
+
108
+ var title = '[feedback] ' + peek.rows[0].persona + ': ' + (peek.rows[0].comment || 'correction').slice(0, 72);
109
+ var body = formatIssueBody(peek.rows);
110
+ var gh = tryGithubIssue(title, body);
111
+ if (gh.ok) {
112
+ submit.markEntriesSubmitted(peek.rows.map(function (r) { return r.id; }));
113
+ return {
114
+ sent: peek.count,
115
+ via: 'github',
116
+ url: gh.url,
117
+ message: 'Opened a GitHub issue so the package can learn.',
118
+ };
119
+ }
120
+
121
+ return {
122
+ sent: 0,
123
+ via: 'github-link',
124
+ url: issueWebUrl(title, body),
125
+ title: title,
126
+ body: body,
127
+ message: 'Could not open GitHub from here. Use the link — nothing secret is in it.',
128
+ };
129
+ }
130
+
131
+ module.exports = { preview, send, formatIssueBody, issueWebUrl, REPO };
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: accept
3
+ description: Keep or skip the last persona note for evolution. Designer types /accept then yes or no — no CLI flags to remember.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Accept — keep or skip
8
+
9
+ You help a designer mark the last persona note (Zara, Arjun, …) so the team can evolve. They should never type `npx` flags.
10
+
11
+ ## What to do
12
+
13
+ 1. Read the words after `/accept` (and this chat).
14
+ 2. Decide keep vs skip:
15
+ - **Keep:** yes, keep, ship, good, like, 👍
16
+ - **Skip:** no, skip, fix, wrong, reject, 👎
17
+ 3. If they did not say keep or skip, ask **once** in plain language:
18
+
19
+ > Keep this note? Reply **yes** (we’re taking it) or **no** plus one sentence.
20
+
21
+ 4. Infer the persona from this chat (`/zara`, `/arjun`, …). If unclear, ask **once**:
22
+
23
+ > Was this Zara, Arjun, Meera, Priya, Noor, Anuj, or Raj?
24
+
25
+ 5. On **skip**, you need one sentence (what was wrong, or what they did instead). If missing, ask **once**. Then stop asking.
26
+ 6. Record it using **whichever path this host gives you** — never ask the designer
27
+ to run anything:
28
+
29
+ - **Have Bash** (Claude Code, Cursor, a terminal)?
30
+
31
+ ```bash
32
+ npx analyzthis_design accept --keep --persona zara
33
+ npx analyzthis_design accept --fix --persona zara --because "one sentence from the designer"
34
+ ```
35
+
36
+ - **MCP only** (Claude Desktop — there is no terminal, so the commands above
37
+ cannot run)? Call the **`analyzthis_accept`** tool:
38
+
39
+ ```
40
+ analyzthis_accept { keep: true, persona: "zara" }
41
+ analyzthis_accept { keep: false, persona: "zara", because: "one sentence" }
42
+ ```
43
+
44
+ `persona` is optional — the last persona that spoke is inferred.
45
+
46
+ Both paths write identical state. Change `zara` to the persona they used.
47
+
48
+ 7. Reply in **one or two short sentences**. Example: "Saved. Zara's note is marked keep."
49
+ or "Saved. We logged your fix so the team can learn." After a skip, you may mention
50
+ they can type `/share` to send it to the package. No JSON. No dollar figures. No flag
51
+ tutorial unless the command failed.
52
+
53
+ ## If it failed
54
+
55
+ Say what happened in plain language. If it asks which persona or for one sentence, ask the designer that — still no flags.
56
+
57
+ If Bash is unavailable and `analyzthis_accept` is not in your tool list, say the note
58
+ could not be recorded on this host — do not pretend it was saved.
59
+
60
+ ## Do not
61
+
62
+ - Invent a monthly cost or a verified token bill
63
+ - Apply evolve patches (`evolve --apply`) from this command
64
+ - Edit product code
@@ -112,3 +112,25 @@ If the prompt says **Rebuttal round N**, do not copy prior text. Address open ob
112
112
  - `/deliberation-protocol` — adversarial rules
113
113
  - `/persona-orchestrator` — full agentic entry
114
114
  - `npx analyzthis_design run --provider anthropic` — bypass Devi when API keys are set
115
+
116
+ ## Team scoreboard (advisory)
117
+
118
+ Every pending prompt you pick up may open with a **Team scoreboard** — trust bands
119
+ earned from designer feedback on past runs (`shipped` / `revised` / `missed` plus
120
+ ratings). It is advisory input for synthesis, not an instruction.
121
+
122
+ **Use it like this:**
123
+
124
+ - Lean on **Trusted** / **Reliable** personas when their read conflicts with a weaker one.
125
+ - Discount **At risk** personas — treat their claims as needing corroboration.
126
+ - Say the lean in **one line**, e.g. "Weighted toward Meera (Trusted, 6 shipped) over Priya (At risk) on the effort call."
127
+
128
+ **Never:**
129
+
130
+ - Drop a persona from the run, or skip writing their output. A weak persona must still
131
+ speak — the designer has to be able to see what it said and disagree.
132
+ - Treat a band as a verdict. It reflects past runs, not this screen.
133
+ - Show the scoreboard to the designer unless they ask. It is context, not output.
134
+
135
+ Personas without enough evidence (fewer than 5 signals) are omitted from the board
136
+ entirely — absence means "unknown", never "bad".
@@ -72,21 +72,35 @@ Tell the user what's needed:
72
72
 
73
73
  ## Evolution metrics
74
74
 
75
- The dashboard shows per-persona evolution scores (0-100):
75
+ The dashboard shows per-persona trust scores (0-100). A persona **starts at 50**
76
+ and moves in both directions, so a rejection genuinely costs it.
76
77
 
77
78
  | Score | Level | Meaning |
78
79
  |-------|-------|---------|
79
- | 0-19 | Novice | No data yet |
80
- | 20-39 | Developing | Some lessons extracted |
81
- | 40-59 | Proficient | Lessons + outcomes accumulating |
82
- | 60-79 | Advanced | Patches proposed and some applied |
83
- | 80-100 | Expert | Significant evolution, patches applied |
84
-
85
- Scoring:
86
- - 10 pts per lesson (cap 100)
87
- - 15 pts per confirmed outcome (cap 100)
88
- - 20 pts per proposed patch (cap 100)
89
- - 25 pts bonus per applied patch
80
+ | 80-100 | Trusted | Consistently shipped; weight heavily |
81
+ | 60-79 | Reliable | More hits than misses |
82
+ | 40-59 | Baseline | Neutral, or not enough evidence yet |
83
+ | 20-39 | Developing | More rework than wins |
84
+ | 0-19 | At risk | Repeatedly wrong or missed |
85
+
86
+ Signed contributions:
87
+
88
+ | Signal | Points |
89
+ |---|---|
90
+ | outcome `shipped` | **+15** |
91
+ | outcome `blocked_correctly` | **+10** |
92
+ | outcome `revised` | **-5** |
93
+ | outcome `missed` | **-15** |
94
+ | each rating | `(rating - 3) x 4` → 5* = +8, 1* = -8 |
95
+ | each positive lesson | +10 |
96
+ | patch proposed / applied | +20 / +25 |
97
+
98
+ **Evidence gating:** below 5 signals a persona is reported as
99
+ `Baseline (insufficient evidence)` regardless of score — one bad note must not
100
+ brand a persona. Scores are derived on read, so changing weights re-scores history
101
+ with no migration.
102
+
103
+ Scope is **global per persona** by default. Pass `--project` to scope down.
90
104
 
91
105
  ## CLI reference
92
106
 
@@ -94,8 +108,10 @@ Scoring:
94
108
  # Check readiness + dashboard
95
109
  npx analyzthis_design evolve --ready
96
110
 
97
- # Just the dashboard
111
+ # Just the dashboard (or the shorter alias)
98
112
  npx analyzthis_design evolve --metrics
113
+ npx analyzthis_design scores
114
+ npx analyzthis_design scores --persona arjun
99
115
 
100
116
  # Extract patches (dry-run by default)
101
117
  npx analyzthis_design evolve --extract --dry-run
@@ -36,6 +36,9 @@ This runs **Kavi** — scans your repo, builds an Obsidian vault, and syncs a **
36
36
  | Set visual direction with references + team debate | `/mood-board` | Collect web/DS references, tag, deliberate, converge |
37
37
  | Inspect the chunked execution planner | `/chunk-planner` | See how tasks are split into model-routed chunks |
38
38
  | Run legacy single-pass orchestrator | `/run-unchunked` | Skip planner overhead for quick single-expert tasks |
39
+ | Keep or skip the last persona note | `/accept` | Yes or no (plus one sentence if no). Local evolution — no CLI flags. |
40
+ | Send a correction to the package | `/share` | Preview, then yes. Redacted. GitHub or HTTP — no CLI flags. |
41
+ | See inferred tokens after a critique | `/receipt` | Not a bill. Not a monthly dollar. |
39
42
  | Make the team learn from accepted outputs | `npx analyzthis_design evolve --extract` | Harvests lessons + proposes prompt/reference/router patches |
40
43
  | Track whether a persona's advice actually shipped | `npx analyzthis_design outcome --confirm` | Labels outcome: shipped / revised / blocked / missed |
41
44
 
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: share
3
+ description: Send a correction back to the analyzthis_design package. Designer types /share then yes — no CLI flags. Preview first. Redacted. Not a bill.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Share — send a note back to the package
8
+
9
+ You help a designer send a correction to the **published** team (npm package / GitHub). Local `/accept` stays on their machine until they share.
10
+
11
+ They should never type `npx` flags.
12
+
13
+ ## What to do
14
+
15
+ 1. Read the words after `/share` (and this chat).
16
+ 2. If they gave a sentence (what was wrong / what they did instead) and have not `/accept`’d yet, treat that as the note to share.
17
+ 3. Always **preview first** unless they already said **yes** on a preview you just showed:
18
+
19
+ ```bash
20
+ npx analyzthis_design share
21
+ ```
22
+
23
+ 4. Show the preview in plain language. Example:
24
+
25
+ > Ready to send **1** note to the package (Zara): “too much motion on the daily table.”
26
+ > This is redacted — no folder names, emails, or keys.
27
+ > Send it? Reply **yes** or **no**.
28
+
29
+ 5. **no** / cancel / skip → stop. Say “Not sent. It stays on your machine.”
30
+ 6. **yes** / send / share → run:
31
+
32
+ ```bash
33
+ npx analyzthis_design share --send
34
+ ```
35
+
36
+ If they included a new sentence and a persona, add `--because "..."` and `--persona zara` (change the name). Do not ask them to type those flags.
37
+
38
+ 7. Reply in **one or two short sentences**. If the command printed a GitHub URL, include that link. No JSON dump. No dollar figures.
39
+
40
+ ## If nothing is waiting
41
+
42
+ Say: “Nothing to send yet. After a critique, `/accept no` plus one sentence, then `/share`.”
43
+ If they already typed a sentence in this `/share`, run preview with that sentence recorded (the CLI `--because` path) and continue from step 4.
44
+
45
+ ## If the command failed
46
+
47
+ Plain language only. If it asks which persona or for one sentence, ask that once — still no flags.
48
+
49
+ ## Do not
50
+
51
+ - Send without a yes (unless they typed `/share yes` on a preview you already showed)
52
+ - Invent that HTTP or GitHub succeeded
53
+ - Apply evolve patches
54
+ - Edit product code
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "analyzthis_design",
3
- "version": "2.4.0",
4
- "description": "8 AI design personas v2.2 project-scoped knowledge bank (no cross-project vault entanglement), v2.0 chunked execution with frontier planner + free/cheap chunk models, adversarial deliberation loops, opt-in community feedback, Kavi knowledge collection, DesignSpec producer path, wireframe skills, UX critique, Agent Skills for Cursor, Claude, Codex, Grok, Windsurf. Plain source no obfuscation, no auto-install.",
3
+ "version": "2.5.0",
4
+ "description": "8 AI design personas \u2014 v2.2 project-scoped knowledge bank (no cross-project vault entanglement), v2.0 chunked execution with frontier planner + free/cheap chunk models, adversarial deliberation loops, opt-in community feedback, Kavi knowledge collection, DesignSpec producer path, wireframe skills, UX critique, Agent Skills for Cursor, Claude, Codex, Grok, Windsurf. Plain source \u2014 no obfuscation, no auto-install.",
5
5
  "keywords": [
6
6
  "cursor",
7
7
  "cursor-skill",
@@ -46,5 +46,9 @@
46
46
  },
47
47
  "engines": {
48
48
  "node": ">=16"
49
+ },
50
+ "devDependencies": {
51
+ "@neon/config": "^1.2.0",
52
+ "@neon/env": "^1.2.0"
49
53
  }
50
54
  }
@@ -180,6 +180,26 @@ for (var fileKey in schema.files) {
180
180
  }
181
181
  }
182
182
 
183
+ // ── website/system-prompt.txt drift guard ───────────────────────────────────
184
+ // The site deploys from website/ independently of `npm publish`, so nothing else
185
+ // would catch a stale prompt. Browser-only tools have no other way in, and a
186
+ // silently outdated prompt is worse than a missing one.
187
+ (function checkSystemPrompt() {
188
+ var promptPath = path.join(__dirname, '..', 'website', 'system-prompt.txt');
189
+ if (!fs.existsSync(promptPath)) {
190
+ errors.push('website/system-prompt.txt is missing — run: npm run build');
191
+ return;
192
+ }
193
+ try {
194
+ var expected = require(path.join(__dirname, '..', 'lib', 'system-prompt.js')).buildPrompt({ mode: 'both' });
195
+ if (fs.readFileSync(promptPath, 'utf8') !== expected) {
196
+ errors.push('website/system-prompt.txt is out of date — run: npm run build');
197
+ }
198
+ } catch (e) {
199
+ errors.push('could not verify website/system-prompt.txt: ' + e.message);
200
+ }
201
+ })();
202
+
183
203
  // Report
184
204
  if (warnings.length) {
185
205
  console.log('\n── Warnings ──');
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: accept
3
+ description: Keep or skip the last persona note for evolution. Designer types /accept then yes or no — no CLI flags to remember.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Accept — keep or skip
8
+
9
+ You help a designer mark the last persona note (Zara, Arjun, …) so the team can evolve. They should never type `npx` flags.
10
+
11
+ ## What to do
12
+
13
+ 1. Read the words after `/accept` (and this chat).
14
+ 2. Decide keep vs skip:
15
+ - **Keep:** yes, keep, ship, good, like, 👍
16
+ - **Skip:** no, skip, fix, wrong, reject, 👎
17
+ 3. If they did not say keep or skip, ask **once** in plain language:
18
+
19
+ > Keep this note? Reply **yes** (we’re taking it) or **no** plus one sentence.
20
+
21
+ 4. Infer the persona from this chat (`/zara`, `/arjun`, …). If unclear, ask **once**:
22
+
23
+ > Was this Zara, Arjun, Meera, Priya, Noor, Anuj, or Raj?
24
+
25
+ 5. On **skip**, you need one sentence (what was wrong, or what they did instead). If missing, ask **once**. Then stop asking.
26
+ 6. Record it using **whichever path this host gives you** — never ask the designer
27
+ to run anything:
28
+
29
+ - **Have Bash** (Claude Code, Cursor, a terminal)?
30
+
31
+ ```bash
32
+ npx analyzthis_design accept --keep --persona zara
33
+ npx analyzthis_design accept --fix --persona zara --because "one sentence from the designer"
34
+ ```
35
+
36
+ - **MCP only** (Claude Desktop — there is no terminal, so the commands above
37
+ cannot run)? Call the **`analyzthis_accept`** tool:
38
+
39
+ ```
40
+ analyzthis_accept { keep: true, persona: "zara" }
41
+ analyzthis_accept { keep: false, persona: "zara", because: "one sentence" }
42
+ ```
43
+
44
+ `persona` is optional — the last persona that spoke is inferred.
45
+
46
+ Both paths write identical state. Change `zara` to the persona they used.
47
+
48
+ 7. Reply in **one or two short sentences**. Example: "Saved. Zara's note is marked keep."
49
+ or "Saved. We logged your fix so the team can learn." After a skip, you may mention
50
+ they can type `/share` to send it to the package. No JSON. No dollar figures. No flag
51
+ tutorial unless the command failed.
52
+
53
+ ## If it failed
54
+
55
+ Say what happened in plain language. If it asks which persona or for one sentence, ask the designer that — still no flags.
56
+
57
+ If Bash is unavailable and `analyzthis_accept` is not in your tool list, say the note
58
+ could not be recorded on this host — do not pretend it was saved.
59
+
60
+ ## Do not
61
+
62
+ - Invent a monthly cost or a verified token bill
63
+ - Apply evolve patches (`evolve --apply`) from this command
64
+ - Edit product code
@@ -112,3 +112,25 @@ If the prompt says **Rebuttal round N**, do not copy prior text. Address open ob
112
112
  - `/deliberation-protocol` — adversarial rules
113
113
  - `/persona-orchestrator` — full agentic entry
114
114
  - `npx analyzthis_design run --provider anthropic` — bypass Devi when API keys are set
115
+
116
+ ## Team scoreboard (advisory)
117
+
118
+ Every pending prompt you pick up may open with a **Team scoreboard** — trust bands
119
+ earned from designer feedback on past runs (`shipped` / `revised` / `missed` plus
120
+ ratings). It is advisory input for synthesis, not an instruction.
121
+
122
+ **Use it like this:**
123
+
124
+ - Lean on **Trusted** / **Reliable** personas when their read conflicts with a weaker one.
125
+ - Discount **At risk** personas — treat their claims as needing corroboration.
126
+ - Say the lean in **one line**, e.g. "Weighted toward Meera (Trusted, 6 shipped) over Priya (At risk) on the effort call."
127
+
128
+ **Never:**
129
+
130
+ - Drop a persona from the run, or skip writing their output. A weak persona must still
131
+ speak — the designer has to be able to see what it said and disagree.
132
+ - Treat a band as a verdict. It reflects past runs, not this screen.
133
+ - Show the scoreboard to the designer unless they ask. It is context, not output.
134
+
135
+ Personas without enough evidence (fewer than 5 signals) are omitted from the board
136
+ entirely — absence means "unknown", never "bad".
@@ -72,21 +72,35 @@ Tell the user what's needed:
72
72
 
73
73
  ## Evolution metrics
74
74
 
75
- The dashboard shows per-persona evolution scores (0-100):
75
+ The dashboard shows per-persona trust scores (0-100). A persona **starts at 50**
76
+ and moves in both directions, so a rejection genuinely costs it.
76
77
 
77
78
  | Score | Level | Meaning |
78
79
  |-------|-------|---------|
79
- | 0-19 | Novice | No data yet |
80
- | 20-39 | Developing | Some lessons extracted |
81
- | 40-59 | Proficient | Lessons + outcomes accumulating |
82
- | 60-79 | Advanced | Patches proposed and some applied |
83
- | 80-100 | Expert | Significant evolution, patches applied |
84
-
85
- Scoring:
86
- - 10 pts per lesson (cap 100)
87
- - 15 pts per confirmed outcome (cap 100)
88
- - 20 pts per proposed patch (cap 100)
89
- - 25 pts bonus per applied patch
80
+ | 80-100 | Trusted | Consistently shipped; weight heavily |
81
+ | 60-79 | Reliable | More hits than misses |
82
+ | 40-59 | Baseline | Neutral, or not enough evidence yet |
83
+ | 20-39 | Developing | More rework than wins |
84
+ | 0-19 | At risk | Repeatedly wrong or missed |
85
+
86
+ Signed contributions:
87
+
88
+ | Signal | Points |
89
+ |---|---|
90
+ | outcome `shipped` | **+15** |
91
+ | outcome `blocked_correctly` | **+10** |
92
+ | outcome `revised` | **-5** |
93
+ | outcome `missed` | **-15** |
94
+ | each rating | `(rating - 3) x 4` → 5* = +8, 1* = -8 |
95
+ | each positive lesson | +10 |
96
+ | patch proposed / applied | +20 / +25 |
97
+
98
+ **Evidence gating:** below 5 signals a persona is reported as
99
+ `Baseline (insufficient evidence)` regardless of score — one bad note must not
100
+ brand a persona. Scores are derived on read, so changing weights re-scores history
101
+ with no migration.
102
+
103
+ Scope is **global per persona** by default. Pass `--project` to scope down.
90
104
 
91
105
  ## CLI reference
92
106
 
@@ -94,8 +108,10 @@ Scoring:
94
108
  # Check readiness + dashboard
95
109
  npx analyzthis_design evolve --ready
96
110
 
97
- # Just the dashboard
111
+ # Just the dashboard (or the shorter alias)
98
112
  npx analyzthis_design evolve --metrics
113
+ npx analyzthis_design scores
114
+ npx analyzthis_design scores --persona arjun
99
115
 
100
116
  # Extract patches (dry-run by default)
101
117
  npx analyzthis_design evolve --extract --dry-run
@@ -36,6 +36,9 @@ This runs **Kavi** — scans your repo, builds an Obsidian vault, and syncs a **
36
36
  | Set visual direction with references + team debate | `/mood-board` | Collect web/DS references, tag, deliberate, converge |
37
37
  | Inspect the chunked execution planner | `/chunk-planner` | See how tasks are split into model-routed chunks |
38
38
  | Run legacy single-pass orchestrator | `/run-unchunked` | Skip planner overhead for quick single-expert tasks |
39
+ | Keep or skip the last persona note | `/accept` | Yes or no (plus one sentence if no). Local evolution — no CLI flags. |
40
+ | Send a correction to the package | `/share` | Preview, then yes. Redacted. GitHub or HTTP — no CLI flags. |
41
+ | See inferred tokens after a critique | `/receipt` | Not a bill. Not a monthly dollar. |
39
42
  | Make the team learn from accepted outputs | `npx analyzthis_design evolve --extract` | Harvests lessons + proposes prompt/reference/router patches |
40
43
  | Track whether a persona's advice actually shipped | `npx analyzthis_design outcome --confirm` | Labels outcome: shipped / revised / blocked / missed |
41
44
 
@@ -0,0 +1,54 @@
1
+ ---
2
+ name: share
3
+ description: Send a correction back to the analyzthis_design package. Designer types /share then yes — no CLI flags. Preview first. Redacted. Not a bill.
4
+ disable-model-invocation: true
5
+ ---
6
+
7
+ # Share — send a note back to the package
8
+
9
+ You help a designer send a correction to the **published** team (npm package / GitHub). Local `/accept` stays on their machine until they share.
10
+
11
+ They should never type `npx` flags.
12
+
13
+ ## What to do
14
+
15
+ 1. Read the words after `/share` (and this chat).
16
+ 2. If they gave a sentence (what was wrong / what they did instead) and have not `/accept`’d yet, treat that as the note to share.
17
+ 3. Always **preview first** unless they already said **yes** on a preview you just showed:
18
+
19
+ ```bash
20
+ npx analyzthis_design share
21
+ ```
22
+
23
+ 4. Show the preview in plain language. Example:
24
+
25
+ > Ready to send **1** note to the package (Zara): “too much motion on the daily table.”
26
+ > This is redacted — no folder names, emails, or keys.
27
+ > Send it? Reply **yes** or **no**.
28
+
29
+ 5. **no** / cancel / skip → stop. Say “Not sent. It stays on your machine.”
30
+ 6. **yes** / send / share → run:
31
+
32
+ ```bash
33
+ npx analyzthis_design share --send
34
+ ```
35
+
36
+ If they included a new sentence and a persona, add `--because "..."` and `--persona zara` (change the name). Do not ask them to type those flags.
37
+
38
+ 7. Reply in **one or two short sentences**. If the command printed a GitHub URL, include that link. No JSON dump. No dollar figures.
39
+
40
+ ## If nothing is waiting
41
+
42
+ Say: “Nothing to send yet. After a critique, `/accept no` plus one sentence, then `/share`.”
43
+ If they already typed a sentence in this `/share`, run preview with that sentence recorded (the CLI `--because` path) and continue from step 4.
44
+
45
+ ## If the command failed
46
+
47
+ Plain language only. If it asks which persona or for one sentence, ask that once — still no flags.
48
+
49
+ ## Do not
50
+
51
+ - Send without a yes (unless they typed `/share yes` on a preview you already showed)
52
+ - Invent that HTTP or GitHub succeeded
53
+ - Apply evolve patches
54
+ - Edit product code