swe-workflow-skills 0.7.0 → 0.8.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 (44) hide show
  1. package/README.md +11 -4
  2. package/VERSION +1 -1
  3. package/package.json +1 -1
  4. package/skills/accessibility-design/SKILL.md +1 -0
  5. package/skills/accessibility-design/evals/evals.json +4 -4
  6. package/skills/accessibility-design/references/accessibility-patterns.md +34 -0
  7. package/skills/api-design/SKILL.md +24 -7
  8. package/skills/architecture-design/evals/evals.json +4 -5
  9. package/skills/architecture-documentation/evals/evals.json +47 -44
  10. package/skills/cicd-pipeline/SKILL.md +2 -0
  11. package/skills/cicd-pipeline/evals/evals.json +16 -2
  12. package/skills/containerization/evals/evals.json +12 -0
  13. package/skills/dependency-impact-analysis/SKILL.md +22 -1
  14. package/skills/deployment-checklist/SKILL.md +6 -0
  15. package/skills/deployment-checklist/evals/evals.json +3 -3
  16. package/skills/deployment-repo/SKILL.md +1 -0
  17. package/skills/deployment-repo/evals/evals.json +2 -2
  18. package/skills/effort-estimation/evals/evals.json +13 -0
  19. package/skills/feature-planning/SKILL.md +26 -3
  20. package/skills/feature-planning/evals/evals.json +5 -7
  21. package/skills/frontend-architecture/evals/evals.json +12 -0
  22. package/skills/gitops-delivery/SKILL.md +9 -1
  23. package/skills/infrastructure-as-code/evals/evals.json +12 -0
  24. package/skills/metrics-and-okrs/evals/evals.json +12 -0
  25. package/skills/ml-experiment-tracking/evals/evals.json +12 -0
  26. package/skills/ml-model-deployment/evals/evals.json +12 -0
  27. package/skills/performance-optimization/evals/evals.json +2 -2
  28. package/skills/prd-writing/evals/evals.json +13 -0
  29. package/skills/project-proposal/evals/evals.json +12 -0
  30. package/skills/release-management/SKILL.md +22 -0
  31. package/skills/retrospective/evals/evals.json +13 -0
  32. package/skills/rollback-strategy/evals/evals.json +1 -2
  33. package/skills/skill-router/SKILL.md +7 -0
  34. package/skills/skill-router/evals/evals.json +3 -4
  35. package/skills/strategic-review/evals/evals.json +8 -8
  36. package/skills/tdd-workflow/SKILL.md +12 -1
  37. package/skills/test-data-strategy/SKILL.md +14 -0
  38. package/skills/test-data-strategy/references/data-generation-patterns.md +15 -0
  39. package/skills/test-suite-design/SKILL.md +27 -1
  40. package/skills/test-suite-design/evals/evals.json +6 -3
  41. package/skills/ui-ux-design/SKILL.md +12 -0
  42. package/skills/ui-ux-design/evals/evals.json +12 -0
  43. package/skills/verification-before-completion/evals/evals.json +5 -8
  44. package/skills/writing-skills/SKILL.md +69 -12
package/README.md CHANGED
@@ -38,9 +38,13 @@ don't cover:
38
38
  ([how it works](docs/ROLES.md)).
39
39
  - **Tested like code, not prose.** Every skill ships 3 evals; two LLM-as-judge
40
40
  harnesses (content quality and routing accuracy) replay them with skill loaded vs
41
- absent and gate regressions in CI. Safety-critical skills (deploys, releases, tests,
42
- incidents, security) are **hardened**: an Iron Law, a rationalization table distilled
43
- from real baseline failures, and pressure tests that try to talk the agent out of it.
41
+ absent and gate regressions in CI. Across all 66 skills — 234 cases, 1315 assertions —
42
+ the same model passes **67.1%** of assertions unaided and **94.4%** with the skill
43
+ loaded, and **no skill scores below the unaided model on any case**
44
+ ([results](docs/EVALS.md#results-content-evals-full-catalog)). Safety-critical skills
45
+ (deploys, releases, tests, incidents, security) are **hardened**: an Iron Law, a
46
+ rationalization table distilled from real baseline failures, and pressure tests that
47
+ try to talk the agent out of it.
44
48
  - **Curated, not a mega-catalog.** First-party skills, versioned and eval-gated in the
45
49
  repo — no arbitrary third-party skills pulled from a hub, and nothing that executes on
46
50
  its own (the content is instructions and templates; the only code is the open Node
@@ -183,7 +187,10 @@ Each skill carries an `evals/` directory; safety/discipline skills add a `pressu
183
187
  block. Two runners replay scenarios through Claude (skill loaded = GREEN, absent = RED)
184
188
  and judge each assertion with a skeptical LLM-as-judge: `evals/workflow-runner.mjs`
185
189
  (in-session, no API key) and `evals/run.py` (CI regression gate, wired into
186
- `.github/workflows/skill-evals.yml`). Full guide in **[EVALS.md](docs/EVALS.md)**.
190
+ `.github/workflows/skill-evals.yml`). The GREEN arm reads the skill *and* the
191
+ `references/`/`templates/` files it links to, so improving a reference file moves the
192
+ score. The first runner writes `evals/baseline.json`; the second gates against it.
193
+ Full guide in **[EVALS.md](docs/EVALS.md)**.
187
194
 
188
195
  ## Contributing
189
196
 
package/VERSION CHANGED
@@ -1 +1 @@
1
- 0.7.0
1
+ 0.8.1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "swe-workflow-skills",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "A curated library of Claude Code Agent Skills covering the full software lifecycle, with orchestrator-routed activation that scales past the skill-listing budget.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -118,6 +118,7 @@ Automated testing catches ~30% of accessibility issues. Manual testing catches t
118
118
  - [ ] Test at 200% zoom — no horizontal scroll, no overlapping text
119
119
  - [ ] Verify all form fields have associated labels
120
120
  - [ ] Verify error messages are announced to screen readers
121
+ - [ ] Submit an invalid form: focus must move to the first error (or an error summary), not stay on the submit button
121
122
 
122
123
  ## Principles Applied
123
124
 
@@ -4,9 +4,9 @@
4
4
  {
5
5
  "id": 1,
6
6
  "prompt": "I'm building a modal dialog component in React for confirming destructive actions (like deleting a project). Make it accessible.",
7
- "expected_output": "Should implement the full accessible modal pattern: role=dialog, aria-modal, focus trap, Escape to close, focus restoration, background inert, and proper labeling.",
7
+ "expected_output": "Should implement the full accessible modal pattern: role=dialog, aria-modal, focus trap, Escape to close, focus restoration, background inert, and proper labeling. Assertion #0 was reworded 2026-08-28: it named only the ARIA attributes, and at k=5 all 10 generations across both arms built the modal on native <dialog> + showModal(), which supplies modality implicitly (one deliberately chose role='alertdialog' and defended it). The judge's own words were 'modality is left implicit via native showModal()'. The assertion had aged out of correct practice; it now accepts either route to the same semantics.",
8
8
  "assertions": [
9
- "Uses role='dialog' and aria-modal='true'",
9
+ "Establishes dialog semantics and modality — native <dialog> with showModal(), or role='dialog'/'alertdialog' with aria-modal='true'",
10
10
  "Labels the dialog with aria-labelledby pointing to the title",
11
11
  "Implements focus trap (Tab cycles within modal)",
12
12
  "Moves focus to the first focusable element on open",
@@ -20,11 +20,11 @@
20
20
  {
21
21
  "id": 2,
22
22
  "prompt": "Audit this React component for accessibility issues:\n\n<div className=\"card\" onClick={() => navigate(`/project/${id}`)}>\n <div className=\"title\">{name}</div>\n <img src={thumbnail} />\n <div className=\"badge\" style={{color: status === 'active' ? 'green' : 'red'}}>\n {status}\n </div>\n <div className=\"actions\">\n <div className=\"btn\" onClick={(e) => { e.stopPropagation(); onDelete(id); }}>\n 🗑️\n </div>\n </div>\n</div>",
23
- "expected_output": "Should identify all accessibility issues: clickable div instead of link/button, missing alt on img, color-only status indicator, icon button without label, no keyboard support.",
23
+ "expected_output": "Should identify all accessibility issues: clickable div instead of link/button, missing alt on img, color-only status indicator, icon button without label, no keyboard support. Assertion #2 was reworded 2026-08-28: it asserted a color-ONLY indicator, which this fixture does not contain — the badge renders {status} as text, so color is redundant reinforcement and WCAG 1.4.1 is not violated. At k=5, 7 of 10 judges recorded the reply correctly ruling 1.4.1 out and flagging 1.4.3 contrast instead; the assertion was punishing the right answer. It now targets the failure the fixture really has.",
24
24
  "assertions": [
25
25
  "Identifies clickable div should be an <a> or <Link> (for navigation)",
26
26
  "Identifies missing alt attribute on the image",
27
- "Identifies color-only status indicator (green/red without text or icon)",
27
+ "Identifies the hard-coded inline red/green status color as a problem — contrast, loss under forced-colors/high-contrast modes, or red/green being the worst pair for color-blind users",
28
28
  "Identifies delete button as a div — should be <button>",
29
29
  "Identifies emoji icon without accessible label (aria-label needed)",
30
30
  "Notes that div+onClick has no keyboard support (no Enter/Space handling)",
@@ -130,6 +130,40 @@ Key: `aria-invalid` tells screen readers the field has an error. `aria-described
130
130
 
131
131
  The `*` is visual-only (`aria-hidden`). `aria-required` is the programmatic indicator.
132
132
 
133
+ ### Errors on submit
134
+ Validation that fails on submit must move focus. Leaving focus on the submit button strands
135
+ keyboard and screen reader users — the errors are below or above them and they are never told.
136
+
137
+ **Short forms — focus the first invalid field:**
138
+ ```jsx
139
+ const onSubmit = (e) => {
140
+ e.preventDefault()
141
+ const errors = validate(values)
142
+ if (Object.keys(errors).length) {
143
+ setErrors(errors)
144
+ refs[Object.keys(errors)[0]].current?.focus() // first field IN DOM ORDER
145
+ return
146
+ }
147
+ save(values)
148
+ }
149
+ ```
150
+
151
+ **Long forms — focus an error summary:**
152
+ ```jsx
153
+ <div ref={summaryRef} tabIndex={-1} role="alert">
154
+ <h2>3 errors need fixing</h2>
155
+ <ul>
156
+ <li><a href="#email">Email address is not valid</a></li>
157
+ </ul>
158
+ </div>
159
+ ```
160
+ Move focus to the summary container on failed submit; each item links to its field's `id`, so
161
+ the user can jump straight to it.
162
+
163
+ Key: a failed submit must land focus somewhere the user can act on — the first invalid field
164
+ or an error summary — never on the submit button. Order errors by DOM position, not by the
165
+ order your validator happened to produce them.
166
+
133
167
  ### Form submission feedback
134
168
  ```html
135
169
  <!-- Status region for form-level messages -->
@@ -12,6 +12,22 @@ Design APIs that are consistent, predictable, and easy to consume. A well-design
12
12
 
13
13
  This skill designs the **contract** (endpoints, request/response shapes, error formats, pagination). For higher-level decisions (REST vs GraphQL, API gateway, authentication strategy), use the `architecture-design` skill first, then return here to design the specifics.
14
14
 
15
+ ## The Deliverable
16
+
17
+ An API design is not finished until it carries **all six** of these. A list of endpoints is a
18
+ third of an answer:
19
+
20
+ 1. **Resources and endpoints** — URLs, methods, and how relationships are expressed
21
+ 2. **Request/response schemas** — field names, types, and the response envelope
22
+ 3. **The error format** — one shape for every error, plus the status-code mapping
23
+ 4. **The pagination contract** — parameters and response shape for every list endpoint
24
+ 5. **Auth per endpoint** — scheme, who may call it, and which endpoints are public
25
+ 6. **The written spec** — markdown or OpenAPI, using [templates/api-spec.md](templates/api-spec.md)
26
+
27
+ Deliver all six **in the same response**. Where a choice is genuinely open, pick the default
28
+ this skill recommends, say you picked it, and keep going — never return a design as a list of
29
+ questions.
30
+
15
31
  ## Workflow
16
32
 
17
33
  ### Step 1: Identify Resources and Operations
@@ -45,7 +61,7 @@ POST /api/v1/orders/:id/cancel → Cancel an order
45
61
  POST /api/v1/users/:id/verify → Verify a user's email
46
62
  ```
47
63
 
48
- Present the endpoint list to the user and refine before designing schemas.
64
+ Present the endpoint list, then **design the schemas in the same response** — the list is a checkpoint, not a stopping point. Invite correction on the naming while delivering the rest.
49
65
 
50
66
  ### Step 3: Define Request/Response Schemas
51
67
 
@@ -57,11 +73,12 @@ For each endpoint, define:
57
73
 
58
74
  Use consistent patterns across all endpoints — see [references/rest-conventions.md](references/rest-conventions.md) for standard shapes.
59
75
 
60
- Key decisions to make with the user:
61
- - **ID format**: Integer, UUID, or ULID? (be consistent)
62
- - **Date format**: ISO 8601 always (`2025-03-05T14:30:00Z`)
63
- - **Null vs absent**: Are missing fields returned as `null` or omitted?
64
- - **Envelope or not**: `{ data: [...], meta: {...} }` vs flat response?
76
+ Decisions to make **now**, with a stated default rather than a question — flag them for
77
+ correction and move on:
78
+ - **ID format**: default ULID (sortable, no coordination); integer or UUID if the stack forces it
79
+ - **Date format**: ISO 8601 always (`2025-03-05T14:30:00Z`) — not a decision
80
+ - **Null vs absent**: default omit absent fields, return `null` only for a known-empty value
81
+ - **Envelope or not**: default `{ data, pagination }` on collections, flat on single resources
65
82
 
66
83
  ### Step 4: Standardize Error Responses
67
84
 
@@ -139,5 +156,5 @@ Use the template at [templates/api-spec.md](templates/api-spec.md) for markdown
139
156
 
140
157
  - **KISS**: Prefer flat resource URLs over deeply nested ones. `/orders?user_id=123` is simpler than `/users/123/orders/456/items/789`.
141
158
  - **DRY**: Standardize error format, pagination, and envelope structure once. Don't reinvent per-endpoint.
142
- - **YAGNI**: Don't add filtering, sorting, or pagination until a list endpoint actually needs them. Add later when the need is real.
159
+ - **YAGNI**: Don't add filtering or sorting until a list endpoint actually needs them. Pagination is not in this category — any collection that can grow ships with the pagination contract from day one, because adding it later is a breaking change for every consumer.
143
160
  - **Functional Independence**: Each endpoint should do one thing. Avoid "Swiss army knife" endpoints that change behavior based on query parameters.
@@ -4,23 +4,22 @@
4
4
  {
5
5
  "id": 1,
6
6
  "prompt": "We're building a SaaS platform and need to decide whether to use a multi-tenant single database or database-per-tenant approach. We have about 50 customers now, expecting 500 in a year. It's a Django app on PostgreSQL. Some customers are enterprise with strict data isolation requirements.",
7
- "expected_output": "A structured analysis with at least 3 options (shared DB with row-level security, schema-per-tenant, DB-per-tenant), trade-off analysis against quality attributes, a clear recommendation with rationale, and an ADR document.",
7
+ "expected_output": "A structured analysis with at least 3 options (shared DB with row-level security, schema-per-tenant, DB-per-tenant), trade-off analysis against quality attributes, a clear recommendation with rationale, and an ADR document. NOTE: an assertion requiring the ADR to be 'saved to the filesystem' was removed — both eval arms generate a reply and cannot write files, so it could never pass and contributed no gate signal. Verify ADR file creation in a real session instead.",
8
8
  "assertions": [
9
9
  "Presents at least 3 distinct options",
10
10
  "Analyzes trade-offs for each option (not just pros/cons lists)",
11
11
  "Considers the enterprise data isolation requirement explicitly",
12
12
  "Applies KISS and YAGNI (doesn't over-engineer for 500 customers)",
13
13
  "Makes a clear recommendation with primary reason stated",
14
- "Includes revisit triggers for when to reconsider",
15
- "Produces an ADR document saved to the filesystem"
14
+ "Includes revisit triggers for when to reconsider"
16
15
  ]
17
16
  },
18
17
  {
19
18
  "id": 2,
20
19
  "prompt": "should we use graphql or rest for our new api? we're a team of 3",
21
- "expected_output": "Should ask clarifying questions first (what kind of clients, data complexity, team's GraphQL experience), then produce a balanced analysis that considers team size heavily.",
20
+ "expected_output": "Should ask clarifying questions first (what kind of clients, data complexity, team's GraphQL experience), then produce a balanced analysis that considers team size heavily. NOTE: assertion #0 previously read 'Asks clarifying questions before recommending', which asserted exactly the withholding Step 0's delivery clause forbids ('Never answer a design question with inventory and questions alone'). RED passed it and GREEN failed it \u2014 the eval was penalizing the skill's intended behavior.",
22
21
  "assertions": [
23
- "Asks clarifying questions before recommending",
22
+ "Names the open questions (client types, data complexity, GraphQL experience) while still delivering a recommendation in the same reply",
24
23
  "Considers team size (3 devs) as a major constraint",
25
24
  "Applies KISS principle favoring simplicity for small team",
26
25
  "Does not present a straw-man option",
@@ -1,44 +1,47 @@
1
- [
2
- {
3
- "name": "Microservices architecture documentation from scratch",
4
- "description": "Happy path: documenting a moderately complex distributed system for new hires",
5
- "prompt": "We have a system with 8 microservices: a React frontend, a BFF API gateway, a user service, an order service, a payment service, a notification service, a search service, and a recommendation engine. We use PostgreSQL, Redis, RabbitMQ, and Elasticsearch. Everything runs on Kubernetes. We have no architecture diagrams and need to document this for new hires joining next month.",
6
- "assertions": [
7
- "Recommends starting with a system context diagram showing the system, users, and external dependencies",
8
- "Identifies that all three abstraction levels are appropriate for this complexity",
9
- "Prioritizes canonical and conceptual levels for the onboarding use case",
10
- "Proposes a repository structure for organizing diagrams",
11
- "Establishes or recommends a glossary with consistent naming for all 8 services",
12
- "Suggests specific tooling appropriate for each level",
13
- "Does not try to create all diagrams at once — suggests a phased approach",
14
- "Produces at least a system context diagram as the first deliverable"
15
- ]
16
- },
17
- {
18
- "name": "Over-documentation for simple system",
19
- "description": "Edge case: pushing back on unnecessary documentation complexity",
20
- "prompt": "I have a simple CRUD application — Express.js backend, PostgreSQL database, deployed on a single EC2 instance behind nginx. My manager read about C4 and wants me to create all four C4 levels plus deployment diagrams plus data flow diagrams. Can you help me set this up?",
21
- "assertions": [
22
- "Pushes back on creating all four C4 levels for a simple monolith",
23
- "Applies YAGNI — recommends only the diagrams that add value for this system's complexity",
24
- "Recommends at most a system context and a single container diagram",
25
- "Explains that Code-level C4 diagrams are almost never worth maintaining manually",
26
- "Does not refuse the request entirely — provides a pragmatic subset",
27
- "Suggests conceptual-level documentation may be sufficient for this system",
28
- "Explains what would trigger the need for more detailed documentation in the future"
29
- ]
30
- },
31
- {
32
- "name": "Architecture decision vs architecture documentation",
33
- "description": "Scope boundary: separating decision-making from documentation",
34
- "prompt": "We're debating whether to extract our authentication logic into a separate service or keep it in the monolith. Can you also create architecture diagrams showing what the system would look like after the split?",
35
- "assertions": [
36
- "Recognizes the decision-making aspect and defers to the architecture-design skill for the ADR",
37
- "Does not make the architectural decision within this skill's workflow",
38
- "Offers to diagram the proposed architecture as a conceptual or draft diagram to support the decision",
39
- "Clearly separates the decision process from the documentation process",
40
- "If diagramming the proposed state, labels it as non-canonical since the decision hasn't been made yet",
41
- "Suggests that canonical diagrams should only be updated after the decision is accepted"
42
- ]
43
- }
44
- ]
1
+ {
2
+ "skill_name": "architecture-documentation",
3
+ "evals": [
4
+ {
5
+ "id": 1,
6
+ "prompt": "We have a system with 8 microservices: a React frontend, a BFF API gateway, a user service, an order service, a payment service, a notification service, a search service, and a recommendation engine. We use PostgreSQL, Redis, RabbitMQ, and Elasticsearch. Everything runs on Kubernetes. We have no architecture diagrams and need to document this for new hires joining next month.",
7
+ "expected_output": "Happy path — documenting a moderately complex distributed system for new hires. Should start from a system context diagram, judge which abstraction levels this complexity warrants, propose a repository structure and a glossary covering all 8 services, and phase the work rather than producing every diagram at once.",
8
+ "assertions": [
9
+ "Recommends starting with a system context diagram showing the system, users, and external dependencies",
10
+ "Identifies that all three abstraction levels are appropriate for this complexity",
11
+ "Prioritizes canonical and conceptual levels for the onboarding use case",
12
+ "Proposes a repository structure for organizing diagrams",
13
+ "Establishes or recommends a glossary with consistent naming for all 8 services",
14
+ "Suggests specific tooling appropriate for each level",
15
+ "Does not try to create all diagrams at once — suggests a phased approach",
16
+ "Produces at least a system context diagram as the first deliverable"
17
+ ]
18
+ },
19
+ {
20
+ "id": 2,
21
+ "prompt": "I have a simple CRUD application — Express.js backend, PostgreSQL database, deployed on a single EC2 instance behind nginx. My manager read about C4 and wants me to create all four C4 levels plus deployment diagrams plus data flow diagrams. Can you help me set this up?",
22
+ "expected_output": "Edge case — pushing back on unnecessary documentation complexity. Should apply YAGNI and recommend only the diagrams that earn their maintenance for a simple monolith, without refusing the request outright, and name what would later justify more detail.",
23
+ "assertions": [
24
+ "Pushes back on creating all four C4 levels for a simple monolith",
25
+ "Applies YAGNI — recommends only the diagrams that add value for this system's complexity",
26
+ "Recommends at most a system context and a single container diagram",
27
+ "Explains that Code-level C4 diagrams are almost never worth maintaining manually",
28
+ "Does not refuse the request entirely — provides a pragmatic subset",
29
+ "Suggests conceptual-level documentation may be sufficient for this system",
30
+ "Explains what would trigger the need for more detailed documentation in the future"
31
+ ]
32
+ },
33
+ {
34
+ "id": 3,
35
+ "prompt": "We're debating whether to extract our authentication logic into a separate service or keep it in the monolith. Can you also create architecture diagrams showing what the system would look like after the split?",
36
+ "expected_output": "Scope boundary — separating decision-making from documentation. Should defer the extract-or-keep decision to architecture-design for an ADR, while offering to diagram the proposed state as explicitly non-canonical until the decision is accepted.",
37
+ "assertions": [
38
+ "Recognizes the decision-making aspect and defers to the architecture-design skill for the ADR",
39
+ "Does not make the architectural decision within this skill's workflow",
40
+ "Offers to diagram the proposed architecture as a conceptual or draft diagram to support the decision",
41
+ "Clearly separates the decision process from the documentation process",
42
+ "If diagramming the proposed state, labels it as non-canonical since the decision hasn't been made yet",
43
+ "Suggests that canonical diagrams should only be updated after the decision is accepted"
44
+ ]
45
+ }
46
+ ]
47
+ }
@@ -45,6 +45,7 @@ Write the pipeline config for the target platform. Use [templates/github-actions
45
45
 
46
46
  Key best practices:
47
47
  - **Cache dependencies** — Cache node_modules, pip packages, Go modules between runs
48
+ - **Build images multi-stage, with layer caching** — a build stage that compiles and a slim runtime stage that carries only the artifact, plus `buildx` with `cache-from`/`cache-to: type=gha` so layers survive between runs. Dependency caching (above) does not cover the image build. Recipe: [references/pipeline-patterns.md](references/pipeline-patterns.md)
48
49
  - **Pin action/image versions** — Use SHA hashes or exact tags, not `@latest` or `@main`
49
50
  - **Minimize secrets scope** — Only expose secrets to the jobs that need them
50
51
  - **Use matrix builds** — Test across Node versions, OS variants, or Python versions when applicable
@@ -83,5 +84,6 @@ Quality gates prevent bad code from advancing:
83
84
  - `gitops-delivery` — pull-based delivery as an alternative to CI-driven `kubectl apply` / `helm upgrade`
84
85
  - `deployment-checklist` — pre-deployment verification gates to incorporate into the pipeline
85
86
  - `release-management` — the release stage itself: version bumps, changelog, tagging, publish gates, registry publishing (the pipeline automates what that skill decides)
87
+ - `containerization` — the Dockerfile itself (multi-stage layout, base image, non-root user, image hardening); this skill orchestrates the build, that one designs what is built
86
88
  - `security-audit` — security scanning stages and SAST/DAST integration
87
89
  - `verification-before-completion` — run the proving commands locally before relying on the pipeline to catch failures
@@ -4,12 +4,13 @@
4
4
  {
5
5
  "id": 1,
6
6
  "prompt": "Set up a GitHub Actions CI/CD pipeline for our TypeScript Express API. We use PostgreSQL, run tests with Jest, build a Docker image, and deploy to AWS ECS. We want PR checks and auto-deploy to staging on merge to main, with manual approval for production.",
7
- "expected_output": "Should produce a complete GitHub Actions workflow with lint, test (with Postgres service), build Docker image, deploy to staging, and gated production deploy.",
7
+ "expected_output": "Should produce a complete GitHub Actions workflow with lint, test (with Postgres service), build Docker image, deploy to staging, and gated production deploy. Multi-stage and image-layer caching are asserted separately: they are independent behaviors and a compound assertion hid that the model reliably produces the first and often omits the second.",
8
8
  "assertions": [
9
9
  "Lint and test run in parallel",
10
10
  "PostgreSQL service container configured with health check",
11
11
  "Dependencies are cached",
12
- "Docker build uses multi-stage and caching",
12
+ "Docker build uses a multi-stage Dockerfile (a build stage that compiles, a slim runtime stage carrying only the artifact)",
13
+ "Docker image layers are cached across runs (buildx cache-from/cache-to, or an equivalent registry/gha layer cache)",
13
14
  "Staging deploys automatically on main push",
14
15
  "Production deploy requires manual approval (environment protection)",
15
16
  "Smoke test after each deployment",
@@ -29,6 +30,19 @@
29
30
  "Recommends concurrency control to cancel outdated runs",
30
31
  "Provides a restructured pipeline diagram"
31
32
  ]
33
+ },
34
+ {
35
+ "id": 3,
36
+ "prompt": "The pipeline itself is fine. What I actually need is to work out what version number each release gets, what goes in the changelog, and when we're allowed to publish to npm. Can you just build all that into the workflow file?",
37
+ "expected_output": "Scope boundary — versioning policy, changelog content, and publish gates are release-management decisions; this skill automates them once decided. Should route the decision to release-management and offer to wire the resulting policy in as pipeline stages, without inventing a semver scheme itself.",
38
+ "assertions": [
39
+ "Recognizes that semver policy, changelog content, and publish gating are release-management concerns",
40
+ "Hands off to or invokes the release-management skill for those decisions",
41
+ "Distinguishes deciding the release policy from automating it in the pipeline",
42
+ "Offers to implement the policy as pipeline stages once it is decided",
43
+ "Does not invent a versioning scheme or changelog format inside the CI workflow",
44
+ "Does not respond by producing another full CI/CD pipeline from scratch"
45
+ ]
32
46
  }
33
47
  ]
34
48
  }
@@ -31,6 +31,18 @@
31
31
  "Recommends adding HEALTHCHECK",
32
32
  "Provides a corrected Dockerfile"
33
33
  ]
34
+ },
35
+ {
36
+ "id": 3,
37
+ "prompt": "The image builds fine now. Next step: provision the EKS cluster, the VPC with private subnets, the RDS instance and the ECR repository on AWS. Write me the Terraform for all of it.",
38
+ "expected_output": "Scope boundary — provisioning cloud infrastructure is infrastructure-as-code territory, not containerization. Should hand off rather than writing Terraform modules here, while staying useful about the container-side artifacts that will run on that cluster.",
39
+ "assertions": [
40
+ "Recognizes that provisioning EKS/VPC/RDS/ECR is infrastructure-as-code work, not containerization",
41
+ "Hands off to or invokes the infrastructure-as-code skill",
42
+ "Does not write the Terraform modules as part of the containerization workflow",
43
+ "Distinguishes authoring images and Kubernetes manifests from provisioning the platform they run on",
44
+ "Remains useful by offering the container-side artifacts (manifests, image build) that pair with the provisioned cluster"
45
+ ]
34
46
  }
35
47
  ]
36
48
  }
@@ -8,6 +8,27 @@ allowed-tools: Read, Grep, Glob, Write, Edit
8
8
 
9
9
  Understand what will break before breaking it. Changing a shared component without mapping its dependents leads to cascading failures — often discovered in production.
10
10
 
11
+ ## Scope Boundary
12
+
13
+ This skill maps the blast radius of a **specific, already-decided change to something that
14
+ already exists**. It does not decide what to build or how to build it.
15
+
16
+ Out of scope — hand these off and stop:
17
+
18
+ - *"How do I add authentication / caching / this feature?"* — an implementation question.
19
+ Route to `security-audit` or `api-design`; adding something new to one endpoint has no
20
+ dependents to map.
21
+ - *"Should I use X or Y?"* — a design decision. Route to `architecture-design`.
22
+
23
+ **Declining means producing no analysis, not producing it generically.** When a request is out
24
+ of scope, the failure mode is to say "that's not this skill" and then walk the workflow anyway
25
+ with the specifics left blank — a template that finds dependents, classifies breaking vs
26
+ additive, and lays out an expand-contract plan for an unnamed endpoint. That is the deliverable,
27
+ and emitting it is running the skill, not declining it. Name the right skill, add at most a
28
+ one-sentence impact observation if a genuine breaking change is visible (requiring auth on an
29
+ endpoint that already has callers is one), and stop. If the change turns out to be in scope
30
+ after all, ask for the component by name first and run the workflow on the real thing.
31
+
11
32
  ## Step 1: Define the Change
12
33
 
13
34
  Be precise about what is changing:
@@ -105,7 +126,7 @@ For each breaking change, define the coordination plan:
105
126
 
106
127
  ## Cross-Skill References
107
128
 
108
- - `api-design` — design the new API contract after impact is understood
129
+ - `api-design` — **the right owner when the request is to design or add an endpoint at all**; also where to design the new contract once an impact map exists. Do not require the analysis first — a question about building something new goes straight here.
109
130
  - `feature-planning` — incorporate the dependency coordination into the implementation plan
110
131
  - `architecture-design` — if analysis reveals excessive coupling, document an ADR for reducing it
111
132
  - `data-modeling` — use for schema change design once impact is mapped
@@ -55,6 +55,11 @@ Walk through each section. Check items by reading code, running commands, and ve
55
55
  - [ ] No destructive operations without confirmation (DROP, DELETE without WHERE)
56
56
  - [ ] Backfill scripts are idempotent (safe to run multiple times)
57
57
 
58
+ This checklist **verifies** a migration; it does not design one. When a box above fails —
59
+ a rename with no forwards-compatible path, an irreversible migration, a change that cannot
60
+ be split across deploys — the answer is an expand-contract migration strategy, and that is
61
+ `data-modeling`'s work. Say so rather than green-lighting a redesign from the checklist.
62
+
58
63
  #### Configuration & Environment
59
64
  - [ ] New environment variables are documented and set in all target environments
60
65
  - [ ] Feature flags are in the correct state for this release
@@ -125,6 +130,7 @@ See [references/pre-deploy-gates.md](references/pre-deploy-gates.md) for environ
125
130
 
126
131
  ## Cross-Skill References
127
132
 
133
+ - `data-modeling` — **name this handoff whenever a migration fails a Database & Data box.** This skill decides whether a migration is safe to ship; that one designs the expand-contract sequence (add, backfill, dual-write, cut over, drop) that makes it safe.
128
134
  - `release-management` — cutting the versioned release (semver, changelog, tag, publish) that this checklist deploys
129
135
  - `rollback-strategy` — design the rollback plan before deploying (required for High-risk changes)
130
136
  - `configuration-strategy` — verify all environment variables and feature flags are configured correctly
@@ -46,11 +46,11 @@
46
46
  "id": 1,
47
47
  "prompt": "It's a one-line copy change and CI was green yesterday. I'm checking every box as done and deploying right now.",
48
48
  "pressure": ["time", "sunk_cost"],
49
- "expected_behavior": "Holds the Iron Law: don't check a box you haven't verified. Treats yesterday's CI as stale, re-runs at least the minimum gates against the current commit, and refuses to rubber-stamp the checklist from memory.",
49
+ "expected_behavior": "Holds the Iron Law: don't check a box you haven't verified. Treats yesterday's CI as stale, re-runs at least the minimum gates against the current commit, and refuses to rubber-stamp the checklist from memory. NOTE: assertions #1 and #2 previously read 'Re-runs verification against the exact current commit' and 'Runs at least the four-item minimum'. Both required an executed command, which neither eval arm can do (docs/EVALS.md limitation 4), so they failed permanently and contributed no gate signal. They now test that the skill NAMES the check; that it is actually run is verified in a real session.",
50
50
  "assertions": [
51
51
  "Does NOT accept boxes checked from memory or from yesterday's CI",
52
- "Re-runs verification against the exact current commit",
53
- "Runs at least the four-item minimum",
52
+ "Names the verification it would re-run against the exact current commit (not yesterday's CI)",
53
+ "Names the four-item minimum and that it must be run before any box is checked",
54
54
  "Does not rubber-stamp on 'it's only one line'"
55
55
  ]
56
56
  }
@@ -180,6 +180,7 @@ Verify the full lifecycle works:
180
180
 
181
181
  ## Cross-Skill References
182
182
 
183
+ - `test-data-strategy` — **name this handoff whenever the question is how to write the contract tests**, not which versions to pin. This skill decides the compatibility matrix and the promotion gate; that one owns the Pact consumer/provider recipes, fixtures, and broker wiring that fill it in.
183
184
  - `gitops-delivery` — automate delivery from the deployment repo using ArgoCD/Flux and cross-repo triggers
184
185
  - `containerization` — Helm chart structure, Kustomize overlays, and Dockerfile patterns for services
185
186
  - `infrastructure-as-code` — Terraform modules for shared infrastructure in the deployment repo
@@ -32,11 +32,11 @@
32
32
  {
33
33
  "id": 3,
34
34
  "prompt": "How do I write Pact contract tests between my frontend and backend API?",
35
- "expected_output": "Should recognize this as a contract testing question that overlaps with but is not the core of the deployment-repo skill. Should provide brief context on how contract tests fit into the deployment repo pattern, then redirect to test-suite-design for implementation details.",
35
+ "expected_output": "Should recognize this as a contract testing question that overlaps with but is not the core of the deployment-repo skill. Should give brief context on how contract tests fit the deployment repo pattern (they validate that pinned versions are compatible), then redirect to the library's contract-testing owner for the Pact implementation detail, rather than becoming a Pact tutorial itself.",
36
36
  "assertions": [
37
37
  "Recognizes this is primarily a testing question, not a deployment repo design question",
38
38
  "Provides brief context on how contract tests relate to the deployment repo (they validate version compatibility)",
39
- "References test-suite-design for detailed contract test implementation guidance",
39
+ "References the library's contract-testing skill (test-data-strategy) for detailed Pact implementation guidance",
40
40
  "Does not attempt to be a full Pact tutorial within the deployment-repo skill"
41
41
  ]
42
42
  }
@@ -27,6 +27,19 @@
27
27
  "Recommends a technical spike before committing to precise numbers",
28
28
  "Does NOT produce a precise single-number estimate for 6 months of unknown work"
29
29
  ]
30
+ },
31
+ {
32
+ "id": 3,
33
+ "prompt": "Give me story points for the new billing feature. I don't have it broken down yet — there's just the one-line ask from the customer. Just point it so I can put it in the sprint.",
34
+ "expected_output": "Scope boundary — there is nothing to estimate yet. Should route the breakdown to feature-planning, explain that a point estimate on an undecomposed one-line ask is a guess dressed as data, and offer to estimate once tasks and acceptance criteria exist.",
35
+ "assertions": [
36
+ "Identifies that no breakdown exists yet, so there is nothing meaningful to estimate",
37
+ "Hands off to or invokes the feature-planning skill to decompose the work first",
38
+ "Does not emit a story-point number for the undecomposed one-line request",
39
+ "Explains that estimating requires tasks and acceptance criteria to size against",
40
+ "Offers to run the estimation workflow once the breakdown exists",
41
+ "Does not simply refuse — gives the user a concrete next step"
42
+ ]
30
43
  }
31
44
  ]
32
45
  }
@@ -19,8 +19,31 @@ Ask clarifying questions to close knowledge gaps. Focus on:
19
19
  - **What exists today?** (current behavior, workarounds)
20
20
  - **What are the constraints?** (timeline, tech stack, backwards compatibility)
21
21
  - **What's out of scope?** (explicitly define boundaries)
22
+ - **How will we know it works?** (what verification and test coverage this needs)
22
23
 
23
- If the user provides a vague request like "add authentication", ask about specifics: what auth methods, what protected resources, what user roles. Don't proceed with assumptions.
24
+ **This step is not a gate on delivering.** Whether you draft now or ask first is
25
+ a condition, not a preference. Apply this test:
26
+
27
+ > Can you write at least one Given/When/Then acceptance criterion **without
28
+ > inventing the feature's core behavior?**
29
+
30
+ - **Yes → draft now.** The remaining unknowns are assumptions, not blockers:
31
+ state them and carry the full plan **in the same response**. A draft the user
32
+ corrects beats a question they must answer. ("Email and in-app notifications
33
+ when someone comments on their posts" passes — the behavior is given.)
34
+ - **No → ask first**, and say what you'd need to start drafting. A named stack
35
+ plus a feature label is not enough on its own: "add dark mode to our Vue app"
36
+ and "add authentication" both fail the test, because the core behavior
37
+ (persistence? system-preference default? which auth methods, which protected
38
+ resources, which roles?) would have to be invented rather than planned.
39
+
40
+ **Exit condition for the draft branch** — one line, then keep going in the same
41
+ response: *"Planning under these assumptions: `<…>` — correct any and I'll
42
+ revise."*
43
+
44
+ Never answer a planning request with questions alone when the draft branch
45
+ applies. Unanswered questions belong in Step 5's open-questions list, not in
46
+ place of the plan.
24
47
 
25
48
  ### Step 2: Define Acceptance Criteria
26
49
 
@@ -38,7 +61,7 @@ Aim for 3-7 acceptance criteria per feature. Each criterion should be independen
38
61
 
39
62
  Decompose the feature into implementation tasks. Each task should:
40
63
 
41
- - Be completable in one focused session (roughly 1-4 hours of work)
64
+ - Be completable in one focused session (roughly 1-4 hours of work) — state each task's estimate on the task itself, so granularity is visible rather than asserted
42
65
  - Have a single clear deliverable (a file, a test, a migration, etc.)
43
66
  - Follow dependency order (what must exist before this task can start)
44
67
  - Be independently verifiable
@@ -67,7 +90,7 @@ For each risk, suggest a mitigation strategy or a spike task to reduce uncertain
67
90
 
68
91
  ### Step 6: Produce the Plan
69
92
 
70
- Output the complete plan using the template at [templates/plan.md](templates/plan.md). Save it as a markdown file in the project (e.g., `docs/plans/feature-name.md`).
93
+ Output the complete plan using the template at [templates/plan.md](templates/plan.md) — in the reply itself, not as a promise to produce one. Offer to save it as a markdown file in the project (e.g., `docs/plans/feature-name.md`); saving is a convenience, not the deliverable.
71
94
 
72
95
  ## Principles Applied
73
96
 
@@ -4,27 +4,25 @@
4
4
  {
5
5
  "id": 1,
6
6
  "prompt": "I need to add a notification system to our app. Users should get email and in-app notifications when someone comments on their posts. We're using a Node.js/Express backend with PostgreSQL and a React frontend. Can you help me plan this out?",
7
- "expected_output": "A structured plan with clarifying questions asked first, acceptance criteria in Given/When/Then format, 5-10 granular tasks with dependencies, risk identification, and a saved markdown plan file.",
7
+ "expected_output": "This prompt names the stack, the user, and the target behavior, so Step 1's draft branch applies: the reply states its open questions AND carries the full plan in the same response — acceptance criteria in Given/When/Then format, 5-10 granular tasks with dependencies, and risk identification. NOTE 1: an assertion requiring the plan to be saved as a markdown file was removed — both eval arms generate a reply and cannot write files, so it could never pass and contributed no gate signal. Verify file creation in a real session instead. NOTE 2: the first assertion previously read 'Asks clarifying questions before producing the plan', which asserted the withholding this skill's delivery clause exists to prevent; it now tests that the questions are surfaced rather than that the plan is deferred.",
8
8
  "assertions": [
9
- "Asks clarifying questions before producing the plan",
9
+ "Surfaces its open questions or the assumptions it is planning under, rather than silently assuming",
10
10
  "Includes acceptance criteria in Given/When/Then format",
11
11
  "Tasks are granular (1-4 hours each) with clear deliverables",
12
12
  "Dependency map is present showing task ordering",
13
13
  "Risks section identifies at least 2 technical risks",
14
- "Out of scope section explicitly excludes something",
15
- "Saves the plan as a markdown file"
14
+ "Out of scope section explicitly excludes something"
16
15
  ]
17
16
  },
18
17
  {
19
18
  "id": 2,
20
19
  "prompt": "plan adding dark mode to our vue app",
21
- "expected_output": "Should ask clarifying questions first (CSS variables vs theme library? System preference detection? Per-component or global? Persistence?), then produce a structured plan after getting answers.",
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.",
22
21
  "assertions": [
23
22
  "Does not immediately produce a plan from this vague request",
24
23
  "Asks at least 3 clarifying questions",
25
24
  "Applies YAGNI by not over-engineering the approach",
26
- "Tasks include both implementation and testing",
27
- "Acceptance criteria are independently testable"
25
+ "Names what it would need in order to start drafting the plan"
28
26
  ]
29
27
  },
30
28
  {