@ketecode/loom 0.0.0-stage → 0.1.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 +516 -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/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/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/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/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 +683 -0
- package/commands/aside.md +19 -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/deps-audit.md +32 -0
- package/commands/epic-decompose.md +21 -0
- package/commands/explain.md +37 -0
- package/commands/feature-dev.md +22 -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/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/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-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/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/protect-files/HOOK.md +24 -0
- package/hooks/protect-files/cases.json +27 -0
- package/hooks/protect-files/hook.js +39 -0
- package/hooks/run.js +132 -0
- package/mcp/atlassian.json +11 -0
- package/mcp/chrome-devtools.json +18 -0
- package/mcp/cloudflare.json +11 -0
- package/mcp/context7.json +11 -0
- package/mcp/fetch.json +17 -0
- package/mcp/figma.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/package.json +59 -4
- package/profiles.json +165 -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/schemas/skill-frontmatter.schema.json +52 -0
- package/scripts/lib/audit.js +96 -0
- package/scripts/lib/frontmatter.js +65 -0
- package/scripts/lib/hooks-install.js +292 -0
- package/scripts/lib/i18n.js +51 -0
- package/scripts/lib/inventory.js +85 -0
- package/scripts/lib/lint.js +158 -0
- package/scripts/lib/mcp-install.js +284 -0
- package/scripts/lib/profiles.js +128 -0
- package/scripts/lib/render.js +86 -0
- package/scripts/lib/rules-install.js +118 -0
- package/scripts/lib/skills.js +86 -0
- package/scripts/lib/targets.js +113 -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-harness-design/SKILL.md +125 -0
- package/skills/agent-harness-design/evals/triggers.json +21 -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-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/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/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/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/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/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/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/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/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/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/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/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/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/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/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/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-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/parallel-agent-orchestration/SKILL.md +106 -0
- package/skills/parallel-agent-orchestration/evals/triggers.json +14 -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/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/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/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/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/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/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/triggers.json +14 -0
- package/skills/skill-authoring/SKILL.md +87 -0
- package/skills/skill-authoring/evals/triggers.json +14 -0
- package/skills/skill-authoring/references/frontmatter.md +40 -0
- package/skills/slack-app-integration/SKILL.md +108 -0
- package/skills/slack-app-integration/evals/triggers.json +17 -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/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/tdd-workflow/SKILL.md +67 -0
- package/skills/tdd-workflow/evals/triggers.json +14 -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/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/verification-loop/SKILL.md +70 -0
- package/skills/verification-loop/evals/triggers.json +14 -0
- package/skills/verification-loop/scripts/detect-checks.js +102 -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,99 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: autonomous-loops
|
|
3
|
+
description: Runs an agent unattended over many iterations without it drifting or doing damage. Defines a measurable goal and stop conditions up front, caps iterations, time and spend, verifies each iteration with a real check, commits checkpoints so any step can be rolled back, keeps a progress log, and stops to escalate on repeated failure or risky actions. Use when the user wants the agent to keep going on its own ("loop until the tests pass", "work through this backlog overnight", "fix every lint error"), or when designing a headless or scheduled agent run.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs git 2.23 or later (for git switch and git restore) and the project's check commands.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: meta
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/requires: "git"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Autonomous loops
|
|
15
|
+
|
|
16
|
+
An unattended loop is a small program with an agent inside. It needs what any long-running job needs: a definition of done, limits, a health check each step, a log, and a way out. Agree all of it with the user **before** the first iteration, because nobody will be watching after.
|
|
17
|
+
|
|
18
|
+
## 1. Write the loop contract
|
|
19
|
+
|
|
20
|
+
Fill this in and show it to the user. **Do not start until they confirm it.**
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
Goal: <measurable end state, e.g. "npm test exits 0" or "0 eslint errors in src/">
|
|
24
|
+
Check: <command that measures progress, and the number it reports>
|
|
25
|
+
Scope: <paths the loop may edit>; everything else is read-only
|
|
26
|
+
Per iteration: <one unit of work, e.g. "fix one failing test file">
|
|
27
|
+
Stop when: goal met | <N> iterations | <T> minutes | <budget> spent |
|
|
28
|
+
no progress for 3 iterations | same error 3 times
|
|
29
|
+
Escalate if: <actions needing a human: see section 4>
|
|
30
|
+
Branch: <work branch, never main>
|
|
31
|
+
Log: <path, e.g. .handoff/loop-log.md>
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
If the goal can't be checked by a command, it is not ready for a loop. Help the user turn it into one, or run it attended.
|
|
35
|
+
|
|
36
|
+
## 2. Prepare
|
|
37
|
+
|
|
38
|
+
1. Create a work branch: `git switch -c loop/<topic>`. Never loop on the default branch.
|
|
39
|
+
2. Make sure the tree is clean (`git status --short`). If it isn't, ask the user what to do with the changes.
|
|
40
|
+
3. Run the check once and record the baseline in the log. If the baseline is already at the goal, stop.
|
|
41
|
+
|
|
42
|
+
## 3. Each iteration
|
|
43
|
+
|
|
44
|
+
1. **Read the log** (last few entries) so you don't repeat a failed approach.
|
|
45
|
+
2. **Pick one unit** of work, the smallest that moves the check.
|
|
46
|
+
3. **Make the change** inside the agreed scope.
|
|
47
|
+
4. **Verify**: run the check, plus the project's fast tests or lint if the check alone could hide regressions.
|
|
48
|
+
5. **Decide**:
|
|
49
|
+
- Better and nothing else broke: commit with a message naming the unit (`loop: fix parser.test.ts timeouts`).
|
|
50
|
+
- Not better, or something else broke: revert the change: `git restore --staged --worktree -- <tracked files you modified>`, then delete the files this iteration created (git restore rejects untracked paths), and note why. Only ever revert this iteration's own uncommitted work.
|
|
51
|
+
6. **Log** one entry:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
## Iteration 7 - 14:32
|
|
55
|
+
Did: raised timeout handling in src/parser.ts
|
|
56
|
+
Check: 12 failing -> 9 failing (kept, commit a1b2c3d)
|
|
57
|
+
Next: auth.test.ts fixtures
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
7. **Check stop conditions** before starting the next iteration.
|
|
61
|
+
|
|
62
|
+
## 4. Escalate instead of acting
|
|
63
|
+
|
|
64
|
+
Stop the loop and report to the user when the next step would:
|
|
65
|
+
|
|
66
|
+
- Edit files outside the agreed scope, delete files, or change CI, secrets or deployment config.
|
|
67
|
+
- Delete, skip or weaken a test, or lower a lint or coverage threshold to make the check pass.
|
|
68
|
+
- Install, upgrade or remove dependencies (unless the contract allows it).
|
|
69
|
+
- Push, open a PR, deploy, run migrations, or call paid or production services.
|
|
70
|
+
- Repeat an approach the log already shows failed.
|
|
71
|
+
|
|
72
|
+
Also stop if the check gets worse twice in a row, or the same error shows three times. That's a sign the loop is stuck, not that it needs more tries.
|
|
73
|
+
|
|
74
|
+
## 5. Budgets
|
|
75
|
+
|
|
76
|
+
- Keep a counter of iterations and elapsed time in the log header and compare against the contract each iteration.
|
|
77
|
+
- If the host reports cost or token usage, track it the same way. If it doesn't, the iteration cap is the budget.
|
|
78
|
+
- For long runs, checkpoint the context too: after every few iterations, make sure the log alone is enough to continue (see the `session-handoff` and `context-budget` skills).
|
|
79
|
+
|
|
80
|
+
## 6. Finish
|
|
81
|
+
|
|
82
|
+
When any stop condition hits, end with this report:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
Stopped because: <goal met | cap reached | stuck | escalation>
|
|
86
|
+
Check: <baseline> -> <final>
|
|
87
|
+
Iterations: <n> (<kept> kept, <reverted> reverted)
|
|
88
|
+
Branch: loop/<topic> at <sha>
|
|
89
|
+
Needs a human: <escalations and open questions, or "nothing">
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
Leave the branch for review. Don't merge or push it unless the user asked for that in the contract.
|
|
93
|
+
|
|
94
|
+
## Never
|
|
95
|
+
|
|
96
|
+
- Never run a loop without a check command and a hard iteration cap.
|
|
97
|
+
- Never game the check (skip tests, add ignores, hard-code expected output, special-case the test).
|
|
98
|
+
- Never keep a change that made the check worse.
|
|
99
|
+
- Never let the loop widen its own scope or extend its own budget.
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Keep fixing the failing tests on your own until the whole suite is green, I'll check back tomorrow",
|
|
4
|
+
"Set up a headless agent run that works through the lint errors in src/ one file at a time overnight",
|
|
5
|
+
"Loop on this: try a fix, run the benchmark, keep it if it's faster, otherwise revert",
|
|
6
|
+
"What guardrails do I need before letting the agent run unattended on our backlog"
|
|
7
|
+
],
|
|
8
|
+
"should_not_trigger": [
|
|
9
|
+
"Run every check on my branch once and tell me if it's ready for a pull request",
|
|
10
|
+
"Fan this refactor out to four subagents and merge their results",
|
|
11
|
+
"Run this cleanup command every morning at 9 using a cron job on the server",
|
|
12
|
+
"Write a failing test first, then implement the date parser"
|
|
13
|
+
]
|
|
14
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: aws-patterns
|
|
3
|
+
description: Designs and reviews workloads on Amazon Web Services, covering least-privilege IAM roles and policies, picking Lambda versus ECS Fargate versus EC2, S3 bucket hardening, RDS and Aurora setup, VPC subnets and security groups, Secrets Manager and Parameter Store, and the bill surprises that come from NAT gateways, public IPv4 and idle resources. Use when building or changing something on AWS, writing an IAM policy, choosing an AWS compute service, or asking why an AWS account costs more than expected.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Live checks need the AWS CLI with credentials for the target account. Infrastructure code may be Terraform, CloudFormation, CDK or SAM.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: devops
|
|
9
|
+
kete-loom/risk: network
|
|
10
|
+
kete-loom/requires: "aws"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# AWS patterns
|
|
15
|
+
|
|
16
|
+
Build on AWS so that every principal has only the access it needs, nothing is public by accident, secrets never sit in code, and the monthly bill holds no surprises. Terraform syntax itself belongs to `terraform-patterns`; container image detail to `docker-patterns`; CI wiring to `github-actions-ci`.
|
|
17
|
+
|
|
18
|
+
## Ground rules
|
|
19
|
+
|
|
20
|
+
1. **Everything is code.** Create resources through the project's IaC (Terraform, CloudFormation, CDK or SAM). Console changes are for exploring only; if you find drift, report it, don't "fix" it by clicking.
|
|
21
|
+
2. **Roles, not users.** Workloads get IAM roles (Lambda execution role, ECS task role, EC2 instance profile). People sign in through IAM Identity Center. Never create long-lived access keys for an app or a CI system; CI uses OIDC federation (see `github-actions-ci`).
|
|
22
|
+
3. **Least privilege, scoped by resource.** No `"Action": "*"` or `"Resource": "*"` on write actions. Name the ARNs. Use conditions (`aws:SourceArn`, `aws:PrincipalOrgID`, `s3:prefix`) when a service or cross-account principal is involved.
|
|
23
|
+
4. **Private by default.** S3 Block Public Access stays on at account and bucket level. Databases live in private subnets with no public endpoint. Serve public content through CloudFront with origin access control, not a public bucket.
|
|
24
|
+
5. **Secrets in Secrets Manager or SSM Parameter Store (`SecureString`).** Never in environment variables committed to the repo, task definitions in git, or user data. Grant `secretsmanager:GetSecretValue` on that one secret ARN only.
|
|
25
|
+
6. **Encrypt and log.** Encryption at rest on S3, EBS, RDS (default keys are fine unless compliance asks for customer-managed KMS keys). CloudTrail on in every region for the account.
|
|
26
|
+
7. **Tag everything** with at least owner, environment and cost centre so cost reports mean something.
|
|
27
|
+
|
|
28
|
+
## Choosing compute
|
|
29
|
+
|
|
30
|
+
| Need | Pick | Watch out for |
|
|
31
|
+
|---|---|---|
|
|
32
|
+
| Event-driven, spiky, short tasks (API, queue consumer, cron) | Lambda | 15-minute maximum run time; cold starts; database connection storms (use RDS Proxy) |
|
|
33
|
+
| Long-running containers without managing servers | ECS on Fargate | Pay per vCPU/memory even when idle; right-size tasks |
|
|
34
|
+
| Many services, team already runs Kubernetes | EKS | Control-plane fee per cluster plus node cost; operational load. See `kubernetes-patterns` |
|
|
35
|
+
| GPUs, special kernels, licensed software, steady high load | EC2 (Auto Scaling group) | You patch the OS; use SSM Session Manager instead of SSH keys and open port 22 |
|
|
36
|
+
| Static site | S3 + CloudFront | Bucket stays private behind origin access control |
|
|
37
|
+
|
|
38
|
+
Decision rule: start with the simplest option that meets the run-time and scaling need. If the user wants EKS for one or two services, ask whether they have Kubernetes experience before committing.
|
|
39
|
+
|
|
40
|
+
## Networking basics
|
|
41
|
+
|
|
42
|
+
1. One VPC per environment, spread across at least two Availability Zones.
|
|
43
|
+
2. Public subnets hold only load balancers and NAT gateways. App and database subnets are private.
|
|
44
|
+
3. Security groups reference other security groups, not CIDR ranges: the database SG allows port 5432 from the app SG only. Never `0.0.0.0/0` on anything but 80/443 on a load balancer.
|
|
45
|
+
4. Add a gateway VPC endpoint for S3 (and DynamoDB if used): it costs nothing and keeps that traffic off the NAT gateway.
|
|
46
|
+
5. Use interface endpoints for other heavy AWS API traffic (ECR, Secrets Manager, CloudWatch Logs) when NAT data charges are high.
|
|
47
|
+
|
|
48
|
+
## Data
|
|
49
|
+
|
|
50
|
+
- **S3:** versioning on for anything you can't regenerate; lifecycle rules to move or expire old objects and abort incomplete multipart uploads; bucket policy that denies non-TLS requests (`aws:SecureTransport` = false).
|
|
51
|
+
- **RDS / Aurora:** Multi-AZ for production, automated backups with a retention that matches the recovery need, deletion protection on, storage encrypted, credentials managed by Secrets Manager (RDS can manage and rotate the master password). Connect with IAM auth or a secret, never a password in config.
|
|
52
|
+
- **DynamoDB:** design keys around access patterns first; on-demand capacity until traffic is predictable.
|
|
53
|
+
|
|
54
|
+
## Cost traps to check every time
|
|
55
|
+
|
|
56
|
+
- NAT gateway hourly charge plus per-GB processing; one per AZ multiplies it. Traffic to S3 through NAT is the classic waste.
|
|
57
|
+
- Public IPv4 addresses are billed per hour, including ones attached to running instances and idle Elastic IPs.
|
|
58
|
+
- Cross-AZ and internet data transfer.
|
|
59
|
+
- Unattached EBS volumes, old snapshots, idle load balancers, forgotten dev RDS instances.
|
|
60
|
+
- CloudWatch Logs with no retention set (the default is never expire).
|
|
61
|
+
- Lambda with oversized memory or a retry loop on a failing event source.
|
|
62
|
+
|
|
63
|
+
Set an AWS Budgets alert on every account before building anything else.
|
|
64
|
+
|
|
65
|
+
## Steps for a change
|
|
66
|
+
|
|
67
|
+
1. Read the existing IaC and identify the account, region and environment. If you can't tell which account a change targets, **stop and ask**.
|
|
68
|
+
2. Write the change in IaC following the ground rules.
|
|
69
|
+
3. Validate it: `terraform plan`, `cdk diff`, `sam validate` or `aws cloudformation validate-template`. For IAM, run `aws accessanalyzer validate-policy --policy-type IDENTITY_POLICY --policy-document file://policy.json` and fix every error and security warning.
|
|
70
|
+
4. Show the user the plan. **Stop and ask before** any apply that deletes or replaces a stateful resource (database, bucket, volume), widens a security group to the internet, or touches production.
|
|
71
|
+
5. After apply, verify: `aws sts get-caller-identity` for identity, the service's health check, and that no new resource is public.
|
|
72
|
+
|
|
73
|
+
## Never
|
|
74
|
+
|
|
75
|
+
- Commit access keys, or put them in `.env` files that reach git.
|
|
76
|
+
- Use the root user for anything except the few tasks that require it; root has MFA and no access keys.
|
|
77
|
+
- Attach `AdministratorAccess` to a workload role "to get it working".
|
|
78
|
+
- Run destructive CLI commands (`aws s3 rm --recursive`, `delete-db-instance`) without the user confirming the exact target.
|
|
79
|
+
|
|
80
|
+
## Review output
|
|
81
|
+
|
|
82
|
+
When asked to review AWS setup, report:
|
|
83
|
+
|
|
84
|
+
```
|
|
85
|
+
AWS review: <account/env>
|
|
86
|
+
Critical: <public data, admin roles, leaked keys>
|
|
87
|
+
High: <missing encryption, open security groups, no backups>
|
|
88
|
+
Cost: <each trap found, rough monthly impact if known>
|
|
89
|
+
Suggested IaC changes: <file: change>
|
|
90
|
+
Not checked: <what you had no access to>
|
|
91
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Write a least-privilege IAM policy so our Lambda can only read one S3 bucket and one secret",
|
|
4
|
+
"Should this background worker run on Lambda, ECS Fargate or plain EC2?",
|
|
5
|
+
"Our AWS bill doubled and most of it is NAT gateway data processing, what are we doing wrong?",
|
|
6
|
+
"Set up a VPC with private subnets for RDS Postgres and security groups that only let the app in",
|
|
7
|
+
"Where should our app's database password live on AWS instead of the task definition env vars?"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Configure GitHub Actions to assume an AWS role with OIDC instead of access keys",
|
|
11
|
+
"Refactor our Terraform modules to use for_each instead of count",
|
|
12
|
+
"Deploy the service to Google Cloud Run with its own service account",
|
|
13
|
+
"Plan a canary rollout for the new checkout service with automatic rollback",
|
|
14
|
+
"Write a Kubernetes Deployment manifest with resource limits and probes"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: azure-patterns
|
|
3
|
+
description: Sets up and audits Microsoft Azure workloads with Entra ID and managed identities instead of stored credentials, Azure RBAC at resource scope, a reasoned choice among App Service, Container Apps, Azure Functions and AKS, Azure SQL and Cosmos DB configuration, Key Vault references, virtual networks with private endpoints and NSGs, and Azure spending pitfalls like idle App Service plans and over-provisioned RUs. Use when building on Azure, wiring a managed identity, deciding where an Azure app should run, or explaining an Azure invoice.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Live checks need the Azure CLI signed in to the target subscription. Infrastructure code may be Bicep, ARM or Terraform.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: devops
|
|
9
|
+
kete-loom/risk: network
|
|
10
|
+
kete-loom/requires: "az"
|
|
11
|
+
kete-loom/owner: "Kete-org"
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
# Azure patterns
|
|
15
|
+
|
|
16
|
+
Build on Azure so apps authenticate with managed identities, secrets live in Key Vault, data services sit behind private endpoints, and costs are predictable. Terraform detail is in `terraform-patterns`, Kubernetes manifests in `kubernetes-patterns`, CI login in `github-actions-ci`, .NET code in `aspnet-core-patterns`.
|
|
17
|
+
|
|
18
|
+
## Ground rules
|
|
19
|
+
|
|
20
|
+
1. **Structure:** management groups, then one subscription per environment (or at least per prod / non-prod), then resource groups per application and environment. Resource groups share a lifecycle: everything in one is deployed and deleted together.
|
|
21
|
+
2. **Managed identities for workloads.** Use a system-assigned identity when one resource needs access; a user-assigned identity when several resources share it or it must exist before the resource. In code use `DefaultAzureCredential` (or the language's equivalent) so the same code works locally with a developer sign-in and in Azure with the identity.
|
|
22
|
+
3. **No client secrets in apps.** If an app registration secret seems needed, **stop and ask** whether a managed identity or workload identity federation (for CI and for AKS) works instead. If a secret is unavoidable, store it in Key Vault and set an expiry reminder.
|
|
23
|
+
4. **Azure RBAC, narrowest scope, data-plane roles.** Grant `Key Vault Secrets User` on the vault, `Storage Blob Data Reader` on the storage account or container. Never Owner or Contributor on a subscription for a workload.
|
|
24
|
+
5. **Key Vault for secrets, keys and certificates.** Use the RBAC permission model, soft delete and purge protection. App Service and Functions read secrets through Key Vault references in app settings; Container Apps through secret references to Key Vault.
|
|
25
|
+
6. **Everything in IaC** (Bicep, ARM or Terraform). Preview with `az deployment group what-if` or `terraform plan`.
|
|
26
|
+
|
|
27
|
+
## Choosing compute
|
|
28
|
+
|
|
29
|
+
| Need | Pick | Watch out for |
|
|
30
|
+
|---|---|---|
|
|
31
|
+
| Web app or API, code or container, simple ops | App Service | The App Service plan bills while running even with zero traffic; deployment slots for zero-downtime swaps |
|
|
32
|
+
| Containerised microservices, scale to zero, Dapr or KEDA scaling | Container Apps | Set min replicas deliberately; workload profiles for dedicated capacity |
|
|
33
|
+
| Event-driven functions (queues, timers, HTTP) | Azure Functions, Flex Consumption plan for new serverless apps | Linux Consumption is legacy and scheduled for retirement; check timeouts per plan |
|
|
34
|
+
| Full Kubernetes control, many teams, custom operators | AKS | You own upgrades and node pools; use workload identity, not pod-managed identity |
|
|
35
|
+
| Lift-and-shift VM software | Virtual Machines / scale sets | Patch management; Bastion instead of public RDP/SSH |
|
|
36
|
+
|
|
37
|
+
Decision rule: App Service or Container Apps first. Choose AKS only when the user names a requirement those can't meet.
|
|
38
|
+
|
|
39
|
+
## Networking basics
|
|
40
|
+
|
|
41
|
+
1. One virtual network per environment (or hub-and-spoke for larger estates), with subnets per tier.
|
|
42
|
+
2. Data services (Azure SQL, Cosmos DB, Storage, Key Vault) get **private endpoints** and public network access disabled; add the matching Private DNS zones so names resolve to the private IP.
|
|
43
|
+
3. App Service and Functions reach the VNet through VNet integration; Container Apps run in a VNet-integrated environment.
|
|
44
|
+
4. NSGs on subnets allow only the ports each tier needs, by service tag or application security group. Never open RDP (3389) or SSH (22) to the internet; use Azure Bastion.
|
|
45
|
+
5. Public HTTP goes through Application Gateway or Front Door, with WAF if the user needs it.
|
|
46
|
+
|
|
47
|
+
## Data
|
|
48
|
+
|
|
49
|
+
- **Azure SQL Database:** Entra ID authentication with the app's managed identity (no SQL passwords in connection strings), Entra-only auth where possible; geo-redundant backups and point-in-time restore configured; serverless tier with auto-pause for dev.
|
|
50
|
+
- **Cosmos DB:** choose the partition key from the dominant query; serverless or autoscale throughput rather than high fixed RU/s; use data-plane RBAC with the managed identity instead of account keys, and disable key-based auth when nothing needs it.
|
|
51
|
+
- **Storage accounts:** disable anonymous blob access and shared key auth where clients support Entra; soft delete for blobs and containers; lifecycle management to cool or archive tiers.
|
|
52
|
+
|
|
53
|
+
## Cost traps
|
|
54
|
+
|
|
55
|
+
- App Service plans and Premium Functions plans that keep billing for apps nobody uses; several small plans that could share one.
|
|
56
|
+
- Cosmos DB provisioned RU/s far above actual use; one container per tenant with minimum RU each.
|
|
57
|
+
- AKS node pools that never scale down; forgotten dev clusters.
|
|
58
|
+
- Log Analytics ingestion with no daily cap or retention policy.
|
|
59
|
+
- Unattached managed disks, public IPs, idle Application Gateways, VMs stopped but not deallocated.
|
|
60
|
+
|
|
61
|
+
Create a budget with alerts on each subscription first.
|
|
62
|
+
|
|
63
|
+
## Steps for a change
|
|
64
|
+
|
|
65
|
+
1. Confirm the subscription and resource group: `az account show`. If it is not the one the user means, **stop and ask**.
|
|
66
|
+
2. Write the change in IaC with identities, RBAC assignments and private endpoints in the same change.
|
|
67
|
+
3. Preview: `az deployment group what-if` or `terraform plan`. Read every delete and replace line.
|
|
68
|
+
4. **Stop and ask before** any deployment in `Complete` mode, any delete or replace of a database, storage account or vault, any role assignment at subscription scope, or any production change.
|
|
69
|
+
5. After deploying, verify the app's health endpoint, that the identity has exactly the intended role assignments (`az role assignment list --assignee <principalId>`), and that public network access is off where intended.
|
|
70
|
+
|
|
71
|
+
## Never
|
|
72
|
+
|
|
73
|
+
- Put storage account keys, Cosmos keys or SQL passwords in app settings or source.
|
|
74
|
+
- Purge a soft-deleted Key Vault or delete a resource group without the user confirming the exact name.
|
|
75
|
+
- Grant Owner to a service principal used by CI "to save time".
|
|
76
|
+
|
|
77
|
+
## Review output
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
Azure review: <subscription/env>
|
|
81
|
+
Critical: <secrets in config, public data endpoints, Owner on workloads>
|
|
82
|
+
High: <no managed identity, missing backups, open NSG rules>
|
|
83
|
+
Cost: <each trap found>
|
|
84
|
+
Suggested IaC changes: <file: change>
|
|
85
|
+
Not checked: <what you had no access to>
|
|
86
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Give our App Service a managed identity so it can read secrets from Key Vault without a client secret",
|
|
4
|
+
"Should we host these microservices on Azure Container Apps or AKS?",
|
|
5
|
+
"Lock down Azure SQL and the storage account with private endpoints and disable public access",
|
|
6
|
+
"Our Cosmos DB costs are huge, how do we cut the provisioned RU/s spend?",
|
|
7
|
+
"We still run Azure Functions on the Linux Consumption plan, what should we move to?"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Use azure/login in a GitHub Actions workflow with a federated credential",
|
|
11
|
+
"Set up IAM roles and a VPC for an ECS service on AWS",
|
|
12
|
+
"Configure Entity Framework Core migrations for our ASP.NET Core app",
|
|
13
|
+
"Pick between Cloud Run and GKE for a new service on Google Cloud",
|
|
14
|
+
"Write a blue-green deployment plan for the billing API"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: benchmark-methodology
|
|
3
|
+
description: Designs and runs performance benchmarks whose numbers hold up, with warmup, enough iterations, medians and p95/p99 with spread, a quiet and pinned machine, interleaved before/after comparison with a significance check, and guards against dead-code elimination and other microbenchmark traps in Go, JMH, BenchmarkDotNet, Criterion, pytest-benchmark and JS. Use when measuring whether a change made code faster or slower, writing a microbenchmark, or judging a performance claim.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Any Agent Skills host. Needs the project's language toolchain; hyperfine is optional for command-level timing.
|
|
6
|
+
metadata:
|
|
7
|
+
kete-loom/version: "0.1.0"
|
|
8
|
+
kete-loom/category: testing
|
|
9
|
+
kete-loom/risk: runs-commands
|
|
10
|
+
kete-loom/owner: "Kete-org"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Benchmark methodology
|
|
14
|
+
|
|
15
|
+
A benchmark is an experiment. Its job is to answer one question ("is B faster than A for this workload, by how much, and are we sure?") with numbers someone else can reproduce. Most bad benchmarks measure the wrong thing, too few times, on a noisy machine.
|
|
16
|
+
|
|
17
|
+
## 1. Write down the question
|
|
18
|
+
|
|
19
|
+
Before any code, state:
|
|
20
|
+
|
|
21
|
+
1. **What is measured**: a function, an endpoint, a CLI command, a whole job.
|
|
22
|
+
2. **The metric**: latency per operation, throughput, allocations, peak memory, startup time.
|
|
23
|
+
3. **The workload**: realistic input sizes and shapes. Use production-like data, not `n = 10`. If you don't know the real sizes, **ask the user**.
|
|
24
|
+
4. **The decision**: what result would change what we do ("ship if p95 improves by 10 % or more with no regression in allocations").
|
|
25
|
+
|
|
26
|
+
If the user wants to know why the app is slow rather than compare versions, profile first (CPU profiler, flame graph) and benchmark the hot spot after.
|
|
27
|
+
|
|
28
|
+
## 2. Pick the level and the tool
|
|
29
|
+
|
|
30
|
+
- **Microbenchmark** (a function, nanoseconds to milliseconds): use the language harness, never a hand-rolled timer loop. See `references/language-harnesses.md`.
|
|
31
|
+
- **Command or process** (a CLI, a build step): `hyperfine --warmup 3 --runs 20 'old-cmd' 'new-cmd'`; add `--prepare` to reset caches or state between runs and `--export-json` to keep raw data.
|
|
32
|
+
- **Service** (an HTTP endpoint): a load tool at a fixed request rate, measuring latency percentiles at that rate. Measuring at maximum throughput hides latency problems.
|
|
33
|
+
|
|
34
|
+
## 3. Control the environment
|
|
35
|
+
|
|
36
|
+
- Same machine, same build flags (release / optimised), same runtime version, same input for A and B.
|
|
37
|
+
- Close other heavy work. On laptops, plug in power and disable low-power modes. In CI, shared runners are noisy: use a dedicated runner, or only trust large differences.
|
|
38
|
+
- Where possible, disable CPU frequency boost and pin to cores (Linux: `taskset -c 2 <cmd>`). Record if you could not.
|
|
39
|
+
- Warm up: JIT compilation, caches, connection pools and lazy initialisation make first runs slow. Discard warmup iterations, or measure cold start separately on purpose.
|
|
40
|
+
- Note the hardware, OS, runtime version and commit for every run.
|
|
41
|
+
|
|
42
|
+
## 4. Run enough and keep the raw data
|
|
43
|
+
|
|
44
|
+
- At least 10 samples per variant for microbenchmarks the harness doesn't already repeat (Go: `-count=10`); 20 or more for noisy ones.
|
|
45
|
+
- **Interleave** A and B (A, B, A, B...) or alternate whole runs so thermal drift and background jobs hit both equally. Never run all of A in the morning and all of B after lunch.
|
|
46
|
+
- Keep the raw samples, not only the mean.
|
|
47
|
+
|
|
48
|
+
## 5. Summarise honestly
|
|
49
|
+
|
|
50
|
+
- Report the **median** and **p95 / p99** for latency; the mean hides tail latency and is pulled by outliers.
|
|
51
|
+
- Report spread: standard deviation, median absolute deviation or a confidence interval.
|
|
52
|
+
- Compare with a significance test, not by eye. Go: `benchstat old.txt new.txt`. JMH and BenchmarkDotNet print error margins; differences inside the error bars are noise. For raw samples, a Mann-Whitney U test is a safe default.
|
|
53
|
+
- Say "no measurable difference" when that is the result. A 2 % change with 5 % noise is not a win.
|
|
54
|
+
- Check memory too: allocations per op (`-benchmem` in Go, `[MemoryDiagnoser]` in BenchmarkDotNet, `-prof gc` in JMH). A faster version that allocates far more may be slower in production.
|
|
55
|
+
|
|
56
|
+
## 6. Microbenchmark traps
|
|
57
|
+
|
|
58
|
+
Check each before trusting a number:
|
|
59
|
+
|
|
60
|
+
1. **Dead-code elimination**: the compiler removes work whose result is unused. Consume results (`Blackhole` in JMH, `std::hint::black_box` in Rust, return the value from a BenchmarkDotNet method, `b.Loop()` in Go 1.24+).
|
|
61
|
+
2. **Constant folding**: inputs known at compile time get precomputed. Load inputs from a variable or setup step.
|
|
62
|
+
3. **Measuring setup**: allocating the input inside the timed region. Do setup outside it.
|
|
63
|
+
4. **Caches too warm**: the same small input every iteration stays in L1 and branch predictors learn it. Use realistic sizes and varied data.
|
|
64
|
+
5. **Timer resolution**: timing a 20 ns operation once is noise; harnesses batch iterations for this reason.
|
|
65
|
+
6. **GC and JIT pauses** landing in one variant only. Run long enough and check variance.
|
|
66
|
+
7. **Debug builds**: `cargo bench` and `go test -bench` optimise by default; for C and C++ check optimisation flags (`-O2`, CMake `Release`), for .NET build with `-c Release`; on the JVM, use JMH so the JIT has warmed up.
|
|
67
|
+
|
|
68
|
+
Language-specific details and example code are in `references/language-harnesses.md`.
|
|
69
|
+
|
|
70
|
+
## Rules
|
|
71
|
+
|
|
72
|
+
- Never claim a speed-up from a single run, a debug build, or a different input.
|
|
73
|
+
- Never tune the benchmark until it shows the result you hoped for; fix the method, then accept the answer.
|
|
74
|
+
- Never commit benchmark code that makes network calls or depends on wall-clock time of day.
|
|
75
|
+
- If results contradict across runs, **stop and report the noise** instead of picking the best run.
|
|
76
|
+
|
|
77
|
+
## Report back
|
|
78
|
+
|
|
79
|
+
```
|
|
80
|
+
Question: <what was compared, workload>
|
|
81
|
+
Environment: <CPU, OS, runtime version, commit A, commit B, noise controls>
|
|
82
|
+
Method: <tool, warmup, samples per variant, interleaved yes/no>
|
|
83
|
+
Results:
|
|
84
|
+
| Variant | median | p95 | spread | allocs/op |
|
|
85
|
+
Verdict: <B is X% faster (p < 0.05) | no measurable difference | B regressed>
|
|
86
|
+
Caveats: <what could still skew it>
|
|
87
|
+
Commands: <exact commands to reproduce>
|
|
88
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"should_trigger": [
|
|
3
|
+
"Write a Go benchmark comparing the old and new JSON decoder and tell me if the new one is actually faster",
|
|
4
|
+
"My JMH numbers swing 30% between runs, how do I get results I can trust?",
|
|
5
|
+
"Is my refactor of the tokenizer a performance regression? Measure it properly before and after",
|
|
6
|
+
"Set up BenchmarkDotNet for our hashing code with allocation stats",
|
|
7
|
+
"Someone claims the Rust rewrite is 3x faster, check whether their benchmark is valid"
|
|
8
|
+
],
|
|
9
|
+
"should_not_trigger": [
|
|
10
|
+
"Profile the API and fix whatever is making the orders endpoint slow",
|
|
11
|
+
"Our Lighthouse score dropped, improve the page load time",
|
|
12
|
+
"Raise the unit test coverage of the parser package to 80%",
|
|
13
|
+
"Write Playwright tests for the search page",
|
|
14
|
+
"Run the test suite and lint before I push"
|
|
15
|
+
]
|
|
16
|
+
}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
# Benchmark harnesses by language
|
|
2
|
+
|
|
3
|
+
Read this when writing a microbenchmark. Use the harness the project already has; add a new one only with the user's agreement.
|
|
4
|
+
|
|
5
|
+
## Go (`testing`)
|
|
6
|
+
|
|
7
|
+
```go
|
|
8
|
+
func BenchmarkParse(b *testing.B) {
|
|
9
|
+
input := loadFixture(b) // setup is outside the timed loop with b.Loop
|
|
10
|
+
for b.Loop() {
|
|
11
|
+
Parse(input)
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
- `b.Loop()` (Go 1.24+) times only the loop body and stops the compiler from optimising the body away. On older Go, use `for i := 0; i < b.N; i++`, call `b.ResetTimer()` after setup, and assign results to a package-level sink variable.
|
|
17
|
+
- Run: `go test -run '^$' -bench BenchmarkParse -benchmem -count=10 ./pkg/parse > new.txt`.
|
|
18
|
+
- Compare: `go install golang.org/x/perf/cmd/benchstat@latest`, then `benchstat old.txt new.txt`. It prints the change with a p-value; "~" means no significant difference.
|
|
19
|
+
- Pitfalls: `-run '^$'` stops unit tests from running alongside; `-cpu 1,4` shows scaling.
|
|
20
|
+
|
|
21
|
+
## Java and Kotlin (JMH)
|
|
22
|
+
|
|
23
|
+
```java
|
|
24
|
+
@State(Scope.Benchmark)
|
|
25
|
+
@BenchmarkMode(Mode.AverageTime)
|
|
26
|
+
@OutputTimeUnit(TimeUnit.NANOSECONDS)
|
|
27
|
+
@Warmup(iterations = 5) @Measurement(iterations = 10) @Fork(3)
|
|
28
|
+
public class ParseBench {
|
|
29
|
+
String input;
|
|
30
|
+
@Setup public void setup() { input = Fixtures.load(); }
|
|
31
|
+
@Benchmark public void parse(Blackhole bh) { bh.consume(Parser.parse(input)); }
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
- Never benchmark the JVM with `System.nanoTime()` loops: JIT tiers, on-stack replacement and dead-code elimination make them meaningless.
|
|
36
|
+
- `@Fork` of 2 or more runs separate JVMs so one JIT profile doesn't decide the result.
|
|
37
|
+
- `-prof gc` reports allocation rate; `-prof async` (async-profiler) shows where time goes.
|
|
38
|
+
- Use `@Param` for input sizes so you see how cost scales.
|
|
39
|
+
|
|
40
|
+
## C# / .NET (BenchmarkDotNet)
|
|
41
|
+
|
|
42
|
+
```csharp
|
|
43
|
+
[MemoryDiagnoser]
|
|
44
|
+
public class ParseBench {
|
|
45
|
+
private string _input = default!;
|
|
46
|
+
[GlobalSetup] public void Setup() => _input = Fixtures.Load();
|
|
47
|
+
[Benchmark(Baseline = true)] public Result Old() => OldParser.Parse(_input);
|
|
48
|
+
[Benchmark] public Result New() => NewParser.Parse(_input);
|
|
49
|
+
}
|
|
50
|
+
// Program.cs: BenchmarkRunner.Run<ParseBench>();
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
- Run in Release: `dotnet run -c Release`. BenchmarkDotNet warns when it detects a debug build or an attached debugger.
|
|
54
|
+
- Return the result from the method so it isn't eliminated.
|
|
55
|
+
- `Baseline = true` adds a Ratio column for before/after.
|
|
56
|
+
|
|
57
|
+
## Rust (Criterion or `cargo bench`)
|
|
58
|
+
|
|
59
|
+
```rust
|
|
60
|
+
use criterion::{criterion_group, criterion_main, Criterion};
|
|
61
|
+
use std::hint::black_box;
|
|
62
|
+
|
|
63
|
+
fn bench(c: &mut Criterion) {
|
|
64
|
+
let input = load_fixture();
|
|
65
|
+
c.bench_function("parse", |b| b.iter(|| parse(black_box(&input))));
|
|
66
|
+
}
|
|
67
|
+
criterion_group!(benches, bench);
|
|
68
|
+
criterion_main!(benches);
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
- Needs `[[bench]] name = "parse" harness = false` in `Cargo.toml`.
|
|
72
|
+
- Criterion saves a baseline and reports change and significance against the previous run; `cargo bench -- --save-baseline before` then `--baseline before` compares named baselines.
|
|
73
|
+
- `black_box` on inputs prevents constant folding; Criterion handles the output.
|
|
74
|
+
|
|
75
|
+
## Python (pytest-benchmark, pyperf, timeit)
|
|
76
|
+
|
|
77
|
+
```python
|
|
78
|
+
def test_parse(benchmark):
|
|
79
|
+
data = load_fixture()
|
|
80
|
+
result = benchmark(parse, data)
|
|
81
|
+
assert result.ok
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
- Run: `pytest --benchmark-only --benchmark-autosave`, then compare saved runs with `pytest-benchmark compare`.
|
|
85
|
+
- For stand-alone scripts, `pyperf` handles warmup, multiple processes and system tuning advice (`python -m pyperf system tune` on Linux).
|
|
86
|
+
- `python -m timeit -s 'setup' 'stmt'` is fine for a quick check, not for a decision.
|
|
87
|
+
- Interpreter version matters a lot between releases; record it.
|
|
88
|
+
|
|
89
|
+
## JavaScript and TypeScript (tinybench, mitata, Vitest bench)
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
import { Bench } from 'tinybench';
|
|
93
|
+
const bench = new Bench({ time: 1000 }); // warmup option names differ between tinybench majors; check the installed version's docs
|
|
94
|
+
const input = loadFixture();
|
|
95
|
+
bench.add('old', () => oldParse(input)).add('new', () => newParse(input));
|
|
96
|
+
await bench.run();
|
|
97
|
+
console.table(bench.table());
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
- V8 optimises and deoptimises based on observed types; feed realistic, varied inputs or one shape will look unrealistically fast.
|
|
101
|
+
- Keep the result reachable (return it, or push into an array checked after the run).
|
|
102
|
+
- Vitest has `bench()` in `*.bench.ts` files, run with `npx vitest bench`.
|
|
103
|
+
- Node version and flags change results; record `node --version`.
|
|
104
|
+
|
|
105
|
+
## C and C++ (Google Benchmark)
|
|
106
|
+
|
|
107
|
+
```cpp
|
|
108
|
+
static void BM_Parse(benchmark::State& state) {
|
|
109
|
+
auto input = LoadFixture();
|
|
110
|
+
for (auto _ : state) benchmark::DoNotOptimize(Parse(input));
|
|
111
|
+
}
|
|
112
|
+
BENCHMARK(BM_Parse);
|
|
113
|
+
BENCHMARK_MAIN();
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
- Build with optimisations (`-O2` or `-DCMAKE_BUILD_TYPE=Release`); the library warns if it was built as debug.
|
|
117
|
+
- `--benchmark_repetitions=10 --benchmark_report_aggregates_only=true` gives mean, median and stddev.
|
|
118
|
+
- `benchmark::ClobberMemory()` forces pending writes to be treated as observable.
|
|
119
|
+
|
|
120
|
+
## Commands and processes (hyperfine)
|
|
121
|
+
|
|
122
|
+
```sh
|
|
123
|
+
# build both versions first (e.g. ./old-bin from main, ./new-bin from the branch)
|
|
124
|
+
hyperfine --warmup 3 --runs 30 --export-json bench.json \
|
|
125
|
+
'./old-bin input.txt' './new-bin input.txt'
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
- `--prepare 'cmd'` runs before each timing run (for example, clearing a cache directory).
|
|
129
|
+
- Never put state-changing commands (`git stash`, `git checkout`) inside a timed command; build each variant once, then time the binaries.
|
|
130
|
+
- hyperfine reports mean, standard deviation, min/max and a relative comparison; it warns about statistical outliers.
|