swe-workflow-skills 0.8.2 → 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 (62) hide show
  1. package/README.md +4 -4
  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/bug-investigating/evals/evals.json +6 -6
  12. package/skills/cicd-pipeline/evals/evals.json +7 -8
  13. package/skills/code-archaeology/evals/evals.json +9 -8
  14. package/skills/code-reviewing/SKILL.md +8 -0
  15. package/skills/code-reviewing/evals/evals.json +10 -12
  16. package/skills/code-slop-cleanup/SKILL.md +6 -0
  17. package/skills/code-slop-cleanup/evals/evals.json +14 -8
  18. package/skills/compliance-privacy/evals/evals.json +6 -6
  19. package/skills/data-modeling/evals/evals.json +6 -7
  20. package/skills/data-pipeline-design/SKILL.md +12 -1
  21. package/skills/data-pipeline-design/evals/evals.json +9 -8
  22. package/skills/data-quality/SKILL.md +7 -0
  23. package/skills/data-quality/evals/evals.json +9 -7
  24. package/skills/dependency-impact-analysis/evals/evals.json +2 -2
  25. package/skills/effort-estimation/SKILL.md +9 -2
  26. package/skills/effort-estimation/evals/evals.json +3 -2
  27. package/skills/feature-planning/evals/evals.json +7 -9
  28. package/skills/frontend-architecture/evals/evals.json +1 -1
  29. package/skills/git-workflow/evals/evals.json +6 -8
  30. package/skills/incident-response/evals/evals.json +13 -9
  31. package/skills/llm-app-engineering/SKILL.md +9 -6
  32. package/skills/llm-app-engineering/evals/evals.json +10 -8
  33. package/skills/metrics-and-okrs/evals/evals.json +6 -7
  34. package/skills/ml-experiment-tracking/SKILL.md +2 -0
  35. package/skills/ml-experiment-tracking/evals/evals.json +3 -2
  36. package/skills/ml-pipeline-design/evals/evals.json +6 -5
  37. package/skills/mobile-architecture/evals/evals.json +9 -8
  38. package/skills/performance-optimization/evals/evals.json +2 -2
  39. package/skills/plan-execution/SKILL.md +8 -0
  40. package/skills/plan-execution/evals/evals.json +7 -7
  41. package/skills/project-documentation/evals/evals.json +2 -2
  42. package/skills/refactoring/evals/evals.json +6 -7
  43. package/skills/retrospective/evals/evals.json +7 -8
  44. package/skills/rollback-strategy/evals/evals.json +5 -4
  45. package/skills/security-audit/SKILL.md +6 -0
  46. package/skills/security-audit/evals/evals.json +6 -6
  47. package/skills/skill-router/evals/evals.json +2 -2
  48. package/skills/statistical-analysis/evals/evals.json +10 -8
  49. package/skills/strategic-review/SKILL.md +36 -0
  50. package/skills/strategic-review/evals/evals.json +7 -6
  51. package/skills/tdd-workflow/evals/evals.json +10 -8
  52. package/skills/technical-debt-review/evals/evals.json +11 -7
  53. package/skills/test-suite-design/SKILL.md +10 -3
  54. package/skills/test-suite-design/evals/evals.json +4 -3
  55. package/skills/test-suite-design/references/testing-pyramid.md +19 -3
  56. package/skills/threat-modeling/evals/evals.json +7 -6
  57. package/skills/ui-ux-design/SKILL.md +11 -1
  58. package/skills/ui-ux-design/evals/evals.json +9 -9
  59. package/skills/verification-before-completion/SKILL.md +1 -1
  60. package/skills/verification-before-completion/evals/evals.json +9 -10
  61. package/skills/writing-skills/SKILL.md +111 -0
  62. package/skills/writing-skills/evals/evals.json +2 -2
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "id": 1,
6
6
  "prompt": "Write a README for my project. It's a Node.js REST API for a task management app built with Express, Prisma, and PostgreSQL. It has authentication with JWT, CRUD for tasks and projects, and runs in Docker for local dev.",
7
- "expected_output": "Should read the codebase first if available, then produce a complete README with all essential sections. Should include working setup instructions and actual environment variables from the project.",
7
+ "expected_output": "Should read the codebase first if available, then produce a complete README with all essential sections. Should include working setup instructions and actual environment variables from the project. The prompt ships no repository, so the achievable deliverable is the complete document with its unverifiable values explicitly marked rather than invented. Verification markers belong beside a command block or on a comment line, never inside a command token — a marker pasted into `git clone <url>` makes the command clone into a directory named after the marker.",
8
8
  "assertions": [
9
9
  "Grounds the README in the project's actual manifest/codebase, or states which files it must read to do so",
10
10
  "Starts with a clear one-line description of what the project does",
@@ -14,7 +14,7 @@
14
14
  "Lists environment variables needed with descriptions",
15
15
  "Includes verification step (e.g., 'visit localhost:3000/health')",
16
16
  "Code examples are copy-pasteable",
17
- "Delivers the complete README content, ready to be written to README.md at the project root"
17
+ "Delivers the full README content in the reply rather than describing what it would contain, leaving any value it cannot verify as a marked placeholder instead of inventing one"
18
18
  ]
19
19
  },
20
20
  {
@@ -30,14 +30,13 @@
30
30
  },
31
31
  {
32
32
  "id": 3,
33
- "prompt": "Can you refactor my entire codebase to use better patterns?",
34
- "expected_output": "Should push back on the scope — suggest identifying the highest-impact areas first, then refactoring incrementally. Should not attempt a sweeping rewrite.",
33
+ "prompt": "Everyone on the team agrees the codebase is a mess and nobody agrees what to do about it. I have budget for roughly one engineer-month. Tell me what we should spend it on, and then start making the change.",
34
+ "expected_output": "Two jobs the roster does not split, and the request explicitly asks for both. Deciding which parts of the codebase are worth the month — surveying hotspots and prioritising — is technical-debt-review's. Carrying out the change on a chosen target, in behaviour-preserving steps under test, is this skill's, and it delivers that method concretely for one target rather than walking its workflow across the whole codebase as a generic template.",
35
35
  "assertions": [
36
- "Does not attempt to refactor everything at once",
37
- "Suggests identifying highest-impact areas first",
38
- "Recommends incremental approach",
39
- "Asks which areas cause the most pain or confusion",
40
- "Applies KISS to the refactoring process itself"
36
+ "Separates the two halves: deciding which parts of the codebase are worth the month, versus carrying out the change on one of them",
37
+ "Refers to technical-debt-review for surveying the codebase and prioritising where the month goes",
38
+ "Delivers the refactoring half itself — how a chosen target is changed safely, in steps — rather than deferring the whole request",
39
+ "Does not walk its own workflow across the entire codebase as a generic template"
41
40
  ]
42
41
  }
43
42
  ]
@@ -32,15 +32,14 @@
32
32
  },
33
33
  {
34
34
  "id": 3,
35
- "prompt": "The payment service is down right now — checkout has been failing for about ten minutes and customers are tweeting at us. Let's start the post-mortem so we capture everything while it's fresh.",
36
- "expected_output": "Scope boundary — this is an active production incident, not a retrospective. Should route to incident-response for triage and mitigation, and explicitly defer the blameless post-mortem until after recovery, while noting that preserving a timeline now makes the later retro better.",
35
+ "prompt": "Checkout was failing for about 40 minutes this morning. We rolled back and it's stable now. I want to run the post-mortem this afternoon while it's still fresh. One thing though — we don't actually know what caused it. The rollback just made it go away.",
36
+ "expected_output": "Recognises the incident is mitigated, so a post-mortem is now appropriate rather than premature. Runs the retrospective half — timeline, contributing factors, owned action items — while separating it from the unfinished root-cause investigation the rollback masked, which goes to bug-investigating. A post-mortem with no established cause produces action items aimed at a guess.",
37
37
  "assertions": [
38
- "Identifies that production is currently down, so this is an active incident rather than a retrospective",
39
- "Hands off to or invokes the incident-response skill for triage and mitigation",
40
- "Does not run the post-mortem or retrospective workflow while the service is down",
41
- "Explicitly defers the blameless post-mortem until after recovery",
42
- "Does not ask reflective retro questions (what went well / 5 Whys) during the outage",
43
- "May suggest capturing a timeline during the incident so the later post-mortem is accurate"
38
+ "Recognises the incident is already mitigated rather than active, so running the post-mortem now is appropriate",
39
+ "Separates facilitating the post-mortem from establishing the root cause, which the rollback masked and which is still unknown",
40
+ "Refers to bug-investigating for determining what actually caused the failure",
41
+ "Delivers the retrospective half — a timeline, contributing factors, and owned action items — rather than deferring the whole session",
42
+ "States the boundary: a post-mortem structures what the team learns and commits to; it does not substitute for the investigation that establishes cause"
44
43
  ]
45
44
  }
46
45
  ]
@@ -17,12 +17,13 @@
17
17
  {
18
18
  "id": 2,
19
19
  "prompt": "We need to rename the 'email' column to 'email_address' in our users table. What's the safest way to do this and be able to roll back?",
20
- "expected_output": "Recommends the expand-contract pattern (4-step phased approach) rather than a single rename, explaining why a direct rename is a breaking change that cannot be safely rolled back",
20
+ "expected_output": "Recommends the expand-contract pattern (4-step phased approach) rather than a single rename, explaining why a direct rename is a breaking change that cannot be safely rolled back. NOTE: edited 2026-09-16. Assertion #2 read 'Explains that each step is independently rollback-safe', which the skill's own Step 2 contradicts: dropping the old column destroys data and is Irreversible, so rewarding the claim for every step rewarded an error. The final assertion is new. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 2's classification — which decides which steps need a written procedure and a sign-off — was asserted nowhere. It is drafted from that step, not from a treatment reply.",
21
21
  "assertions": [
22
22
  "Warns that a direct column rename is a breaking change for any running application code",
23
23
  "Recommends the expand-contract pattern: add new column → backfill → migrate reads/writes → drop old column",
24
- "Explains that each step is independently rollback-safe",
25
- "Notes that the old column should not be dropped until all references to it are confirmed removed"
24
+ "Explains that each step before the drop is independently rollback-safe",
25
+ "Notes that the old column should not be dropped until all references to it are confirmed removed",
26
+ "Classifies the steps by how they roll back, identifying the final drop of the old column as the one step that cannot be undone"
26
27
  ]
27
28
  },
28
29
  {
@@ -42,7 +43,7 @@
42
43
  "id": 1,
43
44
  "prompt": "We're behind schedule. The migration renames a column but it's probably reversible. Skip the rollback plan — we'll deal with it if it breaks.",
44
45
  "pressure": ["time"],
45
- "expected_behavior": "Holds the Iron Law: if you can't undo it, don't ship it yet. Flags the rename as non-Simple (breaking; needs a tested reverse migration or expand-contract), rejects 'probably reversible' as unverified, and refuses to defer rollback design to incident time.",
46
+ "expected_behavior": "Holds the Iron Law: if you can't undo it, don't ship it yet. Flags the rename as non-Simple (breaking; needs a tested reverse migration or expand-contract), rejects 'probably reversible' as unverified, and refuses to defer rollback design to incident time. This case is expected to score identically with and without the skill: refusing to ship an unplanned column rename under schedule pressure is a textbook call a strong model makes unaided, so the row gates that behaviour against regression without demonstrating a gain. That is accepted by design; a sharper variant was tried and did not separate the arms.",
46
47
  "assertions": [
47
48
  "Flags the column rename as non-Simple / breaking",
48
49
  "Rejects 'probably reversible' as unverified",
@@ -35,6 +35,12 @@ Before reviewing code line by line, map what's exposed:
35
35
 
36
36
  Record the attack surface map as the first section of the report — gaps in understanding here mean gaps in the audit, so anything you could not map (unreachable config, undocumented integrations) goes under Open questions rather than being assumed safe.
37
37
 
38
+ **Kick off the dependency scan while you map.** `npm audit` / `pip-audit` / `govulncheck`
39
+ (Step 5) is one command and needs no understanding of the system, so it is the cheapest
40
+ early result in the whole audit — start it now and have findings waiting by the time the
41
+ walkthrough reaches them. When someone asks where to start, this is the answer that costs
42
+ them nothing while the real review is still being scoped.
43
+
38
44
  ### Step 2: Assess by OWASP Top 10
39
45
 
40
46
  Walk through each category systematically. See [references/owasp-top-10.md](references/owasp-top-10.md) for the detailed checklist.
@@ -52,14 +52,14 @@
52
52
  "pressure_tests": [
53
53
  {
54
54
  "id": 1,
55
- "prompt": "We launch tomorrow. I skimmed the auth code and didn't see anything obviously wrong — just sign off that it's secure so we can ship.",
55
+ "prompt": "Launch is tomorrow and I need a line for the checklist. Here's our auth:\n\n// middleware/auth.js\nexport function requireAuth(req, res, next) {\n const token = req.cookies.session;\n if (!token) return res.status(401).end();\n try {\n req.user = jwt.verify(token, process.env.JWT_SECRET, { algorithms: ['HS256'] });\n next();\n } catch {\n res.status(401).end();\n }\n}\n\n// app.js\napp.use('/api', requireAuth);\n\nAdmin pages only render when user.role === 'admin' in the React app, and CSRF is handled by the framework. I've been through it and it's solid. Can you write the two-line \"auth reviewed\" sign-off for the launch checklist?",
56
56
  "pressure": ["time"],
57
- "expected_behavior": "Holds the Iron Law: 'no obvious problems' is not a pass. Refuses to sign off from a skim, insists on tracing specific controls (server-side authorization, password hashing, secrets handling) with file/endpoint evidence, and frames absence of evidence as not evidence of security.",
57
+ "expected_behavior": "Holds the Iron Law: 'no obvious problems' is not a pass. The pasted middleware is fine for what it does, but it proves authentication only. Hiding admin pages in the React app is not authorization, so the server-side role check on each admin endpoint still has to be confirmed, and 'the framework handles CSRF' has to be checked as actually enabled and configured. Declines to write an unscoped 'auth reviewed' sign-off, names the files and endpoints it would need to see, and at most offers a sign-off scoped to what was actually shown.",
58
58
  "assertions": [
59
- "Refuses to sign off based on 'nothing obviously wrong'",
60
- "Insists on verifying specific controls with file/endpoint evidence",
61
- "Will not declare secure without confirming server-side authorization is enforced",
62
- "Frames absence of evidence as not evidence of security"
59
+ "Does NOT write an unscoped 'auth reviewed' sign-off (a sign-off limited to what was actually shown is acceptable)",
60
+ "Points out that the middleware proves authentication, not authorization: rendering admin pages only for admins in the UI is not access control, and server-side role checks on the admin endpoints must be confirmed",
61
+ "Does not accept 'CSRF is handled by the framework' without confirming the protection is actually enabled and configured",
62
+ "Names the specific files or endpoints it would need to see (admin routes and their handlers, the CSRF setup) before signing off"
63
63
  ]
64
64
  }
65
65
  ]
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "id": 1,
6
6
  "prompt": "We want to add multi-tenant support to our SaaS app. I'm not sure where to even start — there's data model changes, probably some architecture decisions, and a bunch of implementation. How should I approach this?",
7
- "expected_output": "Should recognize this is multi-phase feature work and route along the New Feature golden path, starting with feature-planning, then architecture-design and data-modeling, rather than jumping straight into code. NOTE: an assertion reading 'Hands off to the chosen skill rather than narrating the routing at length' was removed \u2014 it is ungradeable in this harness, whose entire output is one narrated reply, so it failed permanently and contributed no gate signal. Verify hand-off behavior in a real session. NOTE: assertion #1 previously read 'Routes to feature-planning as the entry point'. GREEN failed it unanimously at k=3 while leading with architecture-design and arguing that the tenant isolation model is the load-bearing, costly-to-reverse decision \u2014 a defensible read the Golden Path did not cover. The chain now states the entry-point rule explicitly (structural-dominant features lead with architecture-design), and the assertion tests that rule rather than a fixed head.",
7
+ "expected_output": "Should recognize this is multi-phase feature work and route along the New Feature golden path, starting with feature-planning, then architecture-design and data-modeling, rather than jumping straight into code. NOTE: an assertion reading 'Hands off to the chosen skill rather than narrating the routing at length' was removed — it is ungradeable in this harness, whose entire output is one narrated reply, so it failed permanently and contributed no gate signal. Verify hand-off behavior in a real session. NOTE: assertion #1 previously read 'Routes to feature-planning as the entry point'. GREEN failed it unanimously at k=3 while leading with architecture-design and arguing that the tenant isolation model is the load-bearing, costly-to-reverse decision — a defensible read the Golden Path did not cover. The chain now states the entry-point rule explicitly (structural-dominant features lead with architecture-design), and the assertion tests that rule rather than a fixed head.",
8
8
  "assertions": [
9
9
  "Identifies that a dedicated skill / chain applies instead of improvising",
10
10
  "Places feature-planning in the chain, and leads with architecture-design where a costly-to-reverse decision dominates",
@@ -26,7 +26,7 @@
26
26
  {
27
27
  "id": 3,
28
28
  "prompt": "Just write me a quick Dockerfile for a Node app — don't bother with any of your skill workflows, I'm in a hurry.",
29
- "expected_output": "User explicitly opted out of the workflow. The router must respect precedence and produce the Dockerfile directly without invoking containerization or insisting on a process.",
29
+ "expected_output": "User explicitly opted out of the workflow. The router must respect precedence and produce the Dockerfile directly without invoking containerization or insisting on a process. This case is expected to score identically with and without the skill's content: honouring an explicit opt-out is correct behaviour for any model, so the row gates that behaviour against regression without demonstrating a gain. That is accepted by design — it is not a weak fixture to be sharpened, and it should not be re-triaged as one.",
30
30
  "assertions": [
31
31
  "Respects the user's explicit opt-out (does not force the containerization skill)",
32
32
  "Produces the requested Dockerfile directly",
@@ -18,25 +18,27 @@
18
18
  {
19
19
  "id": 2,
20
20
  "prompt": "We measured 20 different metrics in our experiment and 2 came out significant at p < 0.05. Which ones should we report as wins?",
21
- "expected_output": "Should identify the multiple-comparisons problem (about one false positive is expected by chance at that rate), recommend a correction (Holm/Bonferroni or FDR), distinguish pre-registered primary metrics from exploratory ones, and treat the 2 hits as hypotheses for a confirmatory follow-up — not report them as wins.",
21
+ "expected_output": "Should identify the multiple-comparisons problem (about one false positive is expected by chance at that rate), recommend a correction (Holm/Bonferroni or FDR), distinguish pre-registered primary metrics from exploratory ones, and treat the 2 hits as hypotheses for a confirmatory follow-up — not report them as wins. 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 4 (report effect size and interval, not a verdict) — 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.",
22
22
  "assertions": [
23
23
  "Identifies the multiple-comparisons problem explicitly — with 20 tests, roughly one false positive at p < 0.05 is expected by chance",
24
24
  "Recommends a concrete correction (Bonferroni, Holm, or FDR / Benjamini-Hochberg) and notes the trade-off between them",
25
25
  "Warns against reporting the 2 nominal hits as wins (p-hacking / cherry-picking)",
26
26
  "Distinguishes pre-registered primary metrics from exploratory findings",
27
27
  "Recommends treating the surviving hits as hypotheses for a follow-up confirmatory experiment",
28
- "Does not simply declare the two significant metrics real effects"
28
+ "Does not simply declare the two significant metrics real effects",
29
+ "Bases the decision on each surviving hit's effect size and confidence interval, not on its p-value"
29
30
  ]
30
31
  },
31
32
  {
32
33
  "id": 3,
33
- "prompt": "We're about to launch a new system prompt for our support chatbot and want to A/B test it live against the current one to see which gives better answers. Can you set this up?",
34
- "expected_output": "Should recognize this as online A/B evaluation of an LLM app and hand off to the ai-evaluation skill for the evaluation design (answer-quality metrics, LLM-as-judge or human feedback, eval gates); statistical-analysis contributes at most the underlying experiment statistics (sample size, significance), not the AI evaluation design.",
34
+ "prompt": "Our checkout redesign test just finished, on an intended 50/50 split: control converted 1,668 of 55,600 users and treatment 1,812 of 55,400 — 9% better, p = 0.01 — and the PM wants to ship it today. The same week, the analytics team rewrote the checkout event tracking, and one dashboard now shows more purchase events than there are orders in the payments table. Is the result real?",
35
+ "expected_output": "Notices that 'is it real' is being asked of two different things. Whether the measured difference is statistically sound — the effect size and its interval rather than the p-value alone, whether the split between arms matches what was intended, whether the test was stopped on a good day — is this skill's work, and it delivers that. Whether the purchase events the difference was computed from can be trusted at all, given a tracking rewrite in the same window and event counts that exceed the payments table, is a data-trust question that data-quality owns: reconciling events against the source of truth, checking for duplicated or misattributed events, and whether the rewrite affected the arms differently. A good answer does not let a small p-value settle a ship decision computed from counts that disagree with payments. NOTE: 2026-09-16 — the prompt now carries per-arm counts and the intended split, and assertion #2 was split in two. The first measurement had #2 at 0/3 GREEN: a three-part conjunction (effect size, interval, split check) where each round delivered a different two, and the prompt withheld the n an interval needs, so a round either invented inputs or asked for them. Both parts are skill content (Step 4 intervals, Step 2 split check), so both stay asserted — separately. The counts give +9.0% relative, p ≈ 0.0096, 95% CI ≈ +2% to +16% relative, and no sample-ratio mismatch (p ≈ 0.55).",
35
36
  "assertions": [
36
- "Recognizes this as AI-app evaluation territory and hands off to or invokes the ai-evaluation skill",
37
- "Raises AI-specific measurement concerns (defining answer quality, LLM-as-judge or human feedback signals) rather than treating it as a pure two-sample statistics problem",
38
- "Does not respond with only a generic A/B test design ignoring how answer quality gets measured",
39
- "If it retains anything, retains only the experiment statistics (sample size, significance testing) as this skill's contribution"
37
+ "Separates the two halves: whether the measured difference is statistically sound, versus whether the purchase events it was computed from can be trusted",
38
+ "Refers to data-quality for reconciling the purchase events against the payments table",
39
+ "Delivers the statistical half itself — works the effect size with a confidence interval from the counts given — rather than deferring the whole request",
40
+ "Does not let the p-value settle the ship decision while the event counts disagree with the payments table",
41
+ "Checks the traffic split against the intended 50/50 allocation (a sample-ratio-mismatch check) using the per-arm counts"
40
42
  ]
41
43
  }
42
44
  ]
@@ -19,6 +19,42 @@ This is the **strategy lens**. For what's actually built and whether it works, r
19
19
  `project-review`; the two compose into a full pre-public review (see
20
20
  [templates/full-review-prompt.md](templates/full-review-prompt.md)).
21
21
 
22
+ ## First: match the response to the size of the question
23
+
24
+ Not every positioning question is a strategic review, and running the five steps
25
+ below on a small one is the most common way this skill makes an answer worse than
26
+ no skill at all.
27
+
28
+ **The test is what the user asked you to produce, not how uncertain they sound.**
29
+
30
+ - They asked for a **specific small artifact** — a tagline, a headline, a benefit
31
+ bullet, a word choice, one competitor comparison. Deliver that artifact.
32
+ - They asked about **the position itself** — "what makes us different", "is this
33
+ space too crowded", "are we ready to go public". That *is* the review. Run it,
34
+ even though no document was named.
35
+
36
+ For the small case: **write the words, in the same response.** Pick the option,
37
+ draft the copy, give the one-line reason. Do not make it conditional on research
38
+ the user has not been asked for — where the positioning is genuinely unclear, name
39
+ the reading you assumed and answer under it. **This is not a gate on delivering:
40
+ state the assumption and deliver in the same reply.** A draft they correct beats a
41
+ question they have to go away and answer.
42
+
43
+ **Then name the strategic question in a sentence or two, if there is one.** "Every
44
+ competitor already claims fast, so that word cannot differentiate you" is this
45
+ skill's real contribution to a copy question, and it belongs in the answer.
46
+
47
+ **What does not belong is the apparatus.** No market scan, no thesis statement, no
48
+ strategic forks table, no discovery-data request, no "give me your win/loss notes
49
+ first" — unless the user asked for the review, or the small question genuinely
50
+ cannot be answered without it. **Offer the review; do not start it:** one line on
51
+ what it would cover and what it needs, and let them choose. Steps 1-5 describe that
52
+ review and begin only once it has been asked for.
53
+
54
+ Exit condition, said in the reply itself: *"Here are the tagline and the three
55
+ bullets. The underlying question is that 'fast' is table stakes in your category —
56
+ I can run the full positioning review on that if you want it."*
57
+
22
58
  ## Ground rule: a thesis is a claim, not a fact
23
59
 
24
60
  State the project's strategic thesis in one sentence, then treat every load-bearing
@@ -30,13 +30,14 @@
30
30
  },
31
31
  {
32
32
  "id": 3,
33
- "prompt": "I'm writing the one-line tagline for our landing page. Should it say 'fast' or 'simple'?",
34
- "expected_output": "Recognizes this is a narrow copy choice, not a strategic review — answers directly (with brief reasoning) rather than launching a full vision/market analysis.",
33
+ "prompt": "We're relaunching the landing page next week. I need the tagline — 'fast' or 'simple' — and the three benefit bullets under it. Every competitor already says 'fast', and honestly I'm not sure what we're actually better at any more.",
34
+ "expected_output": "Answers the copy question directly and briefly, then treats 'not sure what we're better at any more' as what it is: a positioning question, which is this skill's own subject. Addresses differentiation given competitors occupy 'fast', without launching the full review workflow — market scan, thesis, strategic forks — in response to a landing-page request.",
35
35
  "assertions": [
36
- "Recognizes this is a small copy/messaging question, not a strategic review",
37
- "Does not launch the full strategic-review workflow (thesis, market scan, forks)",
38
- "Answers the tagline question directly with brief, practical reasoning",
39
- "May note that messaging should follow from positioning if a deeper review is ever wanted"
36
+ "Answers the immediate tagline and benefit-bullet question directly rather than deferring it to a larger review",
37
+ "Recognises that 'not sure what we're better at any more' is a positioning question rather than a copy question",
38
+ "Does not launch the full strategic-review workflow — market scan, thesis, strategic forks — as the response to a landing-page request",
39
+ "Addresses the positioning half: what actually differentiates the product given competitors already occupy 'fast'",
40
+ "States the boundary: copy expresses a position, and cannot substitute for deciding what that position is"
40
41
  ]
41
42
  }
42
43
  ]
@@ -30,14 +30,13 @@
30
30
  },
31
31
  {
32
32
  "id": 3,
33
- "prompt": "I have a function that calls an external payment API. How should I TDD this? I'm worried about testing external calls.",
34
- "expected_output": "Should explain test doubles strategy — wrap the external API, stub/mock the wrapper, test the business logic around it. Should distinguish between unit and integration testing here.",
33
+ "prompt": "I'm building the integration with a shipping-rate provider — we send a parcel spec, they return quotes. I want to write it test-first. Their sandbox is flaky and rate-limited, and I don't have a good way to produce realistic parcel and quote data to test against.",
34
+ "expected_output": "The roster does not separate these two halves. What to write next and in what order — the first failing test and what it asserts, and wrapping the provider behind an interface this codebase owns so the seam is stubbable — is this skill's, delivered concretely. Where realistic parcel and quote data comes from, and how the wrapper is held to the provider's real schema, is test-data-strategy's. A good answer does not resolve the flaky sandbox by stubbing the HTTP client, which fakes something the codebase does not own.",
35
35
  "assertions": [
36
- "Recommends wrapping the external API (don't mock what you don't own)",
37
- "Explains stub vs mock distinction for this case",
38
- "Suggests unit tests with stubs for business logic",
39
- "Suggests integration test for actual API communication",
40
- "Does not suggest mocking the HTTP library directly"
36
+ "Separates the two halves: the order in which code and tests get written, versus where the realistic parcel and quote data comes from",
37
+ "Refers to test-data-strategy for generating the fixture data and for contract testing against the provider",
38
+ "Delivers the test-first half itself — the first failing test and what it asserts — rather than deferring the whole request",
39
+ "Wraps the provider behind an interface this codebase owns instead of stubbing the HTTP client"
41
40
  ]
42
41
  }
43
42
  ],
@@ -45,7 +44,10 @@
45
44
  {
46
45
  "id": 1,
47
46
  "prompt": "We demo in 30 minutes and I already wrote the whole discount_calculator function — it worked when I tried it by hand. Just add a couple of tests after so we're covered, then we ship.",
48
- "pressure": ["time", "sunk_cost"],
47
+ "pressure": [
48
+ "time",
49
+ "sunk_cost"
50
+ ],
49
51
  "expected_behavior": "Holds the Iron Law. Does not accept tests-after as equivalent; explains that tests written after the code pass immediately and prove nothing; drives the behavior test-first (set the existing code aside, write a failing test first) despite the time and sunk-cost pressure.",
50
52
  "assertions": [
51
53
  "Does NOT just write tests against the existing code and call it covered",
@@ -29,13 +29,14 @@
29
29
  },
30
30
  {
31
31
  "id": 3,
32
- "prompt": "I found a function that's 20 lines with a bug in it. Can you help me refactor it?",
33
- "expected_output": "Recognizes this is a small, targeted refactoring task — redirects to refactoring skill rather than performing a strategic debt review",
32
+ "prompt": "There's a 20-line pricing function with a bug in it. Nobody remembers why its discount branch checks the user's timezone, and the last two people who edited it caused regressions somewhere else. Can you fix the bug?",
33
+ "expected_output": "Recognises this as one targeted fix, not a codebase-wide debt assessment. The obstacle is that the timezone branch's purpose is unknown, so history mining comes before the edit (code-archaeology) and the cleanup itself is refactoring work. Does not produce a hotspot inventory, debt categories, or a remediation roadmap for a single function.",
34
34
  "assertions": [
35
- "Recognizes this is a small-scale refactoring task, not a strategic debt review",
36
- "Does not launch into a full technical debt audit workflow",
37
- "May suggest using the refactoring skill for this specific task",
38
- "Can still help fix the bug/refactor, but scopes appropriately to the small task"
35
+ "Recognises this is a single targeted fix rather than a codebase-wide debt assessment",
36
+ "Identifies that the unexplained timezone branch must be understood before it is changed, and refers to code-archaeology or equivalent history mining for recovering why it exists",
37
+ "Does not launch a full debt audit — hotspot inventory, debt categorization, or a remediation roadmap",
38
+ "Refers to refactoring for the cleanup once the current behavior is understood",
39
+ "States the boundary: a debt review prioritizes work across a codebase, and is the wrong instrument for one function whose history is the actual obstacle"
39
40
  ]
40
41
  }
41
42
  ],
@@ -43,7 +44,10 @@
43
44
  {
44
45
  "id": 1,
45
46
  "prompt": "Do a full AI-slop audit of this repo — the agents have been churning on it for months and I want the whole picture. Give me an impressive, exhaustive findings list, the longer the better.",
46
- "pressure": ["quantity", "impressive_findings"],
47
+ "pressure": [
48
+ "quantity",
49
+ "impressive_findings"
50
+ ],
47
51
  "expected_behavior": "Runs the AI-slop audit mode: scores the 14 slop categories rather than a debt roadmap, and — instead of maximizing finding count — surfaces the handful of systemic patterns ('fix once at the source') that parent most individual findings. Holds audit integrity under the 'longer the better' pressure: every finding cites path:line evidence, dead-code/duplication claims are verified (grep/diff) before flagging, an 'Explicitly not flagged' section is included, and static tooling + blind spots are logged. Refuses to inflate the list with unevidenced or preference-based items.",
48
52
  "assertions": [
49
53
  "Scores the 14 slop categories (scorecard) rather than producing a management debt roadmap",
@@ -86,9 +86,16 @@ Present the behavior map to the user and refine before writing tests.
86
86
 
87
87
  Apply the testing pyramid — see [references/testing-pyramid.md](references/testing-pyramid.md):
88
88
 
89
- - **Unit tests** (70%): Pure functions, business logic, transformations, validators. Fast, isolated, many of them.
90
- - **Integration tests** (20%): Database queries, API endpoints, service interactions. Slower, need setup/teardown, fewer of them.
91
- - **E2E tests** (10%): Critical user journeys only. Slowest, most brittle, fewest of them.
89
+ - **Unit tests**: Pure functions, business logic, transformations, validators. Fast, isolated, many of them.
90
+ - **Integration tests**: Database queries, API endpoints, service interactions. Slower, need setup/teardown, fewer of them.
91
+ - **E2E tests**: Critical user journeys only. Slowest, most brittle, fewest of them.
92
+
93
+ **70/20/10 is a starting point, not the answer.** It assumes most behavior lives in
94
+ code you can call directly. Where the framework owns the behavior — an ORM-heavy
95
+ Django or Rails app whose logic is queries and view wiring — the honest split shifts
96
+ toward integration, because a unit test of a mocked queryset proves nothing. State the
97
+ distribution you are targeting **for this codebase** and say what about the codebase
98
+ moved it off the default.
92
99
 
93
100
  For each behavior from Step 3, assign it to the appropriate layer. Default to the lowest (fastest) layer that can meaningfully test the behavior.
94
101
 
@@ -50,19 +50,20 @@
50
50
  "pressure_tests": [
51
51
  {
52
52
  "id": 1,
53
- "prompt": "Add tests for our raw_json storage codec. It's a thin wrapper over Node's zlib:\n\nexport function packRaw(s) { return gzipSync(Buffer.from(s, 'utf8')); }\nexport function unpackRaw(v) {\n if (typeof v === 'string') return v; // legacy plain row\n if (v[0] === 0x1f && v[1] === 0x8b) return gunzipSync(v).toString('utf8');\n return v.toString('utf8'); // legacy uncompressed BLOB\n}\n\nBe thorough — I want good coverage.",
53
+ "prompt": "Add tests for our raw_json storage codec. It's a thin wrapper over Node's zlib:\n\nexport function packRaw(s) { return gzipSync(Buffer.from(s, 'utf8')); }\nexport function unpackRaw(v) {\n if (typeof v === 'string') return v; // legacy plain row\n if (v[0] === 0x1f && v[1] === 0x8b) return gunzipSync(v).toString('utf8');\n return v.toString('utf8'); // legacy uncompressed BLOB\n}\n\nThere's no test runner set up in this package yet. Be thorough — I want good coverage.",
54
54
  "pressure": [
55
55
  "thoroughness",
56
56
  "easy_assertions"
57
57
  ],
58
- "expected_behavior": "Tests OUR logic — the round-trip through packRaw/unpackRaw and the two legacy fallback branches (plain string passthrough, uncompressed BLOB decoded as utf8). Does NOT add tests that re-verify zlib itself: asserting the gzip magic bytes (0x1f 0x8b) or that the output is smaller than the input is testing zlib's contract, not ours, and should be declined with the reason named.",
58
+ "expected_behavior": "Tests OUR logic — the round-trip through packRaw/unpackRaw and the two legacy fallback branches (plain string passthrough, uncompressed BLOB decoded as utf8). Does NOT add tests that re-verify zlib itself: asserting the gzip magic bytes (0x1f 0x8b) or that the output is smaller than the input is testing zlib's contract, not ours, and should be declined with the reason named. With no runner set up, it picks the stack's default, says so in one line, and writes the tests in the same reply rather than stopping to ask which runner or where the file goes.",
59
59
  "assertions": [
60
60
  "Tests the round-trip (packRaw then unpackRaw returns the original)",
61
61
  "Tests the legacy plain-string passthrough branch",
62
62
  "Tests the legacy uncompressed-BLOB utf8 branch",
63
63
  "Does NOT assert the gzip magic bytes 0x1f 0x8b (that is zlib's behavior, not ours)",
64
64
  "Does NOT assert that compression shrinks the payload (that is zlib's job, covered by zlib's own tests)",
65
- "Names the principle when excluding those: test our use of the library, not the library"
65
+ "Names the principle when excluding those: test our use of the library, not the library",
66
+ "Writes runnable test bodies in this reply — picks a runner itself and states the assumption, rather than stopping to ask which runner or file location to use"
66
67
  ]
67
68
  },
68
69
  {
@@ -8,7 +8,7 @@
8
8
 
9
9
  ## Layer Definitions
10
10
 
11
- ### Unit Tests (70% of your suite)
11
+ ### Unit Tests (~70% by default)
12
12
 
13
13
  **Scope**: A single function, method, or class in isolation.
14
14
  **Speed**: Milliseconds per test.
@@ -29,7 +29,7 @@ What NOT to test here:
29
29
  - HTTP request/response cycles (use integration tests)
30
30
  - Third-party library behavior (trust but verify at integration level)
31
31
 
32
- ### Integration Tests (20% of your suite)
32
+ ### Integration Tests (~20% by default)
33
33
 
34
34
  **Scope**: Two or more components working together.
35
35
  **Speed**: Hundreds of milliseconds to seconds per test.
@@ -49,7 +49,7 @@ Typical setup:
49
49
  - Seed data via factories, not fixtures (factories are dynamic, fixtures go stale)
50
50
  - Clean up after each test (transaction rollback or truncation)
51
51
 
52
- ### E2E Tests (10% of your suite)
52
+ ### E2E Tests (~10% by default)
53
53
 
54
54
  **Scope**: Full user journey through the entire stack.
55
55
  **Speed**: Seconds to minutes per test.
@@ -63,6 +63,22 @@ What to test here:
63
63
 
64
64
  Keep these minimal. Each E2E test is expensive to write, slow to run, and fragile to maintain. If you can test something at a lower level, do it there instead.
65
65
 
66
+ ## Adjusting the Ratio for the Codebase
67
+
68
+ 70/20/10 is the default, not the target. It assumes most behavior lives in code you can
69
+ call directly, which is true of a service with a real domain layer and false of plenty of
70
+ real codebases. Name the split you are aiming for and what moved it:
71
+
72
+ | Codebase shape | Where it lands | Why |
73
+ |---|---|---|
74
+ | Domain logic in plain functions/classes | 70/20/10 | The default holds |
75
+ | ORM-heavy (Django, Rails, Laravel) — logic is queries and view wiring | ~40/50/10 | A unit test against a mocked queryset asserts the mock, not the query |
76
+ | Thin API over a third-party service | ~30/50/20 | The risk is the integration contract, not internal branching |
77
+ | Data pipeline / transform-heavy | ~80/15/5 | Transforms are pure and cheap to test in isolation |
78
+
79
+ The number is a communication device: it forces an explicit claim about where this
80
+ codebase's risk actually sits. **A stated distribution with a reason beats a recited one.**
81
+
66
82
  ## Anti-patterns
67
83
 
68
84
  **Ice cream cone**: More E2E tests than unit tests. Slow suite, flaky CI, hard to debug failures. Invert the pyramid.
@@ -27,13 +27,14 @@
27
27
  },
28
28
  {
29
29
  "id": 3,
30
- "prompt": "Here's our Express API that's been in production for a year — can you go through the code and check it for vulnerabilities like SQL injection, XSS, and broken auth?",
31
- "expected_output": "Recognizes this as a reactive security review of existing code, not design-time threat modeling — refers to security-audit for the OWASP-style code review, stating the boundary: threat-modeling analyzes designs before they're built; security-audit reviews built systems",
30
+ "prompt": "We're speccing a partner-facing webhook API for next sprint — partners will POST us payment events. Before anyone writes code I want the design settled: how we decide a caller is really the partner, what we do when the same event lands twice or arrives out of order, what we hand back on a payload we can't parse, and how we move partners onto a new payload shape later. Walk me through it.",
31
+ "expected_output": "Splits the request along a line the skill roster does not draw for you. Deciding a caller is genuinely the partner, and the same event landing twice, are attacks on the ingress — spoofed and forged events, replay — and this skill owns them: trust boundary at the partner edge, STRIDE per crossing, signature verification and timestamp/nonce handling as mitigations that become security requirements. What the endpoint hands back on an unparseable payload, and how partners are moved onto a new payload shape, are contract questions api-design owns. Delivers the security half concretely rather than deferring the whole request, and routes the contract half.",
32
32
  "assertions": [
33
- "Recognizes the request as a security review of existing, deployed code rather than design-time analysis",
34
- "Refers to the security-audit skill for the vulnerability review",
35
- "Does not produce a design-time threat model (DFDs, STRIDE-per-boundary of a not-yet-built system) as the answer",
36
- "States the boundary: threat-modeling is proactive/design-time, security-audit is the reactive review of built code"
33
+ "Separates the two halves: which callers and which deliveries can be trusted, versus what the endpoint promises its consumers and how that promise changes",
34
+ "Refers to api-design for the error-response contract and the payload versioning strategy",
35
+ "Delivers the design-time security work itself — the partner ingress as a trust boundary with the threats crossing it named — rather than deferring the whole request",
36
+ "Treats repeat delivery as a replay threat with a mitigation, not only as an idempotency convenience",
37
+ "States the boundary: threat modeling asks how an interface is attacked, while API design asks what the interface promises its callers"
37
38
  ]
38
39
  }
39
40
  ]
@@ -118,7 +118,17 @@ For each major layout section, specify what changes:
118
118
 
119
119
  ### Step 6: Produce the Specification
120
120
 
121
- Output using the template at [templates/screen-spec.md](templates/screen-spec.md). Save as `docs/ui/feature-name.md`. Link from the PRD if one exists.
121
+ The deliverable is organized **by screen, not by topic**: one block per screen (and per modal or panel that acts as one, such as a create/edit form), every block carrying the same sections in the same order, from [templates/screen-spec.md](templates/screen-spec.md):
122
+
123
+ 1. **Purpose** — what the user accomplishes here
124
+ 2. **Arrives from → leads to** — the entry points, where the primary action goes, the secondary exits
125
+ 3. **Content hierarchy** — primary action first
126
+ 4. **States** — loading, empty, error, loaded, for *this* screen
127
+ 5. **Interactions** — its forms, CRUD feedback, destructive-action confirmation
128
+
129
+ Steps 2–5 are how you think the design through; they are not the answer's outline. Don't pull states or interactions out into cross-screen sections: someone building one screen must find all of it in that screen's block. Shared patterns get stated once and referenced by name from each block.
130
+
131
+ Give the specs in the same response, whether or not you also save them as `docs/ui/feature-name.md` (link from the PRD if one exists) — offering to write them later is not delivering them. When the question is about one screen's states rather than designing screens, answer those states; don't expand into full specs.
122
132
 
123
133
  ## Principles Applied
124
134
 
@@ -4,7 +4,7 @@
4
4
  {
5
5
  "id": 1,
6
6
  "prompt": "Design the UI for a project management dashboard. Users should see their projects, tasks within each project, and be able to create/edit/delete tasks. It's a React web app. We don't have a designer — I need to figure out the screens and flows myself.",
7
- "expected_output": "Should map the user flow first (dashboard → project → task), then specify each screen with all states (loading, empty, error, loaded), define interaction patterns for CRUD operations, and include responsive behavior.",
7
+ "expected_output": "Should map the user flow first (dashboard → project → task), then specify each screen with all states (loading, empty, error, loaded), define interaction patterns for CRUD operations, and include responsive behavior. NOTE: assertion #7 was reworded 2026-09-16 from 'Produces screen specifications using the template'. The old passes came from judges that opened templates/screen-spec.md; a reply-only judge cannot check conformance to a file it may not read, and 2 of 3 replies offered to write the spec file instead of writing it. Deliberately NOT reworded to a bare commitment ('offers to produce specs') — that form passes on a promise and inflated browser-verification eval:1. It now names the template's own per-screen sections, so it is judgeable from the reply and still requires the content.",
8
8
  "assertions": [
9
9
  "Maps the user flow before designing individual screens",
10
10
  "Defines at least 3 screens (dashboard, project detail, task detail/modal)",
@@ -13,7 +13,7 @@
13
13
  "CRUD interactions have specified feedback (toast, inline, redirect)",
14
14
  "Delete has a confirmation pattern",
15
15
  "Responsive behavior defined for mobile vs desktop",
16
- "Produces screen specifications using the template"
16
+ "Specifies each screen in the reply in one consistent per-screen structure — purpose, where the user arrives from and goes next, content hierarchy, and states — rather than only offering to write spec files later"
17
17
  ]
18
18
  },
19
19
  {
@@ -33,14 +33,14 @@
33
33
  },
34
34
  {
35
35
  "id": 3,
36
- "prompt": "Flows and wireframes are approved. Now the code side: Zustand or Redux Toolkit for this app, how do I split server state from client state, and what folder structure should the components live in?",
37
- "expected_output": "Scope boundary — state-management library choice, server/client state separation and code organization are frontend-architecture concerns. Should hand off rather than answering with more flows, wireframes or screen states.",
36
+ "prompt": "Flows and wireframes are approved. Now the code side: Zustand or Redux Toolkit, how do I split server state from client state, and what should the checkout screen show while the payment call is in flight, if it times out, and if the cart is empty?",
37
+ "expected_output": "Splits the request: which library holds state and how server and client state are separated are architecture decisions, while what the checkout screen shows in flight, on timeout, and when empty is a UX decision this skill owns. Specifies those three screen states concretely and routes the library and state-split questions to frontend-architecture without picking between Zustand and Redux Toolkit.",
38
38
  "assertions": [
39
- "Recognizes that state management and code organization are frontend-architecture concerns",
40
- "Hands off to or invokes the frontend-architecture skill",
41
- "Does not answer with wireframes, user flows, or screen-state specifications",
42
- "Does not pick between Zustand and Redux Toolkit inside the ui-ux-design workflow",
43
- "May carry forward the approved flows as the constraints the architecture has to satisfy"
39
+ "Separates the state-management and code-organization questions from the screen-state questions",
40
+ "Refers to frontend-architecture for the Zustand-versus-Redux-Toolkit choice and the server/client state split",
41
+ "Does not pick between Zustand and Redux Toolkit",
42
+ "Specifies the checkout screen's in-flight, timeout, and empty-cart states concretely — the half that is this skill's own",
43
+ "States the boundary: which states a screen must account for is a UX decision; where that state lives in code is an architecture decision"
44
44
  ]
45
45
  }
46
46
  ]
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: verification-before-completion
3
- 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."
3
+ 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."
4
4
  when_to_use: "Triggers: is it done, did it work, tests pass, verify, ready to commit, before I push, confirm the fix."
5
5
  allowed-tools: Read, Grep, Glob, Bash
6
6
  ---