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
|
@@ -33,6 +33,34 @@
|
|
|
33
33
|
"After writing the ADR, checks that ADR-0004 is marked superseded by the new record, and gives the exact edit when it isn't",
|
|
34
34
|
"Does not invent records, ids or dates that are not in the repository"
|
|
35
35
|
]
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"id": "design-bulk-export",
|
|
39
|
+
"held_out": "2026-11-04",
|
|
40
|
+
"prompt": "The bulk invoice export PRD got ratified at product review last week (prd-bulk-export.md). Our existing ADRs are in adr/. Can you work out how we should build it and write up the decision?",
|
|
41
|
+
"assertions": [
|
|
42
|
+
"Works in loop order: the constraints (the three existing ADRs and the NFRs) are set out before options are compared, the threat model is done on the chosen design before the panel review, and the ADR is written only after the panel's verdict",
|
|
43
|
+
"The design runs the export as a job on the existing queue (ADR-0002), reads from the read replica (ADR-0001) and sets the tenant from the job payload under row-level security (ADR-0003), or argues explicitly for an exception to one of them; it does not propose generating a 2M-row file in the request path",
|
|
44
|
+
"The NFRs use the PRD's own figures (2,000,000 rows, 95% ready within 15 minutes, 24-hour link, deletion after 7 days, audit log entries) and give every other category a measurable target, an explicit n/a, or a default that is labelled as a default",
|
|
45
|
+
"The threat model covers the download link and cross-tenant access at the trust boundaries they cross (for example a link shared or replayed by another user, or a job run under the wrong tenant), and each mitigation can be checked",
|
|
46
|
+
"The panel review ends in a verdict using one of the gate words (PROCEED, PROCEED WITH CONDITIONS, REVISE, RECONSIDER), and any conditions it sets appear in the ADR's consequences",
|
|
47
|
+
"The ADR records the options considered and the decision, cites ADR-0001, ADR-0002 and ADR-0003, and the record stage states how the new decision relates to the existing ones (which it relies on, and that none are superseded)",
|
|
48
|
+
"Does not invent requirements that are not in the PRD, such as scheduled exports, XLSX or an export API, and does not change the PRD's row limit or 15-minute target"
|
|
49
|
+
]
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"id": "design-draft-prd-webhooks",
|
|
53
|
+
"held_out": "2026-11-04",
|
|
54
|
+
"prompt": "Need an architecture call on partner webhooks for Ledgerline: Kafka, or just POST straight from the app with retries? PRD is prd-partner-webhooks.md, ADRs in adr/. Skip the threat model, it's internal-ish. Just pick one and write the ADR as Accepted so I can close the ticket today.",
|
|
55
|
+
"assertions": [
|
|
56
|
+
"Points out early that the PRD is a draft that has not been reviewed and still has open questions, so the loop's starting input, a ratified requirement, is missing",
|
|
57
|
+
"Treats the delivery guarantee, event volume and retry window as open, and does not pick a guarantee or a volume and design as though it had been decided",
|
|
58
|
+
"Does not drop the threat stage on the user's say-so: it notes that partner endpoints are third-party URLs on the internet, so events cross a trust boundary (for example request forgery through registered URLs, payload signing, leaking invoice data to the wrong endpoint), or it records the skipped threat model as an explicit gap that blocks the decision",
|
|
59
|
+
"Notes that Kafka would be new stateful infrastructure needing Platform review and a named on-call owner under ADR-0004, and that ADR-0002 already requires external calls to run on the existing job queue, which rules out a POST from the request path",
|
|
60
|
+
"The panel's verdict is REVISE or RECONSIDER, not PROCEED, and names the open questions as the crux, saying what answer would change the decision",
|
|
61
|
+
"Does not write an ADR with status Accepted; it writes none, or one marked Proposed that lists what must be settled before acceptance",
|
|
62
|
+
"Does not invent figures that are not in the input, such as an event volume, a latency target, a number of partners or a retry window"
|
|
63
|
+
]
|
|
36
64
|
}
|
|
37
65
|
]
|
|
38
66
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# ADR-0001: PostgreSQL is the system of record
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2024-03-11
|
|
5
|
+
- Deciders: Platform team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Ledgerline needs one transactional store for tenants, customers, invoices and payments. We considered PostgreSQL, MySQL and a document store.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
PostgreSQL 15 (managed) is the single system of record for all billing data. Read replicas may be used for reporting and other read-heavy workloads; nothing writes to a replica.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- Heavy reads (reports, exports) should go to the read replica, not the primary.
|
|
18
|
+
- Replica lag is normally under 2 seconds; features that read from the replica must tolerate that.
|
|
19
|
+
|
|
20
|
+
## Governs
|
|
21
|
+
|
|
22
|
+
- `services/billing-api/db/`
|
|
23
|
+
- `infra/postgres/`
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# ADR-0002: Long-running work goes through the job queue
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2024-06-02
|
|
5
|
+
- Deciders: Platform team, Billing team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Request handlers in billing-api were timing out on PDF generation and large reports, holding database connections for minutes. The load balancer cuts requests at 30 seconds.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
Any work expected to take more than 5 seconds runs as a job on the existing Redis-backed job queue (`jobs-worker` service), never in the request path. The request handler enqueues the job and returns a job ID. Jobs must be idempotent and safe to retry; the queue retries a failed job up to 3 times.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- Features with long-running work need a job status model and a way to tell the user when the job is done.
|
|
18
|
+
- `jobs-worker` concurrency is capped at 20 jobs per pod, 4 pods. Heavy jobs must not starve PDF generation.
|
|
19
|
+
|
|
20
|
+
## Governs
|
|
21
|
+
|
|
22
|
+
- `services/jobs-worker/`
|
|
23
|
+
- `services/billing-api/jobs/`
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
# ADR-0003: Tenant isolation by row-level security
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2024-09-19
|
|
5
|
+
- Deciders: Platform team, Security
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
All tenants share one database. A missed `WHERE tenant_id = ?` in application code leaked one tenant's customer list to another in a staging test (no production impact).
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
Every tenant-owned table has a PostgreSQL row-level security policy on `tenant_id`. Each connection sets `app.tenant_id` at the start of a request or job, and queries run as the `app_tenant` role, which cannot bypass RLS. Background jobs must set the tenant from the job payload, never from a default.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- Code that runs outside a request (jobs, scripts) is responsible for setting the tenant before any query.
|
|
18
|
+
- Cross-tenant work (admin tooling) uses a separate audited role.
|
|
19
|
+
- Files produced from tenant data must be stored under a tenant-scoped prefix.
|
|
20
|
+
|
|
21
|
+
## Governs
|
|
22
|
+
|
|
23
|
+
- `services/billing-api/db/policies/`
|
|
24
|
+
- `services/jobs-worker/tenant_context.py`
|
|
25
|
+
- `infra/object-storage/`
|
package/packs/solution-architect/loops/design/evals/files/design-bulk-export/prd-bulk-export.md
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
# PRD: Bulk invoice export (CSV)
|
|
2
|
+
|
|
3
|
+
- **Product:** Ledgerline
|
|
4
|
+
- **Author:** Ines Moreau (PM, Billing)
|
|
5
|
+
- **Status:** Ratified — product review, 28 Oct 2026 (approvers: Ines Moreau, Kwame Asante (Eng Manager, Billing), Lotte Jansen (Head of Finance Ops))
|
|
6
|
+
- **Tracking:** LDG-2210
|
|
7
|
+
|
|
8
|
+
## Problem
|
|
9
|
+
|
|
10
|
+
Finance admins at our larger tenants reconcile invoices in their own accounting tools at month end. Today the only way to get invoice data out of Ledgerline is the invoice list page, which pages 100 rows at a time, or a support ticket asking us to run a query. In September 2026 support handled 61 export requests from 23 tenants; median time to fulfil was 2.5 working days. Finance admins at three tenants told us in calls that month-end close slips because they wait on us.
|
|
11
|
+
|
|
12
|
+
## Goals
|
|
13
|
+
|
|
14
|
+
| Goal | Success line |
|
|
15
|
+
|---|---|
|
|
16
|
+
| G1. A finance admin can get all of their tenant's invoices for a date range without contacting support | Export-related support tickets fall from 61/month to under 10/month within two months of launch |
|
|
17
|
+
| G2. Exports are fast enough to use during month-end close | 95% of exports are ready to download within 15 minutes of the request |
|
|
18
|
+
|
|
19
|
+
## Users
|
|
20
|
+
|
|
21
|
+
- **Finance Admin** role only. Other roles (Member, Viewer, Billing Contact) must not see or use the feature.
|
|
22
|
+
|
|
23
|
+
## Requirements
|
|
24
|
+
|
|
25
|
+
| ID | Priority | Requirement |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| R1 | Must | A Finance Admin can request a CSV export of invoices filtered by issue-date range (max 24 months) and status (any combination of draft, open, paid, void). |
|
|
28
|
+
| R2 | Must | One export can contain up to 2,000,000 rows. Our largest tenant today has 1.6M invoices. |
|
|
29
|
+
| R3 | Must | The requester is notified in-app and by email when the export is ready, with a download link. |
|
|
30
|
+
| R4 | Must | The download link works for 24 hours and only for the user who requested it. |
|
|
31
|
+
| R5 | Must | Export files are deleted 7 days after creation. |
|
|
32
|
+
| R6 | Must | Columns: invoice number, issue date, due date, status, customer name, customer email, currency, net, tax, gross, paid date. |
|
|
33
|
+
| R7 | Must | Every export request and every download is written to the tenant's audit log (who, when, filters, row count). |
|
|
34
|
+
| R8 | Should | A Finance Admin can see their last 10 exports and their status (queued, running, ready, failed, expired). |
|
|
35
|
+
| R9 | Could | Cancel a queued or running export. |
|
|
36
|
+
|
|
37
|
+
## Data
|
|
38
|
+
|
|
39
|
+
Export files contain customer names and email addresses (personal data) and invoice amounts. Same classification as the invoice table: Confidential.
|
|
40
|
+
|
|
41
|
+
## Non-goals
|
|
42
|
+
|
|
43
|
+
- Scheduled or recurring exports.
|
|
44
|
+
- Formats other than CSV (no XLSX, no PDF bundle).
|
|
45
|
+
- An export API for integrations. Covered separately in LDG-2302.
|
|
46
|
+
- Exporting line items. Invoice headers only.
|
|
47
|
+
|
|
48
|
+
## Open questions
|
|
49
|
+
|
|
50
|
+
None outstanding. (Line-item export was moved to non-goals at review.)
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# ADR-0002: Long-running work goes through the job queue
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2024-06-02
|
|
5
|
+
- Deciders: Platform team, Billing team
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
Request handlers in billing-api were timing out on PDF generation and large reports, holding database connections for minutes. The load balancer cuts requests at 30 seconds.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
Any work expected to take more than 5 seconds, or that calls an external system, runs as a job on the existing Redis-backed job queue (`jobs-worker` service), never in the request path. The request handler enqueues the job and returns. Jobs must be idempotent and safe to retry; the queue retries a failed job up to 3 times with exponential backoff.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- `jobs-worker` concurrency is capped at 20 jobs per pod, 4 pods.
|
|
18
|
+
- The queue does not guarantee ordering between jobs.
|
|
19
|
+
|
|
20
|
+
## Governs
|
|
21
|
+
|
|
22
|
+
- `services/jobs-worker/`
|
|
23
|
+
- `services/billing-api/jobs/`
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
# ADR-0004: New stateful infrastructure needs Platform sign-off
|
|
2
|
+
|
|
3
|
+
- Status: Accepted
|
|
4
|
+
- Date: 2025-08-14
|
|
5
|
+
- Deciders: Platform team, Engineering leadership
|
|
6
|
+
|
|
7
|
+
## Context
|
|
8
|
+
|
|
9
|
+
In 2025 three product teams each stood up their own stateful component (a second Redis, an Elasticsearch cluster, a RabbitMQ). Two had no on-call owner when they failed. Platform ended up running all three.
|
|
10
|
+
|
|
11
|
+
## Decision
|
|
12
|
+
|
|
13
|
+
No team adds a new stateful infrastructure component (database, message broker, streaming platform, search cluster, cache) to production without a Platform team review and a named on-call owner. Requests go through the Platform intake (PLAT board); the review takes about two weeks.
|
|
14
|
+
|
|
15
|
+
## Consequences
|
|
16
|
+
|
|
17
|
+
- Product teams should prefer the existing PostgreSQL, Redis job queue and object storage where they fit.
|
|
18
|
+
- A design that needs a new component must name it, state why the existing ones do not fit, and include the Platform review in its timeline.
|
|
19
|
+
|
|
20
|
+
## Governs
|
|
21
|
+
|
|
22
|
+
- `infra/`
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# PRD: Partner webhooks
|
|
2
|
+
|
|
3
|
+
- **Product:** Ledgerline
|
|
4
|
+
- **Author:** Sam Okonkwo (PM, Integrations)
|
|
5
|
+
- **Status:** DRAFT — not yet reviewed
|
|
6
|
+
- **Tracking:** LDG-2341
|
|
7
|
+
|
|
8
|
+
## Problem
|
|
9
|
+
|
|
10
|
+
Partners who build on Ledgerline (accounting connectors, dunning tools) poll our REST API every few minutes to find out whether invoices have changed. Two partners have told us polling is costing them API quota and that they see changes late.
|
|
11
|
+
|
|
12
|
+
## Goals
|
|
13
|
+
|
|
14
|
+
- Partners find out about invoice changes without polling.
|
|
15
|
+
|
|
16
|
+
## Requirements (draft)
|
|
17
|
+
|
|
18
|
+
| ID | Priority | Requirement |
|
|
19
|
+
|---|---|---|
|
|
20
|
+
| R1 | Must | A partner can register an HTTPS endpoint URL per tenant connection. |
|
|
21
|
+
| R2 | Must | We send an event to that URL when an invoice is created, updated, paid or voided. |
|
|
22
|
+
| R3 | Must | Event body includes invoice ID, event type, timestamp, and the invoice as returned by `GET /v2/invoices/{id}`. |
|
|
23
|
+
| R4 | Should | Failed deliveries are retried. |
|
|
24
|
+
| R5 | ? | Partners can replay events from the last N days. |
|
|
25
|
+
|
|
26
|
+
## Non-goals
|
|
27
|
+
|
|
28
|
+
- Webhooks for objects other than invoices (customers, payments) in v1.
|
|
29
|
+
|
|
30
|
+
## Open questions
|
|
31
|
+
|
|
32
|
+
1. **Delivery guarantee.** At-least-once, or do partners need ordering per invoice? Two partners asked for "exactly once"; we haven't asked what they'd accept. — *owner: Sam, not started*
|
|
33
|
+
2. **Volume.** We don't know how many events this produces. Invoice updates per day across all tenants is not something we currently measure. "Somewhere between thousands and a lot." — *owner: data team, not started*
|
|
34
|
+
3. **Retry window.** How long do we keep retrying a failing partner endpoint? — *not discussed*
|
|
35
|
+
4. **R5 replay.** In or out of v1? — *not discussed*
|
|
36
|
+
5. **Who registers the URL** — the partner, or the tenant's admin when they connect the partner? — *not discussed*
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "api-contract-draft",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Draft an OpenAPI 3.1 contract from a feature brief or story — resource-oriented paths, a full error catalog (RFC 9457), pagination/idempotency/versioning decided not deferred, examples on every operation, plus a decisions log so review argues choices instead of YAML. Use when the user wants to design an API, draft an OpenAPI/Swagger spec, define request/response shapes, or agree a contract between frontend/backend or two teams before code.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"asyncapi"
|
|
28
28
|
],
|
|
29
29
|
"model": {
|
|
30
|
-
"tier": "
|
|
31
|
-
"rationale": "
|
|
30
|
+
"tier": "light",
|
|
31
|
+
"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 69% and heavy's 69% and 76%, within 5 points of the best both times."
|
|
32
32
|
}
|
|
33
33
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "architecture-diagrams",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"description": "Generate architecture diagrams (Mermaid, PlantUML, C4) from a written description of a system. Supports AWS/Azure/GCP cloud topologies, microservice landscapes, sequence flows, container diagrams, and ER models. Use whenever the user asks for an architecture diagram, system sketch, flow diagram, or visualization of a design.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -25,7 +25,7 @@
|
|
|
25
25
|
"architecture"
|
|
26
26
|
],
|
|
27
27
|
"model": {
|
|
28
|
-
"tier": "
|
|
29
|
-
"rationale": "
|
|
28
|
+
"tier": "light",
|
|
29
|
+
"rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 100% of checks in two tier trials, against standard's 93% and heavy's 93% and 93%, within 5 points of the best both times."
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "design-doc",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Generate a Google-style engineering design doc (problem, goals/non-goals, options considered, recommended approach, risks, rollout) from a feature brief or short description. Use when the user wants to draft a design doc, technical proposal, or one-pager for an engineering review.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
{ "to": "architecture-diagrams", "when": "the design is written and needs rendering", "purpose": "Render the prose as a diagram that must not disagree with it.", "fallback": "If architecture-diagrams is absent, emit Mermaid inline and check every node against a claim in the doc." }
|
|
11
11
|
],
|
|
12
12
|
"tags": ["design-doc", "documentation", "engineering", "review"],
|
|
13
|
-
"model": { "tier": "
|
|
13
|
+
"model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 88% and 88% of checks in two tier trials, against standard's 92% and heavy's 91% and 91%, within 5 points of the best both times." }
|
|
14
14
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "figma-diagrams",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.4",
|
|
4
4
|
"description": "Work with Figma and FigJam files via the Figma REST API — read existing file structure, list frames/pages, post comments, and produce FigJam-importable diagram specs. Use when the user mentions a Figma URL, asks to inspect/audit a Figma file, wants to comment on a design programmatically, or wants their architecture diagram in Figma.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"notes": "Reads FIGMA_TOKEN from the environment to call the Figma REST API. Its instructions install the pinned requirements once with `python3 -m pip install -r requirements.txt`, which reaches PyPI."
|
|
42
42
|
},
|
|
43
43
|
"model": {
|
|
44
|
-
"tier": "
|
|
45
|
-
"rationale": "
|
|
44
|
+
"tier": "light",
|
|
45
|
+
"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 92% and heavy's 75% and 92%, within 5 points of the best both times."
|
|
46
46
|
}
|
|
47
47
|
}
|
|
@@ -107,7 +107,6 @@ This looks backward at a real bill. `capacity-cost-model` looks forward: it size
|
|
|
107
107
|
- ❌ Estimating cost before launch, or projecting at 3× or 10× growth. Use `capacity-cost-model`.
|
|
108
108
|
- ❌ Designing telemetry or a logging budget from scratch. Use `observability-plan`, though this skill flags logging cost as a hot spot.
|
|
109
109
|
- ❌ Writing up an incident, including a cost spike from a runaway job. Use `postmortem-generator`.
|
|
110
|
-
- ❌ Reporting AI tool usage or spend by user. Use `ai-usage-report`.
|
|
111
110
|
- ❌ Defining business KPIs for a feature or product. Use `success-metrics`.
|
|
112
111
|
|
|
113
112
|
## Anti-patterns to avoid
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cloud-cost-review",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Review actual cloud spend from a cost export (AWS CUR or Data Exports, GCP billing export, Azure cost details) and produce a ranked savings report — idle and unattached resources, oversized instances backed by utilisation evidence, storage tiering, data transfer hot spots, commitment coverage and untagged spend — each finding with a monthly saving computed from the bill, a confidence level and an ease rating. Use when the user shares a cost CSV and says \"where are we wasting money\", \"review our AWS bill\", \"why did the cloud bill jump this month\", \"find savings in our GCP/Azure spend\", or \"should we buy savings plans\".",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
"optional": []
|
|
13
13
|
},
|
|
14
14
|
"related": [
|
|
15
|
-
"ai-usage-report",
|
|
16
15
|
"capacity-cost-model",
|
|
17
16
|
"observability-plan",
|
|
18
17
|
"postmortem-generator",
|
|
@@ -106,7 +106,6 @@ It uses the metric names DORA currently publishes on [dora.dev](https://dora.dev
|
|
|
106
106
|
- ❌ Writing up one incident: timeline, impact, contributing factors. Use `postmortem-generator`.
|
|
107
107
|
- ❌ Designing SLOs, alerts or dashboards for a service. Use `observability-plan`.
|
|
108
108
|
- ❌ Product or business outcome metrics (activation, retention, revenue). Use `success-metrics`.
|
|
109
|
-
- ❌ Reporting how people use AI tools. Use `ai-usage-report`.
|
|
110
109
|
- ❌ Forecasting infrastructure cost or capacity. Use `capacity-cost-model`.
|
|
111
110
|
|
|
112
111
|
## Anti-patterns to avoid
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "delivery-metrics-report",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Produce a delivery metrics report for one service from deployment, incident and pull-request exports — the DORA metrics (deployment frequency, change lead time, change fail rate, failed deployment recovery time) plus flow metrics (WIP, cycle time p50/p85, throughput), computed by a script with per-week trends and explicit data gaps, then interpreted for what changed and why. Use when the user wants DORA metrics, says \"how are we doing on the four keys\", \"what's our change failure rate\", \"compute lead time and deploy frequency from this CSV\", or \"build our delivery metrics report\".",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
"optional": []
|
|
13
13
|
},
|
|
14
14
|
"related": [
|
|
15
|
-
"ai-usage-report",
|
|
16
15
|
"capacity-cost-model",
|
|
17
16
|
"observability-plan",
|
|
18
17
|
"postmortem-generator",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "incident-comms",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.1",
|
|
4
4
|
"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.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
{ "to": "postmortem-generator", "when": "the incident is resolved", "purpose": "Analyse blamelessly and emit runbook deltas.", "fallback": "If postmortem-generator is absent, write the timeline, the contributing factors, and the procedural changes inline." }
|
|
11
11
|
],
|
|
12
12
|
"tags": ["incident", "communication", "status-page", "outage", "stakeholder", "sre"],
|
|
13
|
-
"model": { "tier": "
|
|
13
|
+
"model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 100% of checks in two tier trials, against standard's 85% and heavy's 92% and 93%, within 5 points of the best both times." }
|
|
14
14
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "postmortem-generator",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.1",
|
|
4
4
|
"description": "Write a blameless incident postmortem from the raw material (chat scrollback, alert history, timeline, notes) for the audience and length the user names — the cause stated as the change and the gap that let it through, never a person even when the notes name one; who or what noticed first and how late; known kept apart from still-unknown; and follow-up actions that close the gap. Invents no times, figures, owners or severities. Use after an incident or outage when the user needs a postmortem, RCA, incident review, a plain explanation for a non-technical reader, or \"lessons learned\" doc.",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
{ "to": "runbook-generator", "when": "the postmortem produced runbook deltas", "purpose": "Apply the deltas as edits to the existing runbook.", "fallback": "If runbook-generator is absent, phrase each delta as a concrete before/after edit so a human can apply it." }
|
|
11
11
|
],
|
|
12
12
|
"tags": ["postmortem", "incident", "rca", "sre", "blameless", "outage"],
|
|
13
|
-
"model": { "tier": "
|
|
13
|
+
"model": { "tier": "light", "rationale": "Measured (RFC-0073): on its held-out evals the light tier met 93% and 91% of checks in two tier trials, against standard's 92% and heavy's 90% and 87%, within 5 points of the best both times." }
|
|
14
14
|
}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "decision-log",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"description": "Extract decisions, action items, owners, and due dates from meeting notes, Slack threads, design-review transcripts, or any unstructured discussion. Produces a clean structured log the user can paste into a doc, tracker, or ADR queue. Use when the user has notes/threads/transcripts and asks for a \"decision log\", \"action items\", \"what did we agree\", or \"follow-ups\".",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": { "npm": [], "pip": [] },
|
|
7
7
|
"env": { "required": [], "optional": [] },
|
|
8
8
|
"related": [],
|
|
9
9
|
"tags": ["meetings", "decisions", "action-items", "stakeholder-communication"],
|
|
10
|
-
"model": { "tier": "
|
|
10
|
+
"model": { "tier": "standard", "rationale": "Measured (RFC-0073): on its held-out evals the light tier fell more than 5 points behind the best in both tier trials (79% and 61% against standard's 79%); one step up, to standard." }
|
|
11
11
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "team-status-report",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Write a weekly team status report from tracker data (Jira, Linear or GitHub Projects, via CSV, JSON or an MCP tool) — shipped, in progress, blocked with the blocker and owner, slipped against plan, risks and asks — with every number computed from the data by a stdlib script, never estimated, and a RAG status that states the rule that set it. Use when the user wants a weekly status update, sprint report or stakeholder update from the tracker, or says \"write this week's status report\", \"are we on track?\".",
|
|
5
5
|
"entrypoint": "SKILL.md",
|
|
6
6
|
"deps": {
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
],
|
|
28
28
|
"permissions": {"network": [], "commands": [], "files": "named-paths"},
|
|
29
29
|
"model": {
|
|
30
|
-
"tier": "
|
|
31
|
-
"rationale": "
|
|
30
|
+
"tier": "light",
|
|
31
|
+
"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 93% and heavy's 93% and 93%, within 5 points of the best both times."
|
|
32
32
|
}
|
|
33
33
|
}
|
package/profiles.json
CHANGED
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"description": "The complete catalogue: every pack, every reviewer agent, every loop.",
|
|
19
19
|
"packs": ["core", "solution-architect", "product-manager", "dev-team", "sre-oncall", "stakeholder-comms", "design", "ai-engineering", "api-builder", "converters", "experience-design", "research", "trackers", "data-analytics", "grc", "infra-as-code", "skill-engineering", "career"],
|
|
20
20
|
"agents": ["devils-advocate", "security-reviewer", "code-quality"],
|
|
21
|
-
"loops": ["
|
|
21
|
+
"loops": ["design", "build", "release", "ship-a-draft", "research", "comply", "measure", "modernize", "ship-agent", "provision", "clarify"]
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
}
|
|
@@ -1,120 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: adopt
|
|
3
|
-
description: Take an organisation from a pile of AI ideas to a first rollout wave its sponsor approved: the use cases ranked with a first slice, readiness scored against that slice, a usage policy covering the data the slice touches, and a cohort rollout whose first wave is the slice's users, with a gate that sends the slice back when a blocking gap stands in its way. Use when the user says "help us start using AI", "roll out AI across the team", "run the adopt loop", or has AI ideas, no policy and no rollout plan.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# adopt
|
|
7
|
-
|
|
8
|
-
One first slice, from a list of ideas to a wave of people using it. The four skills each work
|
|
9
|
-
alone; in order, each one narrows the next. Triage picks one use case, so readiness is scored
|
|
10
|
-
against what that use case needs instead of against the whole organisation. Readiness names the
|
|
11
|
-
gaps, so the policy covers the data the slice really touches. The rollout's pilot is the slice's
|
|
12
|
-
own users, and its adoption gate is the observable triage said would prove or kill the slice.
|
|
13
|
-
|
|
14
|
-
## Stages
|
|
15
|
-
|
|
16
|
-
| # | Stage | Type | Skills | Gate |
|
|
17
|
-
|---|---|---|---|---|
|
|
18
|
-
| 1 | `triage` | generate | [`ai-use-case-triage`](../../skills/ai-use-case-triage/SKILL.md) | — |
|
|
19
|
-
| 2 | `readiness` | verify | [`ai-readiness-assessment`](../../skills/ai-readiness-assessment/SKILL.md) | **G11** review |
|
|
20
|
-
| 3 | `policy` | generate | [`ai-usage-policy`](../../skills/ai-usage-policy/SKILL.md) | — |
|
|
21
|
-
| 4 | `rollout` | generate | [`ai-adoption-rollout`](../../skills/ai-adoption-rollout/SKILL.md) | — |
|
|
22
|
-
| 5 | `sign-off` | gate | [`doc-critique`](../../../core/skills/doc-critique/SKILL.md) | **G11.1** human |
|
|
23
|
-
|
|
24
|
-
## How to run this loop
|
|
25
|
-
|
|
26
|
-
1. **Triage the ideas.** Run `ai-use-case-triage` on whatever the person brought: a brainstorm,
|
|
27
|
-
a backlog, interview notes. Save it as `triage.md`. Carry three things from it into every
|
|
28
|
-
later stage: the first slice (one workflow and the people who do it), the observable that
|
|
29
|
-
proves or kills it, and the time box.
|
|
30
|
-
2. **Score readiness for the slice.** Run `ai-readiness-assessment` scoped to the slice's team
|
|
31
|
-
and the decision "can this slice start". Each dimension is read against what the slice
|
|
32
|
-
needs: Data is the data the slice reads, Tooling is the tool the slice uses, Process is the
|
|
33
|
-
review step the slice's output passes through. Save it as `readiness.md`.
|
|
34
|
-
3. **Judge the slice at G11.** Ask three questions, then choose the verdict below:
|
|
35
|
-
- Does any gap the assessment ranks as blocking sit on something the slice needs?
|
|
36
|
-
- Can each remaining gap be closed inside the slice's time box, with an owner role named?
|
|
37
|
-
- Is there a review step where a person checks the slice's output before anyone acts on it?
|
|
38
|
-
4. **On `REVISE`, change the slice, not the scores.** Return to `triage` with the blocking gap
|
|
39
|
-
as a constraint, and pick the highest-ranked candidate that does not need what is missing.
|
|
40
|
-
The not-yet list's promotion conditions say which one. Each return counts against the cap.
|
|
41
|
-
5. **Write the policy for the slice's data.** Run `ai-usage-policy` for the slice's people,
|
|
42
|
-
naming every kind of data the slice puts into a tool (from triage and the Data line of
|
|
43
|
-
readiness). Every kind of data the slice touches gets a rule; a rule for data the slice
|
|
44
|
-
never touches stays out of this version. Save it as `policy.md`.
|
|
45
|
-
6. **Plan the rollout from the slice.** Run `ai-adoption-rollout` with the slice's users as the
|
|
46
|
-
pilot cohort and triage's observable as the pilot's adoption gate. G11's conditions become
|
|
47
|
-
preconditions the pilot cannot open without. Save it as `rollout.md`.
|
|
48
|
-
7. **Ask the sponsor at G11.1.** Run `doc-critique` over the policy and the rollout together,
|
|
49
|
-
then put the first wave, the conditions and the critique's open findings to the person who
|
|
50
|
-
sponsors the slice. Only they choose the verdict. In a non-interactive run, stop here and
|
|
51
|
-
write the decision they need to make; never record their verdict for them.
|
|
52
|
-
8. **Hand over the plan, then the verdict.** Lead with the slice, who starts using it and when,
|
|
53
|
-
and what would end it. The scorecard, the policy and the cohort plan go underneath. Close
|
|
54
|
-
with each gate on its own line, `G11: <VERDICT>` and `G11.1: <VERDICT>` (or
|
|
55
|
-
`G11.1: awaiting <role>`), and one sentence of reasons.
|
|
56
|
-
|
|
57
|
-
## Verdicts
|
|
58
|
-
|
|
59
|
-
Defined in [`contracts/terminals.json`](../../../../contracts/terminals.json). G11 emits:
|
|
60
|
-
|
|
61
|
-
- `PROCEED`: no blocking gap sits on what the slice needs, and its output has a review step.
|
|
62
|
-
- `PROCEED WITH CONDITIONS`: a gap sits on the slice but can close inside the time box, with
|
|
63
|
-
an owner role. Each condition travels into the rollout as a precondition for the pilot.
|
|
64
|
-
- `REVISE`: a blocking gap sits on the slice and won't close inside the time box. Return to
|
|
65
|
-
`triage` with that gap as a constraint.
|
|
66
|
-
- `RECONSIDER`: the gap blocks every candidate, such as no rule for what may go into any tool
|
|
67
|
-
or no tool access at all. Fixing it is the work, so the loop ends here with that gap's first
|
|
68
|
-
action and owner role.
|
|
69
|
-
- `BLOCKED`: no candidates to triage, or no team the slice belongs to.
|
|
70
|
-
|
|
71
|
-
G11.1 emits `PROCEED`, `PROCEED WITH CONDITIONS`, `REVISE` (back to `policy`, when the sponsor
|
|
72
|
-
rejects a rule or a cohort) or `BLOCKED` (no sponsor named).
|
|
73
|
-
|
|
74
|
-
On the cap-th `REVISE` at G11, emit `RECONSIDER`: three slices in a row hit blocking gaps, so
|
|
75
|
-
the gaps are the work.
|
|
76
|
-
|
|
77
|
-
## Non-interactive runs
|
|
78
|
-
|
|
79
|
-
With no candidates, `ai-use-case-triage` emits `BLOCKED`; carry it through as the loop's
|
|
80
|
-
verdict and run no further stages. Missing weights and readiness evidence degrade to the
|
|
81
|
-
skills' own `[assumption]` and `[insufficient evidence]` tags. G11.1 always stops at the
|
|
82
|
-
sponsor: write `G11.1: awaiting <role>` with the decision they face, never a verdict.
|
|
83
|
-
|
|
84
|
-
## When a stage's skill is not installed
|
|
85
|
-
|
|
86
|
-
Name the missing skill and skilldrop as its source, do the minimal inline version of that
|
|
87
|
-
stage, and record that it ran degraded. A degraded `readiness` still scores Data, Tooling,
|
|
88
|
-
Governance and Process against the slice with an evidence line each, because G11 can't be
|
|
89
|
-
judged without them. Never skip G11 or G11.1.
|
|
90
|
-
|
|
91
|
-
## Run log (opt-in)
|
|
92
|
-
|
|
93
|
-
Only when the environment variable `SKILLDROP_LOOP_LOG` is set to a file path: after each
|
|
94
|
-
gate's verdict, append one JSON line to that file. Nothing else is recorded, and nothing is
|
|
95
|
-
sent anywhere. When the variable isn't set, or you can't read it, skip this section.
|
|
96
|
-
|
|
97
|
-
```bash
|
|
98
|
-
printf '%s\n' '{"ts":"2026-11-03T10:15:00Z","loop":"adopt","stage":"readiness","gate":"G11","verdict":"REVISE","round":1}' >> "$SKILLDROP_LOOP_LOG"
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
Fields: `ts` (UTC), `loop`, `stage`, `gate` (`null` for a stage without one), `verdict` (the
|
|
102
|
-
gate's exact word), and `round` (1 for the first attempt, counting returns under the cap).
|
|
103
|
-
The log holds verdicts only: never the use cases, the scores or the policy.
|
|
104
|
-
`skilldrop loop-stats` summarises the file.
|
|
105
|
-
|
|
106
|
-
## Quality bar
|
|
107
|
-
|
|
108
|
-
- **Readiness is scored against the slice.** An organisation-wide score hides the one gap that stops the slice and flags gaps that stop nothing yet.
|
|
109
|
-
- **A `REVISE` changes the slice.** It never re-scores a dimension upward to let the same slice through.
|
|
110
|
-
- **The policy covers every kind of data the slice touches,** each restriction with what to do instead.
|
|
111
|
-
- **The pilot is the slice's users, and its adoption gate is triage's observable.** A pilot of volunteers from elsewhere proves nothing about the slice.
|
|
112
|
-
- **G11.1 is the sponsor's call.** The loop writes the decision they face; it never records their verdict.
|
|
113
|
-
|
|
114
|
-
## Anti-patterns to avoid
|
|
115
|
-
|
|
116
|
-
- ❌ **Scoring the whole company's readiness first.** The assessment then ranks gaps by how bad they look, not by what they block.
|
|
117
|
-
- ❌ **Writing a policy for every tool and every kind of data before anything ships.** It is long, it is late, and nobody reads the part that matters to the pilot.
|
|
118
|
-
- ❌ **Passing G11 with a blocking gap and a promise.** A gap that won't close inside the time box is a `REVISE`, however good the slice looks.
|
|
119
|
-
- ❌ **A pilot gate that is "the pilot went well".** The gate is triage's observable, with its threshold and time box.
|
|
120
|
-
- ❌ **Running all four skills before the first gate.** A policy and a rollout written for a slice that then fails G11 are thrown away.
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{"query": "help us start using AI in the finance team, we have ideas but no rules and no plan", "should_trigger": true},
|
|
3
|
-
{"query": "run the adopt loop on these AI use cases from the workshop", "should_trigger": true},
|
|
4
|
-
{"query": "we want to roll out AI across the support team: pick where to start, check we're ready, write the rules and plan the waves", "should_trigger": true},
|
|
5
|
-
{"query": "take this list of AI ideas to a first pilot our VP can sign off", "should_trigger": true},
|
|
6
|
-
{"query": "rank these twelve AI use cases by value and risk", "should_trigger": false},
|
|
7
|
-
{"query": "write an AI acceptable-use policy for our staff", "should_trigger": false},
|
|
8
|
-
{"query": "how far along is our engineering team with coding agents?", "should_trigger": false},
|
|
9
|
-
{"query": "design an eval harness for our support chatbot", "should_trigger": false}
|
|
10
|
-
]
|