skilldrop-cli 0.16.3__py3-none-any.whl
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.
- skilldrop_cli/__init__.py +16 -0
- skilldrop_cli/__main__.py +3 -0
- skilldrop_cli/data/LICENSE +9 -0
- skilldrop_cli/data/LICENSE-APACHE +202 -0
- skilldrop_cli/data/LICENSE-MIT +21 -0
- skilldrop_cli/data/agents/README.md +127 -0
- skilldrop_cli/data/agents/code-quality.md +40 -0
- skilldrop_cli/data/agents/devils-advocate.md +40 -0
- skilldrop_cli/data/agents/security-reviewer.md +44 -0
- skilldrop_cli/data/bin/skilldrop.js +2110 -0
- skilldrop_cli/data/catalogue.json +187 -0
- skilldrop_cli/data/contracts/agent.schema.json +28 -0
- skilldrop_cli/data/contracts/catalogue.schema.json +33 -0
- skilldrop_cli/data/contracts/guide.schema.json +18 -0
- skilldrop_cli/data/contracts/loop.schema.json +87 -0
- skilldrop_cli/data/contracts/pack.schema.json +75 -0
- skilldrop_cli/data/contracts/skill.schema.json +110 -0
- skilldrop_cli/data/contracts/terminals.json +33 -0
- skilldrop_cli/data/model-routing.json +474 -0
- skilldrop_cli/data/package.json +46 -0
- skilldrop_cli/data/packs/ai-engineering/pack.json +57 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +90 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-adoption-stage/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-adoption-stage/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +39 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/SKILL.md +63 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/evals/evals.json +28 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-budget/templates/budget-spec.md +30 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/SKILL.md +70 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/evals/evals.json +28 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-loop-design/templates/loop-spec.md +46 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/SKILL.md +89 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/evals/eval_queries.json +15 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/evals/evals.json +41 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/examples/support-triage-agent.md +117 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/reference.md +101 -0
- skilldrop_cli/data/packs/ai-engineering/skills/agent-threat-model/templates/agent-threat-model.md +71 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-adoption-rollout/SKILL.md +61 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-adoption-rollout/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-adoption-rollout/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-adoption-rollout/manifest.json +33 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +68 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-readiness-assessment/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-readiness-assessment/evals/evals.json +17 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +35 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-policy/SKILL.md +67 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-policy/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-policy/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-policy/manifest.json +33 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/SKILL.md +111 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +4213 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +133 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/manifest.json +12 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/scripts/build_report.py +436 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/templates/report-per-user.md +42 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/templates/report-team-rollup.md +49 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +76 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-use-case-triage/SKILL.md +59 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-use-case-triage/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-use-case-triage/evals/evals.json +18 -0
- skilldrop_cli/data/packs/ai-engineering/skills/ai-use-case-triage/manifest.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +73 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/evals/evals.json +19 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/reference.md +58 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/templates/eval-plan.md +63 -0
- skilldrop_cli/data/packs/ai-engineering/skills/llm-eval-harness/templates/golden-case.jsonl +5 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/SKILL.md +69 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/evals/evals.json +29 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/manifest.json +11 -0
- skilldrop_cli/data/packs/ai-engineering/skills/subagent-design/templates/orchestration-plan.md +47 -0
- skilldrop_cli/data/packs/api-builder/pack.json +48 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/SKILL.md +84 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/evals/evals.json +19 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/evals/files/1/SKILL.md +31 -0
- skilldrop_cli/data/packs/api-builder/skills/eval-harness-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/api-builder/skills/prompt-caching-advisor/SKILL.md +90 -0
- skilldrop_cli/data/packs/api-builder/skills/prompt-caching-advisor/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/api-builder/skills/prompt-caching-advisor/evals/evals.json +19 -0
- skilldrop_cli/data/packs/api-builder/skills/prompt-caching-advisor/manifest.json +11 -0
- skilldrop_cli/data/packs/api-builder/skills/token-budget-estimator/SKILL.md +75 -0
- skilldrop_cli/data/packs/api-builder/skills/token-budget-estimator/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/api-builder/skills/token-budget-estimator/evals/evals.json +18 -0
- skilldrop_cli/data/packs/api-builder/skills/token-budget-estimator/manifest.json +11 -0
- skilldrop_cli/data/packs/api-builder/skills/tool-use-schema-writer/SKILL.md +111 -0
- skilldrop_cli/data/packs/api-builder/skills/tool-use-schema-writer/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/api-builder/skills/tool-use-schema-writer/evals/evals.json +18 -0
- skilldrop_cli/data/packs/api-builder/skills/tool-use-schema-writer/manifest.json +11 -0
- skilldrop_cli/data/packs/converters/pack.json +66 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/SKILL.md +103 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/evals/evals.json +27 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/evals/files/1/northwind-q3.pptx +0 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/evals/files/2/acme-contract-summary.pdf +93 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/examples/inputs/accounts.json +1 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/examples/inputs/fabrikam-status.html +14 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/examples/mixed-inputs.md +306 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/manifest.json +49 -0
- skilldrop_cli/data/packs/converters/skills/file-to-markdown/scripts/to_markdown.py +1299 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/SKILL.md +124 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/eval_queries.json +10 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/evals.json +29 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/brand/brand.json +80 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/brand/logo-white.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/brand/logo.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/brand/mark.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/evals/files/1/docs/vendor-onboarding.md +42 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/examples/q3-support-review-input.md +54 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/examples/q3-support-review.md +80 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/examples/tickets-by-region.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/manifest.json +52 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/reference.md +89 -0
- skilldrop_cli/data/packs/converters/skills/md-to-docx/scripts/md_to_docx.py +1114 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/SKILL.md +100 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/evals.json +18 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/brand/brand.json +80 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/brand/logo-white.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/brand/logo.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/brand/mark.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/docs/q3-review.md +35 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/evals/files/1/img/dashboard.png +0 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/examples/inputs/chart.svg +8 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/examples/inputs/ops-review.md +48 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/examples/ops-review.md +83 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/manifest.json +43 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/reference.md +70 -0
- skilldrop_cli/data/packs/converters/skills/md-to-html/scripts/md_to_html.py +652 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/SKILL.md +120 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/evals/eval_queries.json +9 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/evals/evals.json +28 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/evals/files/1/exports/northwind-invoices.csv +25 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/evals/files/2/reports/q3-ops-review.md +32 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/examples/vendor-review-input.md +28 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/examples/vendor-review.md +94 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/manifest.json +33 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/reference.md +94 -0
- skilldrop_cli/data/packs/converters/skills/md-to-xlsx/scripts/md_to_xlsx.py +667 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/SKILL.md +109 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/evals/evals.json +17 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/evals/files/1/docs/contoso-orders.md +23 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/broken-diagrams.md +147 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/broken-flowchart.mmd +8 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/broken-sequence.mmd +11 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/checkout-flow.mmd +9 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/design-notes.md +35 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/fixed-flowchart.mmd +9 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/examples/inputs/typo.mmd +2 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/manifest.json +40 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/reference.md +70 -0
- skilldrop_cli/data/packs/converters/skills/mermaid-render/scripts/render_mermaid.py +486 -0
- skilldrop_cli/data/packs/core/loops/ship-a-draft/LOOP.md +77 -0
- skilldrop_cli/data/packs/core/loops/ship-a-draft/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/core/loops/ship-a-draft/evals/evals.json +25 -0
- skilldrop_cli/data/packs/core/loops/ship-a-draft/loop.json +41 -0
- skilldrop_cli/data/packs/core/pack.json +50 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/SKILL.md +79 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/evals/evals.json +16 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/manifest.json +11 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-adr.md +41 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-decision-log.md +35 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-deck.md +43 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-design-doc.md +48 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-exec-summary.md +47 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-generic.md +45 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-runbook.md +44 -0
- skilldrop_cli/data/packs/core/skills/brief-intake/templates/brief-tech-comparison.md +38 -0
- skilldrop_cli/data/packs/core/skills/council-review/SKILL.md +106 -0
- skilldrop_cli/data/packs/core/skills/council-review/evals/eval_queries.json +38 -0
- skilldrop_cli/data/packs/core/skills/council-review/evals/evals.json +18 -0
- skilldrop_cli/data/packs/core/skills/council-review/examples/redis-cache-decision.md +75 -0
- skilldrop_cli/data/packs/core/skills/council-review/manifest.json +11 -0
- skilldrop_cli/data/packs/core/skills/council-review/reference.md +76 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/architect.md +29 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/bench.md +39 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/operator.md +27 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/pragmatist.md +29 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/security-engineer.md +29 -0
- skilldrop_cli/data/packs/core/skills/council-review/seats/user-advocate.md +27 -0
- skilldrop_cli/data/packs/core/skills/council-review/templates/council-review.md +59 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/SKILL.md +119 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/evals/eval_queries.json +38 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/evals/evals.json +17 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/examples/design-doc-critique.md +34 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/manifest.json +11 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/adr.md +36 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/decision-log.md +39 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/deck.md +45 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/design-doc.md +42 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/exec-summary.md +41 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/generic.md +40 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/runbook.md +42 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/rubrics/tech-comparison.md +40 -0
- skilldrop_cli/data/packs/core/skills/doc-critique/templates/critique.md +49 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/SKILL.md +97 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/evals/evals.json +30 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/manifest.json +34 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/reference.md +106 -0
- skilldrop_cli/data/packs/core/skills/output-hygiene/scripts/scrub.py +315 -0
- skilldrop_cli/data/packs/data-analytics/pack.json +57 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/SKILL.md +83 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/evals/evals.json +19 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/examples/support-staffing.md +84 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/manifest.json +40 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/reference.md +45 -0
- skilldrop_cli/data/packs/data-analytics/skills/dashboard-spec/templates/dashboard-spec.md +55 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/SKILL.md +84 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/evals/evals.json +19 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/examples/refund-rate.md +104 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/manifest.json +41 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/reference.md +67 -0
- skilldrop_cli/data/packs/data-analytics/skills/metric-definition/templates/metric-spec.md +70 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/SKILL.md +83 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/evals/evals.json +19 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/examples/revenue-by-region.md +174 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/manifest.json +42 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/reference.md +84 -0
- skilldrop_cli/data/packs/data-analytics/skills/sql-review/scripts/sql_lint.py +461 -0
- skilldrop_cli/data/packs/design/pack.json +60 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/SKILL.md +105 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/evals/evals.json +18 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/evals/files/1/brand/northwind-logo-white.png +0 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/evals/files/1/brand/northwind-logo.png +0 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/examples/northwind-brand.md +48 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/manifest.json +45 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/scripts/check_brand.py +114 -0
- skilldrop_cli/data/packs/design/skills/brand-kit/templates/brand.json +54 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/SKILL.md +201 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/evals/eval_queries.json +14 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/evals/evals.json +40 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/examples/exec-board-update.md +108 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/examples/templated-brand-deck.md +148 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/manifest.json +18 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/reference.md +180 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/requirements.txt +3 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/scripts/build_deck.py +1134 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/templates/deck-spec.json +168 -0
- skilldrop_cli/data/packs/design/skills/deck-builder/templates/palettes.json +59 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/SKILL.md +113 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/evals.json +18 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/files/1/brand/brand.json +80 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/files/1/brand/logo-white.png +0 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/files/1/brand/logo.png +0 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/evals/files/1/brand/mark.png +0 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/examples/community-health-fair.md +68 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/manifest.json +40 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/reference.md +54 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/scripts/build_flyer.py +323 -0
- skilldrop_cli/data/packs/design/skills/marketing-flyer/templates/flyer-spec.json +26 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/SKILL.md +58 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/evals/evals.json +16 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/manifest.json +11 -0
- skilldrop_cli/data/packs/design/skills/slide-outliner/templates/deck-outline.md +131 -0
- skilldrop_cli/data/packs/dev-team/loops/build/LOOP.md +80 -0
- skilldrop_cli/data/packs/dev-team/loops/build/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/loops/build/evals/evals.json +27 -0
- skilldrop_cli/data/packs/dev-team/loops/build/loop.json +48 -0
- skilldrop_cli/data/packs/dev-team/loops/release/LOOP.md +91 -0
- skilldrop_cli/data/packs/dev-team/loops/release/loop.json +47 -0
- skilldrop_cli/data/packs/dev-team/pack.json +56 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/SKILL.md +74 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/examples/login-form.md +76 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/accessibility-audit/reference.md +69 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/SKILL.md +82 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/eval_queries.json +15 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/evals.json +50 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/Makefile +5 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/alembic/versions/0001_create_bookings.py +10 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/booking/__init__.py +0 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/booking/app.py +8 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/pyproject.toml +11 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/1/tests/test_health.py +5 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/2/AGENTS.md +3 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/2/package.json +12 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/evals/files/2/src/index.ts +1 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/reference.md +89 -0
- skilldrop_cli/data/packs/dev-team/skills/agents-md-generator/templates/agents-md.md +48 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/SKILL.md +67 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/evals/evals.json +17 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/manifest.json +14 -0
- skilldrop_cli/data/packs/dev-team/skills/bug-triage/templates/bug-ticket.md +86 -0
- skilldrop_cli/data/packs/dev-team/skills/contribution-wizard/SKILL.md +134 -0
- skilldrop_cli/data/packs/dev-team/skills/contribution-wizard/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/skills/contribution-wizard/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/contribution-wizard/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/SKILL.md +143 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/evals/eval_queries.json +38 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/examples/rate-limiter-review.md +46 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/lenses/adversarial-review.md +88 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/lenses/edge-cases.md +95 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/lenses/future-proofing.md +75 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/lenses/test-coverage.md +90 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/manifest.json +14 -0
- skilldrop_cli/data/packs/dev-team/skills/devils-advocate/templates/challenge.md +118 -0
- skilldrop_cli/data/packs/dev-team/skills/feature-implement-loop/SKILL.md +88 -0
- skilldrop_cli/data/packs/dev-team/skills/feature-implement-loop/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/skills/feature-implement-loop/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/feature-implement-loop/manifest.json +14 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/SKILL.md +95 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/evals/eval_queries.json +10 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/examples/schema-change-revise.md +54 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/manifest.json +24 -0
- skilldrop_cli/data/packs/dev-team/skills/launch-readiness/templates/readiness-report.md +41 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/SKILL.md +68 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/migration-plan/templates/migration-plan.md +68 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/SKILL.md +85 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/evals/evals.json +26 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/examples/pre-merge-verdict.md +43 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/manifest.json +15 -0
- skilldrop_cli/data/packs/dev-team/skills/pre-merge-review/scripts/gate.py +189 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/SKILL.md +61 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/evals/evals.json +19 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/release-notes/templates/release-notes.md +83 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/SKILL.md +170 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/reference.md +151 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/templates/github-actions-sonar-server.yml.tmpl +50 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/templates/github-actions-sonarcloud.yml.tmpl +53 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/templates/readme-snippet.md +38 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-onboard/templates/sonar-project.properties.tmpl +31 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/SKILL.md +220 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/bugs.md +48 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/code-smells.md +64 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/coverage-and-duplication.md +74 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/security-hotspots.md +56 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/lenses/vulnerabilities.md +52 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/manifest.json +37 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/reference.md +167 -0
- skilldrop_cli/data/packs/dev-team/skills/sonar-review/templates/report.md +84 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/SKILL.md +59 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/dev-team/skills/test-plan-generator/templates/test-plan.md +83 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/SKILL.md +88 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/evals/evals.json +16 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/examples/notifications-epic.md +123 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/manifest.json +14 -0
- skilldrop_cli/data/packs/dev-team/skills/user-story-splitter/templates/story.md +40 -0
- skilldrop_cli/data/packs/experience-design/pack.json +68 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/SKILL.md +77 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/evals/evals.json +18 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/examples/parking-permit-page.md +102 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/manifest.json +41 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/scripts/readability.py +115 -0
- skilldrop_cli/data/packs/experience-design/skills/content-design/templates/content-spec.md +45 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/SKILL.md +79 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/evals/evals.json +19 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/examples/text-field-spec.md +121 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/manifest.json +46 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/reference.md +66 -0
- skilldrop_cli/data/packs/experience-design/skills/design-system-spec/templates/component-spec.md +74 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/SKILL.md +76 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/evals/evals.json +19 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/examples/payroll-app-nav.md +127 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/manifest.json +46 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/reference.md +54 -0
- skilldrop_cli/data/packs/experience-design/skills/information-architecture/templates/ia-spec.md +77 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/SKILL.md +76 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/evals/evals.json +19 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/examples/insurance-claim-blueprint.md +107 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/manifest.json +45 -0
- skilldrop_cli/data/packs/experience-design/skills/service-blueprint/templates/blueprint.md +72 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/SKILL.md +77 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/evals/evals.json +19 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/examples/team-invite-flow.md +66 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/manifest.json +41 -0
- skilldrop_cli/data/packs/experience-design/skills/ux-writing/templates/string-table.md +22 -0
- skilldrop_cli/data/packs/grc/pack.json +57 -0
- skilldrop_cli/data/packs/grc/skills/dpia/SKILL.md +123 -0
- skilldrop_cli/data/packs/grc/skills/dpia/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/grc/skills/dpia/evals/evals.json +19 -0
- skilldrop_cli/data/packs/grc/skills/dpia/examples/acme-warehouse-performance.md +159 -0
- skilldrop_cli/data/packs/grc/skills/dpia/manifest.json +47 -0
- skilldrop_cli/data/packs/grc/skills/dpia/reference.md +118 -0
- skilldrop_cli/data/packs/grc/skills/dpia/templates/dpia.md +103 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/SKILL.md +139 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/evals/evals.json +19 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/examples/northwind-register.csv +9 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/examples/northwind-register.md +127 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/manifest.json +43 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/reference.md +99 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/scripts/check_register.py +338 -0
- skilldrop_cli/data/packs/grc/skills/risk-register/templates/risk-register.csv +2 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/SKILL.md +117 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/evals/evals.json +19 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/examples/northwind-evidence-map.csv +17 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/examples/northwind-type2-security.md +127 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/manifest.json +41 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/reference.md +156 -0
- skilldrop_cli/data/packs/grc/skills/soc2-evidence-map/templates/evidence-map.csv +2 -0
- skilldrop_cli/data/packs/infra-as-code/pack.json +51 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/SKILL.md +85 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/evals/evals.json +31 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/README.md +71 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/examples/basic/main.tf +30 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/main.tf +153 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/outputs.tf +14 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/variables.tf +71 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket/versions.tf +10 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/examples/s3-log-bucket.md +50 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/manifest.json +41 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/reference.md +105 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-module/templates/module-readme.md +55 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/SKILL.md +87 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/evals/evals.json +30 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/evals/files/2/plan.json +133 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/examples/northwind-orders-plan.json +174 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/examples/northwind-orders.md +87 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/manifest.json +48 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/reference.md +77 -0
- skilldrop_cli/data/packs/infra-as-code/skills/terraform-plan-review/scripts/plan_summary.py +361 -0
- skilldrop_cli/data/packs/product-manager/loops/discover/LOOP.md +81 -0
- skilldrop_cli/data/packs/product-manager/loops/discover/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/product-manager/loops/discover/evals/evals.json +26 -0
- skilldrop_cli/data/packs/product-manager/loops/discover/loop.json +41 -0
- skilldrop_cli/data/packs/product-manager/pack.json +61 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/SKILL.md +64 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/evals/evals.json +19 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/examples/build-vs-buy-flags.md +42 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/manifest.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/business-case/templates/business-case.md +60 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/SKILL.md +59 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/evals/eval_queries.json +12 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/evals/evals.json +28 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/manifest.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/okr-cascade/templates/okr-cascade.md +46 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/SKILL.md +62 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/evals/evals.json +17 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/manifest.json +16 -0
- skilldrop_cli/data/packs/product-manager/skills/prd-draft/templates/prd.md +66 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/SKILL.md +76 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/evals/eval_queries.json +13 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/evals/evals.json +32 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/manifest.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/prfaq/templates/prfaq.md +60 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/SKILL.md +61 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/evals/evals.json +16 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/manifest.json +14 -0
- skilldrop_cli/data/packs/product-manager/skills/requirements-interview/templates/interview-kit.md +63 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/SKILL.md +63 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/evals/eval_queries.json +13 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/evals/evals.json +36 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/examples/market-entry-tows.md +42 -0
- skilldrop_cli/data/packs/product-manager/skills/strategy-analysis/manifest.json +15 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/SKILL.md +65 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/evals/evals.json +27 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/manifest.json +11 -0
- skilldrop_cli/data/packs/product-manager/skills/success-metrics/templates/metrics-plan.md +55 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/SKILL.md +65 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/evals/eval_queries.json +12 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/evals/evals.json +30 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/examples/b2b-saas-onboarding.md +69 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/manifest.json +15 -0
- skilldrop_cli/data/packs/product-manager/skills/user-journey-map/templates/journey-map.md +47 -0
- skilldrop_cli/data/packs/research/pack.json +52 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/SKILL.md +131 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/evals/evals.json +19 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/examples/conversion-drop.md +132 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/manifest.json +43 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/reference.md +107 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/scripts/ach_matrix.py +204 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/templates/hypothesis-comparison.md +61 -0
- skilldrop_cli/data/packs/research/skills/hypothesis-comparison/templates/matrix.csv +4 -0
- skilldrop_cli/data/packs/research/skills/research-plan/SKILL.md +122 -0
- skilldrop_cli/data/packs/research/skills/research-plan/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/research/skills/research-plan/evals/evals.json +28 -0
- skilldrop_cli/data/packs/research/skills/research-plan/examples/four-day-week-plan.md +97 -0
- skilldrop_cli/data/packs/research/skills/research-plan/manifest.json +47 -0
- skilldrop_cli/data/packs/research/skills/research-plan/reference.md +88 -0
- skilldrop_cli/data/packs/research/skills/research-plan/templates/research-plan.md +54 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/SKILL.md +123 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/evals/evals.json +19 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/examples/four-day-week.md +146 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/manifest.json +42 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/reference.md +92 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/scripts/citations.py +314 -0
- skilldrop_cli/data/packs/research/skills/source-synthesis/templates/synthesis.md +46 -0
- skilldrop_cli/data/packs/skill-engineering/pack.json +46 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/SKILL.md +139 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/evals/eval_queries.json +10 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/evals/evals.json +19 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/examples/release-notes-skill.md +185 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/manifest.json +42 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/reference.md +144 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/templates/eval_queries.json +9 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/templates/evals.json +16 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-author/templates/skill-template.md +52 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/SKILL.md +131 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/eval_queries.json +11 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/evals.json +19 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/files/1/skills/changelog-writer/SKILL.md +10 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/SKILL.md +12 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/references/tone.md +3 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/evals/files/1/skills/pr-summary/scripts/collect.py +6 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/examples/meeting-notes-review.md +147 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/manifest.json +50 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/reference.md +135 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/scripts/lint_skill.py +481 -0
- skilldrop_cli/data/packs/skill-engineering/skills/skill-review/templates/review.md +43 -0
- skilldrop_cli/data/packs/solution-architect/loops/design/LOOP.md +83 -0
- skilldrop_cli/data/packs/solution-architect/loops/design/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/solution-architect/loops/design/evals/evals.json +26 -0
- skilldrop_cli/data/packs/solution-architect/loops/design/loop.json +47 -0
- skilldrop_cli/data/packs/solution-architect/pack.json +65 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/SKILL.md +50 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/evals/evals.json +17 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/templates/madr.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/adr-generator/templates/nygard.md +19 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/SKILL.md +69 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/evals/evals.json +18 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/reference.md +73 -0
- skilldrop_cli/data/packs/solution-architect/skills/api-contract-draft/templates/openapi-skeleton.yaml +148 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/SKILL.md +66 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/examples/aws-three-tier.md +44 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/examples/c4-container-saas.md +51 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/examples/microservices-sequence.md +49 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/manifest.json +31 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/templates/c4-container.puml +31 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/templates/mermaid-aws.md +52 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/templates/mermaid-flowchart.md +37 -0
- skilldrop_cli/data/packs/solution-architect/skills/architecture-diagrams/templates/mermaid-sequence.md +39 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/SKILL.md +67 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/reference.md +46 -0
- skilldrop_cli/data/packs/solution-architect/skills/data-contract/templates/data-contract.md +69 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/SKILL.md +68 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/reference.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/db-schema-design/templates/schema-design.md +75 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/SKILL.md +49 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/evals/evals.json +17 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/manifest.json +14 -0
- skilldrop_cli/data/packs/solution-architect/skills/design-doc/templates/design-doc.md +98 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/SKILL.md +87 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/evals/evals.json +15 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/manifest.json +36 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/reference.md +91 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/requirements.txt +3 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/_figma_client.py +71 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/frame_to_mermaid.py +102 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/inspect_file.py +46 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/list_comments.py +35 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/scripts/post_comment.py +52 -0
- skilldrop_cli/data/packs/solution-architect/skills/figma-diagrams/templates/figjam-import.json +20 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/SKILL.md +63 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/manifest.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/reference.md +74 -0
- skilldrop_cli/data/packs/solution-architect/skills/nfr-spec/templates/nfr-spec.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/SKILL.md +103 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/evals/evals.json +16 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/reference.md +150 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/templates/description.md +52 -0
- skilldrop_cli/data/packs/solution-architect/skills/reverse-architecture/templates/extraction.md +55 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/SKILL.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/evals/evals.json +18 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/examples/queue-selection.md +41 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/tech-comparison-matrix/templates/matrix.md +45 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/SKILL.md +65 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/evals/evals.json +18 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/examples/document-upload.md +56 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/manifest.json +11 -0
- skilldrop_cli/data/packs/solution-architect/skills/threat-model/reference.md +69 -0
- skilldrop_cli/data/packs/sre-oncall/loops/operate/LOOP.md +84 -0
- skilldrop_cli/data/packs/sre-oncall/loops/operate/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/sre-oncall/loops/operate/evals/evals.json +25 -0
- skilldrop_cli/data/packs/sre-oncall/loops/operate/loop.json +41 -0
- skilldrop_cli/data/packs/sre-oncall/pack.json +59 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/SKILL.md +65 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/evals/evals.json +19 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/manifest.json +11 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/reference.md +54 -0
- skilldrop_cli/data/packs/sre-oncall/skills/capacity-cost-model/templates/cost-model.md +68 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/SKILL.md +121 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/evals/evals.json +29 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/examples/acme-aws-september.md +247 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/examples/acme-cur-2026-08-09.csv +1085 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/manifest.json +49 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/reference.md +100 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/scripts/cost_summary.py +630 -0
- skilldrop_cli/data/packs/sre-oncall/skills/cloud-cost-review/templates/cost-review.md +36 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +114 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/evals.json +28 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/deploys.csv +49 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/incidents.csv +7 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/evals/files/1/prs.csv +84 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/examples/checkout-api-8-weeks.md +123 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/examples/deployments.csv +49 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/examples/incidents.csv +7 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/examples/prs.csv +84 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +48 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/reference.md +83 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/scripts/delivery_metrics.py +566 -0
- skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/templates/delivery-report.md +31 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/SKILL.md +68 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/evals/evals.json +16 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/manifest.json +14 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/reference.md +43 -0
- skilldrop_cli/data/packs/sre-oncall/skills/incident-comms/templates/messages.md +82 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/SKILL.md +70 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/evals/evals.json +16 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/manifest.json +15 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/reference.md +67 -0
- skilldrop_cli/data/packs/sre-oncall/skills/observability-plan/templates/observability-plan.md +62 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/SKILL.md +66 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/evals/evals.json +17 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/manifest.json +14 -0
- skilldrop_cli/data/packs/sre-oncall/skills/postmortem-generator/templates/postmortem.md +67 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/SKILL.md +42 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/evals/evals.json +17 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/manifest.json +11 -0
- skilldrop_cli/data/packs/sre-oncall/skills/runbook-generator/templates/runbook.md +109 -0
- skilldrop_cli/data/packs/stakeholder-comms/pack.json +60 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/SKILL.md +74 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/evals/evals.json +15 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/manifest.json +11 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/audience-profile/reference.md +175 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/decision-log/SKILL.md +68 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/decision-log/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/decision-log/evals/evals.json +17 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/decision-log/manifest.json +11 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/SKILL.md +45 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/evals/evals.json +17 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/manifest.json +11 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/exec-summary/templates/exec-summary.md +48 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/SKILL.md +77 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/evals/evals.json +18 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/examples/local-setup-guide.md +127 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/manifest.json +11 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/templates/api-reference.md +120 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/templates/design-walkthrough.md +72 -0
- skilldrop_cli/data/packs/stakeholder-comms/skills/guide-builder/templates/setup-guide.md +109 -0
- skilldrop_cli/data/packs/trackers/pack.json +61 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/SKILL.md +116 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/evals/evals.json +30 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/evals/files/1/examples/northwind-backlog.csv +28 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/evals/files/2/issues.json +6052 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/examples/northwind-backlog.csv +28 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/examples/northwind-checkout-triage.md +202 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/manifest.json +42 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/reference.md +106 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/scripts/triage_backlog.py +461 -0
- skilldrop_cli/data/packs/trackers/skills/backlog-triage/templates/triage-report.md +42 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/SKILL.md +111 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/evals/eval_queries.json +30 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/evals/evals.json +30 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/evals/files/1/examples/northwind-week-40.csv +16 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/evals/files/2/issues.json +1212 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/examples/northwind-week-40.csv +16 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/examples/northwind-weekly-status.md +160 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/manifest.json +33 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/reference.md +92 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/scripts/status_counts.py +486 -0
- skilldrop_cli/data/packs/trackers/skills/team-status-report/templates/status-report.md +42 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/SKILL.md +116 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/eval_queries.json +34 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/evals.json +31 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/files/1/examples/prd-guest-checkout.md +53 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/files/2/examples/prd-guest-checkout.md +53 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/evals/files/2/examples/tracker-after-two-weeks.csv +30 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/examples/guest-checkout-spec.json +98 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/examples/guest-checkout-sync.md +151 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/examples/prd-guest-checkout.md +53 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/examples/tracker-after-two-weeks.csv +30 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/manifest.json +41 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/reference.md +101 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/scripts/brief_sync.py +501 -0
- skilldrop_cli/data/packs/trackers/skills/tracker-brief-sync/templates/issues-spec.json +26 -0
- skilldrop_cli/data/profiles.json +24 -0
- skilldrop_cli-0.16.3.dist-info/METADATA +91 -0
- skilldrop_cli-0.16.3.dist-info/RECORD +757 -0
- skilldrop_cli-0.16.3.dist-info/WHEEL +5 -0
- skilldrop_cli-0.16.3.dist-info/entry_points.txt +2 -0
- skilldrop_cli-0.16.3.dist-info/licenses/LICENSE +9 -0
- skilldrop_cli-0.16.3.dist-info/top_level.txt +1 -0
skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/scripts/delivery_metrics.py
ADDED
|
@@ -0,0 +1,566 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Compute DORA software delivery metrics and flow metrics from CSV exports.
|
|
3
|
+
|
|
4
|
+
Stdlib only; runs on Python 3.9+.
|
|
5
|
+
|
|
6
|
+
Inputs (CSV, header row required):
|
|
7
|
+
--deployments one row per production deployment (required)
|
|
8
|
+
--incidents one row per production incident (optional)
|
|
9
|
+
--prs one row per pull request / work item (optional)
|
|
10
|
+
|
|
11
|
+
Column contracts live in ../reference.md. Every timestamp must carry a UTC
|
|
12
|
+
offset ("Z" or "+01:00"). A timestamp without one is an error unless you pass
|
|
13
|
+
--assume-tz, and every row that needed it is counted in the report.
|
|
14
|
+
|
|
15
|
+
Usage:
|
|
16
|
+
python3 delivery_metrics.py --deployments deploys.csv \
|
|
17
|
+
[--incidents incidents.csv] [--prs prs.csv] \
|
|
18
|
+
[--service checkout-api] [--from 2026-07-06 --to 2026-08-30] \
|
|
19
|
+
[--assume-tz +00:00] [--out report.md] [--json metrics.json]
|
|
20
|
+
|
|
21
|
+
Exit codes: 0 ok, 2 bad input (missing file, missing column, bad value).
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
from __future__ import annotations
|
|
25
|
+
|
|
26
|
+
import argparse
|
|
27
|
+
import csv
|
|
28
|
+
import json
|
|
29
|
+
import math
|
|
30
|
+
import re
|
|
31
|
+
import sys
|
|
32
|
+
from datetime import date, datetime, timedelta, timezone
|
|
33
|
+
from pathlib import Path
|
|
34
|
+
|
|
35
|
+
FAILED_STATUSES = {"failed", "rolled_back", "rollback", "rolledback", "hotfixed"}
|
|
36
|
+
TRUE_VALUES = {"1", "true", "yes", "y", "t"}
|
|
37
|
+
FALSE_VALUES = {"0", "false", "no", "n", "f", ""}
|
|
38
|
+
LOW_N = 10 # below this many observations a percentile is reported but flagged
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
class InputError(Exception):
|
|
42
|
+
pass
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
# ---------------------------------------------------------------- parsing
|
|
46
|
+
|
|
47
|
+
def parse_offset(text: str) -> timezone:
|
|
48
|
+
m = re.fullmatch(r"([+-])(\d{2}):?(\d{2})", text.strip())
|
|
49
|
+
if text.strip().upper() in ("Z", "UTC"):
|
|
50
|
+
return timezone.utc
|
|
51
|
+
if not m:
|
|
52
|
+
raise InputError("--assume-tz must look like +00:00, -05:00 or Z, got %r" % text)
|
|
53
|
+
sign = 1 if m.group(1) == "+" else -1
|
|
54
|
+
return timezone(sign * timedelta(hours=int(m.group(2)), minutes=int(m.group(3))))
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class Clock:
|
|
58
|
+
"""Parses timestamps and counts the ones that needed an assumed zone."""
|
|
59
|
+
|
|
60
|
+
def __init__(self, assume_tz):
|
|
61
|
+
self.assume_tz = assume_tz
|
|
62
|
+
self.assumed = 0
|
|
63
|
+
|
|
64
|
+
def parse(self, raw, where: str):
|
|
65
|
+
if raw is None or not str(raw).strip():
|
|
66
|
+
return None
|
|
67
|
+
s = str(raw).strip()
|
|
68
|
+
if s.endswith("Z") or s.endswith("z"):
|
|
69
|
+
s = s[:-1] + "+00:00"
|
|
70
|
+
s = s.replace(" ", "T", 1) if re.match(r"\d{4}-\d{2}-\d{2} \d", s) else s
|
|
71
|
+
try:
|
|
72
|
+
dt = datetime.fromisoformat(s)
|
|
73
|
+
except ValueError:
|
|
74
|
+
raise InputError("%s: cannot parse timestamp %r (use ISO 8601, e.g. 2026-07-06T14:03:00Z)" % (where, raw))
|
|
75
|
+
if dt.tzinfo is None:
|
|
76
|
+
if self.assume_tz is None:
|
|
77
|
+
raise InputError(
|
|
78
|
+
"%s: timestamp %r has no UTC offset. Add one to the export, or rerun with "
|
|
79
|
+
"--assume-tz <offset> if you know the zone the tool wrote it in." % (where, raw))
|
|
80
|
+
self.assumed += 1
|
|
81
|
+
dt = dt.replace(tzinfo=self.assume_tz)
|
|
82
|
+
return dt.astimezone(timezone.utc)
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def parse_bool(raw, where: str):
|
|
86
|
+
s = (raw or "").strip().lower()
|
|
87
|
+
if s in TRUE_VALUES:
|
|
88
|
+
return True
|
|
89
|
+
if s in FALSE_VALUES:
|
|
90
|
+
return False
|
|
91
|
+
raise InputError("%s: expected true/false, got %r" % (where, raw))
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
def read_csv(path: Path, required: list, label: str) -> list:
|
|
95
|
+
if not path.exists():
|
|
96
|
+
raise InputError("%s file not found: %s" % (label, path))
|
|
97
|
+
with path.open(newline="", encoding="utf-8-sig") as f:
|
|
98
|
+
reader = csv.DictReader(f)
|
|
99
|
+
if not reader.fieldnames:
|
|
100
|
+
raise InputError("%s file %s is empty or has no header row" % (label, path))
|
|
101
|
+
headers = [h.strip() for h in reader.fieldnames]
|
|
102
|
+
missing = [c for c in required if c not in headers]
|
|
103
|
+
if missing:
|
|
104
|
+
raise InputError("%s file %s is missing required column(s): %s. Found: %s"
|
|
105
|
+
% (label, path, ", ".join(missing), ", ".join(headers)))
|
|
106
|
+
rows = []
|
|
107
|
+
for row in reader:
|
|
108
|
+
rows.append({(k or "").strip(): (v or "").strip() for k, v in row.items()})
|
|
109
|
+
return rows
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
# ---------------------------------------------------------------- math
|
|
113
|
+
|
|
114
|
+
def percentile(values: list, p: float):
|
|
115
|
+
"""Linear interpolation between closest ranks (same as numpy's default)."""
|
|
116
|
+
if not values:
|
|
117
|
+
return None
|
|
118
|
+
xs = sorted(values)
|
|
119
|
+
if len(xs) == 1:
|
|
120
|
+
return xs[0]
|
|
121
|
+
k = (len(xs) - 1) * p / 100.0
|
|
122
|
+
lo, hi = math.floor(k), math.ceil(k)
|
|
123
|
+
if lo == hi:
|
|
124
|
+
return xs[int(k)]
|
|
125
|
+
return xs[lo] + (xs[hi] - xs[lo]) * (k - lo)
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
def dist(hours: list) -> dict:
|
|
129
|
+
return {
|
|
130
|
+
"n": len(hours),
|
|
131
|
+
"p50_hours": rnd(percentile(hours, 50)),
|
|
132
|
+
"p85_hours": rnd(percentile(hours, 85)),
|
|
133
|
+
"p95_hours": rnd(percentile(hours, 95)),
|
|
134
|
+
"low_n": len(hours) < LOW_N,
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def rnd(x, nd=2):
|
|
139
|
+
return None if x is None else round(x, nd)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
def hours_between(a: datetime, b: datetime) -> float:
|
|
143
|
+
return (b - a).total_seconds() / 3600.0
|
|
144
|
+
|
|
145
|
+
|
|
146
|
+
def week_start(d: datetime) -> date:
|
|
147
|
+
day = d.date()
|
|
148
|
+
return day - timedelta(days=day.weekday())
|
|
149
|
+
|
|
150
|
+
|
|
151
|
+
def weeks_in(start: date, end: date) -> list:
|
|
152
|
+
out, w = [], start - timedelta(days=start.weekday())
|
|
153
|
+
while w <= end:
|
|
154
|
+
out.append(w)
|
|
155
|
+
w += timedelta(days=7)
|
|
156
|
+
return out
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
def fmt_h(h):
|
|
160
|
+
if h is None:
|
|
161
|
+
return "n/a"
|
|
162
|
+
if h < 1:
|
|
163
|
+
return "%d min" % round(h * 60)
|
|
164
|
+
if h < 48:
|
|
165
|
+
return "%.1f h" % h
|
|
166
|
+
return "%.1f d" % (h / 24.0)
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
def pct(x):
|
|
170
|
+
return "n/a" if x is None else "%.1f%%" % (x * 100)
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
# ---------------------------------------------------------------- core
|
|
174
|
+
|
|
175
|
+
def compute(args) -> dict:
|
|
176
|
+
clock = Clock(parse_offset(args.assume_tz) if args.assume_tz else None)
|
|
177
|
+
notes, quality = [], {}
|
|
178
|
+
|
|
179
|
+
dep_rows = read_csv(Path(args.deployments), ["deploy_id", "service", "deployed_at", "status"], "deployments")
|
|
180
|
+
inc_rows = read_csv(Path(args.incidents), ["incident_id", "service", "started_at", "resolved_at"], "incidents") if args.incidents else None
|
|
181
|
+
pr_rows = read_csv(Path(args.prs), ["pr_id", "opened_at", "merged_at"], "prs") if args.prs else None
|
|
182
|
+
|
|
183
|
+
services_seen = sorted({r["service"] for r in dep_rows if r["service"]})
|
|
184
|
+
svc = args.service
|
|
185
|
+
|
|
186
|
+
# ---- deployments
|
|
187
|
+
deploys, skipped_no_ts, non_prod = [], 0, 0
|
|
188
|
+
for i, r in enumerate(dep_rows, start=2):
|
|
189
|
+
where = "deployments line %d" % i
|
|
190
|
+
if svc and r["service"] != svc:
|
|
191
|
+
continue
|
|
192
|
+
env = r.get("environment", "").lower()
|
|
193
|
+
if env and env not in ("production", "prod"):
|
|
194
|
+
non_prod += 1
|
|
195
|
+
continue
|
|
196
|
+
ts = clock.parse(r["deployed_at"], where)
|
|
197
|
+
if ts is None:
|
|
198
|
+
skipped_no_ts += 1
|
|
199
|
+
continue
|
|
200
|
+
status = r["status"].lower()
|
|
201
|
+
if status not in FAILED_STATUSES and status not in ("success", "succeeded", "ok"):
|
|
202
|
+
raise InputError("%s: unknown status %r (use success, failed, rolled_back or hotfixed)" % (where, r["status"]))
|
|
203
|
+
deploys.append({
|
|
204
|
+
"id": r["deploy_id"],
|
|
205
|
+
"service": r["service"],
|
|
206
|
+
"at": ts,
|
|
207
|
+
"failed": status in FAILED_STATUSES,
|
|
208
|
+
"first_commit_at": clock.parse(r.get("first_commit_at"), where) if "first_commit_at" in r else None,
|
|
209
|
+
"recovered_at": clock.parse(r.get("recovered_at"), where) if "recovered_at" in r else None,
|
|
210
|
+
"unplanned": parse_bool(r.get("unplanned"), where) if "unplanned" in r else None,
|
|
211
|
+
"has_unplanned_col": "unplanned" in r,
|
|
212
|
+
})
|
|
213
|
+
quality["deploy_rows_read"] = len(dep_rows)
|
|
214
|
+
quality["deploy_rows_skipped_missing_deployed_at"] = skipped_no_ts
|
|
215
|
+
quality["deploy_rows_skipped_non_production"] = non_prod
|
|
216
|
+
if not deploys:
|
|
217
|
+
raise InputError("no production deployments left after filtering%s" % (" for service %r" % svc if svc else ""))
|
|
218
|
+
|
|
219
|
+
# ---- window
|
|
220
|
+
first = min(d["at"] for d in deploys).date()
|
|
221
|
+
last = max(d["at"] for d in deploys).date()
|
|
222
|
+
start = date.fromisoformat(args.date_from) if args.date_from else first
|
|
223
|
+
end = date.fromisoformat(args.date_to) if args.date_to else last
|
|
224
|
+
if end < start:
|
|
225
|
+
raise InputError("--to (%s) is before --from (%s)" % (end, start))
|
|
226
|
+
in_win = lambda dt: dt is not None and start <= dt.date() <= end
|
|
227
|
+
deploys = [d for d in deploys if in_win(d["at"])]
|
|
228
|
+
if not deploys:
|
|
229
|
+
raise InputError("no deployments fall inside %s .. %s" % (start, end))
|
|
230
|
+
days = (end - start).days + 1
|
|
231
|
+
weeks = weeks_in(start, end)
|
|
232
|
+
if days < 28:
|
|
233
|
+
notes.append("The window is %d days. Per-week rates from under four weeks are not a trend; "
|
|
234
|
+
"read them as a snapshot." % days)
|
|
235
|
+
if start.weekday() != 0 or end.weekday() != 6:
|
|
236
|
+
notes.append("The window does not start on a Monday and end on a Sunday, so the first and/or last "
|
|
237
|
+
"week in the weekly series is partial. Read their counts as lower bounds.")
|
|
238
|
+
|
|
239
|
+
by_id = {d["id"]: d for d in deploys}
|
|
240
|
+
|
|
241
|
+
# ---- incidents
|
|
242
|
+
incidents, open_inc, inc_no_start = [], 0, 0
|
|
243
|
+
if inc_rows is not None:
|
|
244
|
+
for i, r in enumerate(inc_rows, start=2):
|
|
245
|
+
where = "incidents line %d" % i
|
|
246
|
+
if svc and r["service"] != svc:
|
|
247
|
+
continue
|
|
248
|
+
st = clock.parse(r["started_at"], where)
|
|
249
|
+
if st is None:
|
|
250
|
+
inc_no_start += 1
|
|
251
|
+
continue
|
|
252
|
+
rs = clock.parse(r["resolved_at"], where)
|
|
253
|
+
if rs is not None and rs < st:
|
|
254
|
+
raise InputError("%s: resolved_at is before started_at" % where)
|
|
255
|
+
if rs is None:
|
|
256
|
+
open_inc += 1
|
|
257
|
+
incidents.append({"id": r["incident_id"], "start": st, "end": rs,
|
|
258
|
+
"deploy": r.get("caused_by_deploy", ""), "severity": r.get("severity", "")})
|
|
259
|
+
incidents = [x for x in incidents if in_win(x["start"])]
|
|
260
|
+
quality["incident_rows_read"] = len(inc_rows)
|
|
261
|
+
quality["incidents_unresolved_excluded_from_restore_time"] = open_inc
|
|
262
|
+
quality["incident_rows_skipped_missing_started_at"] = inc_no_start
|
|
263
|
+
|
|
264
|
+
# incidents linked to a deployment mark that deployment failed
|
|
265
|
+
linked = {}
|
|
266
|
+
for x in incidents:
|
|
267
|
+
if x["deploy"]:
|
|
268
|
+
if x["deploy"] in by_id:
|
|
269
|
+
by_id[x["deploy"]]["failed"] = True
|
|
270
|
+
linked.setdefault(x["deploy"], []).append(x)
|
|
271
|
+
else:
|
|
272
|
+
notes.append("Incident %s names deployment %s, which is not in the window or the deployments file."
|
|
273
|
+
% (x["id"], x["deploy"]))
|
|
274
|
+
|
|
275
|
+
# ---- deployment frequency
|
|
276
|
+
n = len(deploys)
|
|
277
|
+
per_week = {w.isoformat(): 0 for w in weeks}
|
|
278
|
+
for d in deploys:
|
|
279
|
+
per_week[week_start(d["at"]).isoformat()] = per_week.get(week_start(d["at"]).isoformat(), 0) + 1
|
|
280
|
+
deploy_days = len({d["at"].date() for d in deploys})
|
|
281
|
+
gaps = [hours_between(a["at"], b["at"]) for a, b in zip(sorted(deploys, key=lambda d: d["at"]),
|
|
282
|
+
sorted(deploys, key=lambda d: d["at"])[1:])]
|
|
283
|
+
freq = {
|
|
284
|
+
"deployments": n,
|
|
285
|
+
"days_in_window": days,
|
|
286
|
+
"per_day": rnd(n / days, 3),
|
|
287
|
+
"per_week_mean": rnd(n / (days / 7.0), 2),
|
|
288
|
+
"days_with_a_deployment": deploy_days,
|
|
289
|
+
"share_of_days_with_a_deployment": rnd(deploy_days / days, 3),
|
|
290
|
+
"median_hours_between_deployments": rnd(percentile(gaps, 50)),
|
|
291
|
+
"weekly": per_week,
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
# ---- change fail rate
|
|
295
|
+
failed = [d for d in deploys if d["failed"]]
|
|
296
|
+
fail_week = {w.isoformat(): [0, 0] for w in weeks}
|
|
297
|
+
for d in deploys:
|
|
298
|
+
k = week_start(d["at"]).isoformat()
|
|
299
|
+
fail_week.setdefault(k, [0, 0])
|
|
300
|
+
fail_week[k][1] += 1
|
|
301
|
+
if d["failed"]:
|
|
302
|
+
fail_week[k][0] += 1
|
|
303
|
+
cfr = {
|
|
304
|
+
"failed_deployments": len(failed),
|
|
305
|
+
"deployments": n,
|
|
306
|
+
"rate": rnd(len(failed) / n, 4),
|
|
307
|
+
"weekly": {k: {"failed": v[0], "deployments": v[1], "rate": rnd(v[0] / v[1], 4) if v[1] else None}
|
|
308
|
+
for k, v in fail_week.items()},
|
|
309
|
+
"failure_signal": "status in (failed, rolled_back, hotfixed) or named by an incident's caused_by_deploy",
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
# ---- failed deployment recovery time
|
|
313
|
+
rec_hours, no_recovery = [], []
|
|
314
|
+
for d in failed:
|
|
315
|
+
end_ts = d["recovered_at"]
|
|
316
|
+
if end_ts is None and d["id"] in linked:
|
|
317
|
+
ends = [x["end"] for x in linked[d["id"]]]
|
|
318
|
+
end_ts = max(ends) if all(e is not None for e in ends) else None
|
|
319
|
+
if end_ts is None:
|
|
320
|
+
no_recovery.append(d["id"])
|
|
321
|
+
continue
|
|
322
|
+
if end_ts < d["at"]:
|
|
323
|
+
raise InputError("deployment %s recovered before it was deployed" % d["id"])
|
|
324
|
+
rec_hours.append(hours_between(d["at"], end_ts))
|
|
325
|
+
fdrt = dist(rec_hours)
|
|
326
|
+
fdrt["measured_from"] = "deployed_at of the failed deployment"
|
|
327
|
+
fdrt["measured_to"] = "recovered_at on the deployment, else resolved_at of the linked incident(s)"
|
|
328
|
+
fdrt["failed_deployments_without_recovery_time"] = no_recovery
|
|
329
|
+
|
|
330
|
+
# ---- time to restore service (all incidents, the pre-2023 framing)
|
|
331
|
+
ttr = None
|
|
332
|
+
if inc_rows is not None:
|
|
333
|
+
ttr = dist([hours_between(x["start"], x["end"]) for x in incidents if x["end"] is not None])
|
|
334
|
+
ttr["incidents_in_window"] = len(incidents)
|
|
335
|
+
ttr["not_caused_by_a_deployment"] = len([x for x in incidents if not x["deploy"]])
|
|
336
|
+
|
|
337
|
+
# ---- lead time for changes
|
|
338
|
+
lead, lead_source = [], None
|
|
339
|
+
if pr_rows is not None and "deploy_id" in pr_rows[0] and "first_commit_at" in pr_rows[0]:
|
|
340
|
+
lead_source = "prs.first_commit_at -> deployed_at of prs.deploy_id"
|
|
341
|
+
unlinked = 0
|
|
342
|
+
for i, r in enumerate(pr_rows, start=2):
|
|
343
|
+
if svc and r.get("service") and r["service"] != svc:
|
|
344
|
+
continue
|
|
345
|
+
fc = clock.parse(r.get("first_commit_at"), "prs line %d" % i)
|
|
346
|
+
dep = by_id.get(r.get("deploy_id", ""))
|
|
347
|
+
if fc is None or dep is None:
|
|
348
|
+
unlinked += 1
|
|
349
|
+
continue
|
|
350
|
+
if dep["at"] < fc:
|
|
351
|
+
raise InputError("prs line %d: deployed before its first commit" % i)
|
|
352
|
+
lead.append(hours_between(fc, dep["at"]))
|
|
353
|
+
quality["prs_without_a_deploy_in_window_or_first_commit"] = unlinked
|
|
354
|
+
elif any(d["first_commit_at"] for d in deploys):
|
|
355
|
+
lead_source = "deployments.first_commit_at -> deployed_at"
|
|
356
|
+
for d in deploys:
|
|
357
|
+
if d["first_commit_at"] is not None:
|
|
358
|
+
lead.append(hours_between(d["first_commit_at"], d["at"]))
|
|
359
|
+
quality["deployments_missing_first_commit_at"] = len([d for d in deploys if d["first_commit_at"] is None])
|
|
360
|
+
lt = dist(lead) if lead_source else None
|
|
361
|
+
if lt is not None:
|
|
362
|
+
lt["source"] = lead_source
|
|
363
|
+
else:
|
|
364
|
+
notes.append("Lead time for changes not computed: give either prs.first_commit_at + prs.deploy_id, "
|
|
365
|
+
"or deployments.first_commit_at.")
|
|
366
|
+
|
|
367
|
+
# ---- deployment rework rate (optional)
|
|
368
|
+
rework = None
|
|
369
|
+
if deploys[0]["has_unplanned_col"]:
|
|
370
|
+
unpl = len([d for d in deploys if d["unplanned"]])
|
|
371
|
+
rework = {"unplanned_deployments": unpl, "deployments": n, "rate": rnd(unpl / n, 4)}
|
|
372
|
+
|
|
373
|
+
# ---- flow metrics from PRs
|
|
374
|
+
flow = None
|
|
375
|
+
if pr_rows is not None:
|
|
376
|
+
items, start_field = [], None
|
|
377
|
+
for i, r in enumerate(pr_rows, start=2):
|
|
378
|
+
where = "prs line %d" % i
|
|
379
|
+
if svc and r.get("service") and r["service"] != svc:
|
|
380
|
+
continue
|
|
381
|
+
opened = clock.parse(r["opened_at"], where)
|
|
382
|
+
if opened is None:
|
|
383
|
+
raise InputError("%s: opened_at is empty" % where)
|
|
384
|
+
fc = clock.parse(r.get("first_commit_at"), where) if "first_commit_at" in r else None
|
|
385
|
+
begun = fc if fc is not None and fc <= opened else opened
|
|
386
|
+
merged = clock.parse(r["merged_at"], where)
|
|
387
|
+
closed = clock.parse(r.get("closed_at"), where) if "closed_at" in r else None
|
|
388
|
+
done = merged or closed
|
|
389
|
+
if done is not None and done < begun:
|
|
390
|
+
raise InputError("%s: merged/closed before it was started" % where)
|
|
391
|
+
items.append({"begun": begun, "merged": merged, "done": done})
|
|
392
|
+
start_field = "earlier of first_commit_at and opened_at" if "first_commit_at" in pr_rows[0] else "opened_at"
|
|
393
|
+
merged_in = [x for x in items if x["merged"] is not None and in_win(x["merged"])]
|
|
394
|
+
thr = {w.isoformat(): 0 for w in weeks}
|
|
395
|
+
for x in merged_in:
|
|
396
|
+
k = week_start(x["merged"]).isoformat()
|
|
397
|
+
thr[k] = thr.get(k, 0) + 1
|
|
398
|
+
wip = {}
|
|
399
|
+
for w in weeks:
|
|
400
|
+
snap = datetime.combine(min(w + timedelta(days=7), end + timedelta(days=1)),
|
|
401
|
+
datetime.min.time(), tzinfo=timezone.utc)
|
|
402
|
+
wip[w.isoformat()] = len([x for x in items if x["begun"] < snap and (x["done"] is None or x["done"] >= snap)])
|
|
403
|
+
cyc = dist([hours_between(x["begun"], x["merged"]) for x in merged_in])
|
|
404
|
+
cyc["measured_from"] = start_field
|
|
405
|
+
cyc["measured_to"] = "merged_at"
|
|
406
|
+
flow = {
|
|
407
|
+
"cycle_time": cyc,
|
|
408
|
+
"throughput_merged_per_week": thr,
|
|
409
|
+
"throughput_mean_per_week": rnd(len(merged_in) / (days / 7.0), 2),
|
|
410
|
+
"wip_at_week_end": wip,
|
|
411
|
+
"abandoned_in_window": len([x for x in items if x["merged"] is None and x["done"] is not None and in_win(x["done"])]),
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
if not svc and len(services_seen) > 1:
|
|
415
|
+
notes.append("Aggregated across %d services (%s). DORA metrics are meant per application or service; "
|
|
416
|
+
"rerun with --service for each." % (len(services_seen), ", ".join(services_seen)))
|
|
417
|
+
if clock.assumed:
|
|
418
|
+
notes.append("%d timestamp(s) had no UTC offset and were read as %s (--assume-tz)." % (clock.assumed, args.assume_tz))
|
|
419
|
+
quality["timestamps_with_assumed_offset"] = clock.assumed
|
|
420
|
+
|
|
421
|
+
return {
|
|
422
|
+
"generated_for": {"service": svc or "all", "services_in_file": services_seen,
|
|
423
|
+
"from": start.isoformat(), "to": end.isoformat(),
|
|
424
|
+
"week_basis": "ISO weeks starting Monday, UTC"},
|
|
425
|
+
"dora": {
|
|
426
|
+
"deployment_frequency": freq,
|
|
427
|
+
"lead_time_for_changes": lt,
|
|
428
|
+
"change_fail_rate": cfr,
|
|
429
|
+
"failed_deployment_recovery_time": fdrt,
|
|
430
|
+
"deployment_rework_rate": rework,
|
|
431
|
+
},
|
|
432
|
+
"time_to_restore_service_all_incidents": ttr,
|
|
433
|
+
"flow": flow,
|
|
434
|
+
"data_quality": quality,
|
|
435
|
+
"notes": notes,
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
|
|
439
|
+
# ---------------------------------------------------------------- report
|
|
440
|
+
|
|
441
|
+
def dist_row(name, d, extra=""):
|
|
442
|
+
if d is None:
|
|
443
|
+
return "| %s | not computed | | | | %s |" % (name, extra)
|
|
444
|
+
flag = " (low n)" if d["low_n"] else ""
|
|
445
|
+
return "| %s | %d%s | %s | %s | %s | %s |" % (
|
|
446
|
+
name, d["n"], flag, fmt_h(d["p50_hours"]), fmt_h(d["p85_hours"]), fmt_h(d["p95_hours"]), extra)
|
|
447
|
+
|
|
448
|
+
|
|
449
|
+
def render(m: dict) -> str:
|
|
450
|
+
g, dora = m["generated_for"], m["dora"]
|
|
451
|
+
f, c = dora["deployment_frequency"], dora["change_fail_rate"]
|
|
452
|
+
out = []
|
|
453
|
+
out.append("# Delivery metrics: %s" % g["service"])
|
|
454
|
+
out.append("")
|
|
455
|
+
out.append("Window: %s to %s (%d days). Weeks: %s." % (g["from"], g["to"], f["days_in_window"], g["week_basis"]))
|
|
456
|
+
out.append("")
|
|
457
|
+
out.append("## DORA software delivery metrics")
|
|
458
|
+
out.append("")
|
|
459
|
+
out.append("| Metric | Value |")
|
|
460
|
+
out.append("|---|---|")
|
|
461
|
+
out.append("| Deployment frequency | %d deployments; %.2f per week; deployed on %d of %d days (%s) |"
|
|
462
|
+
% (f["deployments"], f["per_week_mean"], f["days_with_a_deployment"], f["days_in_window"],
|
|
463
|
+
pct(f["share_of_days_with_a_deployment"])))
|
|
464
|
+
out.append("| Change fail rate | %d of %d deployments (%s) |" % (c["failed_deployments"], c["deployments"], pct(c["rate"])))
|
|
465
|
+
rw = dora["deployment_rework_rate"]
|
|
466
|
+
out.append("| Deployment rework rate | %s |" % ("%d of %d deployments (%s)" % (rw["unplanned_deployments"], rw["deployments"], pct(rw["rate"])) if rw else "not computed (no `unplanned` column)"))
|
|
467
|
+
out.append("")
|
|
468
|
+
out.append("| Duration metric | n | p50 | p85 | p95 | Measured |")
|
|
469
|
+
out.append("|---|---|---|---|---|---|")
|
|
470
|
+
lt = dora["lead_time_for_changes"]
|
|
471
|
+
out.append(dist_row("Lead time for changes", lt, lt["source"] if lt else "needs first_commit_at"))
|
|
472
|
+
fd = dora["failed_deployment_recovery_time"]
|
|
473
|
+
out.append(dist_row("Failed deployment recovery time", fd, "failed deploy -> recovered"))
|
|
474
|
+
ttr = m["time_to_restore_service_all_incidents"]
|
|
475
|
+
out.append(dist_row("Time to restore service (all incidents)", ttr, "incident start -> resolved" if ttr else "no incidents file"))
|
|
476
|
+
out.append("")
|
|
477
|
+
if fd["failed_deployments_without_recovery_time"]:
|
|
478
|
+
out.append("Failed deployments with no recovery time recorded: %s." % ", ".join(fd["failed_deployments_without_recovery_time"]))
|
|
479
|
+
out.append("")
|
|
480
|
+
out.append("## Weekly series")
|
|
481
|
+
out.append("")
|
|
482
|
+
flow = m["flow"]
|
|
483
|
+
head = "| Week of | Deploys | Failed | Fail rate |"
|
|
484
|
+
sep = "|---|---|---|---|"
|
|
485
|
+
if flow:
|
|
486
|
+
head += " Merged | WIP at week end |"
|
|
487
|
+
sep += "---|---|"
|
|
488
|
+
out.append(head)
|
|
489
|
+
out.append(sep)
|
|
490
|
+
for wk, cnt in f["weekly"].items():
|
|
491
|
+
cw = c["weekly"].get(wk, {"failed": 0, "rate": None})
|
|
492
|
+
row = "| %s | %d | %d | %s |" % (wk, cnt, cw["failed"], pct(cw["rate"]))
|
|
493
|
+
if flow:
|
|
494
|
+
row += " %d | %d |" % (flow["throughput_merged_per_week"].get(wk, 0), flow["wip_at_week_end"].get(wk, 0))
|
|
495
|
+
out.append(row)
|
|
496
|
+
out.append("")
|
|
497
|
+
if flow:
|
|
498
|
+
cy = flow["cycle_time"]
|
|
499
|
+
out.append("## Flow")
|
|
500
|
+
out.append("")
|
|
501
|
+
out.append("| Measure | Value |")
|
|
502
|
+
out.append("|---|---|")
|
|
503
|
+
out.append("| Cycle time p50 / p85 | %s / %s (n=%d%s; %s -> merged) |" % (
|
|
504
|
+
fmt_h(cy["p50_hours"]), fmt_h(cy["p85_hours"]), cy["n"], ", low n" if cy["low_n"] else "", cy["measured_from"]))
|
|
505
|
+
out.append("| Throughput | %.2f merged per week |" % flow["throughput_mean_per_week"])
|
|
506
|
+
out.append("| Abandoned (closed unmerged) in window | %d |" % flow["abandoned_in_window"])
|
|
507
|
+
out.append("")
|
|
508
|
+
out.append("## Data quality")
|
|
509
|
+
out.append("")
|
|
510
|
+
for k, v in m["data_quality"].items():
|
|
511
|
+
out.append("- %s: %s" % (k.replace("_", " "), v))
|
|
512
|
+
if m["notes"]:
|
|
513
|
+
out.append("")
|
|
514
|
+
out.append("## Notes")
|
|
515
|
+
out.append("")
|
|
516
|
+
for n in m["notes"]:
|
|
517
|
+
out.append("- " + n)
|
|
518
|
+
out.append("")
|
|
519
|
+
out.append("Percentiles use linear interpolation between ranks. \"low n\" means fewer than %d observations." % LOW_N)
|
|
520
|
+
return "\n".join(out) + "\n"
|
|
521
|
+
|
|
522
|
+
|
|
523
|
+
def main(argv=None) -> int:
|
|
524
|
+
ap = argparse.ArgumentParser(description="DORA + flow metrics from deployment, incident and PR CSV exports.")
|
|
525
|
+
ap.add_argument("--deployments", required=True)
|
|
526
|
+
ap.add_argument("--incidents")
|
|
527
|
+
ap.add_argument("--prs")
|
|
528
|
+
ap.add_argument("--service", help="only rows for this service")
|
|
529
|
+
ap.add_argument("--from", dest="date_from", help="window start, YYYY-MM-DD (UTC, inclusive)")
|
|
530
|
+
ap.add_argument("--to", dest="date_to", help="window end, YYYY-MM-DD (UTC, inclusive)")
|
|
531
|
+
ap.add_argument("--assume-tz", help="offset for timestamps that lack one, e.g. +00:00")
|
|
532
|
+
ap.add_argument("--out", help="write the markdown report here (default: stdout)")
|
|
533
|
+
ap.add_argument("--json", help="write the metrics JSON here ('-' for stdout after the report)")
|
|
534
|
+
args = ap.parse_args(argv)
|
|
535
|
+
try:
|
|
536
|
+
for flag in ("date_from", "date_to"):
|
|
537
|
+
v = getattr(args, flag)
|
|
538
|
+
if v:
|
|
539
|
+
try:
|
|
540
|
+
date.fromisoformat(v)
|
|
541
|
+
except ValueError:
|
|
542
|
+
raise InputError("--%s must be YYYY-MM-DD, got %r" % (flag.replace("date_", ""), v))
|
|
543
|
+
m = compute(args)
|
|
544
|
+
except InputError as e:
|
|
545
|
+
print("error: %s" % e, file=sys.stderr)
|
|
546
|
+
return 2
|
|
547
|
+
report = render(m)
|
|
548
|
+
if args.out:
|
|
549
|
+
Path(args.out).parent.mkdir(parents=True, exist_ok=True)
|
|
550
|
+
Path(args.out).write_text(report, encoding="utf-8")
|
|
551
|
+
print("wrote %s" % args.out, file=sys.stderr)
|
|
552
|
+
else:
|
|
553
|
+
sys.stdout.write(report)
|
|
554
|
+
if args.json:
|
|
555
|
+
payload = json.dumps(m, indent=2)
|
|
556
|
+
if args.json == "-":
|
|
557
|
+
print(payload)
|
|
558
|
+
else:
|
|
559
|
+
Path(args.json).parent.mkdir(parents=True, exist_ok=True)
|
|
560
|
+
Path(args.json).write_text(payload + "\n", encoding="utf-8")
|
|
561
|
+
print("wrote %s" % args.json, file=sys.stderr)
|
|
562
|
+
return 0
|
|
563
|
+
|
|
564
|
+
|
|
565
|
+
if __name__ == "__main__":
|
|
566
|
+
sys.exit(main())
|
skilldrop_cli/data/packs/sre-oncall/skills/delivery-metrics-report/templates/delivery-report.md
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# Delivery metrics: <service>, <from> to <to>
|
|
2
|
+
|
|
3
|
+
**Scope:** <service>, production only, <n> weeks (ISO weeks, Monday start, UTC).
|
|
4
|
+
**Metrics:** DORA's current names (change lead time, deployment frequency, change fail rate, failed deployment recovery time, plus deployment rework rate if computed), as defined at dora.dev. Time to restore service across all incidents is shown as context, not as the DORA metric.
|
|
5
|
+
**Sources:** <deployments export, incidents export, PR export: tool and date pulled>
|
|
6
|
+
**Assumptions to confirm:** <[assumption] lines, or "none">
|
|
7
|
+
|
|
8
|
+
## Summary
|
|
9
|
+
|
|
10
|
+
<Three sentences: the trend that matters most, the week it moved, and the next thing to check.>
|
|
11
|
+
|
|
12
|
+
## Metrics
|
|
13
|
+
|
|
14
|
+
<Paste the script's DORA table, duration table, weekly series and flow table unchanged.>
|
|
15
|
+
|
|
16
|
+
## Findings
|
|
17
|
+
|
|
18
|
+
1. **<Finding as a sentence with the number and the week.>** <Evidence: which rows or weeks.> **Next check:** <the concrete thing to look at, and the skill or person who owns it.>
|
|
19
|
+
2. ...
|
|
20
|
+
|
|
21
|
+
## Data gaps
|
|
22
|
+
|
|
23
|
+
- <Each metric not computed and the column that would enable it>
|
|
24
|
+
- <Skipped rows by reason, from the data-quality section>
|
|
25
|
+
- <Low-n distributions>
|
|
26
|
+
|
|
27
|
+
## What to measure next
|
|
28
|
+
|
|
29
|
+
- <One or two changes to the exports that would make the next report better, for example "link incidents to deploy_id in the incident tool">
|
|
30
|
+
|
|
31
|
+
<Not for comparing teams: these numbers describe this service against its own history. See reference.md section 5.>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: incident-comms
|
|
3
|
+
description: Draft audience-segmented updates during a live incident — customer status-page posts, internal stakeholder updates, and exec notifications — each leading with user-facing impact, never speculative cause or ETA, always naming the next-update time. Use when an incident is in progress and the user needs a status page post, customer notification, internal update, exec brief, or the resolved/all-clear message.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# incident-comms
|
|
7
|
+
|
|
8
|
+
Produces the words you send *while the incident is still burning* — when the runbook says how to fix it and `postmortem-generator` comes after. The discipline: impact before cause, committed cadence before content, and never a claim you'd have to walk back. A walked-back update costs more trust than the silence it replaced.
|
|
9
|
+
|
|
10
|
+
## How to respond
|
|
11
|
+
|
|
12
|
+
1. **Get the three facts that gate every message.** Before drafting: **who's affected and how** (in their terms, not yours), **what's confirmed vs suspected**, and **when the next update goes out**. Ask at most 2 questions, spent on impact scope and confirmed-vs-suspected — the cadence you can set yourself. If impact is still unknown, that *is* the message ("we're investigating reports of…"), not a reason to wait.
|
|
13
|
+
|
|
14
|
+
2. **Pick the lifecycle stage** — the stage dictates structure (templates in [`templates/`](templates/)):
|
|
15
|
+
- **Acknowledge** — fastest possible "we know, we're on it, next update at HH:MM". Speed beats completeness; a 3-line ack in 5 minutes beats a perfect paragraph in 30.
|
|
16
|
+
- **Update** — what changed since last time, what's being done now, revised next-update time. Sent on the cadence *you committed to* whether or not there's news ("no change yet, still investigating, next update HH:MM" is a valid and trust-preserving update).
|
|
17
|
+
- **Resolve** — what's restored, from when, what to do if still affected, and that a postmortem will follow (for SEV1/2).
|
|
18
|
+
|
|
19
|
+
3. **Segment by audience — three messages, not one forwarded three times.** Same facts, different altitude (full guidance in [`reference.md`](reference.md)):
|
|
20
|
+
- **Customers (status page / in-app):** impact in their words, no internal jargon, no cause speculation, no name-and-blame of a vendor. ✅ *"Some users are unable to upload files. We've identified the cause and are working on a fix."*
|
|
21
|
+
- **Internal stakeholders (support, sales, account teams):** the above plus what to tell *their* customers, whether to pause comms, and the workaround if one exists — they're relaying, so arm them.
|
|
22
|
+
- **Execs:** business impact (revenue/customers/SLA exposure), the decision being asked of them if any, and what you need — not a technical narrative. Three sentences. They escalate or unblock; they don't debug.
|
|
23
|
+
|
|
24
|
+
4. **Lead with impact, in the reader's terms.** The first sentence says what the reader cannot do right now. ✅ *"Checkout is failing for about 20% of customers."* — ❌ *"We're seeing elevated 5xx rates from the payments service."* (the customer doesn't have a payments service; they have a checkout that's broken).
|
|
25
|
+
|
|
26
|
+
5. **Never ship a claim you might retract.** No speculative root cause ("this appears to be a database issue" — until it's confirmed, it isn't), no ETA you can't commit to ("fixed within the hour" sets a clock you'll be judged against), no all-clear before verification. Where pressure demands a time, commit only to the **next update time**, which is entirely in your control. State confidence honestly: "investigating" / "identified" / "monitoring a fix" / "resolved" — the standard status vocabulary, used precisely.
|
|
27
|
+
|
|
28
|
+
6. **Stay blameless and external-safe.** No individual named, no vendor blamed ("our upstream provider" not "AWS is down" until it's both confirmed and yours to disclose), nothing that becomes a screenshot you regret. Assume every internal message gets forwarded and every customer message gets posted to social media — write the one you'd stand behind there.
|
|
29
|
+
|
|
30
|
+
7. **Emit the requested message(s) ready to paste**, each with its channel labeled and the next-update timestamp filled or marked `[set HH:MM]`. When stage is "resolve", include the one-line handoff to `postmortem-generator`. Offer the matching internal/exec versions if the user asked for only one and the others clearly apply.
|
|
31
|
+
|
|
32
|
+
## Useful references in this skill
|
|
33
|
+
|
|
34
|
+
- [`reference.md`](reference.md) — per-audience altitude guide, the status vocabulary, and cadence-by-severity table
|
|
35
|
+
- [`templates/`](templates/) — paste-ready acknowledge / update / resolve messages for status page, internal, and exec channels
|
|
36
|
+
|
|
37
|
+
## Quality bar
|
|
38
|
+
|
|
39
|
+
- **First sentence is reader-facing impact**, not internal symptom. If a customer needs your architecture diagram to parse it, rewrite.
|
|
40
|
+
- **Every message names the next-update time** (or marks it `[set HH:MM]`). The cadence promise is the entire contract; an update with no next-time is a dead end.
|
|
41
|
+
- **Zero retractable claims.** No unconfirmed cause, no committed fix-ETA, no premature all-clear. The only time committed is the next update.
|
|
42
|
+
- **Three audiences are genuinely different**, not one text with words swapped. Exec version is business impact + ask; customer version is impact + action; internal version arms the relayer.
|
|
43
|
+
- **Blameless and forward-safe** — no person, no unconfirmed vendor blame, nothing you wouldn't want screenshotted.
|
|
44
|
+
- **Resolve messages tell still-affected users what to do** and promise the postmortem for SEV1/2.
|
|
45
|
+
|
|
46
|
+
## When to use this skill
|
|
47
|
+
|
|
48
|
+
- ✅ An incident is live and customers/stakeholders/execs need updating
|
|
49
|
+
- ✅ Drafting or updating a status-page post mid-incident
|
|
50
|
+
- ✅ The "what do we tell people?" moment during an outage
|
|
51
|
+
- ✅ The resolved / all-clear message and its internal + exec variants
|
|
52
|
+
|
|
53
|
+
## When NOT to use this skill
|
|
54
|
+
|
|
55
|
+
- ❌ The incident is over and you're analyzing it — that's `postmortem-generator`
|
|
56
|
+
- ❌ How to technically mitigate — that's the `runbook-generator` runbook
|
|
57
|
+
- ❌ A planned-maintenance notice (no failure, no pressure) — a normal scheduled-comms template, not this
|
|
58
|
+
- ❌ Pre-writing a generic incident-comms *policy* — this drafts live messages; the policy is a runbook section
|
|
59
|
+
|
|
60
|
+
## Anti-patterns to avoid
|
|
61
|
+
|
|
62
|
+
- ❌ **Cause speculation in a customer post.** "This appears to be related to a recent deploy" — now you've committed to a story you may have to unwind in public.
|
|
63
|
+
- ❌ **Committing to a fix ETA.** "Service will be restored by 3pm" starts a clock; miss it and the next update is an apology. Commit to the *next update time* instead.
|
|
64
|
+
- ❌ **Going silent between updates.** Skipping the cadence because "there's nothing new" reads as "they've lost control." Send the no-change update.
|
|
65
|
+
- ❌ **One message, three forwards.** Sending the engineer-language internal update straight to the status page, or the customer post to the CEO. Different readers, different altitude.
|
|
66
|
+
- ❌ **Naming a person or an unconfirmed vendor.** "Dave's deploy" / "AWS is down" — blame in a forwardable message is a permanent record of a guess.
|
|
67
|
+
- ❌ **The premature all-clear.** "Resolved" before the fix is verified across all affected paths — the second outage in one incident is the one that makes the news.
|
|
68
|
+
- ❌ **Jargon as reassurance.** "We've failed over to the secondary replica and are draining the queue" tells a customer nothing except that you've stopped speaking their language.
|