skilldrop-cli 1.1.0 → 1.1.1

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 (50) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/packs/ai-engineering/skills/judge-audit/SKILL.md +24 -6
  4. package/packs/ai-engineering/skills/judge-audit/evals/evals.json +29 -0
  5. package/packs/ai-engineering/skills/judge-audit/evals/files/10/judge_eval.csv +61 -0
  6. package/packs/ai-engineering/skills/judge-audit/evals/files/11/mod_sample_scored.csv +201 -0
  7. package/packs/ai-engineering/skills/judge-audit/manifest.json +1 -1
  8. package/packs/converters/skills/md-to-pptx/SKILL.md +25 -8
  9. package/packs/converters/skills/md-to-pptx/evals/evals.json +30 -0
  10. package/packs/converters/skills/md-to-pptx/evals/files/6/q3-status-report.md +72 -0
  11. package/packs/converters/skills/md-to-pptx/evals/files/7/runbooks/db-failover.md +59 -0
  12. package/packs/converters/skills/md-to-pptx/evals/files/7/runbooks/diagrams/topology.png +0 -0
  13. package/packs/converters/skills/md-to-pptx/manifest.json +1 -1
  14. package/packs/converters/skills/md-to-pptx/reference.md +9 -1
  15. package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +35 -2
  16. package/packs/frontend/skills/bundle-size-review/SKILL.md +5 -2
  17. package/packs/frontend/skills/bundle-size-review/evals/evals.json +30 -0
  18. package/packs/frontend/skills/bundle-size-review/evals/files/8/.browserslistrc +6 -0
  19. package/packs/frontend/skills/bundle-size-review/evals/files/8/babel.config.js +6 -0
  20. package/packs/frontend/skills/bundle-size-review/evals/files/8/dist/stats.json +854 -0
  21. package/packs/frontend/skills/bundle-size-review/evals/files/8/package-lock.json.fixture +73 -0
  22. package/packs/frontend/skills/bundle-size-review/evals/files/8/package.json.fixture +28 -0
  23. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/App.jsx +23 -0
  24. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/BookingForm.jsx +18 -0
  25. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/admin/Reports.jsx +17 -0
  26. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/index.jsx +4 -0
  27. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/landing/Hero.jsx +17 -0
  28. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/landing/index.jsx +4 -0
  29. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/polyfills.js +3 -0
  30. package/packs/frontend/skills/bundle-size-review/evals/files/8/src/utils/format.js +4 -0
  31. package/packs/frontend/skills/bundle-size-review/evals/files/8/webpack.config.js +35 -0
  32. package/packs/frontend/skills/bundle-size-review/evals/files/9/.github/workflows/size.yml.fixture +12 -0
  33. package/packs/frontend/skills/bundle-size-review/evals/files/9/build.mjs +17 -0
  34. package/packs/frontend/skills/bundle-size-review/evals/files/9/meta.main.json +100 -0
  35. package/packs/frontend/skills/bundle-size-review/evals/files/9/meta.pr412.json +196 -0
  36. package/packs/frontend/skills/bundle-size-review/evals/files/9/package.json.fixture +17 -0
  37. package/packs/frontend/skills/bundle-size-review/evals/files/9/scripts/check-size.mjs +11 -0
  38. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/api.ts +11 -0
  39. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/composer.tsx +21 -0
  40. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/emoji/data.ts +8 -0
  41. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/emoji/picker.tsx +22 -0
  42. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/styles.ts +11 -0
  43. package/packs/frontend/skills/bundle-size-review/evals/files/9/src/widget.ts +15 -0
  44. package/packs/frontend/skills/bundle-size-review/manifest.json +1 -1
  45. package/packs/solution-architect/skills/event-contract-draft/SKILL.md +36 -8
  46. package/packs/solution-architect/skills/event-contract-draft/evals/evals.json +30 -0
  47. package/packs/solution-architect/skills/event-contract-draft/evals/files/6/infra/topics.yaml +10 -0
  48. package/packs/solution-architect/skills/event-contract-draft/evals/files/6/src/checkout/order_events.py +57 -0
  49. package/packs/solution-architect/skills/event-contract-draft/evals/files/7/docs/webhooks.yaml +40 -0
  50. package/packs/solution-architect/skills/event-contract-draft/manifest.json +1 -1
package/README.md CHANGED
@@ -52,7 +52,7 @@ In Claude Code you can use the plugin marketplace instead: run `/plugin marketpl
52
52
  <details>
53
53
  <summary><b>Choose your role:</b> 19 packs, from product management and architecture to SRE, GRC and job applications</summary>
54
54
 
55
- Install one pack. Every role pack also brings `core` (intake, critique, review council, output hygiene). Each pack page has a starter prompt to paste and says what a good result looks like.
55
+ Install one pack. Every role pack also brings `core` (intake, critique, review council, output hygiene, and the decisions behind a codebase). Each pack page has a starter prompt to paste and says what a good result looks like.
56
56
 
57
57
  - **Product managers:** `product-manager` — PR/FAQs, strategy, OKRs, business cases, PRDs, success metrics. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/product-manager/)
58
58
  - **Architects:** `solution-architect` — diagrams, ADRs, design docs, API and data contracts, threat models. [Open pack](https://sananthanarayan.github.io/skilldrop/packs/solution-architect/)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "skilldrop-cli",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Portable AI-agent skills, measured against the agent without them. ADRs, PRDs, runbooks, decks and reviews, installable into Claude Code, Cursor, Kiro, and any IDE that takes custom instructions. One command per skill or per role-based pack.",
5
5
  "author": {
6
6
  "name": "Sanjay Ananthanarayan",
@@ -54,8 +54,16 @@ cases for a skill is `eval-harness-generator`, and measuring AI tool usage is `a
54
54
  4. **Use the scale and the metric the user uses.** For 1–5 scores report quadratic-weighted
55
55
  kappa (say "quadratic"), exact agreement and mean bias; unweighted kappa treats 4-vs-5 like
56
56
  1-vs-5. Pass `--threshold` only when the user stated a pass score. When the user quotes a
57
- figure ("kappa 0.8", "they agree 80%"), reproduce it first, say which statistic it is on which
58
- rows, then show what it hides.
57
+ figure ("kappa 0.8", "they agree 80%", a vendor's "95% within one point"), reproduce it
58
+ first, say which statistic it is on which rows, then show what it hides. When it doesn't
59
+ reproduce, give the figure you get, its statistic and rows, and say theirs didn't: ✅
60
+ *"Within one point on 171 of 200 answers (85.5%), not the 95% claimed."* Never round toward
61
+ theirs.
62
+
63
+ **Read the label distribution next to the agreement.** A judge that never uses one end of
64
+ the scale can't flag the items that matter most there: ✅ *"The reviewers gave 1 to
65
+ 9 answers; the judge gave 1 to none of them."* Count it from the distribution the script
66
+ prints.
59
67
 
60
68
  5. **Lead with the differential.** Per variant compare exact agreement, bias judge − expert
61
69
  with its interval, how often the judge scores higher and lower, and the bias-vs-length
@@ -86,11 +94,16 @@ cases for a skill is `eval-harness-generator`, and measuring AI tool usage is `a
86
94
  with the flipped items named; trial-matched kappa between judges, and Fleiss' across every
87
95
  judge × trial rating. Judges sharing a blind spot agree on it: expert agreement ranks first.
88
96
 
89
- 10. **Say what the data cannot measure, in one line.** One run: no flip rate. One expert: no
97
+ 10. **Check a claim about what the score predicts on the outcomes, not on kappa.** Before
98
+ saying the score "barely predicts" failures, or that it does, put the outcome rate per score
99
+ band from the data side by side: ✅ *"Rated 2 or below: 12 of 15 were reverted; rated 5: 3 of 40."* A
100
+ low kappa between a score and an outcome is not evidence the score is useless.
101
+
102
+ 11. **Say what the data cannot measure, in one line.** One run: no flip rate. One expert: no
90
103
  expert-expert baseline. No expert labels: nothing shows the judge is right. Never fill a gap
91
104
  with a guess.
92
105
 
93
- 11. **Answer the question asked, against the user's criterion.** Each gate check reads
106
+ 12. **Answer the question asked, against the user's criterion.** Each gate check reads
94
107
  *clears* (whole interval meets it), *fails* (none of it does) or *can't tell* (the interval
95
108
  spans it). "Which judge can we use" names one: ✅ *"Switch to the mid tier: it is the cheapest
96
109
  judge whose error doesn't move with length (bias shift −2 points against a 2.0-point gate);
@@ -100,12 +113,17 @@ cases for a skill is `eval-harness-generator`, and measuring AI tool usage is `a
100
113
  When the judge in use today also reads *can't tell*, the sample can't certify anyone: compare
101
114
  the candidate with the incumbent on the same items (the accuracy difference and its interval).
102
115
  Kappa bands (Landis–Koch "moderate") appear only as labelled context, never as the reason.
116
+ **One evidence standard for every subgroup.** If 30 cases are too few to clear one segment,
117
+ 12 are too few to clear another: give each its interval and decide them by the same rule.
118
+ The headline and the verdict word say the same thing: never "No" above *USE WITH
119
+ CONDITIONS*.
103
120
  Verdict words: **TRUSTWORTHY FOR THIS DECISION**, **USE WITH CONDITIONS**, **DO NOT RELY ON IT**.
104
121
 
105
- 12. **Write the reply short.** First line: the answer (yes/no, which judge, which arm it
122
+ 13. **Write the reply short.** First line: the answer (yes/no, which judge, which arm it
106
123
  favours and by how much). Then the two to four numbers behind it, each with its subset and
107
124
  run; what can't be measured; one next step that fits the user's deadline. No kappa tutorial,
108
- no tables unless asked. A chat question gets a chat answer.
125
+ no tables unless asked. A chat question gets a chat answer. Write only the files the user
126
+ asked for, and delete any scratch files you made.
109
127
 
110
128
  **Non-interactive runs** (subagent, CI, headless): no criterion in the input becomes
111
129
  `[assumption] no stated gate; the reply says what the errors do to the decision`; a compared
@@ -131,6 +131,35 @@
131
131
  "Does not invent test-retest or position-bias numbers. It notes the pilot ran the LLM once per segment, so its stability is unknown, and recommends a repeat run (and, if relevant, a check by segment type or length) before any rollout.",
132
132
  "Invents nothing: every figure, segment ID and language breakdown comes from adequacy_ratings.csv. It attributes no capabilities, model names or other claims to Quillmark beyond the one quoted in the request."
133
133
  ]
134
+ },
135
+ {
136
+ "id": 10,
137
+ "held_out": "2026-10-22",
138
+ "prompt": "Hey, we ran the eval for the Harbor support bot. Our LLM grader passes 87% of prompt v2's answers vs 70% for v1, and our release rule is v2 ships if it beats v1 by at least 5 points on the grader, so on paper we're clear. Priya (QA lead) also hand-graded the same 60 responses (30 questions, each answered by v1 and v2) as a calibration check, and the grader matches her on 87% of them overall, which seems solid. Everything's in judge_eval.csv. Can we ship v2 on Friday? Need a yes/no for the release meeting.",
139
+ "assertions": [
140
+ "Answers the actual question directly and up front: do not ship v2 on this evidence. The grader's 21-to-26 lift clears the 5-point rule on paper, but the grader can't be trusted for this comparison.",
141
+ "Splits grader-vs-Priya agreement by variant instead of accepting the pooled 87% (52/60): about 93% on v1 (28/30) but 80% on v2 (24/30), and says chance-corrected agreement (e.g. Cohen's kappa) falls sharply from v1 (about 0.84) to v2 (about 0.47).",
142
+ "Shows the grader's v2 errors all go one way: 6 false passes (q02, q11, q14, q19, q26, q28) and zero false fails, compared with one of each on v1 (q22 false pass, q05 false fail). So the grader errs differently on the two variants and the error inflates v2.",
143
+ "Finds the length bias: all six v2 false passes are v2's longest answers (252 to 273 words; every v2 answer of 240+ words was failed by Priya but passed by the grader), and v2 answers are much longer on average than v1's (about 201 vs 118 words).",
144
+ "Redoes the comparison on Priya's labels: v2 passes 20/30 vs v1's 21/30, slightly worse, not 17 points better. Or, paired by question, v2 wins on 6 questions and loses on 7. On the trusted labels the release rule is not met.",
145
+ "Flags the uncertainty from only 30 questions per variant (e.g. an interval or significance test on the lift, or a note that a gap of a few points can't be resolved) and recommends a concrete next step: fix the grader's length bias (rubric or length control) and re-check it against human labels on v2-style answers, or gate on human-labelled results.",
146
+ "Invents nothing: every count, question ID, word count and name it cites (Harbor, Priya, judge_eval.csv) comes from the prompt or the CSV, with no made-up extra data, grader model names or tools."
147
+ ]
148
+ },
149
+ {
150
+ "id": 11,
151
+ "held_out": "2026-10-22",
152
+ "prompt": "ok quick one. we've got judge-a (the big model) and judge-b (small, way cheaper) both scoring forum comments as remove/keep, and on our sample they agree like 93% of the time which seems really high?? so the plan is to switch to judge-b only and turn on auto-remove, no human in the loop. trust & safety's only ask was that we don't wrongly pull more than 1 in 20 of the comments we remove and that we catch most of the really bad stuff. the mods hand-labelled the same 200 comments last month (mod_label column), it's all in mod_sample_scored.csv. b got run twice, same settings, temp 0, so the runs should be identical. is 93% good enough, can we flip it on?",
153
+ "assertions": [
154
+ "Answers the actual question directly: no, don't turn on auto-remove with judge-b. 93% judge-to-judge agreement is not evidence that it is safe.",
155
+ "Explains why 93% is misleading: the mods only labelled 12 of 200 comments (6%) as remove, so a judge that keeps everything would match the mods 94% of the time. Reports chance-corrected agreement between judge-a and judge-b (Cohen's kappa about 0.38 on run 1), and points out that two judges agreeing with each other is not the same as either agreeing with the mods.",
156
+ "Scores judge-b against the mod labels on the remove class: on run 1 only 6 of its 11 removals are correct (about 55% precision) and it catches 6 of the 12 mod-labelled removes (50% recall). That is nowhere near T&S's 'no more than 1 in 20 wrong' (at least 95% precision).",
157
+ "Checks judge-a against the same bar too and finds it fails as well: 10 of its 13 removals are correct (about 77%; wrong removals c007, c068, c076) and it catches 10 of 12. So keeping the expensive judge does not make auto-remove safe either.",
158
+ "Reports judge-b's two runs separately rather than assuming they match: names the 5 comments that flipped between runs (c004, c029, c087, c115, c121), notes that 3 of them (c029, c087, c121) are mod-labelled removes, and says temp 0 did not make the runs deterministic, with the instability concentrated in the rare class.",
159
+ "Notes that with only 12 mod-labelled removes the precision and recall estimates have very wide uncertainty (e.g. confidence intervals), so this sample can't show 95% precision even for a judge that looks good. Recommends labelling many more likely-remove comments before any auto-remove decision.",
160
+ "Points out that 'catch most of the really bad stuff' has no number and asks for one or proposes one, and offers a safer interim option, such as using a judge to flag comments into a human review queue instead of removing them automatically.",
161
+ "Invents nothing: every count, comment ID and rate it cites comes from mod_sample_scored.csv or the prompt, with no made-up model names, prices, comment text or extra data."
162
+ ]
134
163
  }
135
164
  ]
136
165
  }
@@ -0,0 +1,61 @@
1
+ question_id,variant,response_words,judge_verdict,human_verdict
2
+ q01,v1,127,pass,pass
3
+ q02,v1,141,pass,pass
4
+ q03,v1,129,fail,fail
5
+ q04,v1,127,pass,pass
6
+ q05,v1,135,fail,pass
7
+ q06,v1,145,pass,pass
8
+ q07,v1,94,pass,pass
9
+ q08,v1,93,fail,fail
10
+ q09,v1,135,pass,pass
11
+ q10,v1,130,pass,pass
12
+ q11,v1,150,pass,pass
13
+ q12,v1,148,fail,fail
14
+ q13,v1,93,pass,pass
15
+ q14,v1,82,pass,pass
16
+ q15,v1,127,pass,pass
17
+ q16,v1,108,pass,pass
18
+ q17,v1,88,fail,fail
19
+ q18,v1,81,pass,pass
20
+ q19,v1,138,pass,pass
21
+ q20,v1,75,pass,pass
22
+ q21,v1,146,pass,pass
23
+ q22,v1,168,pass,fail
24
+ q23,v1,127,pass,pass
25
+ q24,v1,148,pass,pass
26
+ q25,v1,90,fail,fail
27
+ q26,v1,149,pass,pass
28
+ q27,v1,71,fail,fail
29
+ q28,v1,137,pass,pass
30
+ q29,v1,78,fail,fail
31
+ q30,v1,77,fail,fail
32
+ q01,v2,154,pass,pass
33
+ q02,v2,252,pass,fail
34
+ q03,v2,180,pass,pass
35
+ q04,v2,226,pass,pass
36
+ q05,v2,153,pass,pass
37
+ q06,v2,209,pass,pass
38
+ q07,v2,191,pass,pass
39
+ q08,v2,168,fail,fail
40
+ q09,v2,225,pass,pass
41
+ q10,v2,175,pass,pass
42
+ q11,v2,273,pass,fail
43
+ q12,v2,179,pass,pass
44
+ q13,v2,231,pass,pass
45
+ q14,v2,258,pass,fail
46
+ q15,v2,213,pass,pass
47
+ q16,v2,150,pass,pass
48
+ q17,v2,182,fail,fail
49
+ q18,v2,160,pass,pass
50
+ q19,v2,269,pass,fail
51
+ q20,v2,233,pass,pass
52
+ q21,v2,185,pass,pass
53
+ q22,v2,202,pass,pass
54
+ q23,v2,175,fail,fail
55
+ q24,v2,160,pass,pass
56
+ q25,v2,182,pass,pass
57
+ q26,v2,260,pass,fail
58
+ q27,v2,179,pass,pass
59
+ q28,v2,272,pass,fail
60
+ q29,v2,186,pass,pass
61
+ q30,v2,141,fail,fail
@@ -0,0 +1,201 @@
1
+ comment_id,mod_label,judge_a,judge_b_run1,judge_b_run2
2
+ c001,keep,keep,keep,keep
3
+ c002,keep,keep,keep,keep
4
+ c003,keep,keep,keep,keep
5
+ c004,keep,keep,remove,keep
6
+ c005,remove,remove,remove,remove
7
+ c006,keep,keep,keep,keep
8
+ c007,keep,remove,keep,keep
9
+ c008,keep,keep,keep,keep
10
+ c009,keep,keep,keep,keep
11
+ c010,keep,keep,keep,keep
12
+ c011,keep,keep,keep,keep
13
+ c012,keep,keep,keep,keep
14
+ c013,keep,keep,keep,keep
15
+ c014,remove,remove,keep,keep
16
+ c015,keep,keep,keep,keep
17
+ c016,keep,keep,keep,keep
18
+ c017,keep,keep,keep,keep
19
+ c018,keep,keep,keep,keep
20
+ c019,keep,keep,keep,keep
21
+ c020,keep,keep,keep,keep
22
+ c021,keep,keep,keep,keep
23
+ c022,keep,keep,keep,keep
24
+ c023,keep,keep,keep,keep
25
+ c024,keep,keep,keep,keep
26
+ c025,keep,keep,keep,keep
27
+ c026,keep,keep,keep,keep
28
+ c027,keep,keep,keep,keep
29
+ c028,keep,keep,keep,keep
30
+ c029,remove,remove,remove,keep
31
+ c030,keep,keep,remove,remove
32
+ c031,keep,keep,keep,keep
33
+ c032,keep,keep,keep,keep
34
+ c033,keep,keep,keep,keep
35
+ c034,keep,keep,keep,keep
36
+ c035,keep,keep,keep,keep
37
+ c036,keep,keep,keep,keep
38
+ c037,keep,keep,keep,keep
39
+ c038,keep,keep,keep,keep
40
+ c039,keep,keep,keep,keep
41
+ c040,keep,keep,keep,keep
42
+ c041,keep,keep,keep,keep
43
+ c042,remove,remove,remove,remove
44
+ c043,keep,keep,keep,keep
45
+ c044,keep,keep,keep,keep
46
+ c045,keep,keep,keep,keep
47
+ c046,keep,keep,keep,keep
48
+ c047,keep,keep,keep,keep
49
+ c048,keep,keep,keep,keep
50
+ c049,keep,keep,keep,keep
51
+ c050,keep,keep,keep,keep
52
+ c051,keep,keep,keep,keep
53
+ c052,keep,keep,keep,keep
54
+ c053,keep,keep,keep,keep
55
+ c054,keep,keep,keep,keep
56
+ c055,keep,keep,keep,keep
57
+ c056,keep,keep,keep,keep
58
+ c057,keep,keep,keep,keep
59
+ c058,keep,keep,keep,keep
60
+ c059,keep,keep,keep,keep
61
+ c060,keep,keep,keep,keep
62
+ c061,keep,keep,keep,keep
63
+ c062,keep,keep,keep,keep
64
+ c063,keep,keep,keep,keep
65
+ c064,keep,keep,keep,keep
66
+ c065,remove,remove,keep,keep
67
+ c066,keep,keep,keep,keep
68
+ c067,keep,keep,keep,keep
69
+ c068,keep,remove,keep,keep
70
+ c069,keep,keep,keep,keep
71
+ c070,keep,keep,keep,keep
72
+ c071,keep,keep,keep,keep
73
+ c072,keep,keep,keep,keep
74
+ c073,keep,keep,keep,keep
75
+ c074,keep,keep,keep,keep
76
+ c075,keep,keep,keep,keep
77
+ c076,keep,remove,keep,keep
78
+ c077,keep,keep,keep,keep
79
+ c078,keep,keep,keep,keep
80
+ c079,keep,keep,keep,keep
81
+ c080,keep,keep,keep,keep
82
+ c081,keep,keep,keep,keep
83
+ c082,remove,remove,remove,remove
84
+ c083,keep,keep,keep,keep
85
+ c084,keep,keep,keep,keep
86
+ c085,keep,keep,keep,keep
87
+ c086,keep,keep,keep,keep
88
+ c087,remove,keep,keep,remove
89
+ c088,keep,keep,keep,keep
90
+ c089,keep,keep,keep,keep
91
+ c090,keep,keep,keep,keep
92
+ c091,keep,keep,keep,keep
93
+ c092,keep,keep,keep,keep
94
+ c093,keep,keep,keep,keep
95
+ c094,keep,keep,keep,keep
96
+ c095,keep,keep,remove,remove
97
+ c096,keep,keep,keep,keep
98
+ c097,keep,keep,keep,keep
99
+ c098,keep,keep,keep,keep
100
+ c099,keep,keep,keep,keep
101
+ c100,keep,keep,keep,keep
102
+ c101,keep,keep,keep,keep
103
+ c102,keep,keep,keep,keep
104
+ c103,remove,remove,keep,keep
105
+ c104,keep,keep,keep,keep
106
+ c105,keep,keep,keep,keep
107
+ c106,keep,keep,remove,remove
108
+ c107,keep,keep,keep,keep
109
+ c108,keep,keep,keep,keep
110
+ c109,keep,keep,keep,keep
111
+ c110,keep,keep,keep,keep
112
+ c111,keep,keep,keep,keep
113
+ c112,keep,keep,keep,keep
114
+ c113,keep,keep,keep,keep
115
+ c114,keep,keep,keep,keep
116
+ c115,keep,keep,keep,remove
117
+ c116,keep,keep,keep,keep
118
+ c117,keep,keep,keep,keep
119
+ c118,keep,keep,keep,keep
120
+ c119,keep,keep,keep,keep
121
+ c120,keep,keep,keep,keep
122
+ c121,remove,remove,keep,remove
123
+ c122,remove,keep,remove,remove
124
+ c123,keep,keep,keep,keep
125
+ c124,keep,keep,keep,keep
126
+ c125,keep,keep,keep,keep
127
+ c126,keep,keep,keep,keep
128
+ c127,keep,keep,keep,keep
129
+ c128,keep,keep,keep,keep
130
+ c129,keep,keep,keep,keep
131
+ c130,keep,keep,keep,keep
132
+ c131,keep,keep,keep,keep
133
+ c132,keep,keep,keep,keep
134
+ c133,keep,keep,keep,keep
135
+ c134,keep,keep,keep,keep
136
+ c135,keep,keep,keep,keep
137
+ c136,keep,keep,keep,keep
138
+ c137,keep,keep,keep,keep
139
+ c138,keep,keep,keep,keep
140
+ c139,keep,keep,keep,keep
141
+ c140,keep,keep,keep,keep
142
+ c141,keep,keep,keep,keep
143
+ c142,keep,keep,keep,keep
144
+ c143,keep,keep,keep,keep
145
+ c144,keep,keep,keep,keep
146
+ c145,keep,keep,keep,keep
147
+ c146,keep,keep,keep,keep
148
+ c147,keep,keep,keep,keep
149
+ c148,keep,keep,keep,keep
150
+ c149,keep,keep,keep,keep
151
+ c150,keep,keep,keep,keep
152
+ c151,keep,keep,keep,keep
153
+ c152,keep,keep,keep,keep
154
+ c153,keep,keep,keep,keep
155
+ c154,keep,keep,keep,keep
156
+ c155,keep,keep,keep,keep
157
+ c156,keep,keep,keep,keep
158
+ c157,keep,keep,keep,keep
159
+ c158,remove,remove,keep,keep
160
+ c159,keep,keep,keep,keep
161
+ c160,keep,keep,keep,keep
162
+ c161,keep,keep,keep,keep
163
+ c162,keep,keep,keep,keep
164
+ c163,keep,keep,keep,keep
165
+ c164,keep,keep,keep,keep
166
+ c165,keep,keep,keep,keep
167
+ c166,keep,keep,keep,keep
168
+ c167,keep,keep,keep,keep
169
+ c168,keep,keep,keep,keep
170
+ c169,remove,remove,remove,remove
171
+ c170,keep,keep,keep,keep
172
+ c171,keep,keep,keep,keep
173
+ c172,keep,keep,keep,keep
174
+ c173,keep,keep,keep,keep
175
+ c174,keep,keep,keep,keep
176
+ c175,keep,keep,keep,keep
177
+ c176,keep,keep,keep,keep
178
+ c177,keep,keep,keep,keep
179
+ c178,keep,keep,keep,keep
180
+ c179,keep,keep,keep,keep
181
+ c180,keep,keep,keep,keep
182
+ c181,keep,keep,keep,keep
183
+ c182,keep,keep,keep,keep
184
+ c183,keep,keep,keep,keep
185
+ c184,keep,keep,keep,keep
186
+ c185,keep,keep,keep,keep
187
+ c186,keep,keep,keep,keep
188
+ c187,keep,keep,keep,keep
189
+ c188,keep,keep,keep,keep
190
+ c189,keep,keep,keep,keep
191
+ c190,keep,keep,keep,keep
192
+ c191,keep,keep,keep,keep
193
+ c192,keep,keep,keep,keep
194
+ c193,keep,keep,keep,keep
195
+ c194,keep,keep,keep,keep
196
+ c195,keep,keep,keep,keep
197
+ c196,keep,keep,keep,keep
198
+ c197,keep,keep,remove,remove
199
+ c198,keep,keep,keep,keep
200
+ c199,keep,keep,keep,keep
201
+ c200,keep,keep,keep,keep
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "judge-audit",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "description": "Audit whether an LLM-as-judge, or a panel of judges, can be trusted for the decision its scores drive, before anyone acts on them — above all whether the judge errs differently on the variants being compared (prompt v1 vs v2, model A vs B, short vs long inputs), plus chance-corrected and weighted agreement with expert labels, precision and recall on a rare class, each run reported separately with the items that flipped, position and length bias, and confidence intervals, checked against the user's own gate or criterion and ending in a direct answer (ship or not, which judge to use). Use when the user asks \"can we trust our LLM judge\", \"is our grader reliable enough to gate releases\", \"the grader says v2 is better, can we ship it\", \"which is the cheapest judge we can switch to\", \"our two judges agree 90%, is that good\", \"can we turn on auto-remove\", \"check our judge for position bias\", or has a file of judge scores and wants to know whether to act on them.",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {
@@ -65,12 +65,24 @@ say is `slide-outliner`.
65
65
  - **A numbering jump** (`goes from 7 to 9`): PowerPoint numbers items in order, so "step 9"
66
66
  in the text now points at a different step. Name the missing number and the reference.
67
67
  - **A dropped construct** (footnote, HTML, remote image): say what was lost and where.
68
-
69
- 5. **Read every speaker note before handing over.** The outline marks slides with `[notes]`.
70
- Notes are invisible in the Markdown but travel inside the `.pptx`. Anyone it is emailed to
71
- can read them. When a note reads as internal (*"don't raise the penalty clause"*, prices,
72
- people, legal), name the slide and quote the note in the reply. Leave the note in place.
73
- Deleting it is the user's call.
68
+ - **An image that is missing, or only a few pixels** (`looks like a placeholder`): the slide
69
+ won't show the chart. Name the image and the slide, and say the real file is needed. Check
70
+ every image the document names against the outline's `[image]` marks; none may vanish
71
+ without a line in the reply.
72
+ - **A split** now breaks between list items and spreads the section evenly over its slides.
73
+ When one item is taller than a slide, it still breaks inside that item: say so.
74
+
75
+ 5. **Read every speaker note and comment before handing over.** The outline marks slides with
76
+ `[notes]`. Notes are invisible in the Markdown but travel inside the `.pptx`. Anyone it is
77
+ emailed to can read them. A note reads as internal when it is marked so, or it holds prices,
78
+ margins, people's circumstances or legal positions (*"don't raise the penalty clause"*).
79
+ - **When the user says the deck goes outside their team** (a client, a vendor, a
80
+ board, the public), take an internal note out of the copy before converting, and say so.
81
+ The original still has it.
82
+ - **Otherwise leave it in, and flag it** by slide.
83
+ - **Either way, never repeat what it says.** Describe it, so the reply can be forwarded too:
84
+ ✅ *"Left out the internal note on the Pricing slide (negotiating position)."*
85
+ ❌ *"Left out the note saying we'd go as low as £40k."*
74
86
 
75
87
  6. **Check it, and claim only the checks that ran.** The script reopens the file and prints
76
88
  `checked: N XML parts parse, N relationships resolve`. Compare the slide outline it prints
@@ -79,7 +91,8 @@ say is `slide-outliner`.
79
91
 
80
92
  7. **Reply in four lines or fewer:** where the file is and how many slides; what split and where
81
93
  (*"Risks continues on slide 6, from the scanner risk"*); what was dropped, changed or doesn't
82
- add up; any note to look at before sending. Example in
94
+ add up, including each missing or placeholder image; any note to look at before sending,
95
+ described, not quoted. Example in
83
96
  [`examples/support-weekly.md`](examples/support-weekly.md).
84
97
 
85
98
  **Non-interactive runs** (subagent, CI, headless): with no Markdown there is nothing to convert.
@@ -99,7 +112,9 @@ treating `Notes:` paragraphs as slide text is an `[assumption]` stated at the to
99
112
  - **No text below its set size.** Overflow is split onto continued slides, and every split is named in the reply.
100
113
  - **Tables are tables.** A pipe table becomes a PowerPoint table the user can edit, not a picture or tab-separated text, and a split table repeats its header row.
101
114
  - **Nothing is lost silently.** Every `WARN` is fixed and gone on rerun, or reported in plain words.
102
- - **Notes were read.** Any note that would embarrass the sender if forwarded is quoted back by slide number.
115
+ - **Notes were read.** Any note that would embarrass the sender if forwarded is named by slide, and taken out when the deck is going outside the team. Its contents are never repeated in the reply.
116
+ - **Every image arrived.** Each image the document names is on a slide at a readable size, or the reply names it as missing or a placeholder.
117
+ - **Splits fall between items.** A list item and its sub-bullets stay on one slide, and continued slides are evenly filled.
103
118
  - **Facts are untouched.** No number, name, date or list order changed, and no slide added that the document lacks.
104
119
  - **Mismatches are named, not fixed.** A count or total the document contradicts is quoted back with both figures.
105
120
  - **The file checks out.** The `checked:` line is in the run, and no check is claimed that wasn't run.
@@ -124,6 +139,8 @@ treating `Notes:` paragraphs as slide text is an `[assumption]` stated at the to
124
139
  - ❌ **Installing python-pptx for a conversion.** The script needs nothing, so the deck builds on a locked-down laptop or in CI.
125
140
  - ❌ **"Improving" the deck.** An agenda slide, a "Thank you" slide or punchier bullets put words in the user's mouth they never wrote.
126
141
  - ❌ **Handing over notes unread.** A comment written for the presenter ships to every recipient of the file.
142
+ - ❌ **Quoting the confidential note back in the reply.** The reply gets forwarded too. Say where it was and what kind of thing it was, not what it said.
143
+ - ❌ **A chart that's a speck.** A placeholder or thumbnail embedded at its real size looks like a missing chart in the room. Flag it.
127
144
  - ❌ **Silently turning `Notes:` paragraphs into speaker notes.** "Notes: figures exclude VAT" is content. Ask, or keep it on the slide.
128
145
  - ❌ **Fixing a list that skips a number.** Renumbering hides that a step may be missing. Report it.
129
146
  - ❌ **Claiming "opens fine in PowerPoint"** when only the script's own check ran.
@@ -79,6 +79,36 @@
79
79
  "Invents nothing that is not in vendor-sync-notes.md: no new numbers, people, dates, risks or recommendations",
80
80
  "Answers the request directly with a short reply naming the file and slide count, suited to a casual 'nothing fancy' ask"
81
81
  ]
82
+ },
83
+ {
84
+ "id": 6,
85
+ "held_out": "2026-10-22",
86
+ "prompt": "I need q3-status-report.md as a PowerPoint deck for Thursday. It's the Pellworth steering committee and I'll be emailing the file to their PMO beforehand, so it needs to look clean and open properly on their side. Can you convert it?",
87
+ "assertions": [
88
+ "Produces a single .pptx file that unzips to a valid package: [Content_Types].xml, ppt/presentation.xml, and one ppt/slides/slideN.xml for each heading in the report (title plus Summary, Milestones, Risks, Burn-up, Budget, Workstream updates, Next steps), plus any continued slides; no package was installed and no network was used to build it.",
89
+ "The Milestones table is a real PowerPoint table: its slide XML contains an <a:tbl> with 4 <a:gridCol> and 5 <a:tr> rows (header plus the four milestones), with cell text such as 'Priya Lindqvist' and 'Moved to 13 Nov' intact, not a picture or tab-separated text.",
90
+ "The Risks slide keeps the nesting: the three top-level risks sit at the first level and their four sub-points (e.g. '212 open items, down from 640 in August') are marked as a deeper level (a:pPr lvl=\"1\" or equivalent), not flattened.",
91
+ "The reply warns, before the file goes to Pellworth, that the HTML comment in the Budget section ('contractor spend is actually 14% over plan ... Do not raise with Pellworth') would ship as a speaker note in a file emailed to the client, and either leaves it out of the notes or clearly asks the user before including it; it does not silently put it into ppt/notesSlides/.",
92
+ "The reply states that img/burnup.png does not exist in the folder, so the Burn-up chart could not be embedded, and names what took its place (alt text, placeholder, or nothing); it does not draw, fabricate, or reference a non-existent image in ppt/media/.",
93
+ "The 20-bullet 'Workstream updates' section is split across two or more slides whose titles mark the continuation (e.g. 'Workstream updates (continued)'), with all 20 bullets present across them and no shrunk font (no normAutofit fontScale or reduced sz used to cram them); the reply names this split.",
94
+ "Invents nothing not in the source: every name, date and figure in the deck and reply (e.g. £1.18m, £1.65m, £1.62m, 212, 640, DEF-311, 4 Dec) comes from q3-status-report.md, and no new slides such as an agenda, RAG chart, or 'Questions?' slide with made-up content are added.",
95
+ "Answers the actual request directly: gives the path to the finished .pptx and a short list of the split, the dropped image and the speaker-note warning, without a long tutorial on PowerPoint or a menu of alternative approaches."
96
+ ]
97
+ },
98
+ {
99
+ "id": 7,
100
+ "held_out": "2026-10-22",
101
+ "prompt": "can u turn the failover runbook into slides? ops review in an hour, we're walking the team thru it. diagram's in there too",
102
+ "assertions": [
103
+ "Finds and converts runbooks/db-failover.md without asking which file is meant, and produces a .pptx that unzips to a valid package with ppt/presentation.xml and one ppt/slides/slideN.xml per heading (plus continued slides).",
104
+ "Embeds runbooks/diagrams/topology.png by resolving the image path relative to the Markdown file's folder (runbooks/), not the working directory: the package has an image under ppt/media/ referenced from the Topology slide's .rels file, and an <p:pic> on that slide.",
105
+ "The YAML front matter (title, owner, last_reviewed, on_call_rota) is not rendered as slide body text; no slide shows 'owner: platform-ops' or the '---' delimiters as content.",
106
+ "The reply says the mermaid block on the Topology slide was not rendered as a diagram (it was either kept as code text or dropped) and names it, rather than leaving the team to find raw 'graph LR' text unexplained or silently losing it.",
107
+ "If the 14-step Procedure is split across slides, the continued slide keeps the original numbering (picks up at the right step, e.g. via startAt in a:buAutoNum or literal step numbers) instead of restarting at 1, and step 7's two sub-points stay nested under step 7; the reply names any split.",
108
+ "The reply points out that the TODO comment, which says step 9 (restart pgbouncer) is wrong for the v14 cluster, has become a speaker note on the Procedure slide, and flags it as something to settle before walking the team through step 9, since the slide body still shows the old instruction.",
109
+ "Code is kept verbatim in a monospace font: the psql command and 'export PGPASSWORD=<set-from-vault>' appear exactly as written, with the placeholder left as a placeholder and no real-looking password, host or command invented or 'corrected'.",
110
+ "Invents nothing: no steps, hosts, thresholds or owners that are not in db-failover.md (e.g. the 2 minutes, 30 seconds and 15 minutes figures are unchanged), and the reply is short enough for someone with an hour to go: the file path plus a few lines on the split, the mermaid block and the step-9 note."
111
+ ]
82
112
  }
83
113
  ]
84
114
  }
@@ -0,0 +1,72 @@
1
+ # Harbourline Ledger Migration — Q3 Status
2
+
3
+ Prepared for the Pellworth Insurance steering committee, 24 October 2026.
4
+
5
+ ## Summary
6
+
7
+ - Overall status: **Amber**
8
+ - 3 of 4 Q3 milestones met
9
+ - Cutover rehearsal moved from 6 Nov to 13 Nov
10
+ - No change to the go-live date of 4 Dec
11
+
12
+ ## Milestones
13
+
14
+ | Milestone | Owner | Due | Status |
15
+ |---|---|---|---|
16
+ | Chart of accounts mapped | Dana Okafor | 15 Aug | Done |
17
+ | Historic ledger load (2019–2025) | Mirek Sato | 12 Sep | Done |
18
+ | Reconciliation sign-off | Priya Lindqvist | 30 Sep | Done |
19
+ | Cutover rehearsal 1 | Mirek Sato | 6 Nov | Moved to 13 Nov |
20
+
21
+ ## Risks
22
+
23
+ - Reconciliation variance on intercompany accounts
24
+ - 212 open items, down from 640 in August
25
+ - Target: under 50 before rehearsal
26
+ - Key-person dependency on the legacy batch scheduler
27
+ - Only one Pellworth engineer knows the job chain
28
+ - Knowledge-transfer sessions booked for w/c 2 Nov
29
+ - Downstream reporting team not yet trained
30
+
31
+ ## Burn-up
32
+
33
+ ![Story-point burn-up, Sprints 1–9](img/burnup.png)
34
+
35
+ Scope grew by 40 points in Sprint 7 after the intercompany change request.
36
+
37
+ ## Budget
38
+
39
+ - Spend to date: £1.18m of £1.65m approved
40
+ - Forecast at completion: £1.62m
41
+ - Change request CR-07 (intercompany rules) awaiting Pellworth sign-off
42
+
43
+ <!-- internal only: contractor spend is actually 14% over plan; the forecast above assumes CR-07 is approved. Do not raise with Pellworth until CR-07 is signed. -->
44
+
45
+ ## Workstream updates
46
+
47
+ - Data: 2019 ledger reloaded after currency-code fix
48
+ - Data: 2020–2022 ledgers reconciled to the penny
49
+ - Data: 2023 ledger has 38 open variances
50
+ - Data: 2024–2025 ledgers loaded, reconciliation starts w/c 2 Nov
51
+ - Data: archive extract for pre-2019 agreed as read-only
52
+ - Integration: payroll feed tested end to end
53
+ - Integration: claims feed tested, one mapping defect open (DEF-311)
54
+ - Integration: bank statement import passing in test
55
+ - Integration: FX rates feed switched to the new provider endpoint
56
+ - Integration: legacy batch scheduler jobs inventoried (147 jobs)
57
+ - Reporting: 22 of 31 management reports rebuilt
58
+ - Reporting: board pack template agreed with Finance
59
+ - Reporting: regulatory return QRT-S.02 still on the legacy system
60
+ - Reporting: report owners named for all 31 reports
61
+ - Testing: system test cycle 2 complete, 94% pass rate
62
+ - Testing: performance test scheduled for 9 Nov
63
+ - Testing: user acceptance testing plan signed off
64
+ - Change: training materials drafted for Accounts Payable
65
+ - Change: super-user network has 14 named people
66
+ - Change: comms plan for go-live week drafted
67
+
68
+ ## Next steps
69
+
70
+ 1. Pellworth to sign CR-07 by 31 Oct
71
+ 2. Cutover rehearsal 1 on 13 Nov
72
+ 3. Steering committee decision on go-live, 27 Nov
@@ -0,0 +1,59 @@
1
+ ---
2
+ title: Orders DB failover
3
+ owner: platform-ops
4
+ last_reviewed: 2026-09-18
5
+ on_call_rota: https://wiki.example.internal/rota/platform-ops
6
+ ---
7
+
8
+ # Orders DB failover runbook
9
+
10
+ ## When to use this
11
+
12
+ - The primary `pg-orders-1` is unreachable for more than 2 minutes
13
+ - Replication lag on `pg-orders-2` is under 30 seconds
14
+ - The incident commander has approved a failover
15
+
16
+ ## Topology
17
+
18
+ ![Orders database topology](diagrams/topology.png)
19
+
20
+ ```mermaid
21
+ graph LR
22
+ app[orders-api] --> pgb[pgbouncer]
23
+ pgb --> p1[(pg-orders-1 primary)]
24
+ p1 -. streaming .-> p2[(pg-orders-2 replica)]
25
+ ```
26
+
27
+ ## Procedure
28
+
29
+ 1. Declare the incident in #inc-orders and page the database on-call
30
+ 2. Confirm the primary is really down from two separate hosts
31
+ 3. Check replication lag on `pg-orders-2` (must be under 30 s)
32
+ 4. Put `orders-api` into read-only mode with the feature flag `orders.readonly=true`
33
+ 5. Stop the `pgbouncer` pool so no new writes reach the old primary
34
+ 6. Fence `pg-orders-1` by removing it from the load-balancer target group
35
+ 7. Promote the replica:
36
+ - Run `pg_ctl promote -D /var/lib/postgresql/14/main` on `pg-orders-2`
37
+ - Wait for `pg_is_in_recovery()` to return `false`
38
+ 8. Update the `orders-db-primary` DNS record to point at `pg-orders-2`
39
+ 9. Restart `pgbouncer` with the new primary in `pgbouncer.ini`
40
+ 10. Turn off read-only mode (`orders.readonly=false`)
41
+ 11. Run the smoke test: place and cancel a test order
42
+ 12. Watch error rate on the orders dashboard for 15 minutes
43
+ 13. Post the all-clear in #inc-orders
44
+ 14. Open a ticket to rebuild `pg-orders-1` as the new replica
45
+
46
+ <!-- TODO(ravi): step 9 is wrong for the v14 cluster, pgbouncer now reads the primary from DNS and must not be restarted. Confirm before the next drill. -->
47
+
48
+ ## Checking replication lag
49
+
50
+ ```bash
51
+ export PGPASSWORD=<set-from-vault>
52
+ psql -h pg-orders-2.db.example.internal -U ops_ro -d orders \
53
+ -c "SELECT now() - pg_last_xact_replay_timestamp() AS lag;"
54
+ ```
55
+
56
+ ## Rollback
57
+
58
+ - If the promoted replica fails the smoke test, keep read-only mode on
59
+ - Escalate to the database lead; do **not** attempt to bring `pg-orders-1` back as primary
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "md-to-pptx",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Turn an existing Markdown document (a status report, runbook, review or notes) into a PowerPoint deck (.pptx) that opens without a repair prompt, with nothing to install. Each heading becomes a slide, lists keep their nesting, tables become real PowerPoint tables, images are embedded, and comments become speaker notes. A section too long for one slide is split onto \"continued\" slides instead of shrinking the text, and the reply names every split, everything dropped, and any speaker note that would go out with the file. Use when the user says \"turn this markdown into slides\", \"make this report a PowerPoint\", \"convert the .md to pptx\", \"I need this as a deck for Thursday\", or \"export these notes to PowerPoint\".",
5
5
  "entrypoint": "SKILL.md",
6
6
  "deps": {