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.
- package/README.md +11 -4
- package/VERSION +1 -1
- package/package.json +1 -1
- package/skills/accessibility-design/SKILL.md +1 -0
- package/skills/accessibility-design/evals/evals.json +4 -4
- package/skills/accessibility-design/references/accessibility-patterns.md +34 -0
- package/skills/api-design/SKILL.md +24 -7
- package/skills/architecture-design/evals/evals.json +4 -5
- package/skills/architecture-documentation/evals/evals.json +47 -44
- package/skills/cicd-pipeline/SKILL.md +2 -0
- package/skills/cicd-pipeline/evals/evals.json +16 -2
- package/skills/containerization/evals/evals.json +12 -0
- package/skills/dependency-impact-analysis/SKILL.md +22 -1
- package/skills/deployment-checklist/SKILL.md +6 -0
- package/skills/deployment-checklist/evals/evals.json +3 -3
- package/skills/deployment-repo/SKILL.md +1 -0
- package/skills/deployment-repo/evals/evals.json +2 -2
- package/skills/effort-estimation/evals/evals.json +13 -0
- package/skills/feature-planning/SKILL.md +26 -3
- package/skills/feature-planning/evals/evals.json +5 -7
- package/skills/frontend-architecture/evals/evals.json +12 -0
- package/skills/gitops-delivery/SKILL.md +9 -1
- package/skills/infrastructure-as-code/evals/evals.json +12 -0
- package/skills/metrics-and-okrs/evals/evals.json +12 -0
- package/skills/ml-experiment-tracking/evals/evals.json +12 -0
- package/skills/ml-model-deployment/evals/evals.json +12 -0
- package/skills/performance-optimization/evals/evals.json +2 -2
- package/skills/prd-writing/evals/evals.json +13 -0
- package/skills/project-proposal/evals/evals.json +12 -0
- package/skills/release-management/SKILL.md +22 -0
- package/skills/retrospective/evals/evals.json +13 -0
- package/skills/rollback-strategy/evals/evals.json +1 -2
- package/skills/skill-router/SKILL.md +7 -0
- package/skills/skill-router/evals/evals.json +3 -4
- package/skills/strategic-review/evals/evals.json +8 -8
- package/skills/tdd-workflow/SKILL.md +12 -1
- package/skills/test-data-strategy/SKILL.md +14 -0
- package/skills/test-data-strategy/references/data-generation-patterns.md +15 -0
- package/skills/test-suite-design/SKILL.md +27 -1
- package/skills/test-suite-design/evals/evals.json +6 -3
- package/skills/ui-ux-design/SKILL.md +12 -0
- package/skills/ui-ux-design/evals/evals.json +12 -0
- package/skills/verification-before-completion/evals/evals.json +5 -8
- 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.
|
|
42
|
-
|
|
43
|
-
|
|
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`).
|
|
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.
|
|
1
|
+
0.8.1
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "swe-workflow-skills",
|
|
3
|
-
"version": "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
|
-
"
|
|
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
|
|
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
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
- **
|
|
63
|
-
- **
|
|
64
|
-
- **
|
|
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
|
|
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
|
-
"
|
|
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
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
"
|
|
8
|
-
"
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
"
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
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
|
|
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
|
|
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
|
-
"
|
|
53
|
-
"
|
|
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
|
|
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-
|
|
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
|
-
|
|
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).
|
|
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": "
|
|
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
|
-
"
|
|
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": "
|
|
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
|
-
"
|
|
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
|
{
|