skilldrop-cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +413 -0
- package/bin/skilldrop.js +338 -0
- package/model-routing.json +147 -0
- package/package.json +36 -0
- package/packs.json +90 -0
- package/skills/accessibility-audit/SKILL.md +74 -0
- package/skills/accessibility-audit/examples/login-form.md +76 -0
- package/skills/accessibility-audit/manifest.json +11 -0
- package/skills/accessibility-audit/reference.md +69 -0
- package/skills/adr-generator/SKILL.md +49 -0
- package/skills/adr-generator/manifest.json +11 -0
- package/skills/adr-generator/templates/madr.md +56 -0
- package/skills/adr-generator/templates/nygard.md +19 -0
- package/skills/ai-usage-report/SKILL.md +111 -0
- package/skills/ai-usage-report/examples/weekly-engineering-team.md +133 -0
- package/skills/ai-usage-report/manifest.json +11 -0
- package/skills/ai-usage-report/scripts/build_report.py +436 -0
- package/skills/ai-usage-report/templates/report-per-user.md +42 -0
- package/skills/ai-usage-report/templates/report-team-rollup.md +49 -0
- package/skills/ai-usage-report/templates/usage-event-schema.md +76 -0
- package/skills/api-contract-draft/SKILL.md +69 -0
- package/skills/api-contract-draft/manifest.json +11 -0
- package/skills/api-contract-draft/reference.md +73 -0
- package/skills/api-contract-draft/templates/openapi-skeleton.yaml +148 -0
- package/skills/architecture-diagrams/SKILL.md +66 -0
- package/skills/architecture-diagrams/examples/aws-three-tier.md +44 -0
- package/skills/architecture-diagrams/examples/c4-container-saas.md +51 -0
- package/skills/architecture-diagrams/examples/microservices-sequence.md +49 -0
- package/skills/architecture-diagrams/manifest.json +28 -0
- package/skills/architecture-diagrams/templates/c4-container.puml +31 -0
- package/skills/architecture-diagrams/templates/mermaid-aws.md +52 -0
- package/skills/architecture-diagrams/templates/mermaid-flowchart.md +37 -0
- package/skills/architecture-diagrams/templates/mermaid-sequence.md +39 -0
- package/skills/audience-profile/SKILL.md +73 -0
- package/skills/audience-profile/manifest.json +11 -0
- package/skills/audience-profile/reference.md +175 -0
- package/skills/brief-intake/SKILL.md +78 -0
- package/skills/brief-intake/manifest.json +11 -0
- package/skills/brief-intake/templates/brief-adr.md +41 -0
- package/skills/brief-intake/templates/brief-decision-log.md +35 -0
- package/skills/brief-intake/templates/brief-deck.md +43 -0
- package/skills/brief-intake/templates/brief-design-doc.md +48 -0
- package/skills/brief-intake/templates/brief-exec-summary.md +47 -0
- package/skills/brief-intake/templates/brief-generic.md +45 -0
- package/skills/brief-intake/templates/brief-runbook.md +44 -0
- package/skills/brief-intake/templates/brief-tech-comparison.md +38 -0
- package/skills/bug-triage/SKILL.md +67 -0
- package/skills/bug-triage/manifest.json +11 -0
- package/skills/bug-triage/templates/bug-ticket.md +86 -0
- package/skills/business-case/SKILL.md +64 -0
- package/skills/business-case/manifest.json +11 -0
- package/skills/business-case/templates/business-case.md +60 -0
- package/skills/capacity-cost-model/SKILL.md +64 -0
- package/skills/capacity-cost-model/manifest.json +11 -0
- package/skills/capacity-cost-model/reference.md +54 -0
- package/skills/capacity-cost-model/templates/cost-model.md +68 -0
- package/skills/council-review/SKILL.md +106 -0
- package/skills/council-review/examples/redis-cache-decision.md +75 -0
- package/skills/council-review/manifest.json +11 -0
- package/skills/council-review/reference.md +76 -0
- package/skills/council-review/seats/architect.md +29 -0
- package/skills/council-review/seats/bench.md +39 -0
- package/skills/council-review/seats/operator.md +27 -0
- package/skills/council-review/seats/pragmatist.md +29 -0
- package/skills/council-review/seats/security-engineer.md +29 -0
- package/skills/council-review/seats/user-advocate.md +27 -0
- package/skills/council-review/templates/council-review.md +59 -0
- package/skills/data-contract/SKILL.md +67 -0
- package/skills/data-contract/manifest.json +11 -0
- package/skills/data-contract/reference.md +46 -0
- package/skills/data-contract/templates/data-contract.md +69 -0
- package/skills/db-schema-design/SKILL.md +68 -0
- package/skills/db-schema-design/manifest.json +11 -0
- package/skills/db-schema-design/reference.md +56 -0
- package/skills/db-schema-design/templates/schema-design.md +75 -0
- package/skills/decision-log/SKILL.md +67 -0
- package/skills/decision-log/manifest.json +11 -0
- package/skills/deck-builder/SKILL.md +114 -0
- package/skills/deck-builder/examples/exec-board-update.md +108 -0
- package/skills/deck-builder/manifest.json +17 -0
- package/skills/deck-builder/reference.md +92 -0
- package/skills/deck-builder/requirements.txt +1 -0
- package/skills/deck-builder/scripts/build_deck.py +309 -0
- package/skills/deck-builder/templates/deck-spec.json +97 -0
- package/skills/deck-builder/templates/palettes.json +59 -0
- package/skills/design-doc/SKILL.md +49 -0
- package/skills/design-doc/manifest.json +11 -0
- package/skills/design-doc/templates/design-doc.md +98 -0
- package/skills/devils-advocate/SKILL.md +142 -0
- package/skills/devils-advocate/lenses/adversarial-review.md +88 -0
- package/skills/devils-advocate/lenses/edge-cases.md +95 -0
- package/skills/devils-advocate/lenses/future-proofing.md +75 -0
- package/skills/devils-advocate/lenses/test-coverage.md +90 -0
- package/skills/devils-advocate/manifest.json +11 -0
- package/skills/devils-advocate/templates/challenge.md +118 -0
- package/skills/doc-critique/SKILL.md +119 -0
- package/skills/doc-critique/manifest.json +11 -0
- package/skills/doc-critique/rubrics/adr.md +36 -0
- package/skills/doc-critique/rubrics/decision-log.md +39 -0
- package/skills/doc-critique/rubrics/deck.md +45 -0
- package/skills/doc-critique/rubrics/design-doc.md +42 -0
- package/skills/doc-critique/rubrics/exec-summary.md +41 -0
- package/skills/doc-critique/rubrics/generic.md +40 -0
- package/skills/doc-critique/rubrics/runbook.md +42 -0
- package/skills/doc-critique/rubrics/tech-comparison.md +40 -0
- package/skills/doc-critique/templates/critique.md +49 -0
- package/skills/exec-summary/SKILL.md +45 -0
- package/skills/exec-summary/manifest.json +11 -0
- package/skills/exec-summary/templates/exec-summary.md +48 -0
- package/skills/feature-implement-loop/SKILL.md +83 -0
- package/skills/feature-implement-loop/manifest.json +11 -0
- package/skills/figma-diagrams/SKILL.md +85 -0
- package/skills/figma-diagrams/manifest.json +35 -0
- package/skills/figma-diagrams/reference.md +91 -0
- package/skills/figma-diagrams/requirements.txt +1 -0
- package/skills/figma-diagrams/scripts/_figma_client.py +71 -0
- package/skills/figma-diagrams/scripts/frame_to_mermaid.py +102 -0
- package/skills/figma-diagrams/scripts/inspect_file.py +46 -0
- package/skills/figma-diagrams/scripts/list_comments.py +35 -0
- package/skills/figma-diagrams/scripts/post_comment.py +52 -0
- package/skills/figma-diagrams/templates/figjam-import.json +20 -0
- package/skills/guide-builder/SKILL.md +76 -0
- package/skills/guide-builder/examples/local-setup-guide.md +127 -0
- package/skills/guide-builder/manifest.json +11 -0
- package/skills/guide-builder/templates/api-reference.md +120 -0
- package/skills/guide-builder/templates/design-walkthrough.md +72 -0
- package/skills/guide-builder/templates/setup-guide.md +109 -0
- package/skills/incident-comms/SKILL.md +68 -0
- package/skills/incident-comms/manifest.json +11 -0
- package/skills/incident-comms/reference.md +43 -0
- package/skills/incident-comms/templates/messages.md +82 -0
- package/skills/llm-eval-harness/SKILL.md +73 -0
- package/skills/llm-eval-harness/manifest.json +11 -0
- package/skills/llm-eval-harness/reference.md +58 -0
- package/skills/llm-eval-harness/templates/eval-plan.md +63 -0
- package/skills/llm-eval-harness/templates/golden-case.jsonl +5 -0
- package/skills/migration-plan/SKILL.md +68 -0
- package/skills/migration-plan/manifest.json +11 -0
- package/skills/migration-plan/templates/migration-plan.md +68 -0
- package/skills/nfr-spec/SKILL.md +63 -0
- package/skills/nfr-spec/manifest.json +11 -0
- package/skills/nfr-spec/reference.md +74 -0
- package/skills/nfr-spec/templates/nfr-spec.md +56 -0
- package/skills/observability-plan/SKILL.md +70 -0
- package/skills/observability-plan/manifest.json +11 -0
- package/skills/observability-plan/reference.md +67 -0
- package/skills/observability-plan/templates/observability-plan.md +62 -0
- package/skills/okr-cascade/SKILL.md +59 -0
- package/skills/okr-cascade/evals/eval_queries.json +12 -0
- package/skills/okr-cascade/evals/evals.json +28 -0
- package/skills/okr-cascade/manifest.json +11 -0
- package/skills/okr-cascade/templates/okr-cascade.md +46 -0
- package/skills/postmortem-generator/SKILL.md +65 -0
- package/skills/postmortem-generator/manifest.json +11 -0
- package/skills/postmortem-generator/templates/postmortem.md +67 -0
- package/skills/prd-draft/SKILL.md +62 -0
- package/skills/prd-draft/manifest.json +11 -0
- package/skills/prd-draft/templates/prd.md +66 -0
- package/skills/prfaq/SKILL.md +75 -0
- package/skills/prfaq/evals/eval_queries.json +13 -0
- package/skills/prfaq/evals/evals.json +32 -0
- package/skills/prfaq/manifest.json +11 -0
- package/skills/prfaq/templates/prfaq.md +60 -0
- package/skills/release-notes/SKILL.md +61 -0
- package/skills/release-notes/manifest.json +11 -0
- package/skills/release-notes/templates/release-notes.md +83 -0
- package/skills/requirements-interview/SKILL.md +61 -0
- package/skills/requirements-interview/manifest.json +11 -0
- package/skills/requirements-interview/templates/interview-kit.md +63 -0
- package/skills/reverse-architecture/SKILL.md +103 -0
- package/skills/reverse-architecture/manifest.json +11 -0
- package/skills/reverse-architecture/reference.md +150 -0
- package/skills/reverse-architecture/templates/description.md +52 -0
- package/skills/reverse-architecture/templates/extraction.md +55 -0
- package/skills/runbook-generator/SKILL.md +42 -0
- package/skills/runbook-generator/manifest.json +11 -0
- package/skills/runbook-generator/templates/runbook.md +109 -0
- package/skills/slide-outliner/SKILL.md +58 -0
- package/skills/slide-outliner/manifest.json +11 -0
- package/skills/slide-outliner/templates/deck-outline.md +131 -0
- package/skills/sonar-onboard/SKILL.md +170 -0
- package/skills/sonar-onboard/manifest.json +11 -0
- package/skills/sonar-onboard/reference.md +151 -0
- package/skills/sonar-onboard/templates/github-actions-sonar-server.yml.tmpl +50 -0
- package/skills/sonar-onboard/templates/github-actions-sonarcloud.yml.tmpl +53 -0
- package/skills/sonar-onboard/templates/readme-snippet.md +38 -0
- package/skills/sonar-onboard/templates/sonar-project.properties.tmpl +31 -0
- package/skills/sonar-review/SKILL.md +220 -0
- package/skills/sonar-review/lenses/bugs.md +48 -0
- package/skills/sonar-review/lenses/code-smells.md +64 -0
- package/skills/sonar-review/lenses/coverage-and-duplication.md +74 -0
- package/skills/sonar-review/lenses/security-hotspots.md +56 -0
- package/skills/sonar-review/lenses/vulnerabilities.md +52 -0
- package/skills/sonar-review/manifest.json +37 -0
- package/skills/sonar-review/reference.md +167 -0
- package/skills/sonar-review/templates/report.md +84 -0
- package/skills/strategy-analysis/SKILL.md +63 -0
- package/skills/strategy-analysis/evals/eval_queries.json +13 -0
- package/skills/strategy-analysis/evals/evals.json +36 -0
- package/skills/strategy-analysis/manifest.json +11 -0
- package/skills/success-metrics/SKILL.md +63 -0
- package/skills/success-metrics/evals/eval_queries.json +11 -0
- package/skills/success-metrics/evals/evals.json +27 -0
- package/skills/success-metrics/manifest.json +11 -0
- package/skills/success-metrics/templates/metrics-plan.md +55 -0
- package/skills/tech-comparison-matrix/SKILL.md +56 -0
- package/skills/tech-comparison-matrix/manifest.json +11 -0
- package/skills/tech-comparison-matrix/templates/matrix.md +45 -0
- package/skills/test-plan-generator/SKILL.md +59 -0
- package/skills/test-plan-generator/manifest.json +11 -0
- package/skills/test-plan-generator/templates/test-plan.md +83 -0
- package/skills/threat-model/SKILL.md +65 -0
- package/skills/threat-model/examples/document-upload.md +56 -0
- package/skills/threat-model/manifest.json +11 -0
- package/skills/threat-model/reference.md +69 -0
- package/skills/user-journey-map/SKILL.md +64 -0
- package/skills/user-journey-map/evals/eval_queries.json +12 -0
- package/skills/user-journey-map/evals/evals.json +30 -0
- package/skills/user-journey-map/examples/b2b-saas-onboarding.md +69 -0
- package/skills/user-journey-map/manifest.json +11 -0
- package/skills/user-journey-map/templates/journey-map.md +47 -0
- package/skills/user-story-splitter/SKILL.md +88 -0
- package/skills/user-story-splitter/examples/notifications-epic.md +123 -0
- package/skills/user-story-splitter/manifest.json +11 -0
- package/skills/user-story-splitter/templates/story.md +40 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# Brief: Runbook
|
|
2
|
+
|
|
3
|
+
> Target downstream skill: `runbook-generator`
|
|
4
|
+
|
|
5
|
+
## Service
|
|
6
|
+
- **Name:** {service-name} [explicit|implied|inferred|missing]
|
|
7
|
+
- **One-line purpose:** {what it does} [explicit|implied|inferred|missing]
|
|
8
|
+
> "{verbatim snippet}"
|
|
9
|
+
|
|
10
|
+
## Owners
|
|
11
|
+
- **Team:** {team name — role-based, not individual} [explicit|implied|inferred|missing]
|
|
12
|
+
- **Primary on-call rotation:** {rotation name / PagerDuty schedule} [explicit|implied|inferred|missing]
|
|
13
|
+
- **Escalation chain:** {who's next if primary is unavailable} [explicit|implied|inferred|missing]
|
|
14
|
+
|
|
15
|
+
## Tech stack
|
|
16
|
+
- **Language / runtime:** {e.g. Go 1.22, Python 3.12} [explicit|implied|inferred|missing]
|
|
17
|
+
- **Storage:** {e.g. Postgres 15, Redis, S3} [explicit|implied|inferred|missing]
|
|
18
|
+
- **Message brokers / queues:** {e.g. Kafka, SQS — or `n/a`} [explicit|implied|inferred|missing]
|
|
19
|
+
- **External dependencies:** {APIs, vendor services} [explicit|implied|inferred|missing]
|
|
20
|
+
|
|
21
|
+
## Deployment surface
|
|
22
|
+
- **Platform:** {Kubernetes / ECS / Lambda / VMs} [explicit|implied|inferred|missing]
|
|
23
|
+
- **Namespace / cluster / region:** {coordinates} [explicit|implied|inferred|missing]
|
|
24
|
+
- **Deploy mechanism:** {GitHub Actions / ArgoCD / manual / …} [explicit|implied|inferred|missing]
|
|
25
|
+
|
|
26
|
+
## Known failure modes (the "common 5")
|
|
27
|
+
- {Failure 1 — symptom + suspected cause if known} [explicit|implied|inferred|missing]
|
|
28
|
+
- {Failure 2}
|
|
29
|
+
- {Failure 3}
|
|
30
|
+
- {Failure 4}
|
|
31
|
+
- {Failure 5}
|
|
32
|
+
|
|
33
|
+
## Existing dashboards / alerts referenced in source
|
|
34
|
+
- {Dashboard URL or name} [explicit|implied|inferred|missing]
|
|
35
|
+
- {Alert name → page severity}
|
|
36
|
+
|
|
37
|
+
## SLOs (if any)
|
|
38
|
+
- {Metric → target, e.g. "p99 latency < 200ms"} [explicit|implied|inferred|missing]
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
|
|
42
|
+
## 🚩 Missing for downstream
|
|
43
|
+
- {field: why it matters}
|
|
44
|
+
- {e.g. "No owner team — runbook-generator refuses to draft without current ownership"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Brief: Tech Comparison
|
|
2
|
+
|
|
3
|
+
> Target downstream skill: `tech-comparison-matrix`
|
|
4
|
+
|
|
5
|
+
## The question
|
|
6
|
+
{One sentence — what's being chosen and what for. e.g. "Pick a primary OLTP datastore for the new checkout service."} [explicit|implied|inferred|missing]
|
|
7
|
+
> "{verbatim snippet}"
|
|
8
|
+
|
|
9
|
+
## Candidates
|
|
10
|
+
- **{Candidate A}** — {one-line positioning if source has it} [explicit|implied|inferred|missing]
|
|
11
|
+
- **{Candidate B}**
|
|
12
|
+
- **{Candidate C}**
|
|
13
|
+
|
|
14
|
+
## Evaluation criteria (with weights if source implies them)
|
|
15
|
+
- **{Criterion 1}** ({weight if known}) — {what "good" looks like} [explicit|implied|inferred|missing]
|
|
16
|
+
- **{Criterion 2}**
|
|
17
|
+
- **{Criterion 3}**
|
|
18
|
+
- **{Criterion 4}**
|
|
19
|
+
- **{Criterion 5}**
|
|
20
|
+
|
|
21
|
+
## Constraints / non-negotiables
|
|
22
|
+
- {Existing estate, e.g. "must run on AWS"} [explicit|implied|inferred|missing]
|
|
23
|
+
- {Team skills, e.g. "team has 5 years of Postgres"}
|
|
24
|
+
- {Compliance, e.g. "data must stay in eu-west-1"}
|
|
25
|
+
|
|
26
|
+
## Workload profile
|
|
27
|
+
- **Read/write ratio:** {ratio} [explicit|implied|inferred|missing]
|
|
28
|
+
- **Scale targets:** {QPS, data volume, growth} [explicit|implied|inferred|missing]
|
|
29
|
+
- **Consistency needs:** {strong / eventual / tunable} [explicit|implied|inferred|missing]
|
|
30
|
+
|
|
31
|
+
## Tentative leaning (if stated)
|
|
32
|
+
{"Source seems to favour X because Y" — flag so matrix can be honest about bias} [explicit|implied|inferred|missing]
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## 🚩 Missing for downstream
|
|
37
|
+
- {e.g. "Only 1 candidate captured — comparison needs ≥2"}
|
|
38
|
+
- {e.g. "No evaluation criteria — matrix will default to a generic set"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: bug-triage
|
|
3
|
+
description: Turn a vague bug report (Slack message, support ticket, "it's broken on mobile sometimes") into an actionable ticket — searchable symptom title, numbered repro steps from a clean state, expected vs actual, severity separated from priority, evidence tagged reported-vs-verified, and labeled hypotheses instead of root-cause guesses. Use when the user wants to triage a bug, write up a bug report, turn a complaint into a ticket, or make a flaky issue actionable.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# bug-triage
|
|
7
|
+
|
|
8
|
+
Converts the bug report someone *sent* into the ticket an engineer can *start* — without a round of "can you clarify?" first. The discipline: separate what was reported from what's verified, separate severity from priority, and label every guess as a guess. Triage shapes the work; fixing it is `feature-implement-loop` (or a human) downstream.
|
|
9
|
+
|
|
10
|
+
## How to respond
|
|
11
|
+
|
|
12
|
+
1. **Ingest the raw report** — Slack thread, support ticket, user email, a teammate's "X is broken". Mine it for the six ticket fields before asking anything. Then ask **at most 3 questions, ranked by diagnostic value** — the answers that most shrink the search space (exact error text, when it last worked, does it reproduce on a second account/device). Everything unconfirmed proceeds with a tag, not a guess.
|
|
13
|
+
|
|
14
|
+
2. **One bug per ticket.** A report with three symptoms becomes three tickets (or one ticket + a "split out" note naming the others). Multi-symptom tickets close half-fixed.
|
|
15
|
+
|
|
16
|
+
3. **Write the title as symptom + condition, searchable.** ✅ *"Checkout button stays disabled after removing an expired coupon (Safari 17, guest cart)"* — ❌ *"Checkout broken"*, ❌ *"Coupon bug"*. Six months from now someone greps tickets for "disabled checkout" — that's who the title is for.
|
|
17
|
+
|
|
18
|
+
4. **Tag every claim `[reported]` or `[verified]`.** What the reporter says happened vs what was confirmed by logs, a screenshot, or your own reproduction. Triage that presents `[reported]` as fact sends an engineer chasing a description instead of a behavior.
|
|
19
|
+
|
|
20
|
+
5. **Number the repro steps from a clean state** — fresh session, named test account, stated starting URL — each step an observable action, ending in the failure. If reproduction is unknown, the ticket says **"No repro yet"** and lists the exact diagnostics to collect (error text verbatim, console/server log window with timestamp, HAR capture, screen recording) — never invented steps that "probably" trigger it.
|
|
21
|
+
|
|
22
|
+
6. **Split expected vs actual into two concrete lines.** ✅ Expected: *"order total recalculates to pre-coupon price"* / Actual: *"total keeps the discount, button stays disabled"* — ❌ *"it doesn't work right"*. Attach the verbatim error message if one exists; paraphrased errors are unsearchable.
|
|
23
|
+
|
|
24
|
+
7. **Call severity and priority separately** with one line of reasoning each, using the matrix in [`templates/bug-ticket.md`](templates/bug-ticket.md):
|
|
25
|
+
- **Severity** = worst plausible user impact: S1 data loss / security / payment broken · S2 core flow broken, no workaround · S3 degraded, workaround exists · S4 cosmetic
|
|
26
|
+
- **Priority** = business urgency: P1 drop everything · P2 this sprint · P3 backlog
|
|
27
|
+
A cosmetic bug on the pricing page during launch week is S4/P1 — the separation is the point. State the blast radius guess: who's affected (`all users` / `Safari only` / `one tenant`) and tag it.
|
|
28
|
+
|
|
29
|
+
8. **Offer hypotheses as hypotheses.** Up to 3, each with a 5-minute check that would confirm or kill it. ✅ *"H1: expired-coupon validation leaves cart state locked — check: apply/remove a valid coupon, see if button recovers"*. Never present the leading hypothesis as the cause; that anchors the investigation on a guess.
|
|
30
|
+
|
|
31
|
+
9. **Finish with duplicate-search hints** — 2–3 search strings for the tracker (error code, symptom phrasing, component name) so the ticket isn't the third copy.
|
|
32
|
+
|
|
33
|
+
## Useful references in this skill
|
|
34
|
+
|
|
35
|
+
- [`templates/bug-ticket.md`](templates/bug-ticket.md) — the ticket skeleton with the severity/priority matrix and the no-repro diagnostics list
|
|
36
|
+
|
|
37
|
+
## Quality bar
|
|
38
|
+
|
|
39
|
+
- **An engineer can start without contacting the reporter.** Either the repro stands alone or the no-repro diagnostics list says exactly what to collect.
|
|
40
|
+
- **Title findable by symptom search.** If the words a future reporter would type don't appear in it, retitle.
|
|
41
|
+
- **Zero untagged claims.** Every factual statement is `[reported]`, `[verified]`, or `[assumption]` — a triager's authority comes from the tags.
|
|
42
|
+
- **Severity and priority each have a stated reason**, and they were judged independently — one line each, no shared justification.
|
|
43
|
+
- **Hypotheses ≤ 3, each with a concrete check.** A hypothesis without a check is a vibe.
|
|
44
|
+
- **The verbatim error text is present** when any error was shown — quoted exactly, not paraphrased.
|
|
45
|
+
|
|
46
|
+
## When to use this skill
|
|
47
|
+
|
|
48
|
+
- ✅ A Slack/support complaint needs to become a ticket an engineer can pick up
|
|
49
|
+
- ✅ "Can you write this up properly?" for a vaguely described bug
|
|
50
|
+
- ✅ Triaging an inbound bug queue into severity/priority order
|
|
51
|
+
- ✅ A flaky, "sometimes" bug that needs a diagnostics plan instead of guesswork
|
|
52
|
+
|
|
53
|
+
## When NOT to use this skill
|
|
54
|
+
|
|
55
|
+
- ❌ Actually fixing the bug — hand the ticket to `feature-implement-loop` or a human
|
|
56
|
+
- ❌ A production incident in progress — mitigate first; this is queue work, not response work
|
|
57
|
+
- ❌ The post-incident analysis — that's `postmortem-generator`
|
|
58
|
+
- ❌ A feature request wearing a bug costume ("bug: there's no dark mode") — route to `user-story-splitter`
|
|
59
|
+
|
|
60
|
+
## Anti-patterns to avoid
|
|
61
|
+
|
|
62
|
+
- ❌ **Root-cause cosplay.** "It's probably the cache" stated as fact in the ticket body — now the investigation starts at the guess instead of the evidence.
|
|
63
|
+
- ❌ **Repro steps that skip state.** "1. Go to checkout 2. See bug" — which account, which cart, which browser? Steps that don't start clean don't reproduce.
|
|
64
|
+
- ❌ **Severity inflated to get attention** (everything S1) or priority used as severity (P1 because a VP reported it — that's priority, write it as priority).
|
|
65
|
+
- ❌ **The interrogation.** Ten questions back to the reporter before writing anything; three ranked ones, then proceed with tags.
|
|
66
|
+
- ❌ **Paraphrased error messages.** "Some kind of permissions error" when the dialog said `ERR_TENANT_SCOPE_403` — the exact string is the most diagnostic fact available.
|
|
67
|
+
- ❌ **The kitchen-sink ticket.** Three symptoms, two feature requests, and a screenshot dump under one title. Split it.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "bug-triage",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Turn a vague bug report (Slack message, support ticket, \"it's broken on mobile sometimes\") into an actionable ticket — searchable symptom title, numbered repro steps from a clean state, expected vs actual, severity separated from priority, evidence tagged reported-vs-verified, and labeled hypotheses instead of root-cause guesses. Use when the user wants to triage a bug, write up a bug report, turn a complaint into a ticket, or make a flaky issue actionable.",
|
|
5
|
+
"entrypoint": "SKILL.md",
|
|
6
|
+
"deps": { "npm": [], "pip": [] },
|
|
7
|
+
"env": { "required": [], "optional": [] },
|
|
8
|
+
"related": ["feature-implement-loop", "postmortem-generator", "user-story-splitter"],
|
|
9
|
+
"tags": ["bug-triage", "bug-report", "ticket", "qa", "repro", "severity"],
|
|
10
|
+
"model": { "tier": "standard", "rationale": "Extraction plus judgment calls (severity vs priority, hypothesis ranking) — same shape as brief-intake: above light, below heavy." }
|
|
11
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Bug-ticket template
|
|
2
|
+
|
|
3
|
+
Every claim carries a tag: `[reported]` (the reporter says so), `[verified]` (confirmed by log/screenshot/own repro), `[assumption]` (triager's default). Untagged statements are the anti-pattern.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# {Symptom + condition — searchable: "Checkout button stays disabled after removing expired coupon (Safari 17, guest cart)"}
|
|
7
|
+
|
|
8
|
+
**Severity:** S{1–4} — {one line: worst plausible user impact}
|
|
9
|
+
**Priority:** P{1–3} — {one line: business urgency, judged separately}
|
|
10
|
+
**Blast radius:** {all users | segment | one tenant} `[reported|verified|assumption]`
|
|
11
|
+
**Component (best guess):** {area} `[assumption]`
|
|
12
|
+
|
|
13
|
+
## Summary
|
|
14
|
+
|
|
15
|
+
{2–3 sentences: who hits it, doing what, with what result. No cause claims.}
|
|
16
|
+
|
|
17
|
+
## Environment
|
|
18
|
+
|
|
19
|
+
| Field | Value | Tag |
|
|
20
|
+
|---|---|---|
|
|
21
|
+
| App version / commit | … | `[verified]` |
|
|
22
|
+
| OS / browser / device | … | `[reported]` |
|
|
23
|
+
| Account / tenant type | … | `[reported]` |
|
|
24
|
+
| First seen / last worked | … | `[reported]` |
|
|
25
|
+
|
|
26
|
+
## Reproduction
|
|
27
|
+
|
|
28
|
+
{Pick exactly one of the two blocks:}
|
|
29
|
+
|
|
30
|
+
**Steps (from clean state):**
|
|
31
|
+
1. {fresh session, named test account, starting URL}
|
|
32
|
+
2. {observable action}
|
|
33
|
+
3. {observable action → failure}
|
|
34
|
+
**Reproduces:** {n/n attempts} `[verified]`
|
|
35
|
+
|
|
36
|
+
**— or — No repro yet.** Collect:
|
|
37
|
+
- Verbatim error text / screenshot of the exact moment
|
|
38
|
+
- Console or server logs for {window} around {timestamp}
|
|
39
|
+
- HAR capture / request ID of the failing call
|
|
40
|
+
- Screen recording if UI-state dependent
|
|
41
|
+
|
|
42
|
+
## Expected vs actual
|
|
43
|
+
|
|
44
|
+
**Expected:** {concrete, one line}
|
|
45
|
+
**Actual:** {concrete, one line}
|
|
46
|
+
**Error (verbatim):** `{exact string, or "none shown"}`
|
|
47
|
+
|
|
48
|
+
## Hypotheses (≤3 — each with a 5-minute check; none of these is a conclusion)
|
|
49
|
+
|
|
50
|
+
| # | Hypothesis | Quick check |
|
|
51
|
+
|---|---|---|
|
|
52
|
+
| H1 | … | … |
|
|
53
|
+
|
|
54
|
+
## Questions for reporter (≤3, ranked by diagnostic value)
|
|
55
|
+
|
|
56
|
+
1. …
|
|
57
|
+
|
|
58
|
+
## Duplicate-search hints
|
|
59
|
+
|
|
60
|
+
`{error code}` · `{symptom phrase}` · `{component + verb}`
|
|
61
|
+
|
|
62
|
+
## Split out (if the report contained more than one issue)
|
|
63
|
+
|
|
64
|
+
- {symptom} → {new ticket ref / to be filed}
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Severity / priority matrix
|
|
68
|
+
|
|
69
|
+
**Severity — worst plausible user impact (not who reported it):**
|
|
70
|
+
|
|
71
|
+
| | Definition | Examples |
|
|
72
|
+
|---|---|---|
|
|
73
|
+
| S1 | Data loss, security exposure, payments broken | double-charge; cross-tenant read; corrupted saves |
|
|
74
|
+
| S2 | Core flow broken, no workaround | can't log in; checkout dead-ends |
|
|
75
|
+
| S3 | Degraded, workaround exists | export fails but copy-paste works; retry succeeds |
|
|
76
|
+
| S4 | Cosmetic / minor friction | misalignment; typo; flicker |
|
|
77
|
+
|
|
78
|
+
**Priority — business urgency (judged independently):**
|
|
79
|
+
|
|
80
|
+
| | Definition |
|
|
81
|
+
|---|---|
|
|
82
|
+
| P1 | Drop current work; fix and ship now |
|
|
83
|
+
| P2 | This sprint |
|
|
84
|
+
| P3 | Backlog, batch with related work |
|
|
85
|
+
|
|
86
|
+
Legitimate mismatches prove the separation: S4/P1 (typo in the price during launch week), S2/P3 (core flow of a feature being sunset next month).
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: business-case
|
|
3
|
+
description: Build a business case for a build/buy/defer investment decision — do-nothing always included as the baseline, benefits quantified as re-runnable calculations with confidence tags, full costs (build + run + opportunity), ranges instead of false precision, and the flip-assumption named. Use when the user needs to justify an investment, write a business case, compare build vs buy vs defer, or get budget/sponsor approval for an initiative.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# business-case
|
|
7
|
+
|
|
8
|
+
Produces the document a sponsor can approve, challenge, or kill on its merits — because every benefit shows its arithmetic, every option includes the one nobody advocates for (doing nothing), and the case names the single assumption that flips the recommendation. Decides *whether to invest*; `tech-comparison-matrix` picks between technologies after, `prd-draft` captures requirements after, `exec-summary` compresses this doc for a board.
|
|
9
|
+
|
|
10
|
+
## How to respond
|
|
11
|
+
|
|
12
|
+
1. **Pin the decision and the decider.** What exactly is being decided ("invest ~3 engineer-quarters in X" — not "improve our tooling"), who decides, and by when. Ask at most 2 questions, spent on the **cost of the status quo** ("what does the current state cost per month, in what units?") and the **decision deadline**. A business case without a named decision is an essay.
|
|
13
|
+
|
|
14
|
+
2. **Always include Option 0: do nothing.** Costed like every other option — the status quo has a price (ongoing pain, growing risk, deferred opportunity) and the case must beat it *explicitly*, not by assumption. Then 2–3 real alternatives (typically build / buy / partial-defer). Every option presented is one someone could genuinely champion; a lineup of two strawmen escorting the preferred option is theater, and reviewers smell it.
|
|
15
|
+
|
|
16
|
+
3. **Quantify benefits as calculations a reviewer can re-run.** Every benefit shows: the formula, each input with its source tag, and a **confidence tag** (high = measured data, medium = reasonable extrapolation, low = informed guess). ✅ *"40 agents × ~20 min/ticket saved `[data: time study]` × 30 tickets/day → 18–24 FTE-hours/day, confidence: medium (assumes 75–100% of tickets touch the flow)"* — ❌ *"significant efficiency gains"* — an adjective benefit is a benefit that didn't survive arithmetic.
|
|
17
|
+
|
|
18
|
+
4. **Use ranges, never false precision.** Three estimates multiplied together do not produce "327% ROI" — they produce a range, and the case says which end is likelier and why. State payback as a range too ("breakeven month 7–11"). Single-point outputs from multi-guess inputs are the most reliable sign a case is selling, not informing.
|
|
19
|
+
|
|
20
|
+
5. **Cost all three layers, per option**: **build** (people × time, the dominant and most-lowballed term — include ramp-up and the integration tail), **run** (infra, licenses, support burden, maintenance — the layer "buy" options hide in year 2+ pricing and "build" options hide in maintenance), and **opportunity** (what these people would otherwise ship — name the displaced thing, don't leave it abstract).
|
|
21
|
+
|
|
22
|
+
6. **Name the flip-assumption.** The sensitivity question, answered honestly: *which single input, if wrong, reverses the recommendation?* ✅ *"The case rests on ≥60% agent adoption; below ~40%, Option 0 wins — adoption is `[low confidence]`, so we propose a 4-week pilot before full commit."* If no single assumption flips it, say which *pair* does. A case with no flip-condition is claiming certainty it cannot have.
|
|
23
|
+
|
|
24
|
+
7. **Recommend one option, committally.** The recommendation names the option, the reasoning in two sentences, what was given up (the strongest point of the runner-up, stated fairly), and any de-risking step (pilot, staged commit) tied to the flip-assumption. "It depends" is the analyst's job half-done; the decider can disagree with a recommendation, but they can't disagree with a shrug.
|
|
25
|
+
|
|
26
|
+
8. **Lead with the ask.** The first lines of the document: the decision requested, the cost, the headline benefit range, the deadline. ✅ *"Ask: approve 3 engineer-quarters (~$210k loaded) for Option B; expected payback month 7–11; decision needed by July 1 to hit Q4 capacity."* Emit with [`templates/business-case.md`](templates/business-case.md), one message.
|
|
27
|
+
|
|
28
|
+
## Useful references in this skill
|
|
29
|
+
|
|
30
|
+
- [`templates/business-case.md`](templates/business-case.md) — the skeleton: ask-first structure, option table, benefit-calculation blocks, sensitivity section
|
|
31
|
+
|
|
32
|
+
## Quality bar
|
|
33
|
+
|
|
34
|
+
- **Option 0 is present and costed.** A case that doesn't price the status quo hasn't established there's a problem worth money.
|
|
35
|
+
- **Every benefit is a re-runnable calculation** with sourced inputs and a confidence tag. Reviewers check arithmetic; they can't check adjectives.
|
|
36
|
+
- **Outputs are ranges; the case says which end is likelier.** False precision fails the doc even when the direction is right.
|
|
37
|
+
- **All three cost layers appear per option** — build, run, opportunity — with the displaced work named, not waved at.
|
|
38
|
+
- **The flip-assumption is identified** and, where confidence on it is low, a de-risking step is proposed before full commitment.
|
|
39
|
+
- **The recommendation is singular and the runner-up's best argument is stated fairly.** A case that strawmans the alternative converts no skeptics.
|
|
40
|
+
- **The ask is the first thing read** — option, cost, benefit range, deadline, in under 40 words.
|
|
41
|
+
|
|
42
|
+
## When to use this skill
|
|
43
|
+
|
|
44
|
+
- ✅ "Should we build this?" / "write the business case for X"
|
|
45
|
+
- ✅ Build vs buy vs defer with real money or quarters at stake
|
|
46
|
+
- ✅ Budget/headcount approval needs a document, not a hallway pitch
|
|
47
|
+
- ✅ A persistent "we should really fix this" needs its cost of inaction priced
|
|
48
|
+
|
|
49
|
+
## When NOT to use this skill
|
|
50
|
+
|
|
51
|
+
- ❌ The investment decision is already made — go to `prd-draft`
|
|
52
|
+
- ❌ Choosing between technologies for an approved initiative — `tech-comparison-matrix`
|
|
53
|
+
- ❌ Compressing an existing case for execs — `exec-summary`
|
|
54
|
+
- ❌ Trivial cost ("should we buy a $400/yr tool") — the case costs more than the decision; just decide
|
|
55
|
+
|
|
56
|
+
## Anti-patterns to avoid
|
|
57
|
+
|
|
58
|
+
- ❌ **Omitting do-nothing.** Every option looks good against an unexamined status quo — that's why it gets omitted.
|
|
59
|
+
- ❌ **Adjective benefits.** "Improved efficiency, better experience, reduced risk" — three claims, zero numbers, nothing a reviewer can challenge.
|
|
60
|
+
- ❌ **False precision.** "327% ROI" from three guesses. Ranges with a stated lean, always.
|
|
61
|
+
- ❌ **Year-one costing.** Build cost without run cost — the buy option's renewal pricing and the build option's maintenance both live in year 2+, which is where cases go to die.
|
|
62
|
+
- ❌ **Sunk-cost scaffolding.** "We've already invested 2 quarters" argues for nothing; the case is forward-looking from today's zero.
|
|
63
|
+
- ❌ **Option theater.** Two deliberately weak alternatives flanking the favorite. Reviewers notice, and the case loses its credibility along with the vote.
|
|
64
|
+
- ❌ **Burying the ask.** Page 4, paragraph 2, "in light of the above we suggest…" — the sponsor read the first five lines; the ask lives there or nowhere.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "business-case",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Build a business case for a build/buy/defer investment decision — do-nothing always included as the baseline, benefits quantified as re-runnable calculations with confidence tags, full costs (build + run + opportunity), ranges instead of false precision, and the flip-assumption named. Use when the user needs to justify an investment, write a business case, compare build vs buy vs defer, or get budget/sponsor approval for an initiative.",
|
|
5
|
+
"entrypoint": "SKILL.md",
|
|
6
|
+
"deps": { "npm": [], "pip": [] },
|
|
7
|
+
"env": { "required": [], "optional": [] },
|
|
8
|
+
"related": ["exec-summary", "prd-draft", "tech-comparison-matrix"],
|
|
9
|
+
"tags": ["business-case", "investment", "build-vs-buy", "roi", "cost-benefit", "decision"],
|
|
10
|
+
"model": { "tier": "heavy", "rationale": "Weighted multi-option judgment with a committal recommendation — same failure mode as tech-comparison-matrix: cheaper models mis-weight costs, inflate benefits, and miss the flip-assumption. Never downgrade." }
|
|
11
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Business-case template
|
|
2
|
+
|
|
3
|
+
Ask first. Ranges, not points. Every number traceable to a tagged input.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Business case: {decision, named — "Invest 3 engineer-quarters in unified agent view"}
|
|
7
|
+
|
|
8
|
+
## The ask (≤40 words)
|
|
9
|
+
|
|
10
|
+
Approve **{option}** — {cost range, loaded} — expected {headline benefit range},
|
|
11
|
+
payback {range}. Decision needed by **{date}** because {what the deadline forfeits}.
|
|
12
|
+
|
|
13
|
+
**Decider:** {role} · **Author:** {role} · **Date:** {YYYY-MM-DD}
|
|
14
|
+
|
|
15
|
+
## The problem, priced
|
|
16
|
+
|
|
17
|
+
{2–3 sentences: what the status quo costs per month, in units the decider budgets
|
|
18
|
+
in (FTE-hours, churn, incidents, $). Inputs tagged [data:…] / [reported:…] / [estimate].}
|
|
19
|
+
|
|
20
|
+
## Options
|
|
21
|
+
|
|
22
|
+
| | Option 0: do nothing | Option A: {…} | Option B: {…} |
|
|
23
|
+
|---|---|---|---|
|
|
24
|
+
| Build cost | — | {range, loaded, incl. ramp + integration tail} | {range} |
|
|
25
|
+
| Run cost (annual, yr 2+) | {status-quo ongoing cost} | {infra + licenses + maintenance} | {…} |
|
|
26
|
+
| Opportunity cost | {what worsens by deferring} | {the displaced work, named} | {…} |
|
|
27
|
+
| Headline benefit | 0 (baseline) | {range + confidence} | {range + confidence} |
|
|
28
|
+
| Time to value | — | {range} | {range} |
|
|
29
|
+
| Champion-able? | yes — {who'd argue it} | yes — {…} | yes — {…} |
|
|
30
|
+
|
|
31
|
+
## Benefit calculations (re-runnable)
|
|
32
|
+
|
|
33
|
+
### {Benefit 1, Option A}
|
|
34
|
+
- Formula: {inputs → output}
|
|
35
|
+
- Inputs: {value [data: source]} × {value [estimate]} × …
|
|
36
|
+
- Result: **{range}** · Confidence: {high|medium|low} — {why}
|
|
37
|
+
|
|
38
|
+
{Repeat per material benefit. A benefit with no calculation block doesn't appear in the option table.}
|
|
39
|
+
|
|
40
|
+
## Sensitivity — the flip-assumption
|
|
41
|
+
|
|
42
|
+
**The recommendation flips if:** {single input + the threshold — "agent adoption < ~40%"}
|
|
43
|
+
**Confidence on that input:** {tag} → **De-risking step:** {pilot / staged commit / data pull, with cost and duration}
|
|
44
|
+
{If no single input flips it, name the pair that does.}
|
|
45
|
+
|
|
46
|
+
## Recommendation (one option)
|
|
47
|
+
|
|
48
|
+
**{Option}.** {Two sentences of reasoning.}
|
|
49
|
+
**What we give up:** {the runner-up's strongest point, stated fairly.}
|
|
50
|
+
**Conditions:** {the de-risking step above; any staging of the commitment.}
|
|
51
|
+
|
|
52
|
+
## Risks beyond the numbers
|
|
53
|
+
|
|
54
|
+
- {execution/organizational/vendor risk} — {mitigation or acceptance, one line each}
|
|
55
|
+
|
|
56
|
+
## Not in this case
|
|
57
|
+
|
|
58
|
+
{What was deliberately excluded from the math (unquantifiable strategic upside,
|
|
59
|
+
morale, …) — named so the decider can weigh it qualitatively, not smuggled into the numbers.}
|
|
60
|
+
```
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: capacity-cost-model
|
|
3
|
+
description: Build a capacity and cost model for a service or feature — sized from a demand driver and its growth curve, not from instance types; unit economics (cost per request/tenant/GB); peak-vs-average and headroom as explicit decisions; cost at 1×/3×/10× with scaling cliffs named; and the forgotten line items (egress, logging, NAT, non-prod) checklisted. Use when the user needs to estimate cloud/infra cost, size capacity for launch or growth, project the bill at scale, or find what's driving a cost.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# capacity-cost-model
|
|
7
|
+
|
|
8
|
+
Turns "how much will this cost to run?" into a model a reviewer can re-run and finance can trust — sized from **demand**, expressed in **cost per unit**, and honest about the line items everyone forgets until the invoice. Distinct from `business-case` (which decides *whether* to invest, across options) and `nfr-spec` (which *sets* the throughput/availability targets); this models the resources and dollars to *meet* a target you've already chosen.
|
|
9
|
+
|
|
10
|
+
## How to respond
|
|
11
|
+
|
|
12
|
+
1. **Start from the demand model, never from instance types.** The first question is "how much of what?" — the **driver** (requests/sec, tenants, GB stored, events/day, concurrent users), its **current value**, its **growth curve**, and the **peak-to-average ratio**. Ask at most 2 questions, spent on the driver's current volume + source and the peak ratio (the spikiness that decides static-vs-autoscale). Sizing to a round instance count instead of to demand is how clusters end up 80% idle or 200% over.
|
|
13
|
+
|
|
14
|
+
2. **Express everything as unit economics.** Cost per request / per tenant / per 1k events / per GB-month — because that's what scales predictably, what finance budgets in, and what reveals whether the architecture gets cheaper or more expensive per unit as it grows. ✅ *"$0.012 per active tenant per day, dominated by the per-tenant search index"* — ❌ *"about $4k/month"* (a number with no denominator can't be reasoned about at 10×).
|
|
15
|
+
|
|
16
|
+
3. **Model the components against the cost catalog** ([`reference.md`](reference.md)) — compute, storage, **network egress** (the forgotten heavyweight), managed-service tiers, **logging/observability** (routinely a top-3 surprise), backups/DR, data transfer cross-AZ/region, and **non-production environments** (dev/staging/idle often 30–50% of the bill). Each line: the quantity from the demand model × the unit price, with the price's source/date tagged. Missing the egress and observability lines is the single most common way a model lands 40% low.
|
|
17
|
+
|
|
18
|
+
4. **Make peak-vs-average and headroom explicit decisions, not defaults.** State both the average load (what you bill for) and the peak (what you must serve), and the chosen **target utilization + buffer** with its reasoning: ✅ *"size to peak × 1.3 for failover + spike; accept ~55% average utilization because the spike is revenue-critical"*. Over-provisioning burns money; under-provisioning is an incident — the headroom number is where that tradeoff is decided, so it's named, not buried in a rounded-up instance count.
|
|
19
|
+
|
|
20
|
+
5. **Project at 1× / 3× / 10× and find the scaling cliffs.** Cost rarely scales linearly — name where it jumps: the next instance/managed-service tier, cross-AZ egress kicking in, a license seat band, single-node → sharded, a free-tier ceiling. ✅ *"linear to ~5×, then the search tier forces a sharded cluster (+$3k/mo step) at ~6×"*. A model that's a single multiplication hides the cliff that wrecks the budget.
|
|
21
|
+
|
|
22
|
+
6. **Rank the cost drivers and use ranges.** The 2–3 line items that dominate get named (optimization targets them, not the rounding error). Outputs are **ranges with a stated lean** (low/expected/high), never false precision — three estimated inputs don't produce "$4,271/mo". Tag input confidence like `business-case` does.
|
|
23
|
+
|
|
24
|
+
7. **Set the cost guardrails.** Budget alert thresholds, and the **unit-cost regression check**: cost-per-unit should hold flat or fall as volume grows; if the model shows it *rising* with scale, that's a flagged architectural problem, not a footnote. (Mirrors `success-metrics`' guardrail discipline; the alerting itself is an `nfr-spec` cost target.)
|
|
25
|
+
|
|
26
|
+
8. **Emit with [`templates/cost-model.md`](templates/cost-model.md)** in one message: demand model, component table with unit prices, unit economics, total at average + peak, growth scenarios with cliffs, cost-driver ranking, the forgotten-costs checklist (each ticked present or n/a), and guardrails. State the assumptions that most move the total at the top.
|
|
27
|
+
|
|
28
|
+
## Useful references in this skill
|
|
29
|
+
|
|
30
|
+
- [`reference.md`](reference.md) — the cost-component catalog, the forgotten-costs checklist, headroom guidance, and common scaling cliffs
|
|
31
|
+
- [`templates/cost-model.md`](templates/cost-model.md) — the model skeleton with demand, component, and growth-scenario tables
|
|
32
|
+
|
|
33
|
+
## Quality bar
|
|
34
|
+
|
|
35
|
+
- **Sized from a demand driver with a growth curve**, not a chosen instance count. The driver and its source are stated.
|
|
36
|
+
- **Every cost is a unit cost × a quantity**, with the unit price's source and date tagged. A bare monthly total fails.
|
|
37
|
+
- **Egress, observability, and non-prod lines are present** (or explicitly n/a). Their absence is the signature of a model that's 40% low.
|
|
38
|
+
- **Headroom and peak-vs-average are explicit decisions** with reasoning, not absorbed into a rounded number.
|
|
39
|
+
- **Scaling cliffs are named in the 1×/3×/10× projection.** A linear extrapolation that hides a tier jump is a budget trap.
|
|
40
|
+
- **Outputs are ranges with a lean; the unit-cost-at-scale trend is checked.** Rising per-unit cost with growth is flagged as an architecture issue.
|
|
41
|
+
|
|
42
|
+
## When to use this skill
|
|
43
|
+
|
|
44
|
+
- ✅ Estimating run cost for a new service/feature before launch
|
|
45
|
+
- ✅ Sizing capacity for a launch or a known growth event
|
|
46
|
+
- ✅ "What will this cost at 10× / when we hit N tenants?"
|
|
47
|
+
- ✅ Finding what's driving an existing cloud bill and where the next cliff is
|
|
48
|
+
|
|
49
|
+
## When NOT to use this skill
|
|
50
|
+
|
|
51
|
+
- ❌ Deciding whether to build/buy/invest at all — that's `business-case` (this can feed its run-cost line)
|
|
52
|
+
- ❌ Setting the performance/availability targets — that's `nfr-spec` (this sizes to meet them)
|
|
53
|
+
- ❌ The migration/rollout sequence — that's `migration-plan`
|
|
54
|
+
- ❌ A fixed-price SaaS seat with no scaling math — just read the price sheet
|
|
55
|
+
|
|
56
|
+
## Anti-patterns to avoid
|
|
57
|
+
|
|
58
|
+
- ❌ **Sizing from instance types.** "Let's run 3 large nodes" before knowing the load — that's a guess wearing a SKU, idle or overwhelmed by luck.
|
|
59
|
+
- ❌ **The denominator-free total.** "$4k/month" with no per-unit cost can't be projected, compared, or optimized.
|
|
60
|
+
- ❌ **Forgetting egress and observability.** The two line items that turn a tidy estimate into a 40%-low one; the checklist exists because they're forgotten every time.
|
|
61
|
+
- ❌ **Ignoring non-prod.** Three idle staging environments and a never-scaled-down dev cluster are real money the model pretends doesn't exist.
|
|
62
|
+
- ❌ **Linear extrapolation past a cliff.** "10× the load, 10× the cost" right up until the sharded-cluster step doubles it. Name the cliff.
|
|
63
|
+
- ❌ **False precision.** "$4,271.40/mo" from estimated inputs reads as certainty the model doesn't have. Ranges with a lean.
|
|
64
|
+
- ❌ **Missing the rising-unit-cost flag.** A model where cost-per-tenant climbs with scale is describing an architecture that gets worse the more it succeeds — that's the headline, not a row.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "capacity-cost-model",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Build a capacity and cost model for a service or feature — sized from a demand driver and its growth curve, not from instance types; unit economics (cost per request/tenant/GB); peak-vs-average and headroom as explicit decisions; cost at 1×/3×/10× with scaling cliffs named; and the forgotten line items (egress, logging, NAT, non-prod) checklisted. Use when the user needs to estimate cloud/infra cost, size capacity for launch or growth, project the bill at scale, or find what's driving a cost.",
|
|
5
|
+
"entrypoint": "SKILL.md",
|
|
6
|
+
"deps": { "npm": [], "pip": [] },
|
|
7
|
+
"env": { "required": [], "optional": [] },
|
|
8
|
+
"related": ["business-case", "migration-plan", "nfr-spec", "success-metrics"],
|
|
9
|
+
"tags": ["capacity-planning", "cost", "cloud", "finops", "sizing", "unit-economics"],
|
|
10
|
+
"model": { "tier": "standard", "rationale": "Quantitative projection from a demand model against a fixed cost catalog. Headroom and scaling-cliff judgment is bounded by the reference; escalate via ambiguous-input on novel architectures." }
|
|
11
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# capacity-cost-model reference — component catalog, forgotten costs, cliffs
|
|
2
|
+
|
|
3
|
+
All unit prices are illustrative placeholders — the skill tags each with its real source and date. Cloud pricing changes; never hard-code a number without a date.
|
|
4
|
+
|
|
5
|
+
## Cost-component catalog (model every applicable line)
|
|
6
|
+
|
|
7
|
+
| Component | Demand quantity | Typical unit price shape | Notes |
|
|
8
|
+
|---|---|---|---|
|
|
9
|
+
| **Compute** | peak concurrent work / rps | $/vCPU-hr, $/instance-hr, $/request (serverless) | size to peak or autoscale; state which |
|
|
10
|
+
| **Storage** | GB stored × growth | $/GB-month, tiered (hot/warm/cold) | growth is cumulative — model the curve, not a point |
|
|
11
|
+
| **Network egress** | GB out to internet / cross-region | $/GB, often tiered, free inbound | THE forgotten heavyweight; cross-AZ counts too |
|
|
12
|
+
| **Managed services** (DB, cache, queue, search) | IOPS, nodes, throughput units | per-node / per-RU / per-throughput-tier | tier jumps are the classic cliff |
|
|
13
|
+
| **Logging / observability** | GB ingested, metrics cardinality, traces | $/GB ingested, $/metric series | routinely top-3; high-cardinality labels explode it |
|
|
14
|
+
| **Backups / DR** | snapshot GB, replica count, cross-region copy | $/GB-month × retention × copies | retention × copies multiplies fast |
|
|
15
|
+
| **Data transfer** | inter-service, cross-AZ, cross-region | $/GB | "internal" traffic is not always free |
|
|
16
|
+
| **Non-production** | dev + staging + preview envs | fraction of prod, often 30–50% | idle/never-scaled-down is pure waste — model it |
|
|
17
|
+
| **Support / licenses** | seats, support plan %, per-seat tools | $/seat, % of spend | seat bands are a cliff |
|
|
18
|
+
| **Idle / always-on** | min instances, provisioned capacity, NAT gateways | $/hr regardless of load | NAT gateways and provisioned concurrency bill 24/7 |
|
|
19
|
+
|
|
20
|
+
## Forgotten-costs checklist (tick each: present / n/a-with-reason)
|
|
21
|
+
|
|
22
|
+
- [ ] Network egress to internet
|
|
23
|
+
- [ ] Cross-AZ / cross-region data transfer
|
|
24
|
+
- [ ] Logging & observability ingestion (and metric cardinality)
|
|
25
|
+
- [ ] Backups × retention × replica copies
|
|
26
|
+
- [ ] Non-prod environments (dev/staging/preview), incl. idle
|
|
27
|
+
- [ ] NAT gateway / load balancer / always-on networking
|
|
28
|
+
- [ ] Provisioned-but-idle capacity (min autoscale floor, reserved-but-unused)
|
|
29
|
+
- [ ] Support plan (% of spend) and per-seat tooling
|
|
30
|
+
- [ ] Data egress on delete/migration (one-time but real)
|
|
31
|
+
- [ ] Free-tier expiry (the bill that appears in month 13)
|
|
32
|
+
|
|
33
|
+
A model that hasn't consciously cleared this list is presumed 30–40% low.
|
|
34
|
+
|
|
35
|
+
## Headroom guidance (state the decision)
|
|
36
|
+
|
|
37
|
+
- **Target utilization:** the average you design for. 50–70% is common for spiky interactive workloads; 80%+ only for smooth, predictable, non-critical load.
|
|
38
|
+
- **Buffer:** peak × (failover redundancy + spike margin). N+1 across AZs is a multiplier, not a rounding.
|
|
39
|
+
- **Autoscale vs static:** if peak-to-average > ~2–3×, autoscaling usually beats provisioning for peak. State the floor (min capacity bills 24/7) and the scale-up latency (cold starts during a spike are an availability risk, an `nfr-spec` concern).
|
|
40
|
+
- The headroom number is a money-vs-incident tradeoff — write the reasoning, not just the multiplier.
|
|
41
|
+
|
|
42
|
+
## Common scaling cliffs (name the one that bites first)
|
|
43
|
+
|
|
44
|
+
- **Managed-service tier jump** — DB/cache/search moves to the next node size or shard count; cost steps, not slopes.
|
|
45
|
+
- **Single-node → distributed** — replication, coordination, and cross-node transfer appear all at once.
|
|
46
|
+
- **Cross-AZ egress threshold** — multi-AZ for HA turns "internal" traffic into a metered line.
|
|
47
|
+
- **Free-tier / committed-use ceiling** — the discount or free allowance runs out; effective unit price jumps.
|
|
48
|
+
- **License/seat band** — per-seat tools and support plans step at user-count thresholds.
|
|
49
|
+
- **Observability cardinality wall** — a new label dimension multiplies metric series and the bill with them.
|
|
50
|
+
- **Connection/throughput limits** — hitting a managed service's connection cap forces a proxy/pooler tier.
|
|
51
|
+
|
|
52
|
+
## Unit-cost-at-scale check
|
|
53
|
+
|
|
54
|
+
Compute cost-per-unit at 1×, 3×, 10×. The healthy shape is flat or declining (economies of scale). If per-unit cost **rises** with volume, the model has found an architectural anti-pattern (per-tenant fixed overhead, N² chatter, cardinality explosion) — surface it as the headline finding, because it means success makes the economics worse.
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Capacity & cost-model template
|
|
2
|
+
|
|
3
|
+
Demand first, unit costs always, ranges not points, cliffs named. Every unit price tagged with source + date.
|
|
4
|
+
|
|
5
|
+
```markdown
|
|
6
|
+
# Capacity & cost model: {service / feature}
|
|
7
|
+
|
|
8
|
+
**Date:** {YYYY-MM-DD} · **Cloud/region:** {provider, region}
|
|
9
|
+
|
|
10
|
+
## Assumptions that most move the total (top 3)
|
|
11
|
+
|
|
12
|
+
- {driver value, headroom choice, or unit price the answer is most sensitive to} `[data|estimate]`
|
|
13
|
+
|
|
14
|
+
## Demand model
|
|
15
|
+
|
|
16
|
+
| Driver | Current | Growth | Peak : average | Source |
|
|
17
|
+
|---|---|---|---|---|
|
|
18
|
+
| {requests/sec | tenants | GB | events/day} | {value} | {curve, e.g. 8%/mo} | {e.g. 4:1} | `[data: …]` |
|
|
19
|
+
|
|
20
|
+
## Components (quantity × unit price)
|
|
21
|
+
|
|
22
|
+
| Component | Quantity (from demand) | Unit price (source, date) | Monthly (expected) | Range |
|
|
23
|
+
|---|---|---|---|---|
|
|
24
|
+
| Compute | {peak/autoscale} | {$/…} `[src 2026-06]` | {$} | {low–high} |
|
|
25
|
+
| Storage | {GB, cumulative} | {$/GB-mo} | {$} | |
|
|
26
|
+
| Egress | {GB out} | {$/GB} | {$} | |
|
|
27
|
+
| Managed: {db/cache/search} | {tier/nodes} | {$/node} | {$} | |
|
|
28
|
+
| Observability | {GB ingest, series} | {$/GB} | {$} | |
|
|
29
|
+
| Backups/DR | {GB × retention × copies} | {$/GB-mo} | {$} | |
|
|
30
|
+
| Non-prod | {fraction of prod} | — | {$} | |
|
|
31
|
+
| Always-on (NAT/LB/floor) | {24/7 units} | {$/hr} | {$} | |
|
|
32
|
+
| **Total (average load)** | | | **{$ range}** | |
|
|
33
|
+
| **Total (peak provisioned)** | | | **{$ range}** | |
|
|
34
|
+
|
|
35
|
+
## Unit economics
|
|
36
|
+
|
|
37
|
+
- Cost per {request | tenant | 1k events | GB}: **{$ expected (range)}**
|
|
38
|
+
- Dominated by: {the line item driving it}
|
|
39
|
+
|
|
40
|
+
## Growth scenarios & cliffs
|
|
41
|
+
|
|
42
|
+
| Scale | Monthly cost (range) | Cost per unit | Cliff hit? |
|
|
43
|
+
|---|---|---|---|
|
|
44
|
+
| 1× (today) | {$} | {$/unit} | — |
|
|
45
|
+
| 3× | {$} | {$/unit} | {none / names it} |
|
|
46
|
+
| 10× | {$} | {$/unit} | **{e.g. search → sharded cluster, +$3k step at ~6×}** |
|
|
47
|
+
|
|
48
|
+
**Unit-cost trend:** {flat / declining / ⚠ rising — and why if rising}
|
|
49
|
+
|
|
50
|
+
## Cost-driver ranking (optimize these, not the rounding error)
|
|
51
|
+
|
|
52
|
+
1. {line item} — {% of total} — {lever to reduce}
|
|
53
|
+
2. …
|
|
54
|
+
|
|
55
|
+
## Forgotten-costs checklist
|
|
56
|
+
|
|
57
|
+
{egress · cross-AZ · observability · backups×retention×copies · non-prod · NAT/LB ·
|
|
58
|
+
idle floor · support/licenses · migration egress · free-tier expiry — each: ✅ included / n/a (reason)}
|
|
59
|
+
|
|
60
|
+
## Headroom decision
|
|
61
|
+
|
|
62
|
+
Target utilization {x%}; buffer = peak × {multiplier} for {failover + spike}; {autoscale | static} because {peak:avg ratio}. Tradeoff accepted: {money vs incident}.
|
|
63
|
+
|
|
64
|
+
## Guardrails
|
|
65
|
+
|
|
66
|
+
- Budget alert at {threshold}; hard stop / review at {threshold}.
|
|
67
|
+
- Unit-cost regression: alert if cost-per-{unit} rises > {x%} quarter-over-quarter.
|
|
68
|
+
```
|