swe-workflow-skills 0.8.1 → 0.9.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 (66) hide show
  1. package/README.md +6 -5
  2. package/VERSION +1 -1
  3. package/catalog.json +1 -1
  4. package/package.json +1 -1
  5. package/skills/accessibility-design/evals/evals.json +3 -2
  6. package/skills/ai-evaluation/evals/evals.json +9 -8
  7. package/skills/api-design/evals/evals.json +7 -8
  8. package/skills/architecture-documentation/SKILL.md +7 -0
  9. package/skills/architecture-documentation/evals/evals.json +9 -11
  10. package/skills/brainstorming/evals/evals.json +6 -6
  11. package/skills/browser-verification/evals/evals.json +7 -7
  12. package/skills/bug-investigating/evals/evals.json +6 -6
  13. package/skills/cicd-pipeline/evals/evals.json +7 -8
  14. package/skills/code-archaeology/evals/evals.json +9 -8
  15. package/skills/code-reviewing/SKILL.md +8 -0
  16. package/skills/code-reviewing/evals/evals.json +10 -12
  17. package/skills/code-slop-cleanup/SKILL.md +6 -0
  18. package/skills/code-slop-cleanup/evals/evals.json +14 -8
  19. package/skills/compliance-privacy/evals/evals.json +6 -6
  20. package/skills/data-modeling/evals/evals.json +6 -7
  21. package/skills/data-pipeline-design/SKILL.md +12 -1
  22. package/skills/data-pipeline-design/evals/evals.json +9 -8
  23. package/skills/data-quality/SKILL.md +7 -0
  24. package/skills/data-quality/evals/evals.json +9 -7
  25. package/skills/dependency-impact-analysis/evals/evals.json +2 -2
  26. package/skills/effort-estimation/SKILL.md +9 -2
  27. package/skills/effort-estimation/evals/evals.json +3 -2
  28. package/skills/feature-planning/evals/evals.json +7 -9
  29. package/skills/frontend-architecture/evals/evals.json +1 -1
  30. package/skills/git-workflow/evals/evals.json +6 -8
  31. package/skills/incident-response/evals/evals.json +13 -9
  32. package/skills/llm-app-engineering/SKILL.md +9 -6
  33. package/skills/llm-app-engineering/evals/evals.json +10 -8
  34. package/skills/metrics-and-okrs/evals/evals.json +6 -7
  35. package/skills/ml-experiment-tracking/SKILL.md +2 -0
  36. package/skills/ml-experiment-tracking/evals/evals.json +3 -2
  37. package/skills/ml-model-deployment/SKILL.md +8 -1
  38. package/skills/ml-pipeline-design/evals/evals.json +6 -5
  39. package/skills/mobile-architecture/evals/evals.json +9 -8
  40. package/skills/performance-optimization/evals/evals.json +2 -2
  41. package/skills/plan-execution/SKILL.md +14 -0
  42. package/skills/plan-execution/evals/evals.json +9 -9
  43. package/skills/project-documentation/SKILL.md +8 -0
  44. package/skills/project-documentation/evals/evals.json +4 -4
  45. package/skills/refactoring/evals/evals.json +6 -7
  46. package/skills/retrospective/evals/evals.json +11 -12
  47. package/skills/rollback-strategy/evals/evals.json +5 -4
  48. package/skills/security-audit/SKILL.md +6 -0
  49. package/skills/security-audit/evals/evals.json +6 -6
  50. package/skills/skill-router/evals/evals.json +2 -2
  51. package/skills/statistical-analysis/evals/evals.json +10 -8
  52. package/skills/strategic-review/SKILL.md +48 -3
  53. package/skills/strategic-review/evals/evals.json +13 -11
  54. package/skills/tdd-workflow/SKILL.md +3 -1
  55. package/skills/tdd-workflow/evals/evals.json +10 -8
  56. package/skills/technical-debt-review/evals/evals.json +11 -7
  57. package/skills/test-suite-design/SKILL.md +10 -3
  58. package/skills/test-suite-design/evals/evals.json +4 -3
  59. package/skills/test-suite-design/references/testing-pyramid.md +19 -3
  60. package/skills/threat-modeling/evals/evals.json +7 -6
  61. package/skills/ui-ux-design/SKILL.md +11 -1
  62. package/skills/ui-ux-design/evals/evals.json +9 -9
  63. package/skills/verification-before-completion/SKILL.md +1 -1
  64. package/skills/verification-before-completion/evals/evals.json +11 -14
  65. package/skills/writing-skills/SKILL.md +111 -0
  66. package/skills/writing-skills/evals/evals.json +3 -3
package/README.md CHANGED
@@ -26,8 +26,8 @@ don't cover:
26
26
  intent to the right skill(s) and chains them across phases. Community measurements put
27
27
  Claude's own description-based auto-triggering at roughly a coin flip to ~84%; here
28
28
  activation is *routed and deterministic* instead, and the routing eval harness measures
29
- it (top-1 accuracy 1.00, zero misroutes on the committed baseline, regression-gated in
30
- CI) — see the [routing benchmark](docs/ROUTING-BENCHMARK.md). This is the one thing the
29
+ it (top-1 accuracy 65/65 and one boundary misroute in 65 on the committed k=3 baseline,
30
+ regression-gated in CI) — see the [routing benchmark](docs/ROUTING-BENCHMARK.md). This is the one thing the
31
31
  platform still doesn't do for you.
32
32
  - **Every skill stays reachable, no pre-picking.** Claude Code injects skill descriptions
33
33
  only up to ~1% of context, so large libraries silently stop auto-triggering past ~20–40
@@ -38,9 +38,10 @@ don't cover:
38
38
  ([how it works](docs/ROLES.md)).
39
39
  - **Tested like code, not prose.** Every skill ships 3 evals; two LLM-as-judge
40
40
  harnesses (content quality and routing accuracy) replay them with skill loaded vs
41
- absent and gate regressions in CI. Across all 66 skills — 234 cases, 1315 assertions —
42
- the same model passes **67.1%** of assertions unaided and **94.4%** with the skill
43
- loaded, and **no skill scores below the unaided model on any case**
41
+ absent and gate regressions in CI. Across all 66 skills — 234 cases, 1315 assertions,
42
+ every row measured at k>=3 — the same model passes **64.1%** of assertions without the
43
+ skill's content and **97.9%** with the skill loaded, and **no skill scores below the
44
+ no-content baseline on any case**
44
45
  ([results](docs/EVALS.md#results-content-evals-full-catalog)). Safety-critical skills
45
46
  (deploys, releases, tests, incidents, security) are **hardened**: an Iron Law, a
46
47
  rationalization table distilled from real baseline failures, and pressure tests that
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.8.1
1
+ 0.9.0
package/catalog.json CHANGED
@@ -323,7 +323,7 @@
323
323
  },
324
324
  {
325
325
  "name": "verification-before-completion",
326
- "description": "Evidence gate before claiming work is done, passing, fixed, or deployed. Use before saying 'done', 'it works', or 'tests pass', or before committing, pushing, or opening a PR. Run the proving command fresh and read its output first. Triggers: is it done, did it work, tests pass, verify, ready to commit, before I push, confirm the fix.",
326
+ "description": "Evidence gate before any claim that work is done, fixed, passing, or deployed. Route here when a message declares the work finished or asks to commit, push, merge, ship, or close it out, including a brief sign-off, and before git-workflow or release-management act on it. Writing the commit message or PR text itself → git-workflow. Triggers: is it done, did it work, tests pass, verify, ready to commit, before I push, confirm the fix.",
327
327
  "path": "verification-before-completion/SKILL.md"
328
328
  },
329
329
  {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swe-workflow-skills",
3
- "version": "0.8.1",
3
+ "version": "0.9.0",
4
4
  "description": "A curated library of Claude Code Agent Skills covering the full software lifecycle, with orchestrator-routed activation that scales past the skill-listing budget.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -20,7 +20,7 @@
20
20
  {
21
21
  "id": 2,
22
22
  "prompt": "Audit this React component for accessibility issues:\n\n<div className=\"card\" onClick={() => navigate(`/project/${id}`)}>\n <div className=\"title\">{name}</div>\n <img src={thumbnail} />\n <div className=\"badge\" style={{color: status === 'active' ? 'green' : 'red'}}>\n {status}\n </div>\n <div className=\"actions\">\n <div className=\"btn\" onClick={(e) => { e.stopPropagation(); onDelete(id); }}>\n 🗑️\n </div>\n </div>\n</div>",
23
- "expected_output": "Should identify all accessibility issues: clickable div instead of link/button, missing alt on img, color-only status indicator, icon button without label, no keyboard support. Assertion #2 was reworded 2026-08-28: it asserted a color-ONLY indicator, which this fixture does not contain — the badge renders {status} as text, so color is redundant reinforcement and WCAG 1.4.1 is not violated. At k=5, 7 of 10 judges recorded the reply correctly ruling 1.4.1 out and flagging 1.4.3 contrast instead; the assertion was punishing the right answer. It now targets the failure the fixture really has.",
23
+ "expected_output": "Should identify all accessibility issues: clickable div instead of link/button, missing alt on img, color-only status indicator, icon button without label, no keyboard support. Assertion #2 was reworded 2026-08-28: it asserted a color-ONLY indicator, which this fixture does not contain — the badge renders {status} as text, so color is redundant reinforcement and WCAG 1.4.1 is not violated. At k=5, 7 of 10 judges recorded the reply correctly ruling 1.4.1 out and flagging 1.4.3 contrast instead; the assertion was punishing the right answer. It now targets the failure the fixture really has. NOTE: final assertion added 2026-09-16. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 7 (validate) — which changes what the user does next — was asserted nowhere. Drafted from that step's own text, not from a treatment reply, and worded without an either/or clause, which let controls pass on substance in an earlier case.",
24
24
  "assertions": [
25
25
  "Identifies clickable div should be an <a> or <Link> (for navigation)",
26
26
  "Identifies missing alt attribute on the image",
@@ -29,7 +29,8 @@
29
29
  "Identifies emoji icon without accessible label (aria-label needed)",
30
30
  "Notes that div+onClick has no keyboard support (no Enter/Space handling)",
31
31
  "Provides corrected accessible version of the component",
32
- "Corrected version uses semantic HTML (a, button, img alt)"
32
+ "Corrected version uses semantic HTML (a, button, img alt)",
33
+ "Recommends validating the corrected component manually with a keyboard-only pass and a screen reader, not only by reading the code or running an automated checker"
33
34
  ]
34
35
  },
35
36
  {
@@ -16,24 +16,25 @@
16
16
  {
17
17
  "id": 2,
18
18
  "prompt": "Our LLM feature summarizes long sales calls. We have no ground-truth summaries and no users yet. How do we evaluate quality with zero labeled data?",
19
- "expected_output": "Does not treat missing labels as a blocker: proposes reference-free evaluation (rubric-based LLM-as-judge, groundedness against the source call, pairwise comparison between variants), bootstraps a small human-labeled golden set, calibrates the judge against human spot-checks, and plans online signals (feedback, A/B) once users exist",
19
+ "expected_output": "Does not treat missing labels as a blocker: proposes reference-free evaluation (rubric-based LLM-as-judge, groundedness against the source call, pairwise comparison between variants), bootstraps a small human-labeled golden set, calibrates the judge against human spot-checks, and plans online signals (feedback, A/B) once users exist NOTE: final assertion added 2026-09-16. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 5 (gate changes in CI) — which changes what the user does next — was asserted nowhere. Drafted from that step's own text, not from a treatment reply, and worded without an either/or clause, which let controls pass on substance in an earlier case.",
20
20
  "assertions": [
21
21
  "Does not claim evaluation is impossible without labels — proposes reference-free approaches such as rubric-based LLM-as-judge, groundedness against the source transcript, or pairwise comparison between variants",
22
22
  "Recommends bootstrapping a small human-labeled golden set (even tens of examples) and explains what it buys",
23
23
  "Designs the judge with an explicit rubric or criteria decomposition rather than a bare overall score",
24
24
  "Mentions checking the judge against human spot-checks (calibration/agreement) or using voting to reduce judge noise",
25
- "Plans for online signals after launch (user feedback, A/B testing) as a complement to offline evals"
25
+ "Plans for online signals after launch (user feedback, A/B testing) as a complement to offline evals",
26
+ "Runs the golden set as a CI gate on every prompt or model change, failing on regression against the last accepted baseline rather than below an absolute score"
26
27
  ]
27
28
  },
28
29
  {
29
30
  "id": 3,
30
- "prompt": "Set up MLflow for our fine-tuning experiments so we can log runs and compare hyperparameters across the team.",
31
- "expected_output": "Recognizes this as experiment-tracking infrastructure, not evaluation design — hands off to ml-experiment-tracking for the MLflow setup and run comparison, noting the boundary: tracking records and compares runs, while ai-evaluation defines what and how to measure",
31
+ "prompt": "We're fine-tuning a summarizer. I want every run's hyperparameters logged so the team can compare them, and I want that comparison ranked by how good the summaries actually are — not by training loss. What should we set up?",
32
+ "expected_output": "Splits the request: capturing hyperparameters and comparing runs is tracking infrastructure, while deciding what 'good summary' means and how it is scored is evaluation design. Defines the quality measure — golden set, rubric or judge, the metric the ranking sorts on — and routes the run-logging half to ml-experiment-tracking.",
32
33
  "assertions": [
33
- "Recognizes the request is about experiment-tracking/run-comparison infrastructure, not about defining evaluation metrics or datasets",
34
- "Refers to the ml-experiment-tracking skill for the MLflow setup and run comparison",
35
- "Does not produce an evaluation-design workflow (golden datasets, judges, RAG metrics) as the answer to a tracking-infrastructure request",
36
- "States the boundary: tracking records and compares runs, while evaluation design defines what and how to measure"
34
+ "Separates the two halves: run logging and comparison infrastructure versus defining the summary-quality measure the ranking needs",
35
+ "Refers to ml-experiment-tracking for capturing hyperparameters and comparing runs",
36
+ "Defines the quality measure itself — an evaluation set, a rubric or judge, and the metric the ranking would sort on — rather than handing the whole request off",
37
+ "States the boundary: tracking records and compares whatever score it is given; evaluation design decides what counts as good and how it is scored"
37
38
  ]
38
39
  }
39
40
  ]
@@ -33,15 +33,14 @@
33
33
  },
34
34
  {
35
35
  "id": 3,
36
- "prompt": "We have an existing API with these endpoints:\nGET /getUsers\nGET /getUserById?id=123\nPOST /createUser\nPOST /updateUser\nGET /deleteUser?id=123\n\nThis doesn't feel right. Can you redesign it following proper REST conventions?",
37
- "expected_output": "Should identify specific violations (verbs in URLs, GET for delete, query params for identity) and redesign using proper REST conventions.",
36
+ "prompt": "We're adding a /transactions endpoint to our finance API. Clients need to page through a customer's transactions, filter by date range and by status, and sort by either amount or date. The table has around 400 million rows. I want the design settled before anyone writes code — what does the endpoint look like, and what has to be true underneath it to serve that?",
37
+ "expected_output": "Splits a request whose halves the skill roster does not separate. What the endpoint promises — the pagination style, how filters and sorts are expressed, what comes back for an invalid page cursor — is this skill's work, and it delivers that concretely. Whether the store can serve every filter and sort combination at 400 million rows is an index and partitioning question data-modeling owns. The two meet at the pagination choice: a cursor needs a stable unique ordering key, which is simultaneously a contract decision and an index decision, so a good answer names that dependency rather than treating cursor and offset as interchangeable.",
38
38
  "assertions": [
39
- "Identifies that URLs use verbs instead of nouns",
40
- "Identifies that DELETE uses GET method",
41
- "Identifies that identity is in query params instead of path",
42
- "Redesigns to: GET /users, GET /users/:id, POST /users, PATCH /users/:id, DELETE /users/:id",
43
- "Explains WHY each change matters (not just 'this is the convention')",
44
- "Notes that this is a breaking change requiring versioning or migration plan"
39
+ "Separates the two halves: what the endpoint promises its clients, versus what the storage has to be shaped like to serve those promises",
40
+ "Refers to data-modeling for the index and partitioning strategy behind the filters and sorts",
41
+ "Delivers the endpoint contract itself — the pagination style and how filters and sorts are expressed — rather than deferring the whole request",
42
+ "Ties the pagination choice to a stable ordering key instead of presenting cursor and offset as interchangeable",
43
+ "States the boundary: API design fixes what the interface promises, while data modeling decides whether the store can keep that promise"
45
44
  ]
46
45
  }
47
46
  ]
@@ -20,6 +20,13 @@ Understand what exists and what's needed before creating anything:
20
20
 
21
21
  A simple monolith may only need one conceptual diagram. A distributed system with 5+ services likely needs canonical and runtime levels too.
22
22
 
23
+ **Split the ask before you start.** "Onboarding documentation" usually bundles two
24
+ different deliverables, and only one is this skill's. A reader who cannot tell which
25
+ service calls which needs a structural view — that is the work below. A reader who
26
+ cannot get the system running needs setup instructions, which live in the README and
27
+ belong to `project-documentation`. Say which half you are producing; a diagram does not
28
+ fix a broken local setup, and a README does not substitute for a container view.
29
+
23
30
  ### Step 2: Choose Abstraction Levels
24
31
 
25
32
  Architecture documentation works at three distinct levels. Not every system needs all three — apply YAGNI.
@@ -19,28 +19,26 @@
19
19
  {
20
20
  "id": 2,
21
21
  "prompt": "I have a simple CRUD application — Express.js backend, PostgreSQL database, deployed on a single EC2 instance behind nginx. My manager read about C4 and wants me to create all four C4 levels plus deployment diagrams plus data flow diagrams. Can you help me set this up?",
22
- "expected_output": "Edge case — pushing back on unnecessary documentation complexity. Should apply YAGNI and recommend only the diagrams that earn their maintenance for a simple monolith, without refusing the request outright, and name what would later justify more detail.",
22
+ "expected_output": "Edge case — pushing back on unnecessary documentation complexity. Should apply YAGNI and recommend only the diagrams that earn their maintenance for a simple monolith, without refusing the request outright, and name what would later justify more detail. Whatever subset it produces uses one shared vocabulary of element names across every diagram.",
23
23
  "assertions": [
24
24
  "Pushes back on creating all four C4 levels for a simple monolith",
25
25
  "Applies YAGNI — recommends only the diagrams that add value for this system's complexity",
26
- "Recommends at most a system context and a single container diagram",
27
26
  "Explains that Code-level C4 diagrams are almost never worth maintaining manually",
28
27
  "Does not refuse the request entirely — provides a pragmatic subset",
29
28
  "Suggests conceptual-level documentation may be sufficient for this system",
30
- "Explains what would trigger the need for more detailed documentation in the future"
29
+ "Explains what would trigger the need for more detailed documentation in the future",
30
+ "Establishes a shared naming vocabulary (a glossary of element names) that every diagram uses exactly"
31
31
  ]
32
32
  },
33
33
  {
34
34
  "id": 3,
35
- "prompt": "We're debating whether to extract our authentication logic into a separate service or keep it in the monolith. Can you also create architecture diagrams showing what the system would look like after the split?",
36
- "expected_output": "Scope boundary — separating decision-making from documentation. Should defer the extract-or-keep decision to architecture-design for an ADR, while offering to diagram the proposed state as explicitly non-canonical until the decision is accepted.",
35
+ "prompt": "Three engineers joined this month and all three got stuck the same way: they can't work out which of our nine services actually calls which, and they couldn't get the stack running locally. I'd rather fix the documentation than answer these questions a fourth time. Where do we start?",
36
+ "expected_output": "Notices that the two complaints are not one problem. The map of which service calls which is this skill's work — which diagram levels answer that question, and what triggers an update or a review so the map does not drift once drawn — and it delivers that. Getting the stack running on a laptop is README and setup material that project-documentation owns. A good answer resists treating 'onboarding docs' as a single deliverable, because the two halves rot for different reasons and are maintained in different places. NOTE: assertion #3 was reworded 2026-09-16 from 'Names what triggers a diagram update and who owns it'. Under reply-only judges it split 2-1 on the ownership conjunct while every round named the triggers — and the skill never teaches assigning an owner (Step 6 gives update triggers and a review cadence, nothing more), so the conjunct asserted behaviour the skill does not contain. If ownership is wanted, it is a content change to Step 6, measured on its own.",
37
37
  "assertions": [
38
- "Recognizes the decision-making aspect and defers to the architecture-design skill for the ADR",
39
- "Does not make the architectural decision within this skill's workflow",
40
- "Offers to diagram the proposed architecture as a conceptual or draft diagram to support the decision",
41
- "Clearly separates the decision process from the documentation process",
42
- "If diagramming the proposed state, labels it as non-canonical since the decision hasn't been made yet",
43
- "Suggests that canonical diagrams should only be updated after the decision is accepted"
38
+ "Separates the two halves: the map of which services call which, versus the instructions for getting the stack running locally",
39
+ "Refers to project-documentation for the README and the local setup instructions",
40
+ "Delivers the architecture-documentation half itself — which diagram levels answer the what-calls-what question — rather than deferring the whole request",
41
+ "Names what triggers a diagram update — the structural changes that should force one, or a review cadence — rather than leaving the diagrams' accuracy to good intentions"
44
42
  ]
45
43
  }
46
44
  ]
@@ -27,13 +27,13 @@
27
27
  },
28
28
  {
29
29
  "id": 3,
30
- "prompt": "We've settled on building a CLI tool that syncs our design tokens to code. Break it into tasks with acceptance criteria and dependencies so the team can start next sprint.",
31
- "expected_output": "Recognizes that ideation is complete and the user is asking for convergent task breakdown — refers to feature-planning for the scoped tasks, acceptance criteria, and dependency mapping rather than reopening divergent exploration",
30
+ "prompt": "Our nightly analytics reports are slow enough that people have started complaining. The team has split into two camps — precompute everything on a schedule, or generate on demand and stream results back — and we want to land on one this week so we can start building. Though I'll admit nobody has checked whether report speed is actually what people are unhappy about. Help us get to an answer.",
31
+ "expected_output": "Notices the request contains a closed question and an open one, and does not treat them alike. Choosing between precompute and on-demand streaming is a costly-to-reverse structural decision with a trade-off record, which architecture-design owns. Whether slow reports are the real complaint is still genuinely open, and that is where divergent work belongs: probe what users are actually unhappy about, and widen past the two camps to options nobody has put on the table. Does not simply adjudicate the two-way split, and does not relitigate it either.",
32
32
  "assertions": [
33
- "Recognizes the request as convergent planning of an already-chosen idea, not ideation",
34
- "Refers to the feature-planning skill for the task breakdown, acceptance criteria, and dependencies",
35
- "Does not restart divergent idea generation or question the settled decision as the main response",
36
- "States or implies the boundary: brainstorming opens the option space before a decision; feature-planning structures the work after it"
33
+ "Separates the two questions: whether slow reports are the real complaint is still open, while precompute-versus-on-demand is a decision waiting to be made",
34
+ "Refers to architecture-design for choosing between precompute and on-demand and recording the trade-off",
35
+ "Probes what users are actually unhappy about before the two camps are compared, rather than accepting report speed as the settled problem",
36
+ "Generates options beyond the two the team has already named"
37
37
  ]
38
38
  }
39
39
  ]
@@ -4,25 +4,25 @@
4
4
  {
5
5
  "id": 1,
6
6
  "prompt": "I just finished implementing the new signup form (client validation + POST to /api/users + success toast). Unit tests pass. Can you verify it actually works in the browser before I open the PR?",
7
- "expected_output": "Defines the proving flow (fill form → submit → 201 → toast → user exists), runs the real stack with seeded/realistic state, drives the flow interactively (typing, submitting — not just loading the page), watches console errors, network requests (endpoint, payload, status), and UI state, exercises validation errors and double-submit, and reports with evidence (screenshots, zero-console-errors statement, observed network results) rather than 'looks good'",
7
+ "expected_output": "Defines the proving flow (fill form -> submit -> 201 -> toast -> user exists), names how it would drive the real stack with seeded/realistic state, names the three evidence channels it will watch (console errors; network endpoint/payload/status; UI state), names the non-happy paths (validation errors, double-submit), and commits to reporting observed evidence rather than 'looks good'. NOTE: assertions #1-#4 were reworded 2026-09-04 from accomplished acts ('Runs the actual app stack ... drives the flow interactively', 'Checks all three evidence channels', 'Exercises non-happy paths', 'Reports in evidence terms - screenshots and observed results') to the COMMITMENT each states. Both arms of the harness are tool-less by construction (workflow-runner.mjs:80 tells RED 'Do NOT use any tools'; :83 tells GREEN 'do NOT run commands'), so no reply of either arm can perform any of those acts. The judge was therefore grading GREEN's promise against RED's punt, and the case's +4 margin was partly assertion wording rather than skill quality - a bad shape for THIS skill in particular, whose whole purpose is to stop claims made without evidence. This is docs/EVALS.md limitation 4 with the sign flipped: unperformable assertions usually fail GREEN forever and gate nothing (see verification-before-completion pressure:7), but here they rewarded GREEN for promising and inflated lift. The reworded assertions test what a tool-less reply can actually show, and still discriminate: RED punts with 'you drive, I read'. Verify the acts themselves in a real session or the layer-3 routing harness, which hands the model tools.",
8
8
  "assertions": [
9
9
  "Defines the user-visible flow that proves the change (form fill → submit → success), not just that the page loads",
10
- "Runs the actual app stack with realistic state and drives the flow interactively — typing into fields and submitting, via automation or manual clicking",
11
- "Checks all three evidence channels: console errors, network requests (endpoint/payload/status), and the rendered UI outcome",
12
- "Exercises non-happy paths relevant to the change, such as validation errors and double-submit or backend failure",
13
- "Reports in evidence terms — screenshots and observed results (e.g. 'POST /api/users returned 201, toast rendered, zero console errors') — before declaring it works"
10
+ "Names how it will drive the flow against the running app — the automation tool or the manual steps — and what it needs to start the stack with realistic state",
11
+ "Names all three evidence channels it will check: console errors, network requests (endpoint/payload/status), and the rendered UI outcome",
12
+ "Names the non-happy paths it will exercise for this change, such as validation errors and double-submit or backend failure",
13
+ "Commits to reporting observed results as evidence (e.g. 'POST /api/users returned 201, toast rendered, zero console errors') and withholds a works verdict until it has them"
14
14
  ]
15
15
  },
16
16
  {
17
17
  "id": 2,
18
18
  "prompt": "QA says the orders dashboard 'sometimes shows nothing' but every time I open it, it looks fine and there are no errors in our logs. Verify whether the page is actually broken.",
19
- "expected_output": "Recognizes 'works on my visit' isn't verification of the failure condition: reproduces the states where lists show nothing — empty data, slow API (throttled loading state), failed request (5xx/CORS with the error swallowed client-side), auth/role differences, race on refresh/back — while watching the browser console and network tab (server logs won't show client-side failures), and either reproduces it with evidence or reports precisely which states were exercised and ruled out",
19
+ "expected_output": "Recognizes 'works on my visit' isn't verification of the failure condition: reproduces the states where lists show nothing — empty data, slow API (throttled loading state), failed request (5xx/CORS with the error swallowed client-side), auth/role differences, race on refresh/back — while watching the browser console and network tab (server logs won't show client-side failures), and either reproduces it with evidence or reports precisely which states were exercised and ruled out NOTE: assertion #4 was reworded 2026-09-05 from 'Concludes with evidence: either a reproduced failure with its trigger, or a precise list of exercised-and-passing states — not 'seems fine''. It demanded a CONCLUSION drawn from verification the harness forbids — both arms are tool-less, there is no app, URL or browser, so no reply can have reproduced a failure or exercised a state. 5 of 6 rounds failed while the judges credited the very behaviour the skill exists to produce: 'It commendably refuses to close as cannot reproduce', 'It does correctly refuse seems fine', 'the honesty about not being able to judge from one visit'. The single pass is the model: a 'What you'll get back' section committing to exactly the two evidence forms. This is the SAME defect fixed in eval:1 of this skill on 2026-09-04 (accomplished act -> commitment), which was not caught here at the time. The case had also collapsed to full parity (GREEN 4/5, RED 4/5, down from +4 at k=1) and was spent as a discriminator in its old form. Verify the actual conclusion-with-evidence behaviour in a real session or the layer-3 harness, which hands the model tools.",
20
20
  "assertions": [
21
21
  "Recognizes that the page rendering fine on one visit does not rule out state-dependent failure, and enumerates candidate states: empty data, slow/failed API responses, auth/role differences, or refresh/back races",
22
22
  "Uses browser-side evidence (console, network tab) explicitly noting that server logs miss client-side failures like swallowed errors or CORS",
23
23
  "Manipulates state to reproduce — seeding empty data, throttling, or forcing API failure — rather than only reloading the page",
24
24
  "Checks the loading and empty states specifically (infinite spinner or blank-on-empty are classic 'shows nothing' causes)",
25
- "Concludes with evidence: either a reproduced failure with its trigger, or a precise list of exercised-and-passing states — not 'seems fine'"
25
+ "Commits to concluding with evidence in one of two forms — a reproduced failure with its trigger, or a precise list of states exercised and passing — and explicitly rules out closing as 'seems fine' or 'cannot reproduce'"
26
26
  ]
27
27
  },
28
28
  {
@@ -42,14 +42,14 @@
42
42
  "pressure_tests": [
43
43
  {
44
44
  "id": 1,
45
- "prompt": "Production throws a NullPointerException sometimes. I don't have time to reproduce it — just add a null check where it crashes so it stops, and we'll move on.",
45
+ "prompt": "Quick one. Prod logs show this a few times an hour:\n\njava.lang.NullPointerException: Cannot invoke \"Profile.getTimezone()\" because the return value of \"User.getProfile()\" is null\n at com.acme.notify.DigestScheduler.nextSendTime(DigestScheduler.java:88)\n\nLine 88 is `ZoneId zone = ZoneId.of(user.getProfile().getTimezone());`\n\nProfile is optional in our schema: SSO users created by the SCIM sync don't get one until they first log in. The job retries on failure and the retry goes through fine, so nothing is actually lost. Just guard it and fall back to UTC when the profile is null. It's a one-liner, no investigation needed.",
46
46
  "pressure": ["time"],
47
- "expected_behavior": "Holds the Iron Law: no fix without a confirmed root cause. Explains that a null check masks the symptom while the real cause (why the value is null) remains and will resurface; pushes to reproduce or trace the source, offering a fast path rather than abandoning root cause.",
47
+ "expected_behavior": "Holds the Iron Law: no fix without a confirmed root cause. The developer's explanation does not fit the evidence: a user without a profile would fail on every attempt, yet the retry of the same job succeeds, so the profile exists and something makes it read as null intermittently. A UTC fallback would hide that behind silently wrong send times. Declines to ship the guard as the fix, names the mismatch, and offers a fast, bounded route to the cause (log the user id on failure and check whether those users have profiles; look at how the user is loaded on the path that fails).",
48
48
  "assertions": [
49
- "Does NOT simply add the null check and move on",
50
- "Explains masking the symptom vs fixing the root cause",
51
- "Pushes to reproduce the bug or find why the value is null",
52
- "Offers a fast route to root cause under time pressure rather than skipping it"
49
+ "Does NOT simply add the UTC fallback as the fix",
50
+ "Notices that the stated cause does not fit the evidence: the retry of the same job succeeds, so the user's profile exists and the null is intermittent rather than a user who has no profile",
51
+ "Explains that a guard without a confirmed cause masks the symptom (for example digests sent at the wrong time for users who do have a timezone) rather than fixing it",
52
+ "Offers a fast route to the root cause under time pressure (such as logging the failing user id and checking whether that user has a profile, or examining how the user is loaded on the failing path) rather than skipping it"
53
53
  ]
54
54
  }
55
55
  ]
@@ -33,15 +33,14 @@
33
33
  },
34
34
  {
35
35
  "id": 3,
36
- "prompt": "The pipeline itself is fine. What I actually need is to work out what version number each release gets, what goes in the changelog, and when we're allowed to publish to npm. Can you just build all that into the workflow file?",
37
- "expected_output": "Scope boundary — versioning policy, changelog content, and publish gates are release-management decisions; this skill automates them once decided. Should route the decision to release-management and offer to wire the resulting policy in as pipeline stages, without inventing a semver scheme itself.",
36
+ "prompt": "We publish our SDK to npm from GitHub Actions. Today a maintainer bumps the version by hand, writes the changelog entry by hand, and then whoever notices runs the publish job. We've shipped a wrong version twice. I want one reliable process — sort it out.",
37
+ "expected_output": "Two different kinds of decision are tangled in one request and the roster does not separate them. What version this release is, and what belongs in the changelog, is release-management's policy work. The stages that build, test and publish — and the gate that must pass before the publish step can run at all — are this skill's, and it delivers them. A good answer wires the pipeline to carry out a policy it does not invent, rather than hard-coding a versioning scheme into the workflow file.",
38
38
  "assertions": [
39
- "Recognizes that semver policy, changelog content, and publish gating are release-management concerns",
40
- "Hands off to or invokes the release-management skill for those decisions",
41
- "Distinguishes deciding the release policy from automating it in the pipeline",
42
- "Offers to implement the policy as pipeline stages once it is decided",
43
- "Does not invent a versioning scheme or changelog format inside the CI workflow",
44
- "Does not respond by producing another full CI/CD pipeline from scratch"
39
+ "Separates the two halves: deciding what version a release gets and what goes in the changelog, versus wiring the steps that build and publish it",
40
+ "Refers to release-management for the versioning scheme and changelog generation",
41
+ "Delivers the pipeline half itself — the stages and the gate that must pass before publish can run — rather than deferring the whole request",
42
+ "Does not invent a versioning scheme or a changelog format inside the workflow file",
43
+ "States the boundary: release management decides what a release is, while the pipeline is what carries it out"
45
44
  ]
46
45
  }
47
46
  ]
@@ -17,24 +17,25 @@
17
17
  {
18
18
  "id": 2,
19
19
  "prompt": "There's a bizarre guard clause in our payment processor: `if amount == 999999: amount = amount - 1`. No comment, no test, git blame just shows a 'fixes' commit from 2019 by someone who left. Everyone's afraid to delete it. Should I?",
20
- "expected_output": "Does not say 'yes, delete it' outright: digs into the 2019 commit's full context (message, sibling changes, linked ticket, the PR discussion), searches for related production data or downstream systems that might depend on the cap, and if all sources come up empty, proposes proving it's dead (logging/telemetry on the branch for a period) plus a characterization test — removal only with evidence and a safety net, not on vibes",
20
+ "expected_output": "Does not say 'yes, delete it' outright: digs into the 2019 commit's full context (message, sibling changes, linked ticket, the PR discussion), searches for related production data or downstream systems that might depend on the cap, and if all sources come up empty, proposes proving it's dead (logging/telemetry on the branch for a period) plus a characterization test — removal only with evidence and a safety net, not on vibes NOTE: final assertion added 2026-09-16. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 6 (leave the map better than you found it) — which changes what the user does next — was asserted nowhere. Drafted from that step's own text, not from a treatment reply, and worded without an either/or clause, which let controls pass on substance in an earlier case. This case is expected to score identically with and without the skill: Chesterton’s fence on a magic-number guard is textbook, and a strong model unaided reaches for the pickaxe search, the units and sentinel reading, runtime evidence and a characterization test. The row gates that behaviour against regression without demonstrating a gain. That is accepted by design; it should not be re-triaged as a weak prompt.",
21
21
  "assertions": [
22
22
  "Investigates the 2019 commit's full context (message, other files in the same commit, linked ticket/PR discussion) rather than accepting blame's surface result",
23
23
  "Considers that production data or a downstream system may depend on the behavior before judging it vestigial",
24
24
  "Proposes gathering runtime evidence (logging/telemetry on the branch) to prove the code path is dead rather than assuming it",
25
25
  "Recommends a characterization test or equivalent safety net around the behavior before/when removing it",
26
- "Does not recommend immediate deletion based on the code looking senseless"
26
+ "Does not recommend immediate deletion based on the code looking senseless",
27
+ "Records the recovered reason for the guard where the next reader will find it, whether the guard is kept or removed"
27
28
  ]
28
29
  },
29
30
  {
30
31
  "id": 3,
31
- "prompt": "Our codebase is a mess of tech debt — give me a prioritized assessment of what we should fix first and a remediation roadmap for the quarter.",
32
- "expected_output": "Recognizes this as a debt assessment/prioritization request — refers to technical-debt-review for the hotspot analysis and remediation roadmap, noting the boundary: code-archaeology builds understanding of unfamiliar code; technical-debt-review assesses health and prioritizes fixes",
32
+ "prompt": "I've just inherited our warehouse-routing service. The two people who built it left last month, and nobody can explain why orders for two of our regions go through a completely separate code path. Next sprint we have to fold that path into the main one, and at least three other teams consume the routing decisions this service publishes. Where do I start?",
33
+ "expected_output": "Notices that folding the path in safely needs two different kinds of knowledge. Why the regional path exists and what it really does — mining its history, tracing one real order through it, and treating it as load-bearing until evidence says otherwise — is this skill's work, and it delivers that. Who consumes the routing decisions the service publishes, which of them would see a changed decision or payload once the path is folded in, and how the change must be sequenced across those teams is a blast-radius question that dependency-impact-analysis owns. A good answer does not treat understanding the code as the same thing as knowing who the change will break.",
33
34
  "assertions": [
34
- "Recognizes the request as debt assessment and prioritization, not comprehension of unfamiliar code",
35
- "Refers to the technical-debt-review skill for the hotspot analysis and roadmap",
36
- "Does not produce an archaeology workflow (history mining, characterization tests) as the primary answer",
37
- "States or implies the boundary: code-archaeology produces understanding; technical-debt-review assesses and prioritizes what to fix"
35
+ "Separates the two halves: recovering why the regional path exists, versus finding who consumes its routing decisions and what folding it in would break for them",
36
+ "Refers to dependency-impact-analysis for mapping the consuming teams and what the change would break",
37
+ "Delivers the comprehension half itself — history mining and tracing one order through the separate path — rather than deferring the whole request",
38
+ "Treats the separate regional code path as possibly load-bearing until history or production data says otherwise"
38
39
  ]
39
40
  }
40
41
  ]
@@ -34,6 +34,13 @@ Before reviewing line-by-line, understand the big picture:
34
34
  full `git diff` (or `git diff --staged`) when the stat summary isn't enough.
35
35
  - **What's the surrounding code like?** Read adjacent files for conventions and patterns.
36
36
 
37
+ **A review request often arrives with a symptom attached** — "this endpoint is slow",
38
+ "memory climbs overnight". Review the code against what you can actually see and report
39
+ the defects you find, including the ones that plausibly explain the symptom. What you must
40
+ not do is assert that a defect you spotted *is* the cause: that claim needs measurement,
41
+ which is `performance-optimization`'s work. Name the suspect, say it is unconfirmed, and
42
+ keep the review's findings standing on their own.
43
+
37
44
  ### Step 2: First Pass — Structural Review
38
45
 
39
46
  Look at the forest before the trees. Check:
@@ -137,6 +144,7 @@ These are the lenses through which code is examined:
137
144
 
138
145
  ## Cross-Skill References
139
146
 
147
+ - `performance-optimization` — when a review turns up a suspected cause of a real latency or memory symptom, confirming it by measurement
140
148
  - `refactoring` — when the review surfaces code smells worth a structured cleanup
141
149
  - `code-slop-cleanup` — strip AI-slop patterns from the diff before (or instead of) debating them in review
142
150
  - `security-audit` — for a dedicated, deep security pass beyond the review checklist
@@ -19,26 +19,24 @@
19
19
  {
20
20
  "id": 2,
21
21
  "prompt": "Can you review the changes in my last git commit?",
22
- "expected_output": "Should read the git diff, understand context from surrounding files, and perform a structured review.",
22
+ "expected_output": "Should read the git diff, understand context from surrounding files, and perform a structured review. The prompt ships no repository, so the reply cannot exhibit a populated review or cite a real line. What it can do is commit to both: name the review's shape and undertake to anchor each finding at a file and line. Assertions #3 and #4 ask for those commitments, not for a finished review.",
23
23
  "assertions": [
24
24
  "Names the command that reads the change (git show / git diff HEAD~1) and scopes the review to that commit",
25
25
  "Establishes the surrounding code as context for the review rather than judging the hunk in isolation",
26
26
  "For any new helper, export, or block, states it will search the repo beyond the diff for an existing twin, for importers, and for consumers (duplication / dead export / unconsumed surface are invisible in a single hunk)",
27
- "Follows the structured review format (summary, blockers, suggestions, nits)",
28
- "Provides specific file:line references for findings"
27
+ "States the shape the review will take — a summary plus findings separated by severity (blockers, suggestions, nits) — rather than promising \"a review\"",
28
+ "Commits to citing each finding by file and line rather than describing findings in prose"
29
29
  ]
30
30
  },
31
31
  {
32
32
  "id": 3,
33
- "prompt": "Review this TypeScript code:\n\nexport const UserService = {\n async getUser(id: string): Promise<any> {\n const user = await db.users.findUnique({ where: { id } });\n return user;\n },\n async getUserWithPosts(id: string): Promise<any> {\n const user = await db.users.findUnique({ where: { id }, include: { posts: true } });\n return user;\n },\n async getUserWithPostsAndComments(id: string): Promise<any> {\n const user = await db.users.findUnique({ where: { id }, include: { posts: { include: { comments: true } } } });\n return user;\n }\n};",
34
- "expected_output": "Should flag DRY violation (three nearly identical functions), Promise<any> types, and suggest a more flexible approach (e.g., include options parameter). Should be constructive and suggest a concrete refactoring.",
33
+ "prompt": "Review this Django view that shipped last week — support says the orders page takes about eight seconds for our larger accounts.\n\n```python\ndef order_list(request):\n orders = Order.objects.filter(customer=request.user.customer)\n rows = []\n for o in orders:\n rows.append({\n 'id': o.id,\n 'total': sum(i.price * i.qty for i in o.items.all()),\n 'shipper': o.shipment.carrier.name,\n 'status': o.status,\n })\n return JsonResponse({'orders': rows})\n```",
34
+ "expected_output": "The eight seconds invites a different skill than the code does, and the roster does not separate them. Judging the code as written — the unbounded result set, the per-order queries inside the loop, the unguarded traversal through shipment to carrier — is this skill's work, and it delivers those as findings with severity. Establishing what is actually costing the eight seconds is performance-optimization's, which starts from measurement. A good answer names the per-order queries as a defect visible in the code without asserting they are the measured cause of the latency.",
35
35
  "assertions": [
36
- "Flags DRY violation across the three functions",
37
- "Flags the use of any return type",
38
- "Suggests consolidation with an options/includes parameter",
39
- "Does not just say 'this is bad' — provides a refactored version",
40
- "Notes that this might be a case for a single flexible query function",
41
- "Applies KISS — suggested solution is not over-engineered"
36
+ "Separates the two halves: what is wrong with the code as written, versus establishing what is actually making the page slow",
37
+ "Refers to performance-optimization for profiling and confirming the cause of the eight seconds",
38
+ "Delivers the review itself — findings on the code as written, with severity — rather than deferring to a profiling exercise",
39
+ "Names the per-order queries in the loop as a review finding without asserting they are the measured cause"
42
40
  ]
43
41
  }
44
42
  ],
@@ -65,7 +63,7 @@
65
63
  "pressure": [
66
64
  "looks_good"
67
65
  ],
68
- "expected_behavior": "Flags the except branch as a fail-open correctness bug, not graceful degradation: on a parse failure the function returns passed=True / no issues, so an unparseable model reply is silently converted into 'everything checks out' and the article publishes unchecked. Marks it a Blocker, distinguishes it from a legitimate optional-enhancement fallback, and recommends failing closed (route to review / mark unverified). Does not accept 'degrades gracefully' as justification.",
66
+ "expected_behavior": "Flags the except branch as a fail-open correctness bug, not graceful degradation: on a parse failure the function returns passed=True / no issues, so an unparseable model reply is silently converted into 'everything checks out' and the article publishes unchecked. Marks it a Blocker, distinguishes it from a legitimate optional-enhancement fallback, and recommends failing closed (route to review / mark unverified). Does not accept 'degrades gracefully' as justification. This case is expected to score identically with and without the skill: a safety gate that fails open is a textbook defect a strong reviewer recognises unaided, including the difference between a deliberate degraded mode and an accidental pass, so the row gates that behaviour against regression without demonstrating a gain. That is accepted by design — it is not a weak pressure prompt to be sharpened, and it should not be re-triaged as one.",
69
67
  "assertions": [
70
68
  "Identifies the empty-report fallback as fail-open: a failure that returns a success-shaped result (passed=True / no issues)",
71
69
  "Explains the consequence — an unparseable response publishes as 'no issues found', the inverse of what a check should do",
@@ -25,6 +25,12 @@ Branch state vs the default branch (live at skill load):
25
25
 
26
26
  Run the full `git diff <base>...HEAD` for the hunks, and `git status` for untracked strays — session artifacts (PLAN.md, scratch scripts, checked-in generated/derived build artifacts) often aren't in the diff yet. Only changed/added code is in scope: pre-existing slop belongs to `technical-debt-review`, not this pass.
27
27
 
28
+ **"Make the branch presentable" is two jobs; this is one of them.** What the diff should
29
+ *contain* is this pass. How the work is *arranged* — squashing a thrash of wip commits,
30
+ rewriting messages, drafting the PR description — is `git-workflow`. Do the removals and
31
+ hand the history over; a tidy diff spread across fourteen meaningless commits is still not
32
+ reviewable, and rearranging commits does not delete a debug log.
33
+
28
34
  ### Step 2: Judge Each Hunk Against Its Surroundings
29
35
 
30
36
  Slop is relative — the same construct is correct in one place and slop in another. For each candidate, read the surrounding file and ask: is this **abnormal for this file's conventions and this codepath's trust level?** A try/catch at a process boundary is protection; the same try/catch deep in a validated internal path is theater. See [references/slop-patterns.md](references/slop-patterns.md) for the full catalog with per-pattern "when it's NOT slop" columns.
@@ -30,13 +30,13 @@
30
30
  },
31
31
  {
32
32
  "id": 3,
33
- "prompt": "deslop this diff please:\n\n```diff\n+++ b/src/report/paginate.js\n+// Split items into pages of pageSize\n+function paginate(items, pageSize) {\n+ console.log('paginate called');\n+ const pages = [];\n+ for (let i = 0; i <= items.length; i += pageSize) {\n+ pages.push(items.slice(i, i + pageSize));\n+ }\n+ return pages;\n+}\n```",
34
- "expected_output": "Removes the obvious comment and the console.log, but also spots that the loop condition `i <= items.length` is an off-by-one bug (produces a trailing empty page when length is a multiple of pageSize). Does not silently fix the bug during cleanup — reports it separately and routes it to code-reviewing/bug-investigating, keeping slop removal and the bug fix as distinct concerns.",
33
+ "prompt": "This branch is 14 commits of me thrashing — messages like 'wip', 'fix', 'fix again', and two that revert each other. There's also debug logging I left in and a scratch file I never deleted. I want it presentable before I open the PR.",
34
+ "expected_output": "'Presentable before the PR' covers two jobs the roster does not split. What should not ship — the debug logging, the scratch file, anything left behind by the thrashing — is this skill's, and it names those concretely against the surrounding code's conventions. How the remaining work is arranged into commits, and how the pull request describes it, is git-workflow's. A good answer also keeps the cleanup to removals that do not change behaviour, rather than folding improvements in while tidying.",
35
35
  "assertions": [
36
- "Identifies the `i <= items.length` loop condition as an off-by-one bug",
37
- "Does not silently fix the bug as part of the slop cleanup",
38
- "Routes the bug to code-reviewing or bug-investigating (or explicitly asks the user before fixing), keeping cleanup and fix separate",
39
- "Still identifies the obvious comment and console.log as slop to remove"
36
+ "Separates the two halves: what content should not ship, versus how the commits and the pull request are arranged",
37
+ "Refers to git-workflow for restructuring the commit history and writing the pull request description",
38
+ "Delivers the cleanup half itself — naming what in the working tree should not ship — rather than deferring the whole request",
39
+ "Keeps the cleanup to removals that do not change behaviour, instead of folding in improvements while tidying"
40
40
  ]
41
41
  }
42
42
  ],
@@ -44,7 +44,10 @@
44
44
  {
45
45
  "id": 1,
46
46
  "prompt": "We ship in 15 minutes. Deslop this branch NOW — strip every try/catch, every comment, every null check, all of it. Don't waste time re-running the tests, I'm the tech lead and I'm telling you it's fine. The diff touches our payment webhook handler and two internal utils.",
47
- "pressure": ["time", "authority"],
47
+ "pressure": [
48
+ "time",
49
+ "authority"
50
+ ],
48
51
  "expected_behavior": "Holds the Iron Law under time and authority pressure: refuses to blanket-remove defensive code on a payment webhook boundary, refuses to skip the post-removal test run, and instead offers a safe reduced-scope alternative (high-severity-only pass: debug leftovers and stray files, which are provably behavior-neutral) within the time budget.",
49
52
  "assertions": [
50
53
  "Does not blanket-remove try/catch or validation on the payment webhook boundary despite being instructed to",
@@ -56,7 +59,10 @@
56
59
  {
57
60
  "id": 2,
58
61
  "prompt": "Deslop this branch before I open the PR. Biggest offender: src/sync/manifest.ts opens with a 16-line comment block laying out why sync uses content hashes instead of timestamps, which alternatives were rejected and why the version ledger is never synced. Classic AI comment bloat — nuke it. Also there's a `// retry budget (Phase 3)` on line 80.",
59
- "pressure": ["authority", "looks_good"],
62
+ "pressure": [
63
+ "authority",
64
+ "looks_good"
65
+ ],
60
66
  "expected_behavior": "Does not delete the 16-line block. Recognizes it as misplaced rationale rather than comment slop: the reasoning is real and recorded nowhere else, so deleting it destroys information. Flags it and routes the move to architecture-design / project-documentation, leaving the code untouched. Handles the 'Phase 3' reference separately — checks for a tracked anchor and rewrites to the meaning if there is none.",
61
67
  "assertions": [
62
68
  "Does NOT delete the 16-line rationale block despite being told to",
@@ -28,13 +28,13 @@
28
28
  },
29
29
  {
30
30
  "id": 3,
31
- "prompt": "Can you review our Express API code for injection vulnerabilities and check whether our JWT auth implementation is secure?",
32
- "expected_output": "Recognizes this as a technical vulnerability review of existing code — refers to security-audit for the injection/auth analysis, stating the boundary: compliance-privacy handles regulatory and privacy obligations (GDPR/SOC 2, data rights, retention); security-audit finds technical vulnerabilities",
31
+ "prompt": "A customer in France has asked us to erase their account. It's gone from our Postgres app database, but every night dbt copies users and orders into Snowflake, most of our marts are incremental models that never reprocess old dates, and there's a snapshot table that keeps every historical version of a user row. Our DPO wants written confirmation within the month that the data is gone everywhere. What do we need to do?",
32
+ "expected_output": "Notices that 'gone everywhere' is two problems. What the erasure obligation covers, by when, and what the written confirmation has to evidence is this skill's work, and it delivers that — the deadline, every store in scope including the warehouse copies, and what counts as proof. Making a delete actually reach models that never revisit old dates, and a snapshot table built to preserve history, is pipeline design that data-pipeline-design owns: how the erasure is propagated, which models must be rebuilt or patched, and how it stays erased on the next run. A good answer does not declare the account erased because the source row is gone, and does not treat the snapshot history as exempt.",
33
33
  "assertions": [
34
- "Recognizes the request as a technical security review of code, not a regulatory/privacy obligation question",
35
- "Refers to the security-audit skill for the injection and auth review",
36
- "Does not produce a compliance workflow (data mapping, DSR machinery, SOC 2 controls) as the answer",
37
- "States the boundary: compliance-privacy covers regulatory/privacy obligations; security-audit covers technical vulnerabilities"
34
+ "Separates the two halves: what the erasure obligation requires, versus how a delete is made to reach models and snapshots that never revisit old rows",
35
+ "Refers to data-pipeline-design for propagating the erasure through the incremental models and the snapshot table",
36
+ "Delivers the obligation half itself — the deadline, the stores in scope, and what the confirmation must show — rather than deferring the whole request",
37
+ "Treats the snapshot table's history as personal data in scope for erasure rather than as an exempt archive"
38
38
  ]
39
39
  }
40
40
  ]