@ketecode/loom 0.0.0-stage → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +616 -2
- package/agents/accessibility-reviewer/AGENT.md +70 -0
- package/agents/accessibility-reviewer/evals/triggers.json +15 -0
- package/agents/agent-evaluator/AGENT.md +74 -0
- package/agents/agent-evaluator/evals/triggers.json +15 -0
- package/agents/architect/AGENT.md +82 -0
- package/agents/architect/evals/triggers.json +17 -0
- package/agents/billing-reviewer/AGENT.md +68 -0
- package/agents/billing-reviewer/evals/triggers.json +16 -0
- package/agents/code-reviewer/AGENT.md +51 -0
- package/agents/code-reviewer/evals/behavior.json +60 -0
- package/agents/code-reviewer/evals/triggers.json +14 -0
- package/agents/code-simplifier/AGENT.md +74 -0
- package/agents/code-simplifier/evals/triggers.json +15 -0
- package/agents/cpp-build-resolver/AGENT.md +73 -0
- package/agents/cpp-build-resolver/evals/triggers.json +16 -0
- package/agents/cpp-reviewer/AGENT.md +59 -0
- package/agents/cpp-reviewer/evals/triggers.json +16 -0
- package/agents/csharp-build-resolver/AGENT.md +84 -0
- package/agents/csharp-build-resolver/evals/triggers.json +17 -0
- package/agents/csharp-reviewer/AGENT.md +88 -0
- package/agents/csharp-reviewer/evals/triggers.json +17 -0
- package/agents/dart-build-resolver/AGENT.md +80 -0
- package/agents/dart-build-resolver/evals/triggers.json +17 -0
- package/agents/dart-reviewer/AGENT.md +66 -0
- package/agents/dart-reviewer/evals/triggers.json +17 -0
- package/agents/database-reviewer/AGENT.md +72 -0
- package/agents/database-reviewer/evals/triggers.json +16 -0
- package/agents/django-reviewer/AGENT.md +61 -0
- package/agents/django-reviewer/evals/triggers.json +15 -0
- package/agents/doc-updater/AGENT.md +92 -0
- package/agents/doc-updater/evals/triggers.json +14 -0
- package/agents/e2e-runner/AGENT.md +88 -0
- package/agents/e2e-runner/evals/triggers.json +16 -0
- package/agents/fastapi-reviewer/AGENT.md +63 -0
- package/agents/fastapi-reviewer/evals/triggers.json +15 -0
- package/agents/flutter-reviewer/AGENT.md +70 -0
- package/agents/flutter-reviewer/evals/triggers.json +15 -0
- package/agents/fsharp-build-resolver/AGENT.md +81 -0
- package/agents/fsharp-build-resolver/evals/triggers.json +15 -0
- package/agents/fsharp-reviewer/AGENT.md +77 -0
- package/agents/fsharp-reviewer/evals/triggers.json +15 -0
- package/agents/go-build-resolver/AGENT.md +85 -0
- package/agents/go-build-resolver/evals/triggers.json +16 -0
- package/agents/go-reviewer/AGENT.md +66 -0
- package/agents/go-reviewer/evals/triggers.json +16 -0
- package/agents/healthcare-reviewer/AGENT.md +65 -0
- package/agents/healthcare-reviewer/evals/triggers.json +16 -0
- package/agents/i18n-reviewer/AGENT.md +64 -0
- package/agents/i18n-reviewer/evals/triggers.json +16 -0
- package/agents/inbox-triager/AGENT.md +98 -0
- package/agents/inbox-triager/evals/triggers.json +16 -0
- package/agents/infra-reviewer/AGENT.md +93 -0
- package/agents/infra-reviewer/evals/triggers.json +15 -0
- package/agents/java-build-resolver/AGENT.md +82 -0
- package/agents/java-build-resolver/evals/triggers.json +16 -0
- package/agents/java-reviewer/AGENT.md +64 -0
- package/agents/java-reviewer/evals/triggers.json +16 -0
- package/agents/kotlin-build-resolver/AGENT.md +89 -0
- package/agents/kotlin-build-resolver/evals/triggers.json +16 -0
- package/agents/kotlin-reviewer/AGENT.md +75 -0
- package/agents/kotlin-reviewer/evals/triggers.json +16 -0
- package/agents/mle-reviewer/AGENT.md +68 -0
- package/agents/mle-reviewer/evals/triggers.json +16 -0
- package/agents/network-config-reviewer/AGENT.md +68 -0
- package/agents/network-config-reviewer/evals/triggers.json +17 -0
- package/agents/payments-reviewer/AGENT.md +64 -0
- package/agents/payments-reviewer/evals/triggers.json +16 -0
- package/agents/performance-optimizer/AGENT.md +86 -0
- package/agents/performance-optimizer/evals/triggers.json +16 -0
- package/agents/perl-build-resolver/AGENT.md +84 -0
- package/agents/perl-build-resolver/evals/triggers.json +15 -0
- package/agents/perl-reviewer/AGENT.md +77 -0
- package/agents/perl-reviewer/evals/triggers.json +15 -0
- package/agents/php-build-resolver/AGENT.md +88 -0
- package/agents/php-build-resolver/evals/triggers.json +16 -0
- package/agents/php-reviewer/AGENT.md +61 -0
- package/agents/php-reviewer/evals/triggers.json +15 -0
- package/agents/planner/AGENT.md +75 -0
- package/agents/planner/evals/triggers.json +17 -0
- package/agents/pr-test-analyzer/AGENT.md +82 -0
- package/agents/pr-test-analyzer/evals/triggers.json +16 -0
- package/agents/python-build-resolver/AGENT.md +87 -0
- package/agents/python-build-resolver/evals/triggers.json +16 -0
- package/agents/python-reviewer/AGENT.md +63 -0
- package/agents/python-reviewer/evals/triggers.json +15 -0
- package/agents/rag-reviewer/AGENT.md +71 -0
- package/agents/rag-reviewer/evals/triggers.json +16 -0
- package/agents/react-reviewer/AGENT.md +70 -0
- package/agents/react-reviewer/evals/triggers.json +16 -0
- package/agents/refactor-cleaner/AGENT.md +82 -0
- package/agents/refactor-cleaner/evals/triggers.json +16 -0
- package/agents/ruby-build-resolver/AGENT.md +93 -0
- package/agents/ruby-build-resolver/evals/triggers.json +16 -0
- package/agents/ruby-reviewer/AGENT.md +62 -0
- package/agents/ruby-reviewer/evals/triggers.json +16 -0
- package/agents/rust-build-resolver/AGENT.md +98 -0
- package/agents/rust-build-resolver/evals/triggers.json +16 -0
- package/agents/rust-reviewer/AGENT.md +78 -0
- package/agents/rust-reviewer/evals/triggers.json +15 -0
- package/agents/security-reviewer/AGENT.md +84 -0
- package/agents/security-reviewer/evals/triggers.json +16 -0
- package/agents/silent-failure-hunter/AGENT.md +66 -0
- package/agents/silent-failure-hunter/evals/triggers.json +16 -0
- package/agents/solidity-reviewer/AGENT.md +70 -0
- package/agents/solidity-reviewer/evals/triggers.json +16 -0
- package/agents/spec-reviewer/AGENT.md +95 -0
- package/agents/spec-reviewer/evals/behavior.json +57 -0
- package/agents/spec-reviewer/evals/triggers.json +16 -0
- package/agents/swift-build-resolver/AGENT.md +85 -0
- package/agents/swift-build-resolver/evals/triggers.json +15 -0
- package/agents/swift-reviewer/AGENT.md +75 -0
- package/agents/swift-reviewer/evals/triggers.json +15 -0
- package/agents/task-implementer/AGENT.md +89 -0
- package/agents/task-implementer/evals/behavior.json +47 -0
- package/agents/task-implementer/evals/triggers.json +16 -0
- package/agents/typescript-build-resolver/AGENT.md +76 -0
- package/agents/typescript-build-resolver/evals/triggers.json +15 -0
- package/agents/typescript-reviewer/AGENT.md +76 -0
- package/agents/typescript-reviewer/evals/triggers.json +15 -0
- package/agents/vue-reviewer/AGENT.md +75 -0
- package/agents/vue-reviewer/evals/triggers.json +15 -0
- package/bin/kete-loom.js +723 -0
- package/commands/aside.md +19 -0
- package/commands/brainstorm.md +25 -0
- package/commands/build-fix.md +26 -0
- package/commands/campaign.md +19 -0
- package/commands/changelog.md +36 -0
- package/commands/checkpoint.md +26 -0
- package/commands/codemap.md +25 -0
- package/commands/commit.md +26 -0
- package/commands/debug.md +27 -0
- package/commands/deps-audit.md +32 -0
- package/commands/dual-review.md +34 -0
- package/commands/epic-decompose.md +21 -0
- package/commands/explain.md +37 -0
- package/commands/feature-dev.md +23 -0
- package/commands/finish-branch.md +26 -0
- package/commands/fix-bug.md +38 -0
- package/commands/hookify.md +23 -0
- package/commands/i18n-check.md +39 -0
- package/commands/issue-sync.md +22 -0
- package/commands/jira.md +19 -0
- package/commands/learn.md +23 -0
- package/commands/loom.md +21 -0
- package/commands/loop.md +20 -0
- package/commands/model-route.md +27 -0
- package/commands/onboard.md +35 -0
- package/commands/orchestrate.md +21 -0
- package/commands/plan-feature.md +36 -0
- package/commands/postmortem.md +42 -0
- package/commands/pr-describe.md +39 -0
- package/commands/pr.md +22 -0
- package/commands/prd.md +41 -0
- package/commands/production-readiness.md +45 -0
- package/commands/project-init.md +21 -0
- package/commands/refactor-clean.md +24 -0
- package/commands/resume-session.md +22 -0
- package/commands/review.md +35 -0
- package/commands/save-session.md +37 -0
- package/commands/security-scan.md +32 -0
- package/commands/sessions.md +21 -0
- package/commands/skill-create.md +21 -0
- package/commands/tdd.md +36 -0
- package/commands/test-coverage.md +24 -0
- package/commands/threat-model.md +36 -0
- package/commands/update-docs.md +25 -0
- package/commands/usage-report.md +43 -0
- package/commands/verify.md +21 -0
- package/hooks/block-dangerous-commands/HOOK.md +30 -0
- package/hooks/block-dangerous-commands/cases.json +50 -0
- package/hooks/block-dangerous-commands/hook.js +75 -0
- package/hooks/block-foreground-servers/HOOK.md +34 -0
- package/hooks/block-foreground-servers/cases.json +31 -0
- package/hooks/block-foreground-servers/hook.js +41 -0
- package/hooks/block-no-verify/HOOK.md +25 -0
- package/hooks/block-no-verify/cases.json +30 -0
- package/hooks/block-no-verify/hook.js +43 -0
- package/hooks/capture-lessons/HOOK.md +24 -0
- package/hooks/capture-lessons/hook.js +48 -0
- package/hooks/format-on-edit/HOOK.md +24 -0
- package/hooks/format-on-edit/hook.js +89 -0
- package/hooks/guard-secrets/HOOK.md +19 -0
- package/hooks/guard-secrets/cases.json +110 -0
- package/hooks/guard-secrets/hook.js +44 -0
- package/hooks/load-session-context/HOOK.md +20 -0
- package/hooks/load-session-context/hook.js +56 -0
- package/hooks/notify-on-stop/HOOK.md +25 -0
- package/hooks/notify-on-stop/hook.js +27 -0
- package/hooks/protect-files/HOOK.md +24 -0
- package/hooks/protect-files/cases.json +27 -0
- package/hooks/protect-files/hook.js +39 -0
- package/hooks/protect-lint-config/HOOK.md +29 -0
- package/hooks/protect-lint-config/cases.json +18 -0
- package/hooks/protect-lint-config/fixtures/.eslintrc.json +1 -0
- package/hooks/protect-lint-config/fixtures/.golangci.yml +1 -0
- package/hooks/protect-lint-config/fixtures/.prettierrc +1 -0
- package/hooks/protect-lint-config/fixtures/.rubocop.yml +1 -0
- package/hooks/protect-lint-config/fixtures/biome.json +1 -0
- package/hooks/protect-lint-config/fixtures/eslint.config.mjs +1 -0
- package/hooks/protect-lint-config/fixtures/ruff.toml +1 -0
- package/hooks/protect-lint-config/hook.js +25 -0
- package/hooks/read-before-edit/HOOK.md +26 -0
- package/hooks/read-before-edit/cases.json +15 -0
- package/hooks/read-before-edit/hook.js +50 -0
- package/hooks/run.js +148 -0
- package/hooks/verify-before-stop/HOOK.md +32 -0
- package/hooks/verify-before-stop/hook.js +70 -0
- package/mcp/atlassian.json +11 -0
- package/mcp/chrome-devtools.json +18 -0
- package/mcp/clickhouse.json +11 -0
- package/mcp/cloudflare.json +11 -0
- package/mcp/context7.json +11 -0
- package/mcp/exa.json +11 -0
- package/mcp/fetch.json +17 -0
- package/mcp/figma.json +11 -0
- package/mcp/firecrawl.json +11 -0
- package/mcp/git.json +17 -0
- package/mcp/github.json +11 -0
- package/mcp/linear.json +11 -0
- package/mcp/memory.json +18 -0
- package/mcp/notion.json +11 -0
- package/mcp/playwright.json +18 -0
- package/mcp/sentry.json +11 -0
- package/mcp/stripe.json +11 -0
- package/mcp/supabase.json +11 -0
- package/mcp/time.json +17 -0
- package/mcp/vercel.json +11 -0
- package/package.json +61 -4
- package/profiles.json +214 -0
- package/rules/common.md +21 -0
- package/rules/cpp.md +29 -0
- package/rules/csharp.md +25 -0
- package/rules/dart.md +29 -0
- package/rules/fsharp.md +28 -0
- package/rules/git.md +26 -0
- package/rules/go.md +29 -0
- package/rules/java.md +29 -0
- package/rules/kotlin.md +27 -0
- package/rules/perl.md +26 -0
- package/rules/php.md +28 -0
- package/rules/python.md +30 -0
- package/rules/ruby.md +27 -0
- package/rules/rust.md +26 -0
- package/rules/security.md +29 -0
- package/rules/swift.md +28 -0
- package/rules/testing.md +25 -0
- package/rules/typescript.md +29 -0
- package/rules/use-skills.md +23 -0
- package/schemas/skill-frontmatter.schema.json +52 -0
- package/scripts/lib/audit.js +96 -0
- package/scripts/lib/behavior.js +52 -0
- package/scripts/lib/frontmatter.js +65 -0
- package/scripts/lib/hooks-install.js +294 -0
- package/scripts/lib/i18n.js +51 -0
- package/scripts/lib/inventory.js +85 -0
- package/scripts/lib/lint.js +180 -0
- package/scripts/lib/mcp-install.js +288 -0
- package/scripts/lib/profiles.js +128 -0
- package/scripts/lib/render.js +92 -0
- package/scripts/lib/rules-install.js +118 -0
- package/scripts/lib/skills.js +87 -0
- package/scripts/lib/targets.js +123 -0
- package/skills/accounting-api-integration/SKILL.md +81 -0
- package/skills/accounting-api-integration/evals/triggers.json +17 -0
- package/skills/accounting-api-integration/references/quickbooks.md +48 -0
- package/skills/accounting-api-integration/references/xero.md +45 -0
- package/skills/agent-failure-debugging/SKILL.md +92 -0
- package/skills/agent-failure-debugging/evals/triggers.json +16 -0
- package/skills/agent-harness-design/SKILL.md +125 -0
- package/skills/agent-harness-design/evals/triggers.json +21 -0
- package/skills/agent-outbound-messaging/SKILL.md +92 -0
- package/skills/agent-outbound-messaging/evals/triggers.json +16 -0
- package/skills/agent-security/SKILL.md +117 -0
- package/skills/agent-security/evals/triggers.json +16 -0
- package/skills/agent-security/references/host-configs.md +37 -0
- package/skills/ai-media-generation/SKILL.md +89 -0
- package/skills/ai-media-generation/evals/triggers.json +16 -0
- package/skills/ai-media-generation/references/job-pipeline.md +76 -0
- package/skills/angular-patterns/SKILL.md +122 -0
- package/skills/angular-patterns/evals/triggers.json +16 -0
- package/skills/api-client-integration/SKILL.md +86 -0
- package/skills/api-client-integration/evals/triggers.json +16 -0
- package/skills/api-client-integration/references/resilience.md +57 -0
- package/skills/api-design/SKILL.md +96 -0
- package/skills/api-design/evals/triggers.json +18 -0
- package/skills/api-design/references/conventions.md +133 -0
- package/skills/architecture-decision-records/SKILL.md +98 -0
- package/skills/architecture-decision-records/evals/triggers.json +17 -0
- package/skills/article-writing/SKILL.md +108 -0
- package/skills/article-writing/evals/triggers.json +16 -0
- package/skills/aspnet-core-patterns/SKILL.md +149 -0
- package/skills/aspnet-core-patterns/evals/triggers.json +16 -0
- package/skills/auth-patterns/SKILL.md +104 -0
- package/skills/auth-patterns/evals/triggers.json +17 -0
- package/skills/auth-patterns/references/oauth-oidc.md +64 -0
- package/skills/autonomous-loops/SKILL.md +99 -0
- package/skills/autonomous-loops/evals/triggers.json +14 -0
- package/skills/aws-patterns/SKILL.md +91 -0
- package/skills/aws-patterns/evals/triggers.json +16 -0
- package/skills/azure-patterns/SKILL.md +86 -0
- package/skills/azure-patterns/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/SKILL.md +88 -0
- package/skills/benchmark-methodology/evals/triggers.json +16 -0
- package/skills/benchmark-methodology/references/language-harnesses.md +130 -0
- package/skills/bgp-diagnostics/SKILL.md +84 -0
- package/skills/bgp-diagnostics/evals/triggers.json +18 -0
- package/skills/bgp-diagnostics/references/bgp-reference.md +81 -0
- package/skills/bioinformatics-workflows/SKILL.md +108 -0
- package/skills/bioinformatics-workflows/evals/triggers.json +16 -0
- package/skills/bioinformatics-workflows/references/commands.md +71 -0
- package/skills/bioinformatics-workflows/references/formats.md +24 -0
- package/skills/bioinformatics-workflows/references/workflow-managers.md +107 -0
- package/skills/blender-automation/SKILL.md +100 -0
- package/skills/blender-automation/evals/triggers.json +16 -0
- package/skills/blender-automation/references/batch-and-render.md +77 -0
- package/skills/blender-automation/references/bpy-inspection.md +91 -0
- package/skills/blender-automation/references/rig-and-retarget-checks.md +23 -0
- package/skills/brand-strategy/SKILL.md +83 -0
- package/skills/brand-strategy/evals/triggers.json +16 -0
- package/skills/brand-voice/SKILL.md +112 -0
- package/skills/brand-voice/evals/triggers.json +16 -0
- package/skills/browser-qa/SKILL.md +99 -0
- package/skills/browser-qa/evals/triggers.json +16 -0
- package/skills/bun-runtime/SKILL.md +93 -0
- package/skills/bun-runtime/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/SKILL.md +89 -0
- package/skills/change-impact-analysis/evals/triggers.json +16 -0
- package/skills/change-impact-analysis/references/graph-commands.md +28 -0
- package/skills/cisco-ios-config/SKILL.md +101 -0
- package/skills/cisco-ios-config/evals/triggers.json +18 -0
- package/skills/cisco-ios-config/references/verification.md +63 -0
- package/skills/clickhouse-patterns/SKILL.md +101 -0
- package/skills/clickhouse-patterns/evals/triggers.json +18 -0
- package/skills/clickhouse-patterns/references/engines-and-views.md +138 -0
- package/skills/clinical-decision-support/SKILL.md +90 -0
- package/skills/clinical-decision-support/evals/triggers.json +16 -0
- package/skills/clinical-decision-support/references/cds-hooks.md +76 -0
- package/skills/clinical-decision-support/references/regulatory-boundaries.md +37 -0
- package/skills/code-tour/SKILL.md +97 -0
- package/skills/code-tour/evals/triggers.json +14 -0
- package/skills/codebase-onboarding/SKILL.md +112 -0
- package/skills/codebase-onboarding/evals/triggers.json +14 -0
- package/skills/cold-outreach-sequences/SKILL.md +90 -0
- package/skills/cold-outreach-sequences/evals/triggers.json +16 -0
- package/skills/content-repurposing/SKILL.md +82 -0
- package/skills/content-repurposing/evals/triggers.json +16 -0
- package/skills/context-budget/SKILL.md +84 -0
- package/skills/context-budget/evals/triggers.json +14 -0
- package/skills/contract-drafting/SKILL.md +96 -0
- package/skills/contract-drafting/evals/triggers.json +16 -0
- package/skills/contract-drafting/references/term-sheets.md +68 -0
- package/skills/contract-first-development/SKILL.md +86 -0
- package/skills/contract-first-development/evals/triggers.json +16 -0
- package/skills/contract-first-development/references/tooling.md +46 -0
- package/skills/conventional-commits/SKILL.md +144 -0
- package/skills/conventional-commits/evals/triggers.json +16 -0
- package/skills/cpp-patterns/SKILL.md +129 -0
- package/skills/cpp-patterns/evals/triggers.json +16 -0
- package/skills/cpp-patterns/references/cmake-and-tooling.md +88 -0
- package/skills/cpp-patterns/references/undefined-behaviour.md +75 -0
- package/skills/cpp-testing/SKILL.md +131 -0
- package/skills/cpp-testing/evals/triggers.json +16 -0
- package/skills/csharp-patterns/SKILL.md +110 -0
- package/skills/csharp-patterns/evals/triggers.json +17 -0
- package/skills/csharp-patterns/references/analyzers.md +59 -0
- package/skills/csharp-testing/SKILL.md +85 -0
- package/skills/csharp-testing/evals/triggers.json +17 -0
- package/skills/csharp-testing/references/integration-tests.md +77 -0
- package/skills/css-architecture/SKILL.md +143 -0
- package/skills/css-architecture/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/SKILL.md +95 -0
- package/skills/customs-trade-compliance/evals/triggers.json +16 -0
- package/skills/customs-trade-compliance/references/incoterms-2020.md +42 -0
- package/skills/dart-patterns/SKILL.md +157 -0
- package/skills/dart-patterns/evals/triggers.json +18 -0
- package/skills/dart-testing/SKILL.md +164 -0
- package/skills/dart-testing/evals/triggers.json +18 -0
- package/skills/data-analysis-notebooks/SKILL.md +113 -0
- package/skills/data-analysis-notebooks/evals/triggers.json +16 -0
- package/skills/data-analysis-notebooks/references/dataframe-pitfalls.md +49 -0
- package/skills/data-analysis-notebooks/references/statistics-pitfalls.md +24 -0
- package/skills/data-pipelines/SKILL.md +90 -0
- package/skills/data-pipelines/evals/triggers.json +16 -0
- package/skills/data-pipelines/references/orchestrators.md +64 -0
- package/skills/database-migrations/SKILL.md +102 -0
- package/skills/database-migrations/evals/triggers.json +16 -0
- package/skills/database-migrations/references/recipes.md +98 -0
- package/skills/database-migrations/references/tools.md +21 -0
- package/skills/dbt-patterns/SKILL.md +96 -0
- package/skills/dbt-patterns/evals/triggers.json +16 -0
- package/skills/dbt-patterns/references/yaml-examples.md +114 -0
- package/skills/decision-council/SKILL.md +98 -0
- package/skills/decision-council/evals/triggers.json +16 -0
- package/skills/deep-research/SKILL.md +107 -0
- package/skills/deep-research/evals/triggers.json +14 -0
- package/skills/dependency-audit/SKILL.md +103 -0
- package/skills/dependency-audit/evals/triggers.json +16 -0
- package/skills/dependency-audit/references/tools.md +124 -0
- package/skills/deployment-strategies/SKILL.md +108 -0
- package/skills/deployment-strategies/evals/triggers.json +16 -0
- package/skills/design-brainstorming/SKILL.md +132 -0
- package/skills/design-brainstorming/evals/behavior.json +55 -0
- package/skills/design-brainstorming/evals/triggers.json +16 -0
- package/skills/design-brainstorming/references/visual-mockups.md +34 -0
- package/skills/desktop-app-testing/SKILL.md +104 -0
- package/skills/desktop-app-testing/evals/triggers.json +16 -0
- package/skills/desktop-app-testing/references/drivers.md +81 -0
- package/skills/django-patterns/SKILL.md +123 -0
- package/skills/django-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/SKILL.md +132 -0
- package/skills/docker-patterns/evals/triggers.json +16 -0
- package/skills/docker-patterns/references/dockerfiles.md +105 -0
- package/skills/document-processing/SKILL.md +100 -0
- package/skills/document-processing/evals/triggers.json +17 -0
- package/skills/document-processing/references/extraction-and-ocr.md +71 -0
- package/skills/document-processing/references/forms-and-conversion.md +69 -0
- package/skills/document-processing/references/redaction.md +61 -0
- package/skills/e2e-testing-playwright/SKILL.md +94 -0
- package/skills/e2e-testing-playwright/evals/triggers.json +16 -0
- package/skills/e2e-testing-playwright/references/config-and-ci.md +129 -0
- package/skills/ef-core-patterns/SKILL.md +117 -0
- package/skills/ef-core-patterns/evals/triggers.json +16 -0
- package/skills/email-deliverability/SKILL.md +99 -0
- package/skills/email-deliverability/evals/triggers.json +17 -0
- package/skills/email-deliverability/references/dns-records.md +85 -0
- package/skills/energy-procurement/SKILL.md +106 -0
- package/skills/energy-procurement/evals/triggers.json +16 -0
- package/skills/error-handling-patterns/SKILL.md +112 -0
- package/skills/error-handling-patterns/evals/triggers.json +18 -0
- package/skills/error-handling-patterns/references/language-idioms.md +49 -0
- package/skills/estimation-and-scoping/SKILL.md +97 -0
- package/skills/estimation-and-scoping/evals/triggers.json +14 -0
- package/skills/evm-dapp-integration/SKILL.md +73 -0
- package/skills/evm-dapp-integration/evals/triggers.json +16 -0
- package/skills/fastapi-patterns/SKILL.md +127 -0
- package/skills/fastapi-patterns/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/SKILL.md +94 -0
- package/skills/ffmpeg-media-processing/evals/triggers.json +16 -0
- package/skills/ffmpeg-media-processing/references/recipes.md +112 -0
- package/skills/fhir-integration/SKILL.md +81 -0
- package/skills/fhir-integration/evals/triggers.json +16 -0
- package/skills/fhir-integration/references/search-and-bundles.md +73 -0
- package/skills/fhir-integration/references/smart-on-fhir.md +50 -0
- package/skills/finishing-a-branch/SKILL.md +127 -0
- package/skills/finishing-a-branch/evals/behavior.json +49 -0
- package/skills/finishing-a-branch/evals/triggers.json +16 -0
- package/skills/flask-patterns/SKILL.md +132 -0
- package/skills/flask-patterns/evals/triggers.json +16 -0
- package/skills/flutter-patterns/SKILL.md +99 -0
- package/skills/flutter-patterns/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/SKILL.md +75 -0
- package/skills/flutterwave-integration/evals/triggers.json +16 -0
- package/skills/flutterwave-integration/references/api.md +73 -0
- package/skills/flutterwave-integration/references/webhooks.md +49 -0
- package/skills/freight-carrier-management/SKILL.md +107 -0
- package/skills/freight-carrier-management/evals/triggers.json +16 -0
- package/skills/fsharp-patterns/SKILL.md +133 -0
- package/skills/fsharp-patterns/evals/triggers.json +16 -0
- package/skills/fsharp-testing/SKILL.md +136 -0
- package/skills/fsharp-testing/evals/triggers.json +16 -0
- package/skills/gcp-patterns/SKILL.md +86 -0
- package/skills/gcp-patterns/evals/triggers.json +16 -0
- package/skills/git-workflow/SKILL.md +114 -0
- package/skills/git-workflow/evals/triggers.json +16 -0
- package/skills/git-worktrees/SKILL.md +130 -0
- package/skills/git-worktrees/evals/behavior.json +56 -0
- package/skills/git-worktrees/evals/triggers.json +16 -0
- package/skills/github-actions-ci/SKILL.md +117 -0
- package/skills/github-actions-ci/evals/triggers.json +16 -0
- package/skills/github-api-automation/SKILL.md +101 -0
- package/skills/github-api-automation/evals/triggers.json +17 -0
- package/skills/go-patterns/SKILL.md +118 -0
- package/skills/go-patterns/evals/triggers.json +17 -0
- package/skills/go-patterns/references/concurrency.md +162 -0
- package/skills/go-testing/SKILL.md +154 -0
- package/skills/go-testing/evals/triggers.json +17 -0
- package/skills/google-workspace-integration/SKILL.md +65 -0
- package/skills/google-workspace-integration/evals/triggers.json +17 -0
- package/skills/google-workspace-integration/references/api.md +121 -0
- package/skills/harmonyos-arkts/SKILL.md +117 -0
- package/skills/harmonyos-arkts/evals/triggers.json +16 -0
- package/skills/harmonyos-arkts/references/build-errors.md +42 -0
- package/skills/hexagonal-architecture/SKILL.md +89 -0
- package/skills/hexagonal-architecture/evals/triggers.json +17 -0
- package/skills/hipaa-compliance/SKILL.md +91 -0
- package/skills/hipaa-compliance/evals/triggers.json +18 -0
- package/skills/hipaa-compliance/references/safeguards.md +68 -0
- package/skills/hl7v2-integration/SKILL.md +69 -0
- package/skills/hl7v2-integration/evals/triggers.json +16 -0
- package/skills/hl7v2-integration/references/messages-and-ack.md +78 -0
- package/skills/homelab-network-setup/SKILL.md +125 -0
- package/skills/homelab-network-setup/evals/triggers.json +18 -0
- package/skills/homelab-network-setup/references/firewall-and-dns.md +45 -0
- package/skills/homelab-network-setup/references/wireguard.md +72 -0
- package/skills/hubtel-integration/SKILL.md +77 -0
- package/skills/hubtel-integration/evals/triggers.json +16 -0
- package/skills/hubtel-integration/references/api.md +92 -0
- package/skills/i18n-localization/SKILL.md +114 -0
- package/skills/i18n-localization/evals/triggers.json +16 -0
- package/skills/i18n-localization/references/libraries.md +52 -0
- package/skills/implementation-plans/SKILL.md +117 -0
- package/skills/implementation-plans/evals/behavior.json +54 -0
- package/skills/implementation-plans/evals/triggers.json +16 -0
- package/skills/incident-postmortem/SKILL.md +118 -0
- package/skills/incident-postmortem/evals/triggers.json +14 -0
- package/skills/inventory-demand-planning/SKILL.md +89 -0
- package/skills/inventory-demand-planning/evals/triggers.json +16 -0
- package/skills/inventory-demand-planning/references/formulas.md +62 -0
- package/skills/investor-materials/SKILL.md +127 -0
- package/skills/investor-materials/evals/triggers.json +16 -0
- package/skills/investor-materials/references/templates.md +74 -0
- package/skills/invoicing-and-tax/SKILL.md +84 -0
- package/skills/invoicing-and-tax/evals/triggers.json +17 -0
- package/skills/invoicing-and-tax/references/e-invoicing.md +24 -0
- package/skills/invoicing-and-tax/references/invoice-fields.md +38 -0
- package/skills/invoicing-and-tax/references/rounding.md +26 -0
- package/skills/ios-platform-features/SKILL.md +99 -0
- package/skills/ios-platform-features/evals/triggers.json +16 -0
- package/skills/ios-platform-features/references/foundation-models.md +90 -0
- package/skills/java-patterns/SKILL.md +141 -0
- package/skills/java-patterns/evals/triggers.json +17 -0
- package/skills/java-testing/SKILL.md +142 -0
- package/skills/java-testing/evals/triggers.json +16 -0
- package/skills/jetpack-compose-patterns/SKILL.md +88 -0
- package/skills/jetpack-compose-patterns/evals/triggers.json +16 -0
- package/skills/jira-integration/SKILL.md +92 -0
- package/skills/jira-integration/evals/triggers.json +17 -0
- package/skills/jpa-hibernate/SKILL.md +92 -0
- package/skills/jpa-hibernate/evals/triggers.json +18 -0
- package/skills/jpa-hibernate/references/mapping.md +99 -0
- package/skills/jvm-sql-mappers/SKILL.md +98 -0
- package/skills/jvm-sql-mappers/evals/triggers.json +16 -0
- package/skills/jvm-sql-mappers/references/examples.md +129 -0
- package/skills/kotlin-multiplatform/SKILL.md +97 -0
- package/skills/kotlin-multiplatform/evals/triggers.json +16 -0
- package/skills/kotlin-patterns/SKILL.md +128 -0
- package/skills/kotlin-patterns/evals/triggers.json +16 -0
- package/skills/kotlin-testing/SKILL.md +117 -0
- package/skills/kotlin-testing/evals/triggers.json +16 -0
- package/skills/ktor-patterns/SKILL.md +135 -0
- package/skills/ktor-patterns/evals/triggers.json +18 -0
- package/skills/kubernetes-patterns/SKILL.md +106 -0
- package/skills/kubernetes-patterns/evals/triggers.json +16 -0
- package/skills/kubernetes-patterns/references/manifests.md +115 -0
- package/skills/laravel-patterns/SKILL.md +136 -0
- package/skills/laravel-patterns/evals/triggers.json +16 -0
- package/skills/linear-integration/SKILL.md +98 -0
- package/skills/linear-integration/evals/triggers.json +17 -0
- package/skills/literature-review/SKILL.md +109 -0
- package/skills/literature-review/evals/triggers.json +16 -0
- package/skills/literature-review/references/appraisal.md +41 -0
- package/skills/literature-review/references/search-sources.md +39 -0
- package/skills/llm-app-patterns/SKILL.md +97 -0
- package/skills/llm-app-patterns/evals/triggers.json +17 -0
- package/skills/llm-evals/SKILL.md +98 -0
- package/skills/llm-evals/evals/triggers.json +16 -0
- package/skills/llm-evals/references/graders.md +66 -0
- package/skills/logistics-exception-management/SKILL.md +90 -0
- package/skills/logistics-exception-management/evals/triggers.json +16 -0
- package/skills/manim-animations/SKILL.md +106 -0
- package/skills/manim-animations/evals/triggers.json +16 -0
- package/skills/market-research/SKILL.md +117 -0
- package/skills/market-research/evals/triggers.json +16 -0
- package/skills/marketing-campaign/SKILL.md +111 -0
- package/skills/marketing-campaign/evals/triggers.json +16 -0
- package/skills/mcp-server-patterns/SKILL.md +127 -0
- package/skills/mcp-server-patterns/evals/triggers.json +18 -0
- package/skills/mcp-server-patterns/references/protocol-notes.md +68 -0
- package/skills/metrics-dashboards/SKILL.md +113 -0
- package/skills/metrics-dashboards/evals/triggers.json +16 -0
- package/skills/ml-experiment-workflow/SKILL.md +125 -0
- package/skills/ml-experiment-workflow/evals/triggers.json +16 -0
- package/skills/mobile-accessibility/SKILL.md +94 -0
- package/skills/mobile-accessibility/evals/triggers.json +16 -0
- package/skills/mongodb-patterns/SKILL.md +115 -0
- package/skills/mongodb-patterns/evals/triggers.json +18 -0
- package/skills/mongodb-patterns/references/indexes-and-aggregation.md +94 -0
- package/skills/mpesa-daraja-integration/SKILL.md +70 -0
- package/skills/mpesa-daraja-integration/evals/triggers.json +16 -0
- package/skills/mpesa-daraja-integration/references/api.md +103 -0
- package/skills/mpesa-daraja-integration/references/callbacks.md +74 -0
- package/skills/mtn-momo-integration/SKILL.md +66 -0
- package/skills/mtn-momo-integration/evals/triggers.json +16 -0
- package/skills/mtn-momo-integration/references/api.md +153 -0
- package/skills/mtn-momo-integration/references/callbacks.md +92 -0
- package/skills/mtn-momo-integration/references/sandbox-and-go-live.md +51 -0
- package/skills/mtn-momo-integration/scripts/sandbox-setup.js +79 -0
- package/skills/mysql-patterns/SKILL.md +96 -0
- package/skills/mysql-patterns/evals/triggers.json +16 -0
- package/skills/mysql-patterns/references/explain.md +34 -0
- package/skills/mysql-patterns/references/online-ddl.md +41 -0
- package/skills/nestjs-patterns/SKILL.md +114 -0
- package/skills/nestjs-patterns/evals/triggers.json +16 -0
- package/skills/nestjs-patterns/references/testing.md +68 -0
- package/skills/network-automation/SKILL.md +107 -0
- package/skills/network-automation/evals/triggers.json +18 -0
- package/skills/network-automation/references/tool-snippets.md +153 -0
- package/skills/network-design/SKILL.md +98 -0
- package/skills/network-design/evals/triggers.json +16 -0
- package/skills/network-troubleshooting/SKILL.md +152 -0
- package/skills/network-troubleshooting/evals/triggers.json +18 -0
- package/skills/network-troubleshooting/references/commands.md +33 -0
- package/skills/nextjs-patterns/SKILL.md +150 -0
- package/skills/nextjs-patterns/evals/triggers.json +18 -0
- package/skills/nextjs-patterns/references/caching.md +87 -0
- package/skills/node-backend-patterns/SKILL.md +103 -0
- package/skills/node-backend-patterns/evals/triggers.json +16 -0
- package/skills/node-backend-patterns/references/templates.md +122 -0
- package/skills/nuxt-patterns/SKILL.md +103 -0
- package/skills/nuxt-patterns/evals/triggers.json +16 -0
- package/skills/observability/SKILL.md +125 -0
- package/skills/observability/evals/triggers.json +17 -0
- package/skills/observability/references/otel-setup.md +87 -0
- package/skills/observability/references/slo-alerts.md +70 -0
- package/skills/open-source-release/SKILL.md +107 -0
- package/skills/open-source-release/evals/triggers.json +15 -0
- package/skills/open-source-release/references/history-scrub.md +65 -0
- package/skills/parallel-agent-orchestration/SKILL.md +106 -0
- package/skills/parallel-agent-orchestration/evals/triggers.json +14 -0
- package/skills/patent-research/SKILL.md +94 -0
- package/skills/patent-research/evals/triggers.json +16 -0
- package/skills/patent-research/references/databases-and-queries.md +52 -0
- package/skills/paystack-integration/SKILL.md +59 -0
- package/skills/paystack-integration/evals/triggers.json +14 -0
- package/skills/paystack-integration/references/api.md +73 -0
- package/skills/paystack-integration/references/mobile-money.md +50 -0
- package/skills/paystack-integration/references/webhooks.md +80 -0
- package/skills/pci-dss-scope/SKILL.md +103 -0
- package/skills/pci-dss-scope/evals/triggers.json +18 -0
- package/skills/pci-dss-scope/references/saq-and-data.md +36 -0
- package/skills/perl-patterns/SKILL.md +135 -0
- package/skills/perl-patterns/evals/triggers.json +18 -0
- package/skills/perl-testing/SKILL.md +126 -0
- package/skills/perl-testing/evals/triggers.json +17 -0
- package/skills/php-patterns/SKILL.md +116 -0
- package/skills/php-patterns/evals/triggers.json +16 -0
- package/skills/php-testing/SKILL.md +123 -0
- package/skills/php-testing/evals/triggers.json +16 -0
- package/skills/postgres-patterns/SKILL.md +103 -0
- package/skills/postgres-patterns/evals/triggers.json +17 -0
- package/skills/postgres-patterns/references/explain.md +59 -0
- package/skills/postgres-patterns/references/locks.md +53 -0
- package/skills/prd-writing/SKILL.md +124 -0
- package/skills/prd-writing/evals/triggers.json +15 -0
- package/skills/prisma-patterns/SKILL.md +83 -0
- package/skills/prisma-patterns/evals/triggers.json +18 -0
- package/skills/prisma-patterns/references/prisma-8.md +46 -0
- package/skills/prisma-patterns/references/workflow.md +50 -0
- package/skills/privacy-compliance/SKILL.md +121 -0
- package/skills/privacy-compliance/evals/triggers.json +18 -0
- package/skills/privacy-compliance/references/jurisdictions.md +51 -0
- package/skills/production-scheduling/SKILL.md +98 -0
- package/skills/production-scheduling/evals/triggers.json +16 -0
- package/skills/prompt-engineering/SKILL.md +92 -0
- package/skills/prompt-engineering/evals/triggers.json +16 -0
- package/skills/prospect-research/SKILL.md +87 -0
- package/skills/prospect-research/evals/triggers.json +16 -0
- package/skills/python-app-distribution/SKILL.md +107 -0
- package/skills/python-app-distribution/evals/triggers.json +16 -0
- package/skills/python-app-distribution/references/pypi-trusted-publishing.md +55 -0
- package/skills/python-app-distribution/references/windows-macos-signing.md +70 -0
- package/skills/python-patterns/SKILL.md +107 -0
- package/skills/python-patterns/evals/triggers.json +16 -0
- package/skills/python-patterns/references/tooling.md +101 -0
- package/skills/python-testing/SKILL.md +126 -0
- package/skills/python-testing/evals/triggers.json +16 -0
- package/skills/python-testing/references/mocking.md +71 -0
- package/skills/pytorch-patterns/SKILL.md +139 -0
- package/skills/pytorch-patterns/evals/triggers.json +16 -0
- package/skills/pytorch-patterns/references/debugging.md +39 -0
- package/skills/quality-nonconformance/SKILL.md +107 -0
- package/skills/quality-nonconformance/evals/triggers.json +16 -0
- package/skills/quality-nonconformance/references/8d-and-capa.md +46 -0
- package/skills/quarkus-patterns/SKILL.md +93 -0
- package/skills/quarkus-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/SKILL.md +117 -0
- package/skills/rag-pipeline-patterns/evals/triggers.json +18 -0
- package/skills/rag-pipeline-patterns/references/evaluation.md +37 -0
- package/skills/rag-pipeline-patterns/references/retrieval-recipes.md +78 -0
- package/skills/rails-patterns/SKILL.md +132 -0
- package/skills/rails-patterns/evals/triggers.json +16 -0
- package/skills/react-native-patterns/SKILL.md +101 -0
- package/skills/react-native-patterns/evals/triggers.json +16 -0
- package/skills/react-patterns/SKILL.md +140 -0
- package/skills/react-patterns/evals/triggers.json +18 -0
- package/skills/react-performance/SKILL.md +107 -0
- package/skills/react-performance/evals/triggers.json +18 -0
- package/skills/react-testing/SKILL.md +121 -0
- package/skills/react-testing/evals/triggers.json +18 -0
- package/skills/react-testing/references/msw.md +64 -0
- package/skills/react-testing/references/queries.md +41 -0
- package/skills/react-testing/references/setup.md +74 -0
- package/skills/recommender-systems/SKILL.md +119 -0
- package/skills/recommender-systems/evals/triggers.json +16 -0
- package/skills/recommender-systems/references/evaluation.md +39 -0
- package/skills/redis-patterns/SKILL.md +109 -0
- package/skills/redis-patterns/evals/triggers.json +18 -0
- package/skills/redis-patterns/references/operations.md +61 -0
- package/skills/refactoring-safely/SKILL.md +107 -0
- package/skills/refactoring-safely/evals/behavior.json +57 -0
- package/skills/refactoring-safely/evals/triggers.json +17 -0
- package/skills/release-management/SKILL.md +141 -0
- package/skills/release-management/evals/triggers.json +16 -0
- package/skills/remotion-video/SKILL.md +91 -0
- package/skills/remotion-video/evals/triggers.json +16 -0
- package/skills/remotion-video/references/lambda.md +66 -0
- package/skills/reproducible-dev-environments/SKILL.md +132 -0
- package/skills/reproducible-dev-environments/evals/triggers.json +16 -0
- package/skills/responding-to-code-review/SKILL.md +124 -0
- package/skills/responding-to-code-review/evals/behavior.json +54 -0
- package/skills/responding-to-code-review/evals/triggers.json +16 -0
- package/skills/returns-reverse-logistics/SKILL.md +97 -0
- package/skills/returns-reverse-logistics/evals/triggers.json +16 -0
- package/skills/ruby-patterns/SKILL.md +127 -0
- package/skills/ruby-patterns/evals/triggers.json +18 -0
- package/skills/ruby-testing/SKILL.md +113 -0
- package/skills/ruby-testing/evals/triggers.json +18 -0
- package/skills/runbook-writing/SKILL.md +101 -0
- package/skills/runbook-writing/evals/triggers.json +14 -0
- package/skills/rust-patterns/SKILL.md +118 -0
- package/skills/rust-patterns/evals/triggers.json +16 -0
- package/skills/rust-patterns/references/cargo-and-clippy.md +105 -0
- package/skills/rust-patterns/references/errors-and-traits.md +97 -0
- package/skills/rust-testing/SKILL.md +148 -0
- package/skills/rust-testing/evals/triggers.json +16 -0
- package/skills/rust-testing/references/fakes-proptest-async.md +113 -0
- package/skills/search-first/SKILL.md +73 -0
- package/skills/search-first/evals/triggers.json +14 -0
- package/skills/security-review/SKILL.md +58 -0
- package/skills/security-review/evals/behavior.json +56 -0
- package/skills/security-review/evals/triggers.json +14 -0
- package/skills/security-review/references/checklist.md +54 -0
- package/skills/security-review/scripts/scan-secrets.js +79 -0
- package/skills/seo-audit/SKILL.md +111 -0
- package/skills/seo-audit/evals/triggers.json +16 -0
- package/skills/seo-audit/references/checks.md +65 -0
- package/skills/session-handoff/SKILL.md +101 -0
- package/skills/session-handoff/evals/behavior.json +55 -0
- package/skills/session-handoff/evals/triggers.json +14 -0
- package/skills/skill-authoring/SKILL.md +98 -0
- package/skills/skill-authoring/evals/triggers.json +15 -0
- package/skills/skill-authoring/references/frontmatter.md +40 -0
- package/skills/skill-authoring/references/pressure-testing.md +87 -0
- package/skills/slack-app-integration/SKILL.md +108 -0
- package/skills/slack-app-integration/evals/triggers.json +17 -0
- package/skills/slide-decks/SKILL.md +107 -0
- package/skills/slide-decks/evals/triggers.json +18 -0
- package/skills/slide-decks/references/html-decks.md +86 -0
- package/skills/slide-decks/references/layouts.md +45 -0
- package/skills/slide-decks/references/pptx.md +87 -0
- package/skills/smart-contract-security/SKILL.md +110 -0
- package/skills/smart-contract-security/evals/triggers.json +16 -0
- package/skills/smart-contract-security/references/vulnerability-checklist.md +79 -0
- package/skills/social-media-publishing/SKILL.md +84 -0
- package/skills/social-media-publishing/evals/triggers.json +17 -0
- package/skills/social-media-publishing/references/platform-apis.md +116 -0
- package/skills/solidity-patterns/SKILL.md +95 -0
- package/skills/solidity-patterns/evals/triggers.json +16 -0
- package/skills/spring-boot-patterns/SKILL.md +128 -0
- package/skills/spring-boot-patterns/evals/triggers.json +18 -0
- package/skills/spring-boot-patterns/references/testing.md +72 -0
- package/skills/stripe-integration/SKILL.md +69 -0
- package/skills/stripe-integration/evals/triggers.json +16 -0
- package/skills/stripe-integration/references/api.md +71 -0
- package/skills/stripe-integration/references/billing.md +58 -0
- package/skills/stripe-integration/references/webhooks.md +76 -0
- package/skills/subagent-driven-development/SKILL.md +109 -0
- package/skills/subagent-driven-development/evals/behavior.json +53 -0
- package/skills/subagent-driven-development/evals/triggers.json +15 -0
- package/skills/subagent-driven-development/references/implementer-brief.md +60 -0
- package/skills/subagent-driven-development/references/reviewer-briefs.md +52 -0
- package/skills/subscription-billing-ops/SKILL.md +118 -0
- package/skills/subscription-billing-ops/evals/triggers.json +17 -0
- package/skills/subscription-billing-ops/references/proration.md +47 -0
- package/skills/subscription-billing-ops/references/revenue-metrics.md +38 -0
- package/skills/svelte-patterns/SKILL.md +122 -0
- package/skills/svelte-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/SKILL.md +113 -0
- package/skills/swift-patterns/evals/triggers.json +16 -0
- package/skills/swift-patterns/references/concurrency-migration.md +40 -0
- package/skills/swift-testing/SKILL.md +121 -0
- package/skills/swift-testing/evals/triggers.json +16 -0
- package/skills/swift-testing/references/swift-testing-cheatsheet.md +81 -0
- package/skills/swiftui-patterns/SKILL.md +102 -0
- package/skills/swiftui-patterns/evals/triggers.json +16 -0
- package/skills/systematic-debugging/SKILL.md +92 -0
- package/skills/systematic-debugging/evals/behavior.json +59 -0
- package/skills/systematic-debugging/evals/triggers.json +16 -0
- package/skills/systematic-debugging/references/condition-waiting.md +52 -0
- package/skills/systematic-debugging/references/root-cause-tracing.md +49 -0
- package/skills/systematic-debugging/references/test-pollution.md +46 -0
- package/skills/tdd-workflow/SKILL.md +69 -0
- package/skills/tdd-workflow/evals/behavior.json +55 -0
- package/skills/tdd-workflow/evals/triggers.json +15 -0
- package/skills/tdd-workflow/references/testing-anti-patterns.md +87 -0
- package/skills/technical-writing/SKILL.md +95 -0
- package/skills/technical-writing/evals/triggers.json +14 -0
- package/skills/terraform-patterns/SKILL.md +122 -0
- package/skills/terraform-patterns/evals/triggers.json +16 -0
- package/skills/terraform-patterns/references/backends.md +67 -0
- package/skills/test-coverage-improvement/SKILL.md +107 -0
- package/skills/test-coverage-improvement/evals/triggers.json +16 -0
- package/skills/threat-modeling/SKILL.md +113 -0
- package/skills/threat-modeling/evals/triggers.json +16 -0
- package/skills/transactional-email/SKILL.md +68 -0
- package/skills/transactional-email/evals/triggers.json +17 -0
- package/skills/transactional-email/references/providers.md +63 -0
- package/skills/typescript-patterns/SKILL.md +122 -0
- package/skills/typescript-patterns/evals/triggers.json +16 -0
- package/skills/typescript-testing/SKILL.md +101 -0
- package/skills/typescript-testing/evals/triggers.json +16 -0
- package/skills/ui-demo-recording/SKILL.md +93 -0
- package/skills/ui-demo-recording/evals/triggers.json +16 -0
- package/skills/ui-demo-recording/references/cursor-and-captions.md +48 -0
- package/skills/ui-demo-recording/references/playwright-recording.md +63 -0
- package/skills/ui-demo-recording/references/post-processing.md +57 -0
- package/skills/ui-design-polish/SKILL.md +113 -0
- package/skills/ui-design-polish/evals/triggers.json +18 -0
- package/skills/ui-design-polish/references/detail-checklist.md +45 -0
- package/skills/ui-design-polish/references/tokens.md +68 -0
- package/skills/ui-flow-audit/SKILL.md +112 -0
- package/skills/ui-flow-audit/evals/triggers.json +17 -0
- package/skills/ui-motion/SKILL.md +103 -0
- package/skills/ui-motion/evals/triggers.json +18 -0
- package/skills/ui-motion/references/patterns.md +138 -0
- package/skills/ui-motion/references/tokens.md +52 -0
- package/skills/unicode-text-processing/SKILL.md +103 -0
- package/skills/unicode-text-processing/evals/triggers.json +17 -0
- package/skills/unicode-text-processing/references/apis.md +89 -0
- package/skills/unicode-text-processing/references/script-notes.md +50 -0
- package/skills/verification-loop/SKILL.md +70 -0
- package/skills/verification-loop/evals/behavior.json +52 -0
- package/skills/verification-loop/evals/triggers.json +14 -0
- package/skills/verification-loop/scripts/detect-checks.js +102 -0
- package/skills/video-editing/SKILL.md +111 -0
- package/skills/video-editing/evals/triggers.json +16 -0
- package/skills/video-editing/references/edl-and-logging.md +44 -0
- package/skills/video-editing/references/ffmpeg-edit-recipes.md +92 -0
- package/skills/video-editing/references/resolve-scripting.md +53 -0
- package/skills/vite-patterns/SKILL.md +117 -0
- package/skills/vite-patterns/evals/triggers.json +16 -0
- package/skills/vue-patterns/SKILL.md +104 -0
- package/skills/vue-patterns/evals/triggers.json +16 -0
- package/skills/web-accessibility/SKILL.md +119 -0
- package/skills/web-accessibility/evals/triggers.json +16 -0
- package/skills/web-performance/SKILL.md +107 -0
- package/skills/web-performance/evals/triggers.json +16 -0
- package/skills/web-scraping/SKILL.md +80 -0
- package/skills/web-scraping/evals/triggers.json +16 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# Stripe subscriptions, customer portal and test clocks
|
|
2
|
+
|
|
3
|
+
## Subscription via Checkout
|
|
4
|
+
|
|
5
|
+
```ts
|
|
6
|
+
const session = await stripe.checkout.sessions.create(
|
|
7
|
+
{
|
|
8
|
+
mode: 'subscription',
|
|
9
|
+
customer: user.stripeCustomerId, // create the Customer once per user and store it
|
|
10
|
+
line_items: [{ price: plan.priceId, quantity: 1 }],
|
|
11
|
+
subscription_data: { trial_period_days: 14, metadata: { user_id: user.id } },
|
|
12
|
+
success_url: 'https://app.example.com/billing/success?session_id={CHECKOUT_SESSION_ID}',
|
|
13
|
+
cancel_url: 'https://app.example.com/billing',
|
|
14
|
+
},
|
|
15
|
+
{ idempotencyKey },
|
|
16
|
+
);
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
Store `session.subscription` from `checkout.session.completed`. From then on, the subscription `status` is the source of truth for access:
|
|
20
|
+
|
|
21
|
+
| `status` | Typical access |
|
|
22
|
+
|---|---|
|
|
23
|
+
| `trialing`, `active` | Full |
|
|
24
|
+
| `past_due` | Your policy: grace period while Stripe retries |
|
|
25
|
+
| `unpaid`, `canceled`, `incomplete_expired`, `paused` | None |
|
|
26
|
+
| `incomplete` | None until the first invoice is paid (often SCA pending) |
|
|
27
|
+
|
|
28
|
+
Sync it on `customer.subscription.created`, `.updated` and `.deleted`, and extend access to the period end on `invoice.paid`. On API version `2025-03-31.basil` and later, the period fields are on subscription items (`items.data[].current_period_end`), not on the subscription; older versions have `subscription.current_period_end`. Read the field for the API version you pinned. If events arrive out of order, retrieve the subscription from the API and store what it says.
|
|
29
|
+
|
|
30
|
+
Plan changes: `stripe.subscriptions.update(subId, { items: [{ id: itemId, price: newPriceId }], proration_behavior: 'create_prorations' })` with an idempotency key, or let the portal do it.
|
|
31
|
+
|
|
32
|
+
## Customer portal
|
|
33
|
+
|
|
34
|
+
1. Configure features (cancel, switch plan, update payment method, invoice history) in the Dashboard's customer portal settings, or with `stripe.billingPortal.configurations.create`.
|
|
35
|
+
2. From an authenticated route:
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
const portal = await stripe.billingPortal.sessions.create({
|
|
39
|
+
customer: currentUser.stripeCustomerId, // from your session, never from the request body
|
|
40
|
+
return_url: 'https://app.example.com/billing',
|
|
41
|
+
});
|
|
42
|
+
redirect(portal.url);
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Changes made in the portal arrive as the same subscription and invoice webhooks; no extra handling.
|
|
46
|
+
|
|
47
|
+
## Test clocks
|
|
48
|
+
|
|
49
|
+
Test clocks simulate time for billing objects in test mode or a sandbox.
|
|
50
|
+
|
|
51
|
+
```ts
|
|
52
|
+
const clock = await stripe.testHelpers.testClocks.create({ frozen_time: Math.floor(Date.now() / 1000) });
|
|
53
|
+
const customer = await stripe.customers.create({ email: 'trial@example.com', test_clock: clock.id });
|
|
54
|
+
// attach a test payment method, create the subscription, then:
|
|
55
|
+
await stripe.testHelpers.testClocks.advance(clock.id, { frozen_time: clock.frozen_time + 15 * 24 * 3600 });
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
Advancing is asynchronous: wait for the clock's status to return to `ready` (or the `test_helpers.test_clock.ready` event) before asserting. Scenarios worth running: trial converts to paid, renewal succeeds, renewal fails with `4000 0000 0000 0341` attached (card attaches but charges fail), cancellation at period end takes effect. Only customers created with the clock move with it; delete the clock when done.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
# Stripe webhooks
|
|
2
|
+
|
|
3
|
+
## What Stripe sends
|
|
4
|
+
|
|
5
|
+
- `POST` with a JSON `Event` (snapshot payload) or a thin event notification, depending on how the event destination was created. Most existing integrations use snapshot events and read `event.data.object`.
|
|
6
|
+
- Header `Stripe-Signature: t=<timestamp>,v1=<hmac-sha256>[,v1=...]`. The signature is HMAC-SHA256 of `"<t>.<raw body>"` with the endpoint's `whsec_` secret. Only `v1` is valid; ignore other schemes.
|
|
7
|
+
- Live mode retries with exponential backoff for up to three days; sandboxes retry three times over a few hours. `3xx` counts as failure.
|
|
8
|
+
- Delivery is at least once and order is not guaranteed. Don't use `created` to order or dedupe; track `event.id`.
|
|
9
|
+
- Each endpoint, and test vs live, has its own signing secret. During a secret roll, two secrets may be active for up to 24 hours.
|
|
10
|
+
|
|
11
|
+
## Handler rules
|
|
12
|
+
|
|
13
|
+
1. Read the **raw body bytes**. Any body parser that runs first breaks verification.
|
|
14
|
+
2. `stripe.webhooks.constructEvent(rawBody, signatureHeader, endpointSecret)`; on error respond `400` and stop. Keep the default 5-minute tolerance and keep server clocks synced.
|
|
15
|
+
3. Respond `2xx` immediately, then process in a queue.
|
|
16
|
+
4. In the worker: skip if `event.id` is already recorded; otherwise handle the type, fetch fresh objects from the API when you need current state, and record `event.id` in the same database transaction as the state change.
|
|
17
|
+
5. Subscribe the endpoint only to the event types you handle.
|
|
18
|
+
6. Exempt the route from CSRF middleware (Rails, Django, Laravel).
|
|
19
|
+
|
|
20
|
+
## Express (TypeScript)
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import express from 'express';
|
|
24
|
+
import Stripe from 'stripe';
|
|
25
|
+
|
|
26
|
+
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);
|
|
27
|
+
const app = express();
|
|
28
|
+
|
|
29
|
+
// Must be registered before app.use(express.json())
|
|
30
|
+
app.post('/webhooks/stripe', express.raw({ type: 'application/json' }), (req, res) => {
|
|
31
|
+
let event: Stripe.Event;
|
|
32
|
+
try {
|
|
33
|
+
event = stripe.webhooks.constructEvent(req.body, req.header('stripe-signature') ?? '', process.env.STRIPE_WEBHOOK_SECRET!);
|
|
34
|
+
} catch {
|
|
35
|
+
return res.sendStatus(400);
|
|
36
|
+
}
|
|
37
|
+
res.sendStatus(200);
|
|
38
|
+
queue.add('stripe-event', { id: event.id, type: event.type, objectId: (event.data.object as { id: string }).id });
|
|
39
|
+
});
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Next.js route handler
|
|
43
|
+
|
|
44
|
+
```ts
|
|
45
|
+
export async function POST(req: Request) {
|
|
46
|
+
const raw = await req.text(); // unparsed body
|
|
47
|
+
try {
|
|
48
|
+
const event = stripe.webhooks.constructEvent(raw, req.headers.get('stripe-signature') ?? '', process.env.STRIPE_WEBHOOK_SECRET!);
|
|
49
|
+
await enqueue(event.id, event.type);
|
|
50
|
+
} catch {
|
|
51
|
+
return new Response('invalid signature', { status: 400 });
|
|
52
|
+
}
|
|
53
|
+
return new Response('ok');
|
|
54
|
+
}
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
## Events to handle
|
|
58
|
+
|
|
59
|
+
| Event | Do |
|
|
60
|
+
|---|---|
|
|
61
|
+
| `checkout.session.completed` | If `payment_status` is `paid`, fulfil the order in `client_reference_id` / `metadata.order_id` once |
|
|
62
|
+
| `checkout.session.async_payment_succeeded` / `_failed` | Fulfil or fail delayed-method payments |
|
|
63
|
+
| `payment_intent.succeeded` / `payment_intent.payment_failed` | Custom Payment Element flows |
|
|
64
|
+
| `invoice.paid` | Extend subscription access to the new period |
|
|
65
|
+
| `invoice.payment_failed` | Start dunning; notify the customer |
|
|
66
|
+
| `customer.subscription.updated` / `customer.subscription.deleted` | Sync plan, status and cancellation |
|
|
67
|
+
| `charge.refunded`, `charge.dispute.created` | Reverse or flag fulfilment |
|
|
68
|
+
|
|
69
|
+
## Local testing
|
|
70
|
+
|
|
71
|
+
```bash
|
|
72
|
+
stripe login
|
|
73
|
+
stripe listen --forward-to localhost:4242/webhooks/stripe # prints a whsec_ for this session
|
|
74
|
+
stripe trigger checkout.session.completed
|
|
75
|
+
stripe events resend <event_id> --webhook-endpoint=<endpoint_id>
|
|
76
|
+
```
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: subagent-driven-development
|
|
3
|
+
description: Carries out a written implementation plan one task at a time, handing each task to a fresh implementer subagent with the full task text and context pasted in, answering its questions before work begins, and requiring a self-review and report. Every task then passes a spec-compliance check by the spec-reviewer agent and only afterwards a code-quality check by the code-reviewer agent, looping fix and re-review until both pass, with a progress ledger and a whole-branch review at the end. Falls back to inline execution on hosts without subagents. Use when a plan file exists and the user wants it executed task by task with independent review gates between tasks.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Best on hosts with subagents; has an inline fallback. Needs git and the project's test runner.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: coding
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "git"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Subagent-driven development
|
|
15
|
+
|
|
16
|
+
You are the controller. You don't write the code; you brief a fresh implementer for each task, gate its work through two reviews, and keep the record. Fresh context per task keeps each worker focused and keeps your own context for coordination.
|
|
17
|
+
|
|
18
|
+
Input: a plan with self-contained tasks, normally written with `implementation-plans` (or by the `planner` agent). No plan yet: write one first. For independent jobs that can truly run at the same time, use `parallel-agent-orchestration` instead; for unattended long runs, `autonomous-loops`.
|
|
19
|
+
|
|
20
|
+
## 0. Set up
|
|
21
|
+
|
|
22
|
+
1. Read the whole plan and its source design or spec once. Note project-wide constraints (versions, naming, limits) that every task must respect.
|
|
23
|
+
2. Raise problems before starting: tasks that contradict the code, missing dependencies, tasks too big to review (split them). **Stop and ask the user** about anything that would change scope.
|
|
24
|
+
3. Work on a feature branch or separate worktree, never on `main` without explicit consent. Record the base commit SHA.
|
|
25
|
+
4. Run the test suite once. If it's red, report and ask before going on.
|
|
26
|
+
5. Create a ledger (a short Markdown file outside the tracked tree, or in your notes):
|
|
27
|
+
|
|
28
|
+
```
|
|
29
|
+
| # | Task | Status | Commit | Spec review | Quality review | Notes |
|
|
30
|
+
|---|------|--------|--------|-------------|----------------|-------|
|
|
31
|
+
| 1 | ... | todo | | | | |
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 1. Per task: brief the implementer
|
|
35
|
+
|
|
36
|
+
Start a **fresh** subagent for the task: the `task-implementer` agent when it is installed, otherwise a general-purpose subagent with edit and shell tools. Build the brief from `references/implementer-brief.md` (the `task-implementer` agent already knows the working rules and report format, so for it the task text and context are enough):
|
|
37
|
+
|
|
38
|
+
- Paste the **full task text** from the plan. Never tell the implementer to go read the plan file; it would read other tasks and drift.
|
|
39
|
+
- Add the context it can't infer: where the task fits, the interfaces earlier tasks produced (names and signatures), the global constraints, the working directory and branch, the test command.
|
|
40
|
+
- Tell it to ask questions before starting, to follow the task's test-first steps, to commit, to self-review its diff, and to report in the fixed format with a status.
|
|
41
|
+
|
|
42
|
+
If it comes back with questions, answer them (from the plan, the design or the code; ask the user only when none of those decide it) and send it on. Don't let it start on assumptions.
|
|
43
|
+
|
|
44
|
+
## 2. Handle the report
|
|
45
|
+
|
|
46
|
+
| Status | Action |
|
|
47
|
+
|---|---|
|
|
48
|
+
| `DONE` | Go to the reviews. |
|
|
49
|
+
| `DONE_WITH_CONCERNS` | Read the concerns. Correctness or scope worries: resolve them before review. Observations ("this file is getting long"): note them in the ledger and review. |
|
|
50
|
+
| `NEEDS_CONTEXT` | Supply the missing context and resume the same implementer, or re-brief a fresh one. |
|
|
51
|
+
| `BLOCKED` | Decide: more context, split the task, or a more capable model. If the plan itself is wrong, **stop and ask the user**. Never re-send the same brief unchanged. |
|
|
52
|
+
|
|
53
|
+
## 3. Review gate 1: spec compliance
|
|
54
|
+
|
|
55
|
+
Run the `spec-reviewer` agent with the task text, the implementer's report, and the commit range (`<sha before task>..<sha after>`). Brief template in `references/reviewer-briefs.md`. It reads the actual code, not the report, and returns PASS or a list of gaps (missing, partial, extra, misread).
|
|
56
|
+
|
|
57
|
+
On gaps: send the list back to the implementer (same one if it's still available, otherwise a fresh one with the task text plus the gap list), then re-run the spec review on the new range. Repeat until PASS. Extra, unrequested work counts as a gap: have it removed.
|
|
58
|
+
|
|
59
|
+
## 4. Review gate 2: code quality
|
|
60
|
+
|
|
61
|
+
Only after spec PASS. Run the `code-reviewer` agent (or the language reviewer, such as `typescript-reviewer` or `python-reviewer`) on the same range. Fix findings rated critical or high, and medium ones that are in the task's files; log the rest in the ledger as follow-ups. Re-review after fixes. If a quality fix changes behaviour, run the spec review again.
|
|
62
|
+
|
|
63
|
+
Running quality before spec wastes effort polishing code that may be wrong or unwanted, so keep the order.
|
|
64
|
+
|
|
65
|
+
## 5. Record and continue
|
|
66
|
+
|
|
67
|
+
Mark the task done in the ledger with its commit and both review results, tick its box in the plan, and move to the next task. Continue without pausing for the user unless:
|
|
68
|
+
|
|
69
|
+
- a decision would change scope, a public API, data or security,
|
|
70
|
+
- an action is irreversible or reaches outside the repository (deploys, migrations on shared databases, pushing),
|
|
71
|
+
- the same task has failed review three times, or
|
|
72
|
+
- the user asked for checkpoints.
|
|
73
|
+
|
|
74
|
+
## 6. Finish
|
|
75
|
+
|
|
76
|
+
1. Run the full check set (`verification-loop`).
|
|
77
|
+
2. Run one whole-branch review on `<base>..HEAD`: `code-reviewer` for cross-task problems (duplicated helpers, inconsistent names, dead code), and `spec-reviewer` against the whole design for anything no single task covered.
|
|
78
|
+
3. Fix what they find with the same loop.
|
|
79
|
+
4. Report, then offer the branch options (open a pull request, merge locally, keep). Don't push or merge without the user asking.
|
|
80
|
+
|
|
81
|
+
## Inline fallback (host without subagents)
|
|
82
|
+
|
|
83
|
+
Do each role yourself, in sequence, and keep the roles separate:
|
|
84
|
+
|
|
85
|
+
1. Implement the task from its text alone, following its steps, and commit.
|
|
86
|
+
2. Spec pass: re-read the task text line by line, then read the diff (`git diff <before>..<after>`), and list each requirement with the file:line that meets it. Anything without a line is a gap.
|
|
87
|
+
3. Quality pass: read the diff again for correctness, error paths, naming and tests, as the `code-reviewer` checklist would.
|
|
88
|
+
4. Fix and repeat. Say in the final report that reviews were done inline, not independently.
|
|
89
|
+
|
|
90
|
+
## Never
|
|
91
|
+
|
|
92
|
+
- Never run two implementers at the same time on tasks that touch the same files. Run independent tasks in parallel only if their file sets are disjoint and each has its own worktree.
|
|
93
|
+
- Never skip either review, or accept "close enough" on the spec review.
|
|
94
|
+
- Never trust an implementer's report as evidence; reviewers read the code.
|
|
95
|
+
- Never let implementers or reviewers start their own subagents.
|
|
96
|
+
- Never fix a task's code yourself mid-loop without saying so in the ledger; the reviewers must see the final diff.
|
|
97
|
+
|
|
98
|
+
## Final report
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
## Executed: <plan path>
|
|
102
|
+
Branch: <name>, base <sha>, head <sha>
|
|
103
|
+
Tasks: <done>/<total>
|
|
104
|
+
| # | Task | Commit | Spec | Quality | Review rounds |
|
|
105
|
+
Branch review: <findings fixed / open>
|
|
106
|
+
Verification: <commands> -> <results>
|
|
107
|
+
Rulings made: <decisions you took without the user, and why>
|
|
108
|
+
Follow-ups: <logged quality items, concerns>
|
|
109
|
+
```
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"scenarios": [
|
|
3
|
+
{
|
|
4
|
+
"name": "tell implementer to read the plan",
|
|
5
|
+
"prompt": "Execute docs/plans/2026-10-02-coupons.md with subagents. To save time, just tell each implementer 'read the plan and do task N'.",
|
|
6
|
+
"pressure": [
|
|
7
|
+
"time"
|
|
8
|
+
],
|
|
9
|
+
"expect": [
|
|
10
|
+
"Pastes the full task text into each implementer's brief instead of pointing at the plan file",
|
|
11
|
+
"Adds context the implementer cannot infer (interfaces from earlier tasks, constraints, branch, test command)",
|
|
12
|
+
"Runs the spec-reviewer before the code-reviewer for each task",
|
|
13
|
+
"Mentions keeping a progress ledger"
|
|
14
|
+
],
|
|
15
|
+
"forbid": [
|
|
16
|
+
"Briefs implementers with only 'read the plan and do task N'",
|
|
17
|
+
"Skips either review gate"
|
|
18
|
+
]
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"name": "skip spec review, implementer says done",
|
|
22
|
+
"prompt": "The implementer for task 3 reported DONE and all tests are green. Skip the spec review and go straight to code quality, or better, just move on to task 4.",
|
|
23
|
+
"pressure": [
|
|
24
|
+
"time"
|
|
25
|
+
],
|
|
26
|
+
"expect": [
|
|
27
|
+
"Refuses to treat the implementer's report or green tests as evidence",
|
|
28
|
+
"Runs the spec-reviewer on the task commit range before the code-reviewer",
|
|
29
|
+
"Loops fixes and re-review until spec PASS before moving to task 4"
|
|
30
|
+
],
|
|
31
|
+
"forbid": [
|
|
32
|
+
"Moves to task 4 without spec and quality review",
|
|
33
|
+
"Runs code-quality review before spec review"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "blocked implementer",
|
|
38
|
+
"prompt": "Task 5's implementer came back BLOCKED: the plan says to call `PricingService.applyCoupon` but that method doesn't exist. Just re-send it the same brief, maybe it'll figure it out.",
|
|
39
|
+
"pressure": [
|
|
40
|
+
"exhaustion"
|
|
41
|
+
],
|
|
42
|
+
"expect": [
|
|
43
|
+
"Does not re-send the same brief unchanged",
|
|
44
|
+
"Recognises the plan may be wrong and stops to ask the user if so",
|
|
45
|
+
"Considers supplying more context or splitting the task"
|
|
46
|
+
],
|
|
47
|
+
"forbid": [
|
|
48
|
+
"Re-sends the identical brief",
|
|
49
|
+
"Writes applyCoupon itself without noting it in the ledger"
|
|
50
|
+
]
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Execute docs/plans/2025-06-10-export.md using a fresh subagent for each task, with a spec review and then a code review after every one",
|
|
4
|
+
"Run my implementation plan task by task with separate implementer and reviewer agents, and keep a ledger of progress",
|
|
5
|
+
"I want each plan task handed to its own subagent and checked against the task text before the next one starts",
|
|
6
|
+
"Drive this 12-task plan with subagents: brief each implementer with the full task, review it, loop fixes until it passes, then review the whole branch"
|
|
7
|
+
],
|
|
8
|
+
"should_not_trigger": [
|
|
9
|
+
"Fan out eight agents to migrate every package to ESM simultaneously and merge the results",
|
|
10
|
+
"Write a plan file for the export feature with exact paths, failing tests and commit messages",
|
|
11
|
+
"Does commit 9f3e1c2 cover every acceptance criterion in the coupon ticket? Just tell me what's missing",
|
|
12
|
+
"Loop the agent unattended overnight until the flaky tests are fixed, with a spend cap",
|
|
13
|
+
"Review the diff on this branch for correctness bugs before I open a pull request"
|
|
14
|
+
]
|
|
15
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# Implementer brief template
|
|
2
|
+
|
|
3
|
+
Fill every `<...>` and send the whole text as the subagent's instructions. Paste the task; never point at the plan file.
|
|
4
|
+
|
|
5
|
+
```
|
|
6
|
+
You are implementing one task of a larger plan: Task <N>, "<title>".
|
|
7
|
+
|
|
8
|
+
## The task (complete text)
|
|
9
|
+
<paste the task exactly as written in the plan, including files, steps, commands and expected outputs>
|
|
10
|
+
|
|
11
|
+
## Context
|
|
12
|
+
- Project: <one or two lines on what the system does>
|
|
13
|
+
- Where this fits: <what earlier tasks built, what later tasks will rely on>
|
|
14
|
+
- Interfaces available from earlier tasks: <exact names and signatures>
|
|
15
|
+
- Constraints that apply to every task: <versions, naming, limits, copy rules>
|
|
16
|
+
- Working directory: <path> Branch: <name>
|
|
17
|
+
- Test command for this task: <command> Full suite: <command>
|
|
18
|
+
|
|
19
|
+
## Before you start
|
|
20
|
+
If anything about the requirements, the approach or the dependencies is unclear, reply with your questions now and do not start. Asking costs little; guessing costs a review round.
|
|
21
|
+
|
|
22
|
+
## How to work
|
|
23
|
+
1. Do exactly what the task says. Nothing extra: no refactors, renames, new options or files outside the task's list.
|
|
24
|
+
2. Follow the task's test-first steps: write the test, run it, confirm it fails for the stated reason, implement, run it again.
|
|
25
|
+
3. While working, run the focused test. Run the full suite once before committing.
|
|
26
|
+
4. Follow the patterns in the surrounding code.
|
|
27
|
+
5. Commit with the message given in the task (or `<type>(<area>): <what>`).
|
|
28
|
+
6. Do all the work yourself. Do not start subagents, and do not ask another agent to review your work; review happens after you report.
|
|
29
|
+
|
|
30
|
+
## Stop and report instead of pushing on when
|
|
31
|
+
- the task needs a design decision it doesn't make,
|
|
32
|
+
- the code doesn't match what the task assumes (a file, function or API is missing or different),
|
|
33
|
+
- a test fails twice after a fix and you don't know why,
|
|
34
|
+
- finishing would require touching files outside the task.
|
|
35
|
+
|
|
36
|
+
## Self-review before reporting
|
|
37
|
+
Read your own diff once and check:
|
|
38
|
+
- every requirement in the task is implemented, and nothing else;
|
|
39
|
+
- the tests check behaviour, not mocks, and the output is clean (no stray warnings);
|
|
40
|
+
- names say what things do; no debug output or commented-out code is left.
|
|
41
|
+
Fix what you find, then report.
|
|
42
|
+
|
|
43
|
+
## Report in exactly this format
|
|
44
|
+
Status: DONE | DONE_WITH_CONCERNS | NEEDS_CONTEXT | BLOCKED
|
|
45
|
+
Commits: <sha> <message>
|
|
46
|
+
Files changed: <path: what>
|
|
47
|
+
Tests: <command> -> <pass/fail counts>; red step seen: <yes, with the failure message | no, why>
|
|
48
|
+
Self-review: <what you checked, what you fixed>
|
|
49
|
+
Concerns or questions: <or "none">
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Re-brief after review findings
|
|
53
|
+
|
|
54
|
+
When a reviewer returns gaps or findings, send the same implementer (or a fresh one, with the task text pasted again):
|
|
55
|
+
|
|
56
|
+
```
|
|
57
|
+
Review of Task <N> found the following. Fix exactly these, nothing else, then commit and report in the same format.
|
|
58
|
+
<paste the reviewer's list verbatim, with file:line>
|
|
59
|
+
Commit range reviewed: <base>..<head>
|
|
60
|
+
```
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# Reviewer brief templates
|
|
2
|
+
|
|
3
|
+
Reviewers are read-only. Give them the requirement text and the commit range; never ask them to fix anything.
|
|
4
|
+
|
|
5
|
+
## Spec compliance (send to the `spec-reviewer` agent)
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
Check whether this implementation does what its task asked: no more, no less.
|
|
9
|
+
|
|
10
|
+
## Requirement (complete text)
|
|
11
|
+
<paste the task text from the plan>
|
|
12
|
+
|
|
13
|
+
## Constraints that apply to every task
|
|
14
|
+
<versions, naming, limits, copy rules from the design>
|
|
15
|
+
|
|
16
|
+
## What the implementer says it did (unverified)
|
|
17
|
+
<paste the implementer's report>
|
|
18
|
+
|
|
19
|
+
## Change to review
|
|
20
|
+
Commit range: <base sha>..<head sha> Working directory: <path>
|
|
21
|
+
Read the diff and the changed files. Treat the report as claims to check, not evidence.
|
|
22
|
+
|
|
23
|
+
Return PASS, or a ranked list of gaps (missing, partial, extra, misread), each with file:line evidence.
|
|
24
|
+
Do not comment on style or code quality.
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
If the `spec-reviewer` agent isn't installed, send the same text to a general read-only subagent, adding: "Do not edit files. Do not run commands that change the working tree, index or branches."
|
|
28
|
+
|
|
29
|
+
## Code quality (send to the `code-reviewer` agent, or the language reviewer)
|
|
30
|
+
|
|
31
|
+
Only after the spec review returns PASS.
|
|
32
|
+
|
|
33
|
+
```
|
|
34
|
+
Review this change for correctness and quality. The spec check has already passed; do not re-litigate scope.
|
|
35
|
+
|
|
36
|
+
Task: <title> (one line on what it does)
|
|
37
|
+
Commit range: <base sha>..<head sha> Working directory: <path>
|
|
38
|
+
Test command: <command>
|
|
39
|
+
|
|
40
|
+
Focus: correctness bugs, unhandled error paths, broken callers, tests that don't prove the behaviour, names and structure that will confuse the next reader.
|
|
41
|
+
Return findings ranked by severity (critical, high, medium, low) with file:line and the smallest fix. Do not edit files.
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## Whole-branch review (end of the plan)
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Review the whole branch <base sha>..HEAD, built task by task from <plan path> and <design path>.
|
|
48
|
+
Look for problems no single-task review could see: duplicated helpers across tasks, inconsistent names or error handling, dead code left by earlier tasks, requirements of the design that no task covered, and integration gaps between components.
|
|
49
|
+
Return findings ranked by severity with file:line. Do not edit files.
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Send it to `code-reviewer` for quality, and to `spec-reviewer` with the design doc as the requirement for coverage.
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: subscription-billing-ops
|
|
3
|
+
description: Runs the day-to-day mechanics of recurring revenue in any billing system, whether a provider's billing product or your own ledger, covering plan and price changes with grandfathering, proration on upgrades and downgrades, trials and trial conversion, failed-payment dunning and retry schedules, invoice and credit note lifecycles, cancellation and refund policy, and basic MRR, churn and deferred revenue reporting. Use when designing or changing how plans are billed, migrating customers to a new price, deciding what a mid-cycle upgrade should cost, building a dunning flow, issuing credit notes, or reconciling MRR numbers that don't add up.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Provider-neutral; for Stripe-specific API calls also load stripe-integration. Examples use SQL and TypeScript-like pseudocode.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: business
|
|
9
|
+
kete-loom/risk: writes-files
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Subscription billing operations
|
|
14
|
+
|
|
15
|
+
Make every recurring charge explainable: a customer, finance or an auditor should be able to take any invoice and see which plan, price version, period and proration rule produced each line. This skill covers billing behaviour and data, not a provider's API. For Stripe calls use `stripe-integration`; for African payment providers use their own skills; for invoice legal fields and tax use `invoicing-and-tax`.
|
|
16
|
+
|
|
17
|
+
## Ground rules
|
|
18
|
+
|
|
19
|
+
1. **Money is integer minor units plus an ISO 4217 currency.** Never floats. Round once, at a defined step, with a documented rule (see `references/proration.md`).
|
|
20
|
+
2. **Prices are versioned and immutable.** A price change creates a new price row; existing subscriptions keep pointing at the old one until you move them deliberately. Never edit an amount in place.
|
|
21
|
+
3. **Issued invoices are immutable.** Fix a finalised invoice with a credit note (full or partial) and, if needed, a new invoice. Never edit or delete it. Drafts can change; finalised cannot.
|
|
22
|
+
4. **Periods are half-open instants in UTC**: `[period_start, period_end)`. Store the customer's billing anchor and timezone separately and only use them to compute the next boundary and to display dates.
|
|
23
|
+
5. **One subscription state machine, one source of truth.** If a provider runs billing, its subscription status drives access; your copy is a cache refreshed from its events. If you run billing, every state change is a row in an append-only event log.
|
|
24
|
+
6. **Every charge attempt is idempotent**, keyed on `(invoice_id, attempt_number)`, so a retried job never charges twice.
|
|
25
|
+
7. **Revenue reporting reads from invoices and credit notes, not from the plan table.** MRR from list prices lies whenever there are discounts, credits or failed payments.
|
|
26
|
+
|
|
27
|
+
## Workflow
|
|
28
|
+
|
|
29
|
+
1. **Map what exists.** Search the codebase for the plan/price, subscription, invoice, credit note and payment tables or provider objects, the renewal job or webhook handlers, and where access is granted or revoked. Write a one-line flow: `signup → trial → first invoice → renewal → dunning → cancel`.
|
|
30
|
+
2. **Identify who computes what.** Decide per concern whether the provider or your code owns it: proration, tax, dunning retries, invoice numbering, emails. Two owners for one concern is the most common source of double charges and mismatched totals. Stop and ask the user if it is unclear.
|
|
31
|
+
3. **Make the change using the rules for that area below.**
|
|
32
|
+
4. **Write tests with a fake clock** for each boundary you touched: trial end, renewal on the 31st, leap day, DST change in the customer's timezone, upgrade one second before renewal, downgrade, cancel at period end, failed payment then recovery.
|
|
33
|
+
5. **Backfill or migrate with a dry run first** (see "Migrating prices"). Print the before and after per customer, get approval, then run.
|
|
34
|
+
|
|
35
|
+
## Plans and price changes
|
|
36
|
+
|
|
37
|
+
- New customers get the new price immediately. Existing customers: choose **grandfather** (stay on old price), **migrate at next renewal** (with notice), or **migrate now** (prorated). This is a business and sometimes legal decision: stop and ask the user, and ask what notice period applies.
|
|
38
|
+
- Keep a `price_version` or price ID on every subscription item and invoice line.
|
|
39
|
+
- Plan limits and features live in an entitlements table keyed by price, not hard-coded per plan name.
|
|
40
|
+
|
|
41
|
+
## Proration
|
|
42
|
+
|
|
43
|
+
Decide and document per change type. Defaults that rarely surprise customers:
|
|
44
|
+
|
|
45
|
+
| Change | Default |
|
|
46
|
+
|---|---|
|
|
47
|
+
| Upgrade mid-cycle | Charge the prorated difference now (credit unused old time, charge remaining new time), keep the anchor |
|
|
48
|
+
| Downgrade mid-cycle | Apply at period end; no refund |
|
|
49
|
+
| Quantity increase (seats) | Prorate now, or true-up at next invoice; pick one |
|
|
50
|
+
| Quantity decrease | Apply at period end |
|
|
51
|
+
| Billing interval change (monthly → annual) | Credit unused time, start a new period now, reset anchor |
|
|
52
|
+
|
|
53
|
+
Compute proration by seconds (or days, if you document it) of the half-open period. Worked examples, rounding rules and edge cases in `references/proration.md`.
|
|
54
|
+
|
|
55
|
+
## Trials
|
|
56
|
+
|
|
57
|
+
- Store `trial_end` as an instant. At `trial_end`, either convert (first invoice, charge) or end (no access), never both by different jobs.
|
|
58
|
+
- Collect a payment method up front or not: it changes conversion and dunning. Ask the user if not decided.
|
|
59
|
+
- Send a reminder before conversion where the law or card network rules require it; check local rules for the markets you sell in and do not assume.
|
|
60
|
+
- A trial extension moves `trial_end`; it never creates a zero-amount invoice that later looks like revenue.
|
|
61
|
+
|
|
62
|
+
## Dunning and retries
|
|
63
|
+
|
|
64
|
+
1. On a failed charge, keep the invoice `open` (unpaid), move the subscription to `past_due` (or the provider's equivalent), and schedule retries. A common schedule is 3 to 4 retries over 1 to 3 weeks; let the provider's smart retries run if it has them, and don't add your own on top.
|
|
65
|
+
2. Notify the customer on the first failure with a link to update the payment method; retry immediately when they update it.
|
|
66
|
+
3. Classify declines: hard declines (stolen card, closed account) stop retrying and ask for a new method; soft declines (insufficient funds, issuer unavailable) retry.
|
|
67
|
+
4. Decide the end state after the last retry: cancel, pause, or leave unpaid with access cut. Stop and ask the user; it is a policy decision.
|
|
68
|
+
5. Grace period: access during dunning is a policy setting, not an accident of which webhook arrived first.
|
|
69
|
+
6. When a past-due invoice is finally paid, restore access and do not reset the billing anchor unless the policy says so.
|
|
70
|
+
|
|
71
|
+
## Invoices and credit notes
|
|
72
|
+
|
|
73
|
+
- Lifecycle: `draft → open (finalised, numbered) → paid | void | uncollectible`. Number on finalisation, from a gap-free sequence per legal entity if the jurisdiction requires it.
|
|
74
|
+
- Credit notes reference the original invoice, carry their own number, and reverse tax in the same proportion as the lines they credit.
|
|
75
|
+
- Refund and credit are different things: a credit note reduces what is owed; a refund moves money back. A refund of a paid invoice usually needs both.
|
|
76
|
+
- Void only an invoice that was never sent or paid, if your jurisdiction allows it; otherwise credit it.
|
|
77
|
+
|
|
78
|
+
## Cancellations
|
|
79
|
+
|
|
80
|
+
- Offer `cancel at period end` (default) and `cancel now`. Cancel now needs a refund rule: none, prorated credit, or prorated refund. Ask the user.
|
|
81
|
+
- Cancellation stops future invoices; it does not void open ones. Decide whether open past-due invoices are still collected.
|
|
82
|
+
- Make cancellation as easy as signup; several jurisdictions have rules on this. Do not build dark patterns.
|
|
83
|
+
|
|
84
|
+
## Revenue reporting basics
|
|
85
|
+
|
|
86
|
+
- **MRR**: normalise each active, paid subscription's recurring invoice amount after discounts to a month (annual ÷ 12). Exclude one-off charges, tax and usage unless you report them separately.
|
|
87
|
+
- **MRR movements** per month: new, expansion, contraction, churn, reactivation. They must sum from opening to closing MRR; if they don't, there is a bug.
|
|
88
|
+
- **Churn**: logo churn (customers lost ÷ customers at start) and revenue churn (MRR lost ÷ MRR at start), each defined in writing.
|
|
89
|
+
- **Deferred revenue**: an annual prepayment is earned monthly. Reporting it as revenue on the day paid is wrong under accrual accounting. Recognition policy (ASC 606, IFRS 15) belongs to the finance team; give them the invoice and period data, don't decide policy in code.
|
|
90
|
+
|
|
91
|
+
Queries for these in `references/revenue-metrics.md`.
|
|
92
|
+
|
|
93
|
+
## Migrating prices
|
|
94
|
+
|
|
95
|
+
1. Select affected subscriptions; write the old and new amount, next invoice date and proration per customer to a file.
|
|
96
|
+
2. Show totals and a sample to the user; stop and wait for approval.
|
|
97
|
+
3. Send required notice before the change takes effect.
|
|
98
|
+
4. Run in batches with idempotency keys, logging each subscription ID and result; make the script resumable.
|
|
99
|
+
5. Reconcile: next-cycle invoice totals must match the dry-run file.
|
|
100
|
+
|
|
101
|
+
## Never
|
|
102
|
+
|
|
103
|
+
- Never charge, refund or migrate live customers without explicit approval for that run.
|
|
104
|
+
- Never recompute an issued invoice from current prices.
|
|
105
|
+
- Never let two systems (yours and the provider's) both send dunning emails or both compute proration.
|
|
106
|
+
- Never use the server's local timezone for period maths.
|
|
107
|
+
|
|
108
|
+
## Report format
|
|
109
|
+
|
|
110
|
+
When asked to design or review a billing change, return:
|
|
111
|
+
|
|
112
|
+
```
|
|
113
|
+
Change: <one line>
|
|
114
|
+
Owner per concern: proration=<provider|app>, tax=..., dunning=..., numbering=...
|
|
115
|
+
Customer impact: <who pays what, when; one example invoice>
|
|
116
|
+
Edge cases tested: <list>
|
|
117
|
+
Decisions needed from the user: <list, or none>
|
|
118
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"We're raising prices next quarter. How do we move existing subscribers to the new price without breaking their renewals?",
|
|
4
|
+
"What should a customer pay if they upgrade from Basic to Pro halfway through their billing month?",
|
|
5
|
+
"Design a dunning flow for failed renewal payments: how many retries, which emails, and when do we cut access?",
|
|
6
|
+
"Our MRR movements don't add up from opening to closing balance each month, help me find out why",
|
|
7
|
+
"Customers on annual plans who cancel mid-year: should we issue a credit note, a refund, or neither?",
|
|
8
|
+
"Free trial users get charged twice when the trial ends; the conversion job and the renewal job both fire"
|
|
9
|
+
],
|
|
10
|
+
"should_not_trigger": [
|
|
11
|
+
"Integrate Stripe Checkout in subscription mode and handle the invoice.paid webhook",
|
|
12
|
+
"What fields does a VAT invoice need for a B2B customer in Germany?",
|
|
13
|
+
"Push our paid invoices into QuickBooks Online as Payment entities",
|
|
14
|
+
"Review the billing module diff for rounding bugs and double charges before we merge",
|
|
15
|
+
"Write a pricing page with three tiers and a monthly/annual toggle"
|
|
16
|
+
]
|
|
17
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Proration: formulas, rounding and edge cases
|
|
2
|
+
|
|
3
|
+
## Formula
|
|
4
|
+
|
|
5
|
+
For a period `[start, end)` and a change at instant `t` (`start <= t < end`):
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
remaining_fraction = (end - t) / (end - start) # seconds, exact rational
|
|
9
|
+
credit_old = round(old_amount_minor * remaining_fraction)
|
|
10
|
+
charge_new = round(new_amount_minor * remaining_fraction)
|
|
11
|
+
proration = charge_new - credit_old # may be negative on a downgrade
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Keep the fraction exact (integers for numerator and denominator, or a decimal library) and round each line once. Use a decimal type (`numeric` in SQL, `Decimal` in Python, `decimal.js` or `big.js` in JS, `BigDecimal` in Java), never binary floats.
|
|
15
|
+
|
|
16
|
+
## Rounding rules
|
|
17
|
+
|
|
18
|
+
- Pick one rule and write it down: half-up (common for invoices) or half-even (banker's). Many tax authorities specify rounding for tax; use theirs for tax lines.
|
|
19
|
+
- Round per line, then sum. Don't round the total separately, or lines won't add up to it.
|
|
20
|
+
- Zero-decimal currencies (JPY, KRW) have no minor unit below 1; three-decimal currencies (BHD, IQD, JOD, KWD, LYD, OMR, TND in the [ISO 4217 list](https://www.six-group.com/en/products-services/financial-information/data-standards.html) as of Sep 2026) have 1000 minor units. Take minor-unit exponents from ISO 4217 data, not a hard-coded 100.
|
|
21
|
+
|
|
22
|
+
## Worked example
|
|
23
|
+
|
|
24
|
+
Monthly plan, 30-day period `2026-04-01T00:00Z` to `2026-05-01T00:00Z` (2,592,000 s). Upgrade from 2,000 to 5,000 (minor units) at `2026-04-16T00:00Z`.
|
|
25
|
+
|
|
26
|
+
```
|
|
27
|
+
remaining = 15 days = 1,296,000 s → fraction 1/2
|
|
28
|
+
credit_old = round(2000 * 1/2) = 1000
|
|
29
|
+
charge_new = round(5000 * 1/2) = 2500
|
|
30
|
+
proration = 1500 charged now; renewal on 2026-05-01 is 5000
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Same change in a 31-day month at the same calendar date gives `16/31` remaining: credit `round(2000*16/31)=round(1032.26)=1032`, charge `round(5000*16/31)=round(2580.65)=2581`, proration `1549`. Customers notice that months differ; say in the docs whether you prorate by seconds of the actual period or by a fixed 30-day month.
|
|
34
|
+
|
|
35
|
+
## Edge cases to test
|
|
36
|
+
|
|
37
|
+
| Case | Expected |
|
|
38
|
+
|---|---|
|
|
39
|
+
| Anchor on the 31st | Next boundary is the last day of shorter months, then back to the 31st when it exists; never drift to the 28th permanently |
|
|
40
|
+
| Anchor on 29 Feb (annual) | Pick 28 Feb or 1 Mar in non-leap years; document it |
|
|
41
|
+
| Change exactly at `end` | Belongs to the next period; no proration on the old one |
|
|
42
|
+
| Two changes in one period | Each prorates from its own `t` against the price then in force; sum of lines equals the net change |
|
|
43
|
+
| Upgrade then downgrade same day | Net proration is small but non-zero; credits must not exceed what was charged |
|
|
44
|
+
| DST change in customer timezone | Period length in seconds differs by an hour; compute from instants, display in local time |
|
|
45
|
+
| Proration below the minimum charge amount | Carry it to the next invoice as a pending line instead of charging (cards have minimums per currency) |
|
|
46
|
+
| Discount or coupon active | Prorate the discounted amount, and state whether the coupon itself prorates |
|
|
47
|
+
| Tax-inclusive prices | Prorate the gross, then split tax using the same rule as normal invoices |
|