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.
- package/README.md +1 -1
- package/package.json +1 -1
- package/packs/ai-engineering/skills/judge-audit/SKILL.md +24 -6
- package/packs/ai-engineering/skills/judge-audit/evals/evals.json +29 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/10/judge_eval.csv +61 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/11/mod_sample_scored.csv +201 -0
- package/packs/ai-engineering/skills/judge-audit/manifest.json +1 -1
- package/packs/converters/skills/md-to-pptx/SKILL.md +25 -8
- package/packs/converters/skills/md-to-pptx/evals/evals.json +30 -0
- package/packs/converters/skills/md-to-pptx/evals/files/6/q3-status-report.md +72 -0
- package/packs/converters/skills/md-to-pptx/evals/files/7/runbooks/db-failover.md +59 -0
- package/packs/converters/skills/md-to-pptx/evals/files/7/runbooks/diagrams/topology.png +0 -0
- package/packs/converters/skills/md-to-pptx/manifest.json +1 -1
- package/packs/converters/skills/md-to-pptx/reference.md +9 -1
- package/packs/converters/skills/md-to-pptx/scripts/md_to_pptx.py +35 -2
- package/packs/frontend/skills/bundle-size-review/SKILL.md +5 -2
- package/packs/frontend/skills/bundle-size-review/evals/evals.json +30 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/.browserslistrc +6 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/babel.config.js +6 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/dist/stats.json +854 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/package-lock.json.fixture +73 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/package.json.fixture +28 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/App.jsx +23 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/BookingForm.jsx +18 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/admin/Reports.jsx +17 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/src/app/index.jsx +4 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/src/landing/Hero.jsx +17 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/src/landing/index.jsx +4 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/src/polyfills.js +3 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/src/utils/format.js +4 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/8/webpack.config.js +35 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/.github/workflows/size.yml.fixture +12 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/build.mjs +17 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/meta.main.json +100 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/meta.pr412.json +196 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/package.json.fixture +17 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/scripts/check-size.mjs +11 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/src/api.ts +11 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/src/composer.tsx +21 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/src/emoji/data.ts +8 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/src/emoji/picker.tsx +22 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/src/styles.ts +11 -0
- package/packs/frontend/skills/bundle-size-review/evals/files/9/src/widget.ts +15 -0
- package/packs/frontend/skills/bundle-size-review/manifest.json +1 -1
- package/packs/solution-architect/skills/event-contract-draft/SKILL.md +36 -8
- package/packs/solution-architect/skills/event-contract-draft/evals/evals.json +30 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/6/infra/topics.yaml +10 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/6/src/checkout/order_events.py +57 -0
- package/packs/solution-architect/skills/event-contract-draft/evals/files/7/docs/webhooks.yaml +40 -0
- 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.
|
|
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%"
|
|
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. **
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
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
|
|
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
|
|
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
|
+

|
|
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
|
+

|
|
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
|
|
Binary file
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "md-to-pptx",
|
|
3
|
-
"version": "0.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": {
|