swe-workflow-skills 0.8.2 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (64) hide show
  1. package/README.md +70 -98
  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 +11 -9
  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/configuration-strategy/evals/evals.json +2 -1
  20. package/skills/data-modeling/evals/evals.json +8 -8
  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-pipeline-design/evals/evals.json +6 -5
  38. package/skills/mobile-architecture/evals/evals.json +9 -8
  39. package/skills/performance-optimization/evals/evals.json +7 -5
  40. package/skills/plan-execution/SKILL.md +8 -0
  41. package/skills/plan-execution/evals/evals.json +9 -8
  42. package/skills/project-documentation/evals/evals.json +2 -2
  43. package/skills/refactoring/evals/evals.json +6 -7
  44. package/skills/retrospective/evals/evals.json +7 -8
  45. package/skills/rollback-strategy/evals/evals.json +5 -4
  46. package/skills/security-audit/SKILL.md +6 -0
  47. package/skills/security-audit/evals/evals.json +6 -6
  48. package/skills/skill-router/evals/evals.json +2 -2
  49. package/skills/statistical-analysis/evals/evals.json +10 -8
  50. package/skills/strategic-review/SKILL.md +36 -0
  51. package/skills/strategic-review/evals/evals.json +7 -6
  52. package/skills/subagent-orchestration/evals/evals.json +2 -1
  53. package/skills/tdd-workflow/evals/evals.json +10 -8
  54. package/skills/technical-debt-review/evals/evals.json +11 -7
  55. package/skills/test-suite-design/SKILL.md +10 -3
  56. package/skills/test-suite-design/evals/evals.json +4 -3
  57. package/skills/test-suite-design/references/testing-pyramid.md +19 -3
  58. package/skills/threat-modeling/evals/evals.json +7 -6
  59. package/skills/ui-ux-design/SKILL.md +11 -1
  60. package/skills/ui-ux-design/evals/evals.json +9 -9
  61. package/skills/verification-before-completion/SKILL.md +1 -1
  62. package/skills/verification-before-completion/evals/evals.json +11 -11
  63. package/skills/writing-skills/SKILL.md +112 -1
  64. package/skills/writing-skills/evals/evals.json +2 -2
@@ -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
  ]
@@ -11,7 +11,8 @@
11
11
  "Suggests percentage-based rollout for the feature flag",
12
12
  "Warns against committing any credential to version control",
13
13
  "Recommends startup validation to fail fast if secrets are missing",
14
- "Notes different values needed for dev/staging/production"
14
+ "Notes different values needed for dev/staging/production",
15
+ "Before adding the new keys, establishes what configuration already exists (existing keys or values, .env.example, config conventions), or says it cannot inspect the project and names what it would check"
15
16
  ]
16
17
  },
17
18
  {
@@ -12,7 +12,8 @@
12
12
  "Includes indexes for common access patterns (order lookup by user, product search)",
13
13
  "Foreign keys have explicit ON DELETE behavior",
14
14
  "Includes created_at/updated_at timestamps",
15
- "Validates schema against likely access patterns"
15
+ "Validates schema against likely access patterns",
16
+ "Before proposing tables, establishes what schema already exists, or says it is treating the project as greenfield or cannot inspect it and names what it would check"
16
17
  ]
17
18
  },
18
19
  {
@@ -29,14 +30,13 @@
29
30
  },
30
31
  {
31
32
  "id": 3,
32
- "prompt": "We need to rename our 'username' column to 'display_name' in the users table. We have 2M users and the column is used in about 15 places in the codebase. We can't have downtime. How should I approach this?",
33
- "expected_output": "Should recommend the expand-contract migration pattern, not a simple column rename. Should produce multiple migration steps with deployment coordination.",
33
+ "prompt": "We're adding identity verification to onboarding, so for every new customer we'll be storing a passport number, a date of birth, and a scan of the document itself. Design the tables. Legal has already confirmed we're allowed to collect all three.",
34
+ "expected_output": "The prompt closes the question of whether the data may be collected, which leaves two open halves the roster does not separate. How it is stored — the tables, the keys, and the fact that a document image does not belong in a row — is this skill's work, delivered concretely. What follows from holding it — how long it may be kept, and how it is removed on request — is compliance-privacy's. The halves meet at deletability: a schema that cannot drop the identifiers without breaking the customer record makes the obligation impossible to honour, so a good answer designs for removal rather than only for writing.",
34
35
  "assertions": [
35
- "Does NOT suggest a simple ALTER TABLE RENAME",
36
- "Recommends expand-contract (add new column, dual-write, backfill, cut over, drop old)",
37
- "Addresses the zero-downtime requirement explicitly",
38
- "Warns about table locking on 2M rows",
39
- "Produces reversible migration steps"
36
+ "Separates the two halves: how the data is shaped and stored, versus what obligations follow from holding it",
37
+ "Refers to compliance-privacy for retention periods and the erasure path",
38
+ "Delivers the schema itself, including where the document image lives rather than only the columns beside it",
39
+ "Designs for removal: the identifiers and the scan can be deleted without breaking the customer record"
40
40
  ]
41
41
  }
42
42
  ]
@@ -25,6 +25,13 @@ magnitude cheaper to build and operate than streaming — don't buy streaming
25
25
  because "real-time" sounds better; buy it when a consumer decision genuinely
26
26
  changes within minutes.
27
27
 
28
+ **If the ask arrives with a bill attached, separate the two questions.** Changing what
29
+ work runs each night — full refreshes to incremental, narrower scans, fewer rebuilds — is
30
+ this skill's, and the steps below do it. What that work is *charged at*, and how much of
31
+ the invoice this job even accounts for, is `finops-cost-optimization`'s. Find out this
32
+ job's share of the spend before promising a number: a rewrite that halves a job
33
+ responsible for a fifth of the bill moves the total by a tenth.
34
+
28
35
  ### Step 2: Choose ELT (and Say Why)
29
36
 
30
37
  For a cloud warehouse (Snowflake, BigQuery, Redshift, Databricks), default to
@@ -93,7 +100,10 @@ for a dbt-centric greenfield stack (asset/partition model matches warehouse
93
100
  thinking, first-class dbt integration); Airflow where the org already runs it
94
101
  or needs its ecosystem breadth (comparison and managed options:
95
102
  [references/orchestration.md](references/orchestration.md)). Then wire in
96
- operations: retries with alerting on final failure (`observability-design`),
103
+ operations: retries, and **an alert on final failure that names who receives it** — a load
104
+ that fails silently is the failure this step exists to prevent, so the alert is part of the
105
+ pipeline design, not a monitoring afterthought. (SLOs, error budgets and instrumentation depth
106
+ are `observability-design`'s; deciding that a failed run pages someone is not.) Alongside it,
97
107
  quality checks between layers (`data-quality`), and cost visibility per model —
98
108
  warehouses make it very easy to spend quietly.
99
109
 
@@ -108,6 +118,7 @@ warehouses make it very easy to spend quietly.
108
118
 
109
119
  ## Cross-Skill References
110
120
 
121
+ - `finops-cost-optimization` — warehouse sizing, spend attribution, and whether this job is actually driving the bill
111
122
  - `data-quality` — tests, contracts, and freshness checks between the layers
112
123
  - `data-modeling` — the schema design of the marts this pipeline produces
113
124
  - `ml-pipeline-design` — when the consumer is model training, not BI
@@ -17,24 +17,25 @@
17
17
  {
18
18
  "id": 2,
19
19
  "prompt": "Our nightly job loads yesterday's orders into the warehouse. When it fails midway and we rerun it, we get duplicate rows — and backfilling last month means manually editing the date in the script 30 times. Fix the design.",
20
- "expected_output": "Identifies the non-idempotent append-only load as the root cause; converts the job to an idempotent write pattern (delete+insert by partition, merge/upsert on a key, or partition overwrite) parameterized over a logical date, so backfill becomes running the same job over a range via the orchestrator — with a lookback window for late-arriving data",
20
+ "expected_output": "Identifies the non-idempotent append-only load as the root cause; converts the job to an idempotent write pattern (delete+insert by partition, merge/upsert on a key, or partition overwrite) parameterized over a logical date, so backfill becomes running the same job over a range via the orchestrator — with a lookback window for late-arriving data NOTE: final assertion added 2026-09-18. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 7 (orchestrate and operate) — 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. Chosen because it is an operate-or-verify step: of the seven rows tried this way, the three that separated the arms all asserted work the unaided model skips after the answer it already knows.",
21
21
  "assertions": [
22
22
  "Identifies the root cause as a non-idempotent, append-only load",
23
23
  "Proposes an idempotent write pattern: delete+insert by partition, merge/upsert on a unique key, or partition-overwrite semantics",
24
24
  "Parameterizes the run over a logical date/window so any day can be run or re-run identically (backfill = the same job over a range)",
25
25
  "Recommends orchestrator-native backfill (or an equivalent parameterized range run) over hand-edited scripts",
26
- "Considers late-arriving or corrected data (lookback window, watermark, or reprocessing policy), not just the happy path"
26
+ "Considers late-arriving or corrected data (lookback window, watermark, or reprocessing policy), not just the happy path",
27
+ "Makes a failed run visible: retries with an alert on final failure, so a load that fails is noticed rather than found later"
27
28
  ]
28
29
  },
29
30
  {
30
31
  "id": 3,
31
- "prompt": "Design the data pipeline that produces training features for our churn model — we need point-in-time correct features and a training set refreshed weekly.",
32
- "expected_output": "Recognizes this as an ML training/feature pipeline, not analytics ELT — hands off to ml-pipeline-design, flagging point-in-time correctness/leakage as the ML-specific concern that a BI-oriented warehouse design does not address",
32
+ "prompt": "Our nightly dbt run takes five hours and the warehouse bill has doubled since January. Most of the models are full refreshes over the whole event table. Leadership wants both numbers down before the next board meeting.",
33
+ "expected_output": "Two numbers, two owners, and the roster does not say which is which. Restructuring full refreshes into incremental builds so less work runs each night is this skill's, and it delivers that. How the warehouse is sized, and how much of the doubled bill this job actually accounts for, is finops-cost-optimization's. A good answer establishes that share before promising a reduction, because a pipeline rewrite that addresses a minority of the spend will not move the bill.",
33
34
  "assertions": [
34
- "Recognizes this is an ML training/feature pipeline, not an analytics/BI ELT pipeline",
35
- "Refers to the ml-pipeline-design skill for feature engineering and training orchestration",
36
- "Flags point-in-time correctness / data leakage as the ML-specific concern that distinguishes this from BI work",
37
- "Does not answer with a BI-oriented warehouse/dbt marts design as the primary solution"
35
+ "Separates the two halves: how the models are built and refreshed, versus how the warehouse spend is sized and attributed",
36
+ "Refers to finops-cost-optimization for warehouse sizing and attributing the bill",
37
+ "Delivers the pipeline half itself — moving the full refreshes onto incremental builds — rather than deferring the whole request",
38
+ "Establishes what share of the bill this job actually accounts for before promising a reduction"
38
39
  ]
39
40
  }
40
41
  ]
@@ -24,6 +24,13 @@ staleness → freshness, broken joins → `relationships`. Wins from day one, an
24
24
  the suite grows the same way tests do after bugs — every new incident adds a
25
25
  check that would have caught it.
26
26
 
27
+ **An incident that nobody noticed failed twice, and you only own the first failure.**
28
+ Not knowing the data was wrong is a detection gap — the checks below close it. Knowing and
29
+ not telling anyone is a routing gap: who gets paged, on what threshold, and through which
30
+ channel is `observability-design`'s work. Build the check that would have caught this
31
+ incident, then say explicitly that a check nobody is paged for will produce the same
32
+ outcome next time.
33
+
27
34
  ### Step 2: Check at the Right Layer — Boundary First
28
35
 
29
36
  Where a check runs matters as much as what it checks:
@@ -16,23 +16,25 @@
16
16
  {
17
17
  "id": 2,
18
18
  "prompt": "An upstream team owns the events we ingest and keeps renaming columns and changing types without telling us. Our pipeline breaks silently every few weeks. What should we put in place?",
19
- "expected_output": "Proposes a producer/consumer data contract (schema, types, semantics, SLA) enforced at the ingestion boundary so violations fail loudly at entry; shifts validation left into the producer's CI or publish path; adds versioning/deprecation windows for breaking changes; and backstops enforcement with schema-drift and volume/distribution anomaly detection",
19
+ "expected_output": "Proposes a producer/consumer data contract (schema, types, semantics, SLA) enforced at the ingestion boundary so violations fail loudly at entry; shifts validation left into the producer's CI or publish path; adds versioning/deprecation windows for breaking changes; and backstops enforcement with schema-drift and volume/distribution anomaly detection 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 (route failures to an owner) — the part of the skill that changes what the user does — was asserted nowhere. The assertion is drafted from that step, not from a treatment reply.",
20
20
  "assertions": [
21
21
  "Proposes an explicit data contract between producer and consumer (schema, types, semantics, SLAs), not just more downstream tests",
22
22
  "Enforces the schema at the ingestion boundary so violations fail loudly at entry instead of propagating silently",
23
23
  "Shifts checks left: contract validation in the producer's CI or at publish time",
24
24
  "Covers change management for breaking changes: contract versioning or a deprecation window",
25
- "Adds detection for what enforcement misses: schema-drift alerts or anomaly checks on volume/distributions"
25
+ "Adds detection for what enforcement misses: schema-drift alerts or anomaly checks on volume/distributions",
26
+ "Routes each failed check to a named owner of the affected table or domain, rather than leaving alerts where nobody watches them"
26
27
  ]
27
28
  },
28
29
  {
29
30
  "id": 3,
30
- "prompt": "We need realistic but fake customer data to seed staging so QA can test the checkout flow — GDPR means we can't copy production.",
31
- "expected_output": "Recognizes this as generating synthetic/test data, not validating production data — hands off to test-data-strategy (factories, synthetic generation, anonymization) rather than proposing expectations, contracts, or freshness checks",
31
+ "prompt": "A customer told us our revenue dashboard had been wrong for three days before anyone here noticed. The upstream team had renamed a column. I need to make sure that never happens silently again.",
32
+ "expected_output": "'Never happens silently' is two problems the roster does not separate. Knowing the data is wrong — a schema-drift check and a freshness check that would have caught a renamed column on the first run, plus a contract with the upstream team so the rename surfaces before it lands — is this skill's work, delivered concretely. Getting a person's attention once something is known to be wrong, including who is paged and on what threshold, is observability-design's. A good answer treats detection and notification as separate failures, because this incident failed at both.",
32
33
  "assertions": [
33
- "Recognizes this is about generating test/synthetic data, not validating production data quality",
34
- "Refers to the test-data-strategy skill for factories, synthetic data generation, and GDPR-safe anonymization",
35
- "Does not answer with data-quality machinery (expectations, contracts, freshness checks) as the solution"
34
+ "Separates the two halves: detecting that the data is wrong, versus getting a person's attention when it is",
35
+ "Refers to observability-design for alert routing and who gets paged",
36
+ "Delivers the detection half itself — a schema-drift or freshness check that would have caught the renamed column — rather than deferring the whole request",
37
+ "Raises a contract with the upstream team so the rename surfaces before it lands, not only afterwards"
36
38
  ]
37
39
  }
38
40
  ]
@@ -21,7 +21,7 @@
21
21
  "assertions": [
22
22
  "Confirms this is a backwards-compatible (additive) change",
23
23
  "Notes that existing code ignores the new column and remains safe",
24
- "May mention that ORM models should be updated to avoid unexpected behavior when they serialize full rows",
24
+ "Flags that code selecting whole rows — ORM models, serializers — will start returning the new column",
25
25
  "Does not require complex coordination or versioning",
26
26
  "Gives a clear 'safe to proceed' verdict with any minor caveats"
27
27
  ]
@@ -33,7 +33,7 @@
33
33
  "assertions": [
34
34
  "Recognizes this is not a dependency impact analysis request",
35
35
  "Does not perform a blast radius analysis for adding auth",
36
- "May note that adding required auth to an existing endpoint is a breaking change for current consumers (brief impact observation)",
36
+ "Notes that adding required auth to a live endpoint is a breaking change for its current consumers",
37
37
  "Directs to security-audit or api-design skill for the actual implementation guidance"
38
38
  ]
39
39
  }
@@ -39,10 +39,17 @@ Convert to time or cost via team velocity or loaded cost, add a 20-30% buffer fo
39
39
  unknowns, and communicate a range in stakeholder language — weeks and dollars, not
40
40
  story points. A single number becomes a commitment; a range communicates confidence.
41
41
 
42
+ **Say when the number gets revisited.** A range nobody revisits hardens into the commitment
43
+ you avoided giving — so hand over the estimate with its re-forecast attached: the next point
44
+ where real data replaces assumption (a phase boundary, the end of a spike, the first sprints
45
+ of actuals), and what would move the number. That sentence is what keeps an early-discovery
46
+ estimate honest; without it, "wide range" is just a number the stakeholder rounds down.
47
+
42
48
  ### Step 5: Track and Calibrate
43
49
 
44
- Compare estimated vs actual each sprint, look for systematic bias, and recalibrate
45
- velocity on the last 3-5 sprints, not the all-time average.
50
+ Compare estimated with actual — per sprint on delivery work, at each phase boundary on a
51
+ project-sized estimate — look for systematic bias, and recalibrate on the last 3-5 data
52
+ points, not the all-time average.
46
53
 
47
54
  ## Principles Applied
48
55
 
@@ -18,14 +18,15 @@
18
18
  {
19
19
  "id": 2,
20
20
  "prompt": "Our VP wants a budget estimate for a 6-month data platform rebuild. We're in early discovery and a lot is still unknown. How do I estimate this responsibly?",
21
- "expected_output": "Should recommend three-point estimation for high-uncertainty work, produce wide ranges, clearly state assumptions and unknowns, and suggest narrowing the estimate through phased discovery.",
21
+ "expected_output": "Should recommend three-point estimation for high-uncertainty work, produce wide ranges, clearly state assumptions and unknowns, and suggest narrowing the estimate through phased discovery. NOTE: final assertion added 2026-09-18. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 5 (track and calibrate) — 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. Chosen because it is an operate-or-verify step: of the seven rows tried this way, the three that separated the arms all asserted work the unaided model skips after the answer it already knows.",
22
22
  "assertions": [
23
23
  "Recommends three-point estimation due to high uncertainty",
24
24
  "Produces wide initial ranges (appropriate for early discovery)",
25
25
  "Suggests a phased approach: estimate phase 1 tightly, phases 2-3 loosely",
26
26
  "Clearly states which assumptions drive the estimate",
27
27
  "Recommends a technical spike before committing to precise numbers",
28
- "Does NOT produce a precise single-number estimate for 6 months of unknown work"
28
+ "Does NOT produce a precise single-number estimate for 6 months of unknown work",
29
+ "Commits to re-estimating against actuals as the work lands — comparing estimated with actual and recalibrating on recent data, rather than treating the first number as the budget"
29
30
  ]
30
31
  },
31
32
  {
@@ -17,7 +17,7 @@
17
17
  {
18
18
  "id": 2,
19
19
  "prompt": "plan adding dark mode to our vue app",
20
- "expected_output": "The ask-first branch of Step 1: the request names no concrete behavior, persistence, or theming approach, so the reply asks before drafting (CSS variables vs theme library? System preference detection? Per-component or global? Persistence?) and says what it would need to start drafting. NOTE: assertions #3 and #4 previously read 'Tasks include both implementation and testing' and 'Acceptance criteria are independently testable' — plan artifacts that the ask-first branch by definition does not produce, so they could never pass on this case. They now test the coverage of the clarification itself. The artifact assertions are exercised on eval:1, where the draft branch applies. NOTE 2: a replacement assertion, 'Its questions cover verification/testing scope, not implementation choices alone', was then removed too \u2014 it failed in BOTH arms at k=3 even after Step 1 gained a verification question, and 0/N in both arms means there is nothing to discriminate.",
20
+ "expected_output": "The ask-first branch of Step 1: the request names no concrete behavior, persistence, or theming approach, so the reply asks before drafting (CSS variables vs theme library? System preference detection? Per-component or global? Persistence?) and says what it would need to start drafting. NOTE: assertions #3 and #4 previously read 'Tasks include both implementation and testing' and 'Acceptance criteria are independently testable' — plan artifacts that the ask-first branch by definition does not produce, so they could never pass on this case. They now test the coverage of the clarification itself. The artifact assertions are exercised on eval:1, where the draft branch applies. NOTE 2: a replacement assertion, 'Its questions cover verification/testing scope, not implementation choices alone', was then removed too — it failed in BOTH arms at k=3 even after Step 1 gained a verification question, and 0/N in both arms means there is nothing to discriminate. NOTE 3: this case scores the same in both arms, and that is accepted rather than a weak fixture — an unaided model also asks before planning a seven-word request, so the row gates the ask-first branch without demonstrating a gain. The branch is a deliberate, documented departure from the library's ask-alongside default (see writing-skills); do not re-triage it as a posture defect.",
21
21
  "assertions": [
22
22
  "Does not immediately produce a plan from this vague request",
23
23
  "Asks at least 3 clarifying questions",
@@ -27,15 +27,13 @@
27
27
  },
28
28
  {
29
29
  "id": 3,
30
- "prompt": "We need to migrate our REST API to GraphQL. It's a Django backend serving a React Native mobile app and a Next.js web app. We have about 40 endpoints. The CEO wants it done in 3 sprints. Help me plan this.",
31
- "expected_output": "Should flag the complexity and risks, suggest an incremental migration strategy rather than big-bang, break into phased milestones, and identify the critical path.",
30
+ "prompt": "We've committed to building SSO for enterprise customers — SAML plus SCIM provisioning, with admin-managed roles. Sales has already told two prospects it lands next quarter. Break it up for the team, and tell me whether next quarter is real.",
31
+ "expected_output": "The request asks for two things the roster does not separate. Breaking the work into deliverable pieces with acceptance criteria and sequencing, and surfacing the dependency on each customer's identity provider, is this skill's work and it delivers that. Turning those pieces into a defensible answer about the quarter — sizing technique, capacity, and the confidence attached to a date — is effort-estimation's. A good answer does not quietly convert a task list into a calendar commitment.",
32
32
  "assertions": [
33
- "Flags the risk of a full rewrite in 3 sprints",
34
- "Suggests incremental or parallel migration strategy",
35
- "Recommends architectural decisions be made first",
36
- "References the architecture-design skill for ADR",
37
- "Identifies external dependencies (mobile app release cycle)",
38
- "Creates phased milestones, not just flat task list"
33
+ "Separates the two halves: breaking the work into deliverable pieces, versus deciding how much calendar those pieces add up to",
34
+ "Refers to effort-estimation for sizing the work and testing the next-quarter date against team capacity",
35
+ "Delivers the breakdown itself — scoped tasks with acceptance criteria — rather than deferring the whole request",
36
+ "Identifies the dependency outside the team's control, such as each customer's identity provider"
39
37
  ]
40
38
  }
41
39
  ]
@@ -39,7 +39,7 @@
39
39
  "Hands off to or invokes the accessibility-design skill",
40
40
  "Does not answer with component hierarchy, state management, or folder structure guidance",
41
41
  "Does not attempt a full WCAG audit inside the frontend-architecture workflow",
42
- "May note where architectural choices (focus management, component composition) support the accessibility work"
42
+ "Names at least one architectural choice the accessibility work will depend on, such as where focus state lives or how the components are composed"
43
43
  ]
44
44
  }
45
45
  ]
@@ -29,15 +29,13 @@
29
29
  },
30
30
  {
31
31
  "id": 3,
32
- "prompt": "We're a team of 4 starting a new project. What branching strategy should we use? We deploy to production multiple times a day.",
33
- "expected_output": "Should recommend a simple strategy (main + short-lived feature branches) given small team and continuous deployment. Should NOT suggest GitFlow or other complex models.",
32
+ "prompt": "We're a team of 4 on a new project and we deploy to production several times a day. Main broke twice last week: two PRs that each passed on their own were merged an hour apart, the combination didn't build, and it went straight out. What branching setup should we use so this stops happening?",
33
+ "expected_output": "Notices that the breakage has two causes that are fixed in different places. How branches are cut, how long they live, and how they merge is this skill's work, and it delivers that — main plus short-lived branches, a merge style, a review bar sized to four people, without reaching for GitFlow. That each PR was tested against a base that no longer existed when it merged, and that nothing checked the combined result before it deployed, is a gate problem: required checks on the up-to-date merge result, a merge queue, and a build that must pass on main before the deploy runs are cicd-pipeline's work. A good answer does not claim a branching model alone prevents a broken merge result.",
34
34
  "assertions": [
35
- "Recommends simple branching (main + feature branches)",
36
- "Does NOT recommend GitFlow (too heavy for 4 devs + continuous deployment)",
37
- "Recommends short-lived branches (1-3 days max)",
38
- "Suggests squash-merge as default merge strategy",
39
- "Includes branch naming conventions",
40
- "Mentions PR review requirements appropriate for team size"
35
+ "Separates the two halves: how branches are arranged and merged, versus the checks that must pass on the merged result before it reaches production",
36
+ "Refers to cicd-pipeline for the required checks on the merged result and the gate before deploy",
37
+ "Delivers the branching strategy itself — main plus short-lived branches and a merge style — rather than deferring the whole request",
38
+ "Explains that each PR was tested against a stale base rather than against the combined result"
41
39
  ]
42
40
  }
43
41
  ],
@@ -17,24 +17,25 @@
17
17
  {
18
18
  "id": 2,
19
19
  "prompt": "We have an incident where a background job is running but producing incorrect results — all order totals calculated in the last 2 hours are wrong by about 15%. No service is down, users aren't seeing errors. How should we handle this?",
20
- "expected_output": "Recognizes this as a data integrity incident (potentially Sev1 despite no downtime), recommends stopping the job immediately, scoping the data impact, and planning data correction before communication",
20
+ "expected_output": "Recognizes this as a data integrity incident (potentially Sev1 despite no downtime), recommends stopping the job immediately, scoping the data impact, and planning data correction before communication NOTE: final assertion added 2026-09-18. Every earlier assertion here is the textbook answer, which the control produced unaided (RED matched GREEN on all of them), while Step 5 (recover and verify) — 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. Chosen because it is an operate-or-verify step: of the seven rows tried this way, the three that separated the arms all asserted work the unaided model skips after the answer it already knows.",
21
21
  "assertions": [
22
22
  "Recognizes data corruption as a high-severity issue even without service downtime",
23
23
  "Recommends stopping the job immediately to prevent more bad data",
24
24
  "Addresses scoping the affected records (which orders, time range, total count)",
25
25
  "Raises the question of customer communication and billing correction",
26
- "Does not treat this as a low-priority issue just because no service is down"
26
+ "Does not treat this as a low-priority issue just because no service is down",
27
+ "Treats stopping the job as mitigation rather than resolution: the incident closes only once the affected totals are corrected and verified"
27
28
  ]
28
29
  },
29
30
  {
30
31
  "id": 3,
31
- "prompt": "I want to do an incident response drill with my team to practice before a real incident happens. Can you help me plan it?",
32
- "expected_output": "Clarifies this is incident response preparation/training, not an active incident — redirects to planning a drill scenario rather than executing incident response steps",
32
+ "prompt": "I want the team practicing before a real outage. Plan us a drill: pick a failure to inject, decide who plays incident commander and who runs comms, and write the runbook they'll follow when the pager actually goes off.",
33
+ "expected_output": "Splits the request: choosing and injecting a failure is chaos-experiment design, while the response roles, comms structure and the on-call runbook are this skill's own. Produces the roles and runbook, routes the failure-injection design to resilience-engineering, and does not run the live incident workflow — nothing is down.",
33
34
  "assertions": [
34
- "Recognizes this is a planning/training request, not an active incident",
35
- "Does not execute the incident response workflow as if production is down",
36
- "Offers to help design drill scenarios, runbooks, or role assignments",
37
- "May suggest this is adjacent to retrospective/process improvement work"
35
+ "Separates the two halves: selecting and injecting the failure is chaos-experiment design, while the response roles, comms and runbook are incident-response's own",
36
+ "Refers to resilience-engineering for designing the failure injection or game-day scenario",
37
+ "Produces the incident-response half — incident commander and comms assignments, and the runbook responders follow — rather than handing the whole request off",
38
+ "Does not execute the live incident workflow as though production were currently down"
38
39
  ]
39
40
  }
40
41
  ],
@@ -42,7 +43,10 @@
42
43
  {
43
44
  "id": 1,
44
45
  "prompt": "Site is down and everyone is watching. I'm pretty sure I know the bug — let me just push a quick forward fix straight to prod, no time for a rollback or a review.",
45
- "pressure": ["time", "authority"],
46
+ "pressure": [
47
+ "time",
48
+ "authority"
49
+ ],
46
50
  "expected_behavior": "Holds the Iron Law: mitigate before investigate, and never ship an unverified fix under pressure. Prefers fast reversible mitigation (rollback / feature flag) over an unreviewed forward fix, keeps review even during the incident, and requires verifying recovery against baseline before declaring resolved.",
47
51
  "assertions": [
48
52
  "Prefers fast, reversible mitigation (rollback / flag) over an unreviewed forward fix",
@@ -9,8 +9,9 @@ allowed-tools: Read, Grep, Glob, Write, Edit, Bash
9
9
  Design LLM applications as **systems, not prompts**: what goes into the context
10
10
  window, what the model is allowed to do, and what happens when it's wrong. The
11
11
  model is the one component you don't control — engineer everything around it.
12
- This skill designs and builds; proving a change helped is `ai-evaluation`'s job,
13
- and no design below is "done" until it has an eval harness.
12
+ This skill designs and builds: it decides what occupies the context window and
13
+ what gets cut. Proving a change helped is `ai-evaluation`'s job — it measures,
14
+ this skill chooses. No design below is "done" until it has an eval harness.
14
15
 
15
16
  ## Workflow
16
17
 
@@ -74,10 +75,12 @@ compact stale history instead of letting it scroll off; store durable facts
74
75
 
75
76
  ### Step 6: Wire In Evaluation Before Shipping
76
77
 
77
- Hand the design to `ai-evaluation`: a golden dataset (including unanswerable
78
- and adversarial cases), RAG-stage metrics (retrieval vs generation scored
79
- separately), agent task-success rate, and a CI regression gate. "The answers
80
- feel better" is not evidence; a design without an eval harness is a prototype.
78
+ Hand `ai-evaluation` the **inputs** it needs and let it design the instrument:
79
+ the variants being compared, the question set they should be run over, and what
80
+ must be held constant between them. Specifying the golden-set size, the judge
81
+ rubric, or the calibration protocol here is doing the other skill's job — and
82
+ badly, because this skill is not judged on it. "The answers feel better" is not
83
+ evidence; a design without an eval harness is a prototype.
81
84
 
82
85
  Deeper pattern detail (chunking table, reranking, memory patterns, failure
83
86
  modes): [references/patterns.md](references/patterns.md).