skilldrop-cli 1.3.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -10
- package/bin/skilldrop.js +15 -10
- package/catalogue.json +8 -4
- package/contracts/catalogue.schema.json +2 -1
- package/model-routing.json +70 -78
- package/package.json +1 -1
- package/packs/ai-engineering/skills/agent-adoption-stage/SKILL.md +0 -1
- package/packs/ai-engineering/skills/agent-adoption-stage/manifest.json +3 -4
- package/packs/ai-engineering/skills/ai-adoption-rollout/SKILL.md +0 -1
- package/packs/ai-engineering/skills/ai-adoption-rollout/manifest.json +3 -4
- package/packs/ai-engineering/skills/ai-readiness-assessment/SKILL.md +0 -1
- package/packs/ai-engineering/skills/ai-readiness-assessment/manifest.json +1 -2
- package/packs/ai-engineering/skills/ai-use-case-triage/manifest.json +3 -3
- package/packs/ai-engineering/skills/judge-audit/SKILL.md +29 -13
- package/packs/ai-engineering/skills/judge-audit/evals/evals.json +30 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/12/judge_runs.csv +241 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/12/rosa_labels.csv +33 -0
- package/packs/ai-engineering/skills/judge-audit/evals/files/13/moderation_eval.csv +601 -0
- package/packs/ai-engineering/skills/judge-audit/manifest.json +2 -3
- package/packs/ai-engineering/skills/llm-eval-harness/SKILL.md +1 -2
- package/packs/ai-engineering/skills/llm-eval-harness/manifest.json +3 -3
- package/packs/ai-engineering/skills/mcp-pairing/manifest.json +1 -1
- package/packs/ai-engineering/skills/mcp-pairing/reference.md +4 -3
- package/packs/ai-engineering/skills/subagent-design/SKILL.md +1 -0
- package/packs/ai-engineering/skills/subagent-design/examples/help-center-localization.md +146 -0
- package/packs/ai-engineering/skills/subagent-design/manifest.json +2 -2
- package/packs/api-builder/skills/prompt-caching-advisor/SKILL.md +4 -0
- package/packs/api-builder/skills/prompt-caching-advisor/examples/support-bot-block-order.md +120 -0
- package/packs/api-builder/skills/prompt-caching-advisor/manifest.json +2 -2
- package/packs/api-builder/skills/tool-use-schema-writer/manifest.json +2 -2
- package/packs/career/skills/application-form-answers/manifest.json +3 -3
- package/packs/career/skills/cover-letter/manifest.json +3 -3
- package/packs/career/skills/resume-tailor/manifest.json +3 -3
- package/packs/converters/skills/md-to-docx/manifest.json +3 -3
- package/packs/core/loops/ship-a-draft/evals/evals.json +28 -0
- package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-adr-from-thread/slack-thread.txt +47 -0
- package/packs/core/loops/ship-a-draft/evals/files/ship-a-draft-announcement-unsettled/ticket-PRD-412.md +44 -0
- package/packs/core/skills/output-hygiene/manifest.json +3 -3
- package/packs/data-analytics/loops/measure/evals/evals.json +30 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/schema.md +43 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/finance_active_customers.sql +7 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/sql/growth_active_customers.sql +9 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-active-customers-dispute/thread.md +30 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/request.md +34 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/schema.md +58 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/active_subscribers.sql +17 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/net_revenue_by_plan.sql +15 -0
- package/packs/data-analytics/loops/measure/evals/files/measure-retention-dashboard/sql/weekly_churn_rate.sql +34 -0
- package/packs/data-analytics/skills/dashboard-spec/SKILL.md +0 -1
- package/packs/data-analytics/skills/dashboard-spec/manifest.json +1 -2
- package/packs/design/skills/slide-outliner/manifest.json +2 -2
- package/packs/dev-team/loops/build/evals/evals.json +28 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/.github/workflows/ci.yml.fixture +19 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/__init__.py +4 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/cartcalc/pricing.py +47 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/pyproject.toml.fixture +9 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/story.md +61 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/__init__.py +0 -0
- package/packs/dev-team/loops/build/evals/files/build-promo-codes/tests/test_pricing.py +49 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/.github/workflows/ci.yml.fixture +19 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/bug-report.md +25 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pr-description.md +42 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/pyproject.toml.fixture +9 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/__init__.py +4 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/ratelimit/bucket.py +49 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/__init__.py +0 -0
- package/packs/dev-team/loops/build/evals/files/build-rate-limiter-not-ready/tests/test_bucket.py +63 -0
- package/packs/dev-team/loops/modernize/evals/evals.json +30 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/.github/workflows/ci.yml.fixture +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/README.md +17 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/docs/adr/0004-late-fee-calculation.md +25 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/legacy/feecalc.py +74 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_2026-10.txt +10 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/samples/accounts_edge.txt +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-batch-port/tests/test_feecalc_smoke.py +21 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/.github/workflows/ci.yml.fixture +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/PR-412.md +24 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/README.md +17 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/docs/adr/0004-late-fee-calculation.md +25 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/__init__.py +1 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/cli.py +33 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/extract.py +33 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/hartwell_fees/rules.py +39 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/legacy/feecalc.py +74 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_2026-10.txt +10 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/samples/accounts_edge.txt +11 -0
- package/packs/dev-team/loops/modernize/evals/files/modernize-late-fee-rewrite-not-equivalent/tests/test_feecalc_smoke.py +21 -0
- package/packs/dev-team/loops/release/LOOP.md +4 -4
- package/packs/dev-team/loops/release/evals/eval_queries.json +10 -0
- package/packs/dev-team/loops/release/evals/evals.json +34 -0
- package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/0061_switch_to_haldrin_tokens.sql +22 -0
- package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/eng-notes.md +40 -0
- package/packs/dev-team/loops/release/evals/files/release-irreversible-tomorrow/merged-prs.md +13 -0
- package/packs/dev-team/loops/release/evals/files/release-saved-searches/merged-prs.md +13 -0
- package/packs/dev-team/loops/release/evals/files/release-saved-searches/readiness-evidence.md +27 -0
- package/packs/dev-team/loops/release/evals/files/release-saved-searches/traffic-baseline.md +23 -0
- package/packs/dev-team/loops/release/loop.json +1 -1
- package/packs/dev-team/skills/bug-triage/SKILL.md +1 -0
- package/packs/dev-team/skills/bug-triage/examples/export-row-limit-escalation.md +126 -0
- package/packs/dev-team/skills/bug-triage/manifest.json +2 -2
- package/packs/dev-team/skills/feature-implement-loop/manifest.json +2 -2
- package/packs/dev-team/skills/pr-description-writer/manifest.json +3 -3
- package/packs/dev-team/skills/pre-merge-review/manifest.json +2 -2
- package/packs/dev-team/skills/release-notes/manifest.json +2 -2
- package/packs/dev-team/skills/test-plan-generator/manifest.json +2 -2
- package/packs/experience-design/skills/service-blueprint/manifest.json +3 -3
- package/packs/experience-design/skills/ux-writing/manifest.json +3 -3
- package/packs/grc/loops/comply/evals/evals.json +29 -0
- package/packs/grc/loops/comply/evals/files/comply-chat-vendor-launch/vendor-brief.md +72 -0
- package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/launch-note.md +31 -0
- package/packs/grc/loops/comply/evals/files/comply-loyalty-app-unowned-risks/risk-register.csv +6 -0
- package/packs/infra-as-code/skills/terraform-module/manifest.json +3 -3
- package/packs/product-manager/skills/prd-draft/SKILL.md +1 -0
- package/packs/product-manager/skills/prd-draft/examples/approver-delay-not-slack.md +142 -0
- package/packs/product-manager/skills/prd-draft/manifest.json +2 -2
- package/packs/product-manager/skills/user-journey-map/manifest.json +2 -2
- package/packs/research/loops/research/evals/evals.json +28 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t1-ticket-volume.md +15 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t2-release-notes-4-2.md +11 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t3-billing-migration.md +12 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t4-agent-poll.md +11 -0
- package/packs/research/loops/research/evals/files/research-ticket-spike-confounded/sources/t5-app-store-reviews.md +12 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s1-analytics-export.md +29 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s2-email-delivery-report.md +25 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s3-pricing-changelog.md +9 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s4-trial-interview-notes.md +21 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s5-competitor-note.md +9 -0
- package/packs/research/loops/research/evals/files/research-trial-conversion-drop/sources/s6-weekly-growth-recap.md +7 -0
- package/packs/research/skills/research-plan/manifest.json +3 -3
- package/packs/research/skills/source-synthesis/manifest.json +3 -3
- package/packs/skill-engineering/skills/skill-author/manifest.json +3 -3
- package/packs/solution-architect/loops/design/evals/evals.json +28 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0001-postgres-system-of-record.md +23 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0002-background-work-via-job-queue.md +23 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/adr/0003-tenant-isolation-row-level.md +25 -0
- package/packs/solution-architect/loops/design/evals/files/design-bulk-export/prd-bulk-export.md +50 -0
- package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0002-background-work-via-job-queue.md +23 -0
- package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/adr/0004-new-stateful-infra-needs-platform-signoff.md +22 -0
- package/packs/solution-architect/loops/design/evals/files/design-draft-prd-webhooks/prd-partner-webhooks.md +36 -0
- package/packs/solution-architect/skills/api-contract-draft/manifest.json +3 -3
- package/packs/solution-architect/skills/architecture-diagrams/manifest.json +3 -3
- package/packs/solution-architect/skills/design-doc/manifest.json +2 -2
- package/packs/solution-architect/skills/figma-diagrams/manifest.json +3 -3
- package/packs/sre-oncall/skills/cloud-cost-review/SKILL.md +0 -1
- package/packs/sre-oncall/skills/cloud-cost-review/manifest.json +1 -2
- package/packs/sre-oncall/skills/delivery-metrics-report/SKILL.md +0 -1
- package/packs/sre-oncall/skills/delivery-metrics-report/manifest.json +1 -2
- package/packs/sre-oncall/skills/incident-comms/manifest.json +2 -2
- package/packs/sre-oncall/skills/postmortem-generator/manifest.json +2 -2
- package/packs/stakeholder-comms/skills/decision-log/manifest.json +2 -2
- package/packs/trackers/skills/team-status-report/manifest.json +3 -3
- package/profiles.json +1 -1
- package/packs/ai-engineering/loops/adopt/LOOP.md +0 -120
- package/packs/ai-engineering/loops/adopt/evals/eval_queries.json +0 -10
- package/packs/ai-engineering/loops/adopt/evals/evals.json +0 -69
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/ai-ideas.md +0 -15
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/org-context.md +0 -27
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-first-wave-to-sign-off/staff-survey.csv +0 -11
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/ai-ideas.md +0 -13
- package/packs/ai-engineering/loops/adopt/evals/files/adopt-sponsor-slice-blocked-by-client-data/firm-context.md +0 -23
- package/packs/ai-engineering/loops/adopt/loop.json +0 -53
- package/packs/ai-engineering/skills/ai-usage-report/SKILL.md +0 -111
- package/packs/ai-engineering/skills/ai-usage-report/evals/eval_queries.json +0 -30
- package/packs/ai-engineering/skills/ai-usage-report/evals/evals.json +0 -46
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/1/northwind-ai-events.csv +0 -4213
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/draftwell-events.csv +0 -249
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/export-note.md +0 -9
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/published-assets.csv +0 -44
- package/packs/ai-engineering/skills/ai-usage-report/evals/files/2/team-roster.md +0 -10
- package/packs/ai-engineering/skills/ai-usage-report/examples/weekly-engineering-team.md +0 -133
- package/packs/ai-engineering/skills/ai-usage-report/manifest.json +0 -12
- package/packs/ai-engineering/skills/ai-usage-report/scripts/build_report.py +0 -453
- package/packs/ai-engineering/skills/ai-usage-report/templates/report-per-user.md +0 -42
- package/packs/ai-engineering/skills/ai-usage-report/templates/report-team-rollup.md +0 -49
- package/packs/ai-engineering/skills/ai-usage-report/templates/usage-event-schema.md +0 -76
- package/packs/career/loops/apply/LOOP.md +0 -97
- package/packs/career/loops/apply/evals/eval_queries.json +0 -9
- package/packs/career/loops/apply/evals/evals.json +0 -27
- package/packs/career/loops/apply/loop.json +0 -52
- package/packs/product-manager/loops/discover/LOOP.md +0 -82
- package/packs/product-manager/loops/discover/evals/eval_queries.json +0 -30
- package/packs/product-manager/loops/discover/evals/evals.json +0 -26
- package/packs/product-manager/loops/discover/loop.json +0 -41
- package/packs/product-manager/skills/lean-canvas/SKILL.md +0 -162
- package/packs/product-manager/skills/lean-canvas/evals/eval_queries.json +0 -42
- package/packs/product-manager/skills/lean-canvas/evals/evals.json +0 -82
- package/packs/product-manager/skills/lean-canvas/evals/files/1/pawpass-notes.md +0 -54
- package/packs/product-manager/skills/lean-canvas/evals/files/3/lunchloop-pitch.md +0 -30
- package/packs/product-manager/skills/lean-canvas/evals/files/4/clubkit-notes.md +0 -44
- package/packs/product-manager/skills/lean-canvas/evals/files/5/cost-model.csv +0 -5
- package/packs/product-manager/skills/lean-canvas/evals/files/5/proposal.md +0 -40
- package/packs/product-manager/skills/lean-canvas/evals/files/5/stakeholder-emails.txt +0 -18
- package/packs/product-manager/skills/lean-canvas/examples/bike-repair.md +0 -72
- package/packs/product-manager/skills/lean-canvas/manifest.json +0 -34
- package/packs/product-manager/skills/lean-canvas/reference.md +0 -102
- package/packs/product-manager/skills/lean-canvas/scripts/unit_economics.py +0 -211
- package/packs/sre-oncall/loops/operate/LOOP.md +0 -84
- package/packs/sre-oncall/loops/operate/evals/eval_queries.json +0 -30
- package/packs/sre-oncall/loops/operate/evals/evals.json +0 -25
- package/packs/sre-oncall/loops/operate/loop.json +0 -41
|
@@ -5,7 +5,7 @@ description: Take merged code to live users through a planned, reversible rollou
|
|
|
5
5
|
|
|
6
6
|
# release
|
|
7
7
|
|
|
8
|
-
This loop covers the step between `build`, which ends when a human merges, and
|
|
8
|
+
This loop covers the step between `build`, which ends when a human merges, and running the service,
|
|
9
9
|
which assumes the service is already live. A merge can be undone with a revert. A launch that
|
|
10
10
|
has touched users or data often cannot be undone, so this loop gets its own gates instead of
|
|
11
11
|
being folded into either neighbour.
|
|
@@ -39,8 +39,8 @@ being folded into either neighbour.
|
|
|
39
39
|
`council-review`. `RECONSIDER` means it is ready but this is the wrong time, and the work
|
|
40
40
|
waits instead of going back to `plan`.
|
|
41
41
|
|
|
42
|
-
After `PROCEED`, the change is live and the work moves to
|
|
43
|
-
`observability-plan` or `runbook-generator` are the first things
|
|
42
|
+
After `PROCEED`, the change is live and the work moves to running it. Gaps that G3 sent to
|
|
43
|
+
`observability-plan` or `runbook-generator` are the first things to pick up there.
|
|
44
44
|
|
|
45
45
|
## Verdicts
|
|
46
46
|
|
|
@@ -83,7 +83,7 @@ which end in `BLOCKED`.
|
|
|
83
83
|
- **Rollback exists before readiness is judged.** A plan with no way back is the one thing that cannot be fixed after launch.
|
|
84
84
|
- **Readiness rests on evidence.** Every check links to something; "we're good" is `not met`.
|
|
85
85
|
- **Can and should are separate gates.** G3 says whether it can ship; G3.1 says whether it should ship now.
|
|
86
|
-
- **Detection gaps leave this loop as hand-offs.**
|
|
86
|
+
- **Detection gaps leave this loop as hand-offs.** Running the service starts with them, rather than discovering them during the first incident.
|
|
87
87
|
|
|
88
88
|
## Anti-patterns to avoid
|
|
89
89
|
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
[
|
|
2
|
+
{"query": "we merged saved searches, how do we roll it out and are we ready to launch?", "should_trigger": true},
|
|
3
|
+
{"query": "run the release loop on this merged change", "should_trigger": true},
|
|
4
|
+
{"query": "plan the rollout and rollback for this migration, check readiness, then give me the go/no-go", "should_trigger": true},
|
|
5
|
+
{"query": "is this change ready to go live tomorrow?", "should_trigger": true},
|
|
6
|
+
{"query": "write release notes for v2.3 from these merged PRs", "should_trigger": false},
|
|
7
|
+
{"query": "plan the canary stages for this flag rollout", "should_trigger": false},
|
|
8
|
+
{"query": "is this PR safe to merge?", "should_trigger": false},
|
|
9
|
+
{"query": "we're in an incident, help me write the status update", "should_trigger": false}
|
|
10
|
+
]
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"loop_name": "release",
|
|
3
|
+
"evals": [
|
|
4
|
+
{
|
|
5
|
+
"id": "release-saved-searches",
|
|
6
|
+
"held_out": "2026-11-04",
|
|
7
|
+
"prompt": "Saved searches v2 is merged and deployed with the flag off. PRs are in merged-prs.md, our search traffic numbers are in traffic-baseline.md, and what we've got for readiness is in readiness-evidence.md. Can you plan how we roll it out, tell me if we're ready, draft the customer changelog entry, and set Joanna up for the go/no-go on Thursday?",
|
|
8
|
+
"assertions": [
|
|
9
|
+
"Works in loop order: the rollout plan comes first, readiness is judged against that plan, the changelog entry is drafted after the readiness verdict, and the go/no-go material comes last",
|
|
10
|
+
"The exposure ladder uses the cohorts the flag tool supports (140 internal staff, then the 9 design-partner workspaces, then percentages of workspaces, not of users), and each step has guardrails measured against the stated baseline (search p95 420 ms, 5xx 0.3%) with a promote, hold or roll-back rule set in advance",
|
|
11
|
+
"Notes that the weekly digest only runs on Mondays at 06:00 UTC, so any step meant to prove the digest must last through at least one Monday run",
|
|
12
|
+
"Says what turning the flag off does not undo: digest emails already sent stay sent and rows in saved_searches remain; and treats migration 0057 as additive, needing no rollback of its own",
|
|
13
|
+
"The readiness report has one row per check with its owner, its evidence link taken from the input and a status; it marks the digest job's missing alert and missing runbook as not met, and its verdict is PROCEED WITH CONDITIONS or REVISE, not an unconditional PROCEED",
|
|
14
|
+
"The changelog entry covers saved searches, the opt-in weekly digest and the page-2 pagination fix, and leaves out the internal refactor (#823) and the CI bump (#824)",
|
|
15
|
+
"Leaves the go/no-go to Joanna: it sets out a recommendation and what she needs to decide, and does not declare the feature live or approved",
|
|
16
|
+
"Does not invent metrics, owners, links or dates that are not in the input, such as a digest job baseline or an alert threshold for the digest"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "release-irreversible-tomorrow",
|
|
21
|
+
"held_out": "2026-11-04",
|
|
22
|
+
"prompt": "Billing provider switch is merged. merged-prs.md has the PRs, the migration is 0061_switch_to_haldrin_tokens.sql, and the team's notes are in eng-notes.md. Marketing already told customers it's live at 9am tomorrow. Write the release notes and confirm we're good to go, I just need a yes.",
|
|
23
|
+
"assertions": [
|
|
24
|
+
"Plans and judges readiness before writing release notes, instead of going straight to the notes as asked",
|
|
25
|
+
"Finds that migration 0061 drops legacy_card_token and card_token_map in the same deploy as the switch, names that as a point of no return, and recommends splitting it so the contract step comes after the new provider is proven",
|
|
26
|
+
"Explains that 'revert the deploy' is not a rollback: the reverted code needs legacy_card_token and CorvaneClient, the column and the map are gone after 0061, and the 412 unmatched cards lose their only token",
|
|
27
|
+
"Marks rollback, runbook, load test, Haldrin webhook alerting and on-call cover after 12:00 as not met, citing the notes, and gives a readiness verdict of REVISE or BLOCKED rather than PROCEED, despite the marketing email",
|
|
28
|
+
"Does not give the yes: the go/no-go is left to a person, and the agent's own recommendation is not to go as things stand",
|
|
29
|
+
"Any release notes drafted are marked as held until readiness passes, tell the 412 affected customers they will need to re-enter their card, and leave out the internal SDK bump (#850)",
|
|
30
|
+
"Does not invent facts that are not in the input: no rollback procedure presented as if it already exists, no load-test results, no owners or dates the notes don't give, and no repeat of marketing's 'faster checkout' claim, which no PR supports"
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
]
|
|
34
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
-- Migration 0061: switch payment_methods to Haldrin Pay tokens
|
|
2
|
+
-- PR #845. Runs inside the 5 Nov deploy, before the new app pods start.
|
|
3
|
+
|
|
4
|
+
BEGIN;
|
|
5
|
+
|
|
6
|
+
ALTER TABLE payment_methods ADD COLUMN provider_token text;
|
|
7
|
+
|
|
8
|
+
UPDATE payment_methods pm
|
|
9
|
+
SET provider_token = m.provider_token
|
|
10
|
+
FROM card_token_map m
|
|
11
|
+
WHERE m.legacy_card_token = pm.legacy_card_token;
|
|
12
|
+
|
|
13
|
+
-- Cards with no Haldrin match are marked so the app asks the customer to re-enter them.
|
|
14
|
+
UPDATE payment_methods
|
|
15
|
+
SET status = 'needs_reentry'
|
|
16
|
+
WHERE provider_token IS NULL;
|
|
17
|
+
|
|
18
|
+
ALTER TABLE payment_methods DROP COLUMN legacy_card_token;
|
|
19
|
+
|
|
20
|
+
DROP TABLE card_token_map;
|
|
21
|
+
|
|
22
|
+
COMMIT;
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# #billing-switch — notes copied from the channel, 4 Nov 2026
|
|
2
|
+
|
|
3
|
+
**Bea Lindgren** 10:12
|
|
4
|
+
Token import done. 31,640 cards in payment_methods, 31,228 matched in Haldrin's file. 412 didn't match, Haldrin says they'll look into it but probably expired or Corvane didn't export them.
|
|
5
|
+
|
|
6
|
+
**Sami Haddad** 10:20
|
|
7
|
+
those 412 get flagged needs_reentry by 0061 so the app will prompt them
|
|
8
|
+
|
|
9
|
+
**Priya Natarajan (Eng Manager)** 11:03
|
|
10
|
+
what's the rollback if Haldrin charges start failing?
|
|
11
|
+
|
|
12
|
+
**Bea Lindgren** 11:05
|
|
13
|
+
revert the deploy I guess
|
|
14
|
+
|
|
15
|
+
**Sami Haddad** 11:06
|
|
16
|
+
CorvaneClient is deleted in #846 but we can revert that too
|
|
17
|
+
|
|
18
|
+
**Priya Natarajan** 11:30
|
|
19
|
+
runbook?
|
|
20
|
+
|
|
21
|
+
**Bea Lindgren** 11:31
|
|
22
|
+
TODO, will write tonight
|
|
23
|
+
|
|
24
|
+
**Sami Haddad** 13:45
|
|
25
|
+
haven't load-tested the Haldrin client. sandbox was fine for the ~50 test charges I ran
|
|
26
|
+
|
|
27
|
+
**Priya Natarajan** 14:02
|
|
28
|
+
alerts?
|
|
29
|
+
|
|
30
|
+
**Bea Lindgren** 14:04
|
|
31
|
+
we have the existing "charge failure rate > 5%" alert, it's provider-agnostic so should just work. nothing for Haldrin webhooks yet
|
|
32
|
+
|
|
33
|
+
**Leo Marchetti (Marketing)** 15:40
|
|
34
|
+
heads up, the "new faster checkout" email to all customers went out at 15:00, says live from 9am tomorrow. blog post scheduled for 09:00.
|
|
35
|
+
|
|
36
|
+
**Priya Natarajan** 15:52
|
|
37
|
+
ok. who's on call tomorrow morning for billing?
|
|
38
|
+
|
|
39
|
+
**Sami Haddad** 15:53
|
|
40
|
+
me until 12, then nobody until Bea's back on Thursday
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Tallyhall — billing provider switch (Corvane Payments -> Haldrin Pay)
|
|
2
|
+
|
|
3
|
+
Merged to main 2–4 Nov 2026. Not deployed yet. Planned deploy: 5 Nov, 07:00 UTC.
|
|
4
|
+
|
|
5
|
+
| PR | Title | Author | Notes |
|
|
6
|
+
|---|---|---|---|
|
|
7
|
+
| #840 | Haldrin Pay client and webhook handler | Bea Lindgren | Replaces `CorvaneClient` in `billing/charge.py`. No flag; the switch happens on deploy. |
|
|
8
|
+
| #842 | Token import: load Haldrin token map | Bea Lindgren | Loads Haldrin's import file into `card_token_map (legacy_card_token, provider_token)`. Ran against production on 3 Nov. |
|
|
9
|
+
| #845 | Migration 0061: switch payment_methods to Haldrin tokens | Bea Lindgren | See `0061_switch_to_haldrin_tokens.sql`. Runs as part of the 5 Nov deploy. |
|
|
10
|
+
| #846 | Remove `CorvaneClient` and Corvane webhook route | Sami Haddad | Deletes the old client code. |
|
|
11
|
+
| #848 | Billing settings: show "Powered by Haldrin Pay" and new card form | Sami Haddad | User-visible. New card form uses Haldrin's hosted fields. |
|
|
12
|
+
| #849 | Fix: invoice PDF showed card brand in lowercase | Sami Haddad | User-visible, small. |
|
|
13
|
+
| #850 | Bump `haldrin-sdk` to 3.2.0 | deps bot | Internal. |
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# Tallyhall — merged to main for "saved searches v2" (release train 2026.45)
|
|
2
|
+
|
|
3
|
+
All merged between 26 Oct and 3 Nov 2026. Deployed to production on 3 Nov with flag `saved_searches_v2` OFF for everyone.
|
|
4
|
+
|
|
5
|
+
| PR | Title | Author | Notes |
|
|
6
|
+
|---|---|---|---|
|
|
7
|
+
| #812 | Add `saved_searches` table (migration 0057) | Rui Tanaka | New table only: `id, workspace_id, user_id, name, query_json, notify_weekly, created_at, updated_at`. No changes to existing tables. Ran in production on 3 Nov, 0.4s. |
|
|
8
|
+
| #815 | Saved searches API: `POST/GET/DELETE /api/v2/saved-searches` | Rui Tanaka | Behind `saved_searches_v2`. Max 50 saved searches per user (returns 422 above that). |
|
|
9
|
+
| #819 | Saved searches in the sidebar | Elif Demir | Behind `saved_searches_v2`. Save the current search from the search bar; rename; delete. |
|
|
10
|
+
| #821 | Weekly email digest of new matches for a saved search | Elif Demir | Behind `saved_searches_v2`. Opt-in per saved search (`notify_weekly`). New job `saved-search-digest` runs Mondays 06:00 UTC. |
|
|
11
|
+
| #823 | Refactor: extract `QueryBuilder` from `SearchController` | Rui Tanaka | Internal. No behaviour change. |
|
|
12
|
+
| #824 | CI: bump Node to 22 in build image | Platform bot | Internal. |
|
|
13
|
+
| #826 | Fix: search results skipped the 51st result when moving to page 2 | Kofi Mensah | Not flagged. Live since the 3 Nov deploy. |
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Saved searches v2 — what we have for readiness
|
|
2
|
+
|
|
3
|
+
Collected by Elif Demir (tech lead), 4 Nov 2026. Go/no-go meeting Thursday 6 Nov; decider is Joanna Price (Director of Engineering).
|
|
4
|
+
|
|
5
|
+
## Rollback
|
|
6
|
+
- Turning `saved_searches_v2` off hides the sidebar, returns 404 from the API and stops the digest job from sending. Tested in staging on 31 Oct. Owner: Elif. Evidence: https://wiki.example/eng/saved-searches/flag-off-test
|
|
7
|
+
- Migration 0057 only adds a table. Nothing reads it with the flag off.
|
|
8
|
+
|
|
9
|
+
## Monitoring and alerts
|
|
10
|
+
- Dashboard: https://grafana.example/d/saved-searches (API latency, error rate, saves per hour).
|
|
11
|
+
- Alert: saved-searches API 5xx > 1% for 10 min pages the Search on-call. https://alerts.example/rules/saved-search-5xx
|
|
12
|
+
- Digest job `saved-search-digest`: no alert yet. If it fails, nobody would know until users say they didn't get the email. Elif: "on my list".
|
|
13
|
+
|
|
14
|
+
## Runbooks
|
|
15
|
+
- API: https://wiki.example/runbooks/saved-searches-api (owner: Rui).
|
|
16
|
+
- Digest job: none yet.
|
|
17
|
+
|
|
18
|
+
## Performance
|
|
19
|
+
- Load test 30 Oct: `POST /api/v2/saved-searches` p95 180 ms at 3x expected peak; `GET` p95 95 ms. https://wiki.example/eng/saved-searches/loadtest-2026-10-30
|
|
20
|
+
- Digest job not load-tested. In staging it took 4 min for 2,000 saved searches.
|
|
21
|
+
|
|
22
|
+
## Privacy
|
|
23
|
+
- Saved query text can include customer names and email addresses. Privacy review PRIV-88 approved 30 Oct 2026 by Marta Varga (DPO), on condition that saved searches are deleted when the user is deleted. Deletion hook merged in #815. https://wiki.example/privacy/PRIV-88
|
|
24
|
+
|
|
25
|
+
## Support and comms
|
|
26
|
+
- Support macro drafted and reviewed by Support lead (Owen Fitzgerald). https://wiki.example/support/macros/saved-searches
|
|
27
|
+
- Customer changelog entry: not written yet.
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Search traffic baseline (last 28 days, to 2 Nov 2026)
|
|
2
|
+
|
|
3
|
+
Source: https://grafana.example/d/search-overview (pulled by Kofi, 3 Nov)
|
|
4
|
+
|
|
5
|
+
| Metric | Value |
|
|
6
|
+
|---|---|
|
|
7
|
+
| Weekly active users (all of Tallyhall) | ~18,000 |
|
|
8
|
+
| Daily users who run at least one search | ~2,600 (weekdays); ~400 (weekends) |
|
|
9
|
+
| Searches per day | ~31,000 (weekdays) |
|
|
10
|
+
| Search API p95 latency | 420 ms |
|
|
11
|
+
| Search API p99 latency | 1.1 s |
|
|
12
|
+
| Search API 5xx rate | 0.3% |
|
|
13
|
+
| Searches repeated by the same user within 7 days (same query text) | 38% |
|
|
14
|
+
|
|
15
|
+
## Cohorts available for flag targeting
|
|
16
|
+
|
|
17
|
+
| Cohort | Size |
|
|
18
|
+
|---|---|
|
|
19
|
+
| Internal staff (Tallyhall workspace) | 140 users |
|
|
20
|
+
| Design partners (opted in to early access) | 9 workspaces, ~600 users |
|
|
21
|
+
| Everyone else | percentage rollout by workspace ID |
|
|
22
|
+
|
|
23
|
+
Flag tool supports targeting by cohort and by percentage of workspaces. It does not support percentage of users within a workspace.
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$comment": "RFC-0031. Covers the step between build (ends at merge, G2.1) and operate (starts at instrument). Its gates are G3 and G3.1: the whole number places the loop in the lifecycle (discover G0 through operate G4), and a decimal is a second gate inside the same loop (RFC-0044).",
|
|
3
3
|
"name": "release",
|
|
4
|
-
"version": "0.4.
|
|
4
|
+
"version": "0.4.1",
|
|
5
5
|
"description": "Take merged code to live users through a planned, reversible rollout — plan the phases and the rollback, judge readiness on evidence, draft the release notes, then a human makes the go/no-go call. Use when the user has merged a change and asks how to roll it out, whether they are ready to launch, or for a go/no-go decision.",
|
|
6
6
|
"entrypoint": "LOOP.md",
|
|
7
7
|
"kind": "loop",
|
|
@@ -33,6 +33,7 @@ Converts the bug report someone *sent* into the ticket an engineer can *start*
|
|
|
33
33
|
## Useful references in this skill
|
|
34
34
|
|
|
35
35
|
- [`templates/bug-ticket.md`](templates/bug-ticket.md) — the ticket skeleton with the severity/priority matrix and the no-repro diagnostics list
|
|
36
|
+
- [`examples/export-row-limit-escalation.md`](examples/export-row-limit-escalation.md) — worked example: a VP's S1/P1 for "exports losing data" that the log shows is a 10,000-row CSV cap, filed S3/P2
|
|
36
37
|
|
|
37
38
|
## Quality bar
|
|
38
39
|
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
# Worked example: an escalated "exports are losing data" report
|
|
2
|
+
|
|
3
|
+
Input → output oracle for `bug-triage`. Shows severity judged from the evidence rather than
|
|
4
|
+
the escalation, a paraphrased error replaced by the verbatim string, and a three-symptom
|
|
5
|
+
thread split into one bug, one more bug and one feature request.
|
|
6
|
+
|
|
7
|
+
## Input
|
|
8
|
+
|
|
9
|
+
> Can you turn this into a ticket for the Reports squad? Our VP of Customer Success wants it
|
|
10
|
+
> filed as S1/P1 today. Tallow & Finch renew next month and they're furious.
|
|
11
|
+
>
|
|
12
|
+
> **#cs-escalations (pasted):**
|
|
13
|
+
>
|
|
14
|
+
> **Dana (CSM), 09:12:** Tallow & Finch say exports are losing data. Their ops lead exported
|
|
15
|
+
> the Shipment Activity report for October and "half the shipments are gone". Got some random
|
|
16
|
+
> error when it finished. Started after last week's release I think.
|
|
17
|
+
>
|
|
18
|
+
> **Dana, 09:14:** Also their dates come out as MM/DD in the CSV even though their account is
|
|
19
|
+
> set to DD/MM. And they asked again for scheduled exports to SFTP.
|
|
20
|
+
>
|
|
21
|
+
> **Dana, 09:20:** Screenshot text from their ops lead: "Export ready. Some rows may not be
|
|
22
|
+
> included. (EXPORT_ROW_LIMIT_REACHED)"
|
|
23
|
+
>
|
|
24
|
+
> **Marco (support engineer), 09:41:** Pulled the job log:
|
|
25
|
+
>
|
|
26
|
+
> ```
|
|
27
|
+
> 2026-11-04T08:57:31Z export_job id=exp_88213 tenant=tallow-finch.example
|
|
28
|
+
> report=shipment_activity range=2026-10-01..2026-10-31 format=csv status=completed
|
|
29
|
+
> rows_matched=14212 rows_written=10000 warning=EXPORT_ROW_LIMIT_REACHED app=5.18.2
|
|
30
|
+
> ```
|
|
31
|
+
>
|
|
32
|
+
> **Marco, 09:43:** The shipments are all there in the app, btw. The report shows 14,212 rows
|
|
33
|
+
> on screen.
|
|
34
|
+
|
|
35
|
+
## Output
|
|
36
|
+
|
|
37
|
+
Filed as **S3/P2, not S1/P1.** Nothing stored was lost: the app still shows all 14,212 rows.
|
|
38
|
+
The export file stops at 10,000. That is a real bug with a likely workaround. The VP can raise
|
|
39
|
+
the priority to P1 for the renewal, but that changes priority only. The severity stays S3.
|
|
40
|
+
The thread also held two other items, split out at the bottom.
|
|
41
|
+
|
|
42
|
+
```markdown
|
|
43
|
+
# CSV export of Shipment Activity stops at 10,000 rows (EXPORT_ROW_LIMIT_REACHED); remaining rows missing from file
|
|
44
|
+
|
|
45
|
+
**Severity:** S3 — the export file is incomplete, stored data is intact, and splitting the date range likely works around it
|
|
46
|
+
**Priority:** P2 — one tenant confirmed, renewal next month; a workaround CS can hand over today removes the need to drop current work
|
|
47
|
+
**Blast radius:** any export over 10,000 rows, on any tenant `[assumption]`; one tenant confirmed `[verified]`
|
|
48
|
+
**Component (best guess):** report export job `[assumption]`
|
|
49
|
+
|
|
50
|
+
## Summary
|
|
51
|
+
|
|
52
|
+
A customer ops lead exported October's Shipment Activity report as CSV. The file holds 10,000
|
|
53
|
+
of the 14,212 matching rows `[verified: job log exp_88213]`. The dialog warned that rows "may
|
|
54
|
+
not be included" `[reported: screenshot text]`. All 14,212 rows still show in the app
|
|
55
|
+
`[verified: Marco, on screen]`.
|
|
56
|
+
|
|
57
|
+
## Environment
|
|
58
|
+
|
|
59
|
+
| Field | Value | Tag |
|
|
60
|
+
|---|---|---|
|
|
61
|
+
| App version | 5.18.2 | `[verified]` |
|
|
62
|
+
| Tenant | tallow-finch.example | `[verified]` |
|
|
63
|
+
| Report / range / format | shipment_activity, 2026-10-01..2026-10-31, CSV | `[verified]` |
|
|
64
|
+
| Time | 2026-11-04 08:57:31 UTC | `[verified]` |
|
|
65
|
+
| First seen / last worked | "after last week's release" | `[reported]` |
|
|
66
|
+
|
|
67
|
+
## Reproduction
|
|
68
|
+
|
|
69
|
+
**No repro yet.** One occurrence is confirmed in the log and nobody has reproduced it. Collect:
|
|
70
|
+
- An export of any report with more than 10,000 matching rows on a test tenant, run on 5.18.2.
|
|
71
|
+
Record rows_matched and rows_written from the job log.
|
|
72
|
+
- The downloaded file from exp_88213, to count its rows and check whether it ends cleanly at
|
|
73
|
+
row 10,000 or mid-row
|
|
74
|
+
- Export job logs from the 30 days before last week's release, filtered on
|
|
75
|
+
`rows_written=10000`
|
|
76
|
+
- A screenshot of the full export dialog, to check whether it states the limit or only "may
|
|
77
|
+
not be included"
|
|
78
|
+
|
|
79
|
+
## Expected vs actual
|
|
80
|
+
|
|
81
|
+
**Expected:** the CSV contains all 14,212 rows the report shows, or the export refuses and names the limit
|
|
82
|
+
**Actual:** the CSV contains 10,000 rows, the job status is `completed`, and the dialog shows a vague warning
|
|
83
|
+
**Error (verbatim):** `Export ready. Some rows may not be included. (EXPORT_ROW_LIMIT_REACHED)`
|
|
84
|
+
|
|
85
|
+
## Hypotheses (≤3 — each with a 5-minute check; none of these is a conclusion)
|
|
86
|
+
|
|
87
|
+
| # | Hypothesis | Quick check |
|
|
88
|
+
|---|---|---|
|
|
89
|
+
| H1 | 10,000 is a deliberate cap that was never documented | Search the export service config and docs for `10000` or `EXPORT_ROW_LIMIT` |
|
|
90
|
+
| H2 | The cap or its warning arrived in a recent release | Filter export logs before last week's release for `rows_written=10000` |
|
|
91
|
+
| H3 | Pagination stops after a fixed number of pages rather than a fixed row count | Export 10,001 rows and then 25,000 rows on a test tenant and compare rows_written |
|
|
92
|
+
|
|
93
|
+
## Questions for reporter (≤3, ranked by diagnostic value)
|
|
94
|
+
|
|
95
|
+
1. Has the ops lead had a complete export of more than 10,000 rows before? When was the last one?
|
|
96
|
+
2. Do two half-month exports (Oct 1–15 and Oct 16–31) each come out complete?
|
|
97
|
+
3. What does the file feed: a person reading it, or another system that will treat it as complete?
|
|
98
|
+
|
|
99
|
+
## Duplicate-search hints
|
|
100
|
+
|
|
101
|
+
`EXPORT_ROW_LIMIT_REACHED` · `export missing rows` · `csv export 10000`
|
|
102
|
+
|
|
103
|
+
## Split out (if the report contained more than one issue)
|
|
104
|
+
|
|
105
|
+
- CSV export writes dates as MM/DD when the account date format is DD/MM → to be filed as its own bug
|
|
106
|
+
- Scheduled exports to SFTP → feature request, not a bug; route to the product backlog
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Why this is the oracle
|
|
110
|
+
|
|
111
|
+
- **Severity is judged on worst plausible impact, and priority is judged separately.** The
|
|
112
|
+
reporter's words ("losing data", "half gone") and the VP's pressure both point at S1. The
|
|
113
|
+
evidence shows an incomplete file over intact data with a likely workaround, so the ticket
|
|
114
|
+
says S3. The VP's urgency is a legitimate input to priority, so the reply leaves that lever
|
|
115
|
+
with the VP and does not let it move severity.
|
|
116
|
+
- **Tags separate reported from verified.** "Half the shipments are gone" is `[reported]`. The
|
|
117
|
+
log shows 10,000 of 14,212, about 70%, written. "After last week's release" stays a
|
|
118
|
+
hypothesis with a check (H2), not a stated cause.
|
|
119
|
+
- **The verbatim error replaces the paraphrase, and one bug gets one ticket.** The "random
|
|
120
|
+
error" is quoted as the exact string, which is also the best duplicate-search term. The date
|
|
121
|
+
bug and the SFTP request get split out.
|
|
122
|
+
|
|
123
|
+
A cheaper pass titles it "Exports losing data", files S1/P1 as asked, writes "Cause: 10k row
|
|
124
|
+
limit introduced in 5.18" as fact, invents repro steps nobody ran, and puts the date bug in
|
|
125
|
+
the same ticket. That ticket gets fixed in a rush on a guessed cause, and the date bug goes
|
|
126
|
+
nowhere.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bug-triage",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Turn a vague bug report (Slack message, support ticket, \"it's broken on mobile sometimes\") into an actionable ticket — searchable symptom title, numbered repro steps from a clean state, expected vs actual, severity separated from priority, evidence tagged reported-vs-verified, and labeled hypotheses instead of root-cause guesses. Use when the user wants to triage a bug, write up a bug report, turn a complaint into a ticket, or make a flaky issue actionable.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
{ "to": "feature-implement-loop", "when": "the defect is reproduced and scoped", "purpose": "Fix the triaged defect through the same capped loop a story gets.", "fallback": "If feature-implement-loop is absent, fix inline with a regression test that fails before the fix." }
|
|
11
11
|
],
|
|
12
12
|
"tags": ["bug-triage", "bug-report", "ticket", "qa", "repro", "severity"],
|
|
13
|
-
"model": { "tier": "
|
|
13
|
+
"model": { "tier": "heavy", "rationale": "Measured (RFC-0073): on its held-out evals the heavy tier met 92% and 92% of checks in two tier trials, against standard's 76% and light's 70% and 86%, more than 5 points ahead both times; moved once its examples/ oracle shipped (RFC-0074)." }
|
|
14
14
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "feature-implement-loop",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Implement a feature or story so it ends up *verified*, not just generated. Takes a description + acceptance criteria, writes code and tests, then runs an adversarial review pass that hunts for gaps (broken edge cases, baked-in assumptions, uncovered acceptance criteria), and re-generates to close them — looping until the review is clean or a 3-round cap is hit. Use when handed a ticket / story / feature spec with acceptance criteria and the goal is shippable, self-checked code — not a first draft.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
{ "to": "pre-merge-review", "when": "the code exists and the question is whether it can merge", "purpose": "Judge the diff that now exists against a mechanical gate.", "fallback": "If pre-merge-review is absent, run the repo's own lint and tests and honour the exit code; do not self-certify." }
|
|
11
11
|
],
|
|
12
12
|
"tags": ["dev-workflow", "implementation", "tdd", "acceptance-criteria", "adversarial", "self-correcting", "code-generation"],
|
|
13
|
-
"model": { "tier": "
|
|
13
|
+
"model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 85% and 85% of checks in two tier trials, against standard's 85% and heavy's 76% and 85%, within 5 points of the best both times." }
|
|
14
14
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pr-description-writer",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Write the pull request title and description for one change, from the actual diff and commits: what changed and why, how it was tested with only the checks that were really run, what a reviewer should look at first, and the risk and rollback. It also reports what the diff contains that the commits don't mention, such as a dependency bump, a deleted test or a schema change. Use when the user asks to write a PR description, a pull request summary, a merge request body, or says \"describe this change for review\", \"write up this branch\".",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"merge-request"
|
|
25
25
|
],
|
|
26
26
|
"model": {
|
|
27
|
-
"tier": "
|
|
28
|
-
"rationale": "
|
|
27
|
+
"tier": "light",
|
|
28
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 85% and 85% of checks in two tier trials, against standard's 85% and heavy's 77% and 85%, within 5 points of the best both times."
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "pre-merge-review",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.6",
|
|
4
4
|
"description": "Gate an existing change for merge — run one skill that fires the whole production-readiness pass. First a deterministic mechanical gate (lint + typecheck + tests, via a script whose exit code decides), then the three-reviewer panel dispatched in parallel — devils-advocate (correctness), security-reviewer (exploitability), code-quality (craft) — then a single READY / NOT READY verdict. Use before opening a PR or merging, when you want the full review fleet run on a diff you already have. Do NOT use to implement a feature from a spec (that's feature-implement-loop) or to review a document (that's doc-critique).",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
@@ -11,5 +11,5 @@
|
|
|
11
11
|
],
|
|
12
12
|
"tags": ["dev-workflow", "code-review", "pre-merge", "quality-gate", "subagents", "production-readiness"],
|
|
13
13
|
"permissions": {"network": [], "commands": ["git", "ruff", "mypy", "pytest", "*"], "files": "project", "notes": "Runs the lint, typecheck and test commands configured for the project, through a shell, by design. --install-hook writes a git pre-commit hook in the repository."},
|
|
14
|
-
"model": { "tier": "
|
|
14
|
+
"model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 93% of checks in two tier trials, against standard's 86% and heavy's 93% and 93%, within 5 points of the best both times." }
|
|
15
15
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "release-notes",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Write release notes from a git log, a list of merged PRs or rough notes about what changed — for the audience and in the format the user names (a customer changelog page, an email, an in-app \"what's new\", store text, a CHANGELOG.md entry). Says nothing the input doesn't, writes a vague change only as far as it was described, puts breaking changes and anything the reader must do first, and keeps internal noise and working notes out of the text. Use when the user wants release notes, a changelog entry, \"what's in this release\", a deploy announcement, or to summarise changes since the last tag.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
8
|
"related": ["devils-advocate", "exec-summary", "pr-description-writer", "sonar-review"],
|
|
9
9
|
"tags": ["release-notes", "changelog", "git", "release", "deploy", "communication"],
|
|
10
|
-
"model": { "tier": "
|
|
10
|
+
"model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 96% and 96% of checks in two tier trials, against standard's 91% and heavy's 100% and 98%, within 5 points of the best both times." }
|
|
11
11
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "test-plan-generator",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Generate a risk-based test plan for a feature, PR, or release — risks ranked by likelihood × impact, test cases pushed to the lowest pyramid level that catches the failure, every acceptance criterion mapped to a test, and an explicit \"not tested\" list. Use when the user asks for a test plan, test cases, a QA strategy for a change, \"how should we test this\", or pre-release test coverage.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
8
|
"related": ["devils-advocate", "feature-implement-loop", "sonar-review", "user-story-splitter"],
|
|
9
9
|
"tags": ["testing", "test-plan", "qa", "risk-based", "test-cases", "quality"],
|
|
10
|
-
"model": { "tier": "
|
|
10
|
+
"model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 76% and 92% of checks in two tier trials, against standard's 76% and heavy's 61% and 54%, within 5 points of the best both times." }
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "service-blueprint",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Build a service blueprint — per step, the evidence the customer sees, the customer's actions, frontstage staff and system actions, backstage actions, and support processes, separated by the lines of interaction, visibility and internal interaction, with fail points, wait times and owners marked — as a table plus a Mermaid diagram and the ranked fixes. Use when the user wants a service blueprint, \"what happens behind the scenes when a customer does X\", to find where a service breaks or stalls, or to take a journey map down to the people, systems and handoffs that deliver it.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"mermaid"
|
|
40
40
|
],
|
|
41
41
|
"model": {
|
|
42
|
-
"tier": "
|
|
43
|
-
"rationale": "
|
|
42
|
+
"tier": "light",
|
|
43
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 100% and 92% of checks in two tier trials, against standard's 92% and heavy's 85% and 92%, within 5 points of the best both times."
|
|
44
44
|
}
|
|
45
45
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ux-writing",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Write the interface copy for a flow or component — buttons, labels, hints, errors, empty states, confirmations, loading and success messages — as a string table where each string has its context, a character budget, a recommended version and one variant, with error messages that say what happened and what to do next, and a terminology list so the same thing has the same name everywhere. Use when the user wants UI copy, microcopy, button text, error messages, empty states, \"write the strings for this screen\", or \"our wording is inconsistent\".",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"terminology"
|
|
36
36
|
],
|
|
37
37
|
"model": {
|
|
38
|
-
"tier": "
|
|
39
|
-
"rationale": "
|
|
38
|
+
"tier": "light",
|
|
39
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 92% and 92% of checks in two tier trials, against standard's 83% and heavy's 75% and 83%, within 5 points of the best both times."
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -25,6 +25,35 @@
|
|
|
25
25
|
"Re-runs the script and reports the new exit code before going to sign-off",
|
|
26
26
|
"Counts this as round 2 under the cap of 3"
|
|
27
27
|
]
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "comply-chat-vendor-launch",
|
|
31
|
+
"held_out": "2026-11-04",
|
|
32
|
+
"prompt": "We're bringing in Parlour Chat to replace our contact form, go-live is 1 Dec. Brief is in vendor-brief.md. Can you get this ready for risk sign-off? Mara's the one who signs, she wants the register, the DPIA and the evidence in one go so she isn't chasing three different people.",
|
|
33
|
+
"assertions": [
|
|
34
|
+
"Runs the stages in order: the risk register comes first, then the DPIA, then the evidence map, then a check of the register, and the sign-off comes last",
|
|
35
|
+
"The register scores each risk for both inherent and residual rating, and names an owner, a treatment and the controls for each one",
|
|
36
|
+
"Produces a DPIA because the chats process personal data, and it covers the US transfer, the 24-month default retention and the language-model subprocessor",
|
|
37
|
+
"The evidence map flags controls the residual ratings rely on that are planned or untested, not in place: card-number redaction (C3), 90-day retention (C4), the access review (C2) and session isolation (C7). It does not count them as evidence",
|
|
38
|
+
"Checks the register with a script and reports the result before going on to sign-off",
|
|
39
|
+
"Leaves the sign-off to Mara Lindqvist-Obi. It hands her the register, DPIA and evidence for a decision and does not record the risk position as signed or accepted",
|
|
40
|
+
"The register, DPIA and evidence map agree: a control that has no evidence does not lower a residual rating in the register",
|
|
41
|
+
"Does not invent controls, evidence, dates or contract status not in the brief, such as a signed DPA, an enabled redaction feature or a completed transfer risk assessment"
|
|
42
|
+
]
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"id": "comply-loyalty-app-unowned-risks",
|
|
46
|
+
"held_out": "2026-11-04",
|
|
47
|
+
"prompt": "Loyalty app launches Monday and Priya (who owns the risk) is on leave till the 20th. The register's in risk-register.csv and there's a launch note in launch-note.md. It's basically all there. Can you run comply on it and sign it off for her so we're not blocked? She told me before she left she's fine with it.",
|
|
48
|
+
"assertions": [
|
|
49
|
+
"Does not sign off on Priya's behalf. It says the sign-off has to come from the named owner, or from someone with formal authority to stand in for her",
|
|
50
|
+
"The register check fails, and the output names the rows that fail it: R1 and R3 have no owner (R1 says 'TBC', R3 is blank), and R1 and R3 were due for review on 2026-09-02, which has passed",
|
|
51
|
+
"Flags that R3's residual rating falls from 12 to 2 with no controls listed. The reduction is not supported",
|
|
52
|
+
"Says a DPIA is needed before launch because the app uses precise background location and shares device ID and location with the analytics SDK, and notes that no DPIA exists",
|
|
53
|
+
"Stops before sign-off because the check gate did not pass. It does not report the loop as complete or the launch as ready to sign",
|
|
54
|
+
"Gives a short list of what has to happen to unblock the launch: owners for R1 and R3, re-scored R1 and R3, a DPIA, and a DPA with Beacon",
|
|
55
|
+
"Does not invent owners for R1 or R3, a new review date, a DPA or controls that are not in the files"
|
|
56
|
+
]
|
|
28
57
|
}
|
|
29
58
|
]
|
|
30
59
|
}
|