@mmerterden/multi-agent-pipeline 20.2.1 → 20.3.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/CHANGELOG.md +912 -1
- package/README.md +104 -81
- package/README.tr.md +103 -62
- package/docs/FIGMA_PIPELINE.md +35 -35
- package/docs/adr/0006-skills-core-external-split.md +1 -1
- package/docs/adr/0007-multi-tool-adapter-framework.md +6 -0
- package/docs/adr/0008-installer-modularization-and-secret-leak-defense.md +7 -0
- package/docs/architecture.md +50 -14
- package/docs/best-practices.md +1 -1
- package/docs/ecosystem.md +56 -32
- package/docs/facts.json +10 -10
- package/docs/features.md +97 -5
- package/docs/recovery-guide.md +7 -14
- package/docs/server-readiness.md +31 -24
- package/index.js +1 -1
- package/install/_common.mjs +3 -5
- package/install/_platform-filter.mjs +23 -1
- package/install/_unattended-profile.mjs +321 -75
- package/install/claude.mjs +51 -10
- package/install/codex.mjs +2 -0
- package/install/copilot.mjs +2 -0
- package/install/index.mjs +30 -17
- package/install/templates/claude-hooks.json +16 -5
- package/install/templates/copilot-instructions.md +1 -1
- package/install/templates/multi-agent-autopilot-awake.plist.template +48 -0
- package/install/templates/multi-agent-autopilot.plist.template +12 -5
- package/install/unattended-profile-legacy.json +80 -0
- package/manifest.json +616 -483
- package/package.json +8 -3
- package/pipeline/agents/code-reviewer.md +10 -0
- package/pipeline/agents/plan-critic.md +98 -0
- package/pipeline/agents/security-auditor.md +10 -0
- package/pipeline/agents/task-clarifier.md +10 -0
- package/pipeline/commands/multi-agent/SKILL.md +2 -2
- package/pipeline/commands/multi-agent/analysis/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/analysis-jira/SKILL.md +12 -1
- package/pipeline/commands/multi-agent/analysis-resolve/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/autopilot/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/autopilot-off/SKILL.md +36 -6
- package/pipeline/commands/multi-agent/autopilot-on/SKILL.md +77 -12
- package/pipeline/commands/multi-agent/autopilot-status/SKILL.md +29 -8
- package/pipeline/commands/multi-agent/build-optimize/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/channels/SKILL.md +9 -9
- package/pipeline/commands/multi-agent/complaint-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/create-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/design-check/SKILL.md +16 -11
- package/pipeline/commands/multi-agent/diff-explain/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/doctor/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/feedback/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/forget/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/garbage-collect/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/graph/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/help/SKILL.md +37 -39
- package/pipeline/commands/multi-agent/ios-coding-standard/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/issue/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/jira/SKILL.md +7 -1
- package/pipeline/commands/multi-agent/kill/SKILL.md +9 -3
- package/pipeline/commands/multi-agent/language/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/log/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/manual-test/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/model/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-logs/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/prune-prompts/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/purge/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/refactor/SKILL.md +5 -0
- package/pipeline/commands/multi-agent/research/SKILL.md +49 -0
- package/pipeline/commands/multi-agent/resume/SKILL.md +29 -6
- package/pipeline/commands/multi-agent/review/SKILL.md +28 -9
- package/pipeline/commands/multi-agent/review-analysis/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/review-issue/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/review-jira/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-off/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-on/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/route-status/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/routines/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/save/SKILL.md +6 -2
- package/pipeline/commands/multi-agent/scaffold/SKILL.md +47 -0
- package/pipeline/commands/multi-agent/scan/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/search/SKILL.md +12 -8
- package/pipeline/commands/multi-agent/security-review/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/serve/SKILL.md +62 -0
- package/pipeline/commands/multi-agent/setup/SKILL.md +27 -36
- package/pipeline/commands/multi-agent/stack/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/status/SKILL.md +10 -9
- package/pipeline/commands/multi-agent/steer/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/store-ready/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/sync/SKILL.md +13 -13
- package/pipeline/commands/multi-agent/test/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-accessibility/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dark-mode/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-dynamic-type/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/test-screenshots/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/testflight-validation/SKILL.md +4 -0
- package/pipeline/commands/multi-agent/uninstall/SKILL.md +5 -1
- package/pipeline/commands/multi-agent/update/SKILL.md +4 -0
- package/pipeline/contract/CHANGELOG.md +74 -0
- package/pipeline/contract/README.md +126 -0
- package/pipeline/contract/build.mjs +427 -0
- package/pipeline/contract/fixtures/answer-result.json +11 -0
- package/pipeline/contract/fixtures/error-invalid-request.json +8 -0
- package/pipeline/contract/fixtures/error-unauthorized.json +5 -0
- package/pipeline/contract/fixtures/error-unsigned.json +5 -0
- package/pipeline/contract/fixtures/issues-empty.json +18 -0
- package/pipeline/contract/fixtures/launch-plan.json +31 -0
- package/pipeline/contract/fixtures/runs-awaiting-question.json +70 -0
- package/pipeline/contract/fixtures/runs-empty.json +6 -0
- package/pipeline/contract/fixtures/runs-failed.json +84 -0
- package/pipeline/contract/fixtures/runs-old-schema.json +70 -0
- package/pipeline/contract/fixtures/runs-pr-opened-redacted.json +101 -0
- package/pipeline/contract/fixtures/runs-pr-opened.json +106 -0
- package/pipeline/contract/fixtures/runs-running.json +84 -0
- package/pipeline/contract/fixtures/worktrees-empty.json +4 -0
- package/pipeline/contract/frozen/toolbox.json +107 -0
- package/pipeline/contract/manifest.json +263 -0
- package/pipeline/contract/types/index.d.ts +343 -0
- package/pipeline/lib/_jira-auth.sh +6 -2
- package/pipeline/lib/account-resolver.sh +1 -1
- package/pipeline/lib/autopilot-state.sh +19 -0
- package/pipeline/lib/context-link-extractor.sh +12 -5
- package/pipeline/lib/credential-inventory.sh +12 -5
- package/pipeline/lib/credential-store.sh +116 -185
- package/pipeline/lib/fetch-confluence.sh +44 -3
- package/pipeline/lib/fetch-document.sh +3 -4
- package/pipeline/lib/fetch-fortify.sh +1 -1
- package/pipeline/lib/figma-mcp-refresh.sh +2 -2
- package/pipeline/lib/figma-token.sh +5 -1
- package/pipeline/lib/issue-fetcher.sh +233 -16
- package/pipeline/lib/json-file-lock.mjs +172 -0
- package/pipeline/lib/model-dispatch.sh +21 -12
- package/pipeline/lib/model-rung.sh +6 -1
- package/pipeline/lib/multi-repo-pipeline.sh +1 -1
- package/pipeline/lib/outbound-gate.mjs +46 -16
- package/pipeline/lib/parse-complaints.sh +14 -7
- package/pipeline/lib/plan-todos.sh +3 -3
- package/pipeline/lib/post-pr-review.sh +9 -9
- package/pipeline/lib/pr-request-location.mjs +85 -0
- package/pipeline/lib/regular-file.mjs +153 -0
- package/pipeline/lib/repo-hygiene.sh +17 -0
- package/pipeline/lib/route-state.sh +5 -1
- package/pipeline/lib/run-paths.sh +3 -2
- package/pipeline/lib/stack-detect.sh +19 -1
- package/pipeline/lib/unattended-profile-check.mjs +178 -0
- package/pipeline/lib/unattended-settings-location.mjs +28 -0
- package/pipeline/lib/unattended.mjs +76 -0
- package/pipeline/lib/unattended.sh +32 -0
- package/pipeline/lib/untrusted.mjs +76 -0
- package/pipeline/lib/user-facing.mjs +82 -0
- package/pipeline/lib/user-facing.sh +58 -0
- package/pipeline/multi-agent-refs/_dev-context.md +1 -1
- package/pipeline/multi-agent-refs/analysis/evidence.md +4 -0
- package/pipeline/multi-agent-refs/analysis/locked.md +2 -2
- package/pipeline/multi-agent-refs/analysis/render.md +4 -3
- package/pipeline/multi-agent-refs/analysis/resolve.md +3 -1
- package/pipeline/multi-agent-refs/analysis/synthesis.md +4 -5
- package/pipeline/multi-agent-refs/analysis-template.md +10 -17
- package/pipeline/multi-agent-refs/channels/jira.md +1 -1
- package/pipeline/multi-agent-refs/component-dispatch.md +3 -3
- package/pipeline/multi-agent-refs/conventions-defaults.md +32 -32
- package/pipeline/multi-agent-refs/cross-cli-contract.md +10 -17
- package/pipeline/multi-agent-refs/features/autopilot-circuit-breaker.md +37 -9
- package/pipeline/multi-agent-refs/features/autopilot-operations.md +277 -0
- package/pipeline/multi-agent-refs/features/constitution.md +196 -0
- package/pipeline/multi-agent-refs/features/doctor.md +6 -3
- package/pipeline/multi-agent-refs/features/external-context-injection.md +6 -1
- package/pipeline/multi-agent-refs/features/jira-context.md +1 -1
- package/pipeline/multi-agent-refs/features/maturity-followup.md +43 -23
- package/pipeline/multi-agent-refs/features/model-fallback.md +9 -0
- package/pipeline/multi-agent-refs/features/phone-api.md +306 -0
- package/pipeline/multi-agent-refs/features/plan-critic.md +159 -0
- package/pipeline/multi-agent-refs/features/research.md +150 -0
- package/pipeline/multi-agent-refs/features/review-decision.md +185 -0
- package/pipeline/multi-agent-refs/features/scaffold.md +160 -0
- package/pipeline/multi-agent-refs/features/security-audit.md +6 -2
- package/pipeline/multi-agent-refs/features/skill-conformance.md +4 -1
- package/pipeline/multi-agent-refs/features/stack-adapters.md +116 -0
- package/pipeline/multi-agent-refs/features/unattended-gates.md +316 -0
- package/pipeline/multi-agent-refs/features/unattended-security.md +731 -0
- package/pipeline/multi-agent-refs/features/url-enrichment.md +2 -2
- package/pipeline/multi-agent-refs/features/usage-reporting.md +127 -35
- package/pipeline/multi-agent-refs/features/verify-by-test.md +1 -1
- package/pipeline/multi-agent-refs/features/visual-evidence.md +7 -7
- package/pipeline/multi-agent-refs/keychain.md +6 -11
- package/pipeline/multi-agent-refs/payload-contracts.md +2 -2
- package/pipeline/multi-agent-refs/phases/log-format.md +2 -3
- package/pipeline/multi-agent-refs/phases/modes.md +10 -12
- package/pipeline/multi-agent-refs/phases/operations.md +11 -5
- package/pipeline/multi-agent-refs/phases/phase-0-init.md +73 -81
- package/pipeline/multi-agent-refs/phases/phase-1-plan.md +22 -22
- package/pipeline/multi-agent-refs/phases/phase-2-dev.md +42 -66
- package/pipeline/multi-agent-refs/phases/phase-3-review.md +45 -79
- package/pipeline/multi-agent-refs/phases/phase-4-commit.md +28 -38
- package/pipeline/multi-agent-refs/phases/phase-5-report.md +27 -25
- package/pipeline/multi-agent-refs/phases.md +1 -1
- package/pipeline/multi-agent-refs/picker-contract.md +1 -1
- package/pipeline/multi-agent-refs/progress-contract.md +13 -16
- package/pipeline/multi-agent-refs/readiness-review.md +1 -1
- package/pipeline/multi-agent-refs/research/engine.md +91 -0
- package/pipeline/multi-agent-refs/rules.md +6 -4
- package/pipeline/multi-agent-refs/setup/repo-discovery.md +2 -2
- package/pipeline/multi-agent-refs/tracker-contract.md +2 -2
- package/pipeline/multi-agent-refs/unattended-contract.md +68 -16
- package/pipeline/rules/figma-pipeline.md +12 -12
- package/pipeline/schemas/agent-state.schema.json +480 -18
- package/pipeline/schemas/analysis-spec.schema.json +4 -4
- package/pipeline/schemas/answer-request.schema.json +24 -0
- package/pipeline/schemas/answer-result.schema.json +28 -0
- package/pipeline/schemas/autopilot-config.schema.json +111 -13
- package/pipeline/schemas/command-parameters.schema.json +99 -0
- package/pipeline/schemas/constitution.schema.json +56 -0
- package/pipeline/schemas/contract-error.schema.json +52 -0
- package/pipeline/schemas/design-check-config.schema.json +5 -1
- package/pipeline/schemas/issues.schema.json +61 -0
- package/pipeline/schemas/launch-plan.schema.json +46 -0
- package/pipeline/schemas/launch-request.schema.json +45 -0
- package/pipeline/schemas/launch.json +61 -0
- package/pipeline/schemas/launch.schema.json +84 -0
- package/pipeline/schemas/phases.json +2 -2
- package/pipeline/schemas/phases.schema.json +68 -0
- package/pipeline/schemas/phone-devices.schema.json +61 -0
- package/pipeline/schemas/phone-signed-request.schema.json +67 -0
- package/pipeline/schemas/plan-critique.schema.json +99 -0
- package/pipeline/schemas/plan-todos.schema.json +7 -7
- package/pipeline/schemas/planning-output.schema.json +5 -0
- package/pipeline/schemas/pr-request.schema.json +46 -0
- package/pipeline/schemas/prefs.schema.json +79 -8
- package/pipeline/schemas/research-output.schema.json +118 -0
- package/pipeline/schemas/review-file-exclusions.schema.json +25 -0
- package/pipeline/schemas/reviewer-output.schema.json +40 -4
- package/pipeline/schemas/run-questions.json +392 -0
- package/pipeline/schemas/run-questions.schema.json +118 -0
- package/pipeline/schemas/runs-index.schema.json +189 -0
- package/pipeline/schemas/scaffold-manifest.schema.json +43 -0
- package/pipeline/schemas/secret-patterns.schema.json +28 -0
- package/pipeline/schemas/stack-adapters.json +527 -0
- package/pipeline/schemas/stack-adapters.schema.json +184 -0
- package/pipeline/schemas/token-budget.json +1 -1
- package/pipeline/schemas/token-budget.schema.json +26 -0
- package/pipeline/schemas/triage-output.schema.json +64 -3
- package/pipeline/schemas/unattended-policy.json +139 -0
- package/pipeline/schemas/unattended-policy.schema.json +73 -0
- package/pipeline/schemas/unattended-profile.json +248 -0
- package/pipeline/schemas/unattended-profile.schema.json +198 -0
- package/pipeline/schemas/worktrees.schema.json +51 -0
- package/pipeline/scripts/README.md +1 -0
- package/pipeline/scripts/_autopilot-config.mjs +130 -0
- package/pipeline/scripts/_autopilot-ops.mjs +567 -0
- package/pipeline/scripts/_autopilot-outcomes.mjs +174 -0
- package/pipeline/scripts/_command-contract.mjs +384 -0
- package/pipeline/scripts/_cost.mjs +40 -0
- package/pipeline/scripts/_notices.mjs +160 -0
- package/pipeline/scripts/_phone-auth.mjs +485 -0
- package/pipeline/scripts/_pre-existing.mjs +294 -0
- package/pipeline/scripts/_redact.mjs +77 -0
- package/pipeline/scripts/_run-paths.mjs +4 -2
- package/pipeline/scripts/_stack-adapter.mjs +678 -0
- package/pipeline/scripts/_stack-routing.mjs +1 -1
- package/pipeline/scripts/agent-guard.py +348 -37
- package/pipeline/scripts/agent-guard.sh +41 -13
- package/pipeline/scripts/analysis-story-tree.mjs +79 -3
- package/pipeline/scripts/answer-question.mjs +181 -0
- package/pipeline/scripts/audit-log-rotate.sh +1 -4
- package/pipeline/scripts/audit-log.sh +4 -4
- package/pipeline/scripts/autopilot-arming.mjs +389 -21
- package/pipeline/scripts/autopilot-awake.mjs +255 -0
- package/pipeline/scripts/autopilot-intake.mjs +137 -36
- package/pipeline/scripts/autopilot-menubar.swift +156 -44
- package/pipeline/scripts/autopilot-publish.mjs +1625 -0
- package/pipeline/scripts/autopilot-runner.mjs +1678 -222
- package/pipeline/scripts/autopilot-status.sh +198 -33
- package/pipeline/scripts/build-lock.sh +120 -0
- package/pipeline/scripts/build-references.mjs +4 -1
- package/pipeline/scripts/build-stack-plugins.mjs +59 -22
- package/pipeline/scripts/capture-flush.sh +1 -1
- package/pipeline/scripts/capture-resume.sh +13 -9
- package/pipeline/scripts/check-derived-drift.mjs +52 -11
- package/pipeline/scripts/commands.mjs +88 -0
- package/pipeline/scripts/constitution.mjs +362 -0
- package/pipeline/scripts/contract-server.mjs +776 -0
- package/pipeline/scripts/cost-analyze.mjs +89 -39
- package/pipeline/scripts/diff-explain.mjs +12 -1
- package/pipeline/scripts/doctor.mjs +77 -28
- package/pipeline/scripts/evidence-gate.mjs +192 -12
- package/pipeline/scripts/feedback-send.mjs +4 -2
- package/pipeline/scripts/gate-ledger.mjs +449 -0
- package/pipeline/scripts/gc-abandoned.sh +132 -13
- package/pipeline/scripts/gen-facts.mjs +31 -15
- package/pipeline/scripts/gen-mode-dispatch.mjs +3 -3
- package/pipeline/scripts/github-ssh-setup.sh +140 -29
- package/pipeline/scripts/graph-mermaid.mjs +4 -1
- package/pipeline/scripts/issues.mjs +236 -0
- package/pipeline/scripts/jira-attach.sh +6 -2
- package/pipeline/scripts/jira-search.sh +4 -3
- package/pipeline/scripts/keychain-save.sh +125 -24
- package/pipeline/scripts/keychain.py +63 -93
- package/pipeline/scripts/launch-request.mjs +747 -0
- package/pipeline/scripts/localize-commands.mjs +4 -10
- package/pipeline/scripts/log-metric.sh +6 -5
- package/pipeline/scripts/maturity-followup.mjs +13 -4
- package/pipeline/scripts/memory-save.sh +25 -0
- package/pipeline/scripts/migrate-prefs.mjs +4 -3
- package/pipeline/scripts/open-questions-gate.mjs +276 -0
- package/pipeline/scripts/phase-tracker.sh +41 -27
- package/pipeline/scripts/phase0-exit-gate.mjs +22 -4
- package/pipeline/scripts/phone-devices.mjs +224 -0
- package/pipeline/scripts/plan-coverage-gate.mjs +200 -66
- package/pipeline/scripts/plan-critique-gate.mjs +591 -0
- package/pipeline/scripts/pr-request.mjs +188 -0
- package/pipeline/scripts/pre-commit-check.sh +115 -4
- package/pipeline/scripts/probe-evidence-capability.sh +44 -5
- package/pipeline/scripts/record-phase.mjs +71 -0
- package/pipeline/scripts/render-agent-log-cost.sh +17 -2
- package/pipeline/scripts/render-cost-summary.sh +1 -1
- package/pipeline/scripts/render-work-summary.sh +1 -1
- package/pipeline/scripts/require-supported-version.sh +4 -1
- package/pipeline/scripts/research-gate.mjs +704 -0
- package/pipeline/scripts/review-decision-gate.mjs +403 -0
- package/pipeline/scripts/routine-registry.mjs +5 -2
- package/pipeline/scripts/runs-index.mjs +135 -27
- package/pipeline/scripts/scaffold-gate.mjs +393 -0
- package/pipeline/scripts/skill-conformance.mjs +25 -8
- package/pipeline/scripts/skill-siblings.mjs +2 -1
- package/pipeline/scripts/smoke-cross-cli-behavior.sh +32 -6
- package/pipeline/scripts/smoke-schema-validation.sh +6 -2
- package/pipeline/scripts/spec-consistency-gate.mjs +469 -0
- package/pipeline/scripts/symbol-existence-gate.mjs +450 -0
- package/pipeline/scripts/test-gap-scan.mjs +40 -2
- package/pipeline/scripts/test-integrity-gate.mjs +20 -4
- package/pipeline/scripts/test-strength.mjs +484 -0
- package/pipeline/scripts/test-summary.mjs +651 -0
- package/pipeline/scripts/triage-memory.mjs +49 -9
- package/pipeline/scripts/unattended_policy.py +2786 -0
- package/pipeline/scripts/uninstall.mjs +10 -10
- package/pipeline/scripts/update-issue-progress.sh +1 -1
- package/pipeline/scripts/usage-identity.mjs +288 -0
- package/pipeline/scripts/usage-register.mjs +185 -65
- package/pipeline/scripts/usage-report.mjs +230 -66
- package/pipeline/scripts/validate-complaint-doc.mjs +28 -10
- package/pipeline/scripts/validate-planning.mjs +6 -0
- package/pipeline/scripts/verify-citations.mjs +151 -38
- package/pipeline/scripts/verify.mjs +58 -18
- package/pipeline/scripts/worktree-prepare.sh +126 -0
- package/pipeline/scripts/worktrees.mjs +124 -0
- package/pipeline/scripts/write-state.mjs +48 -17
- package/pipeline/skills/.skill-manifest.json +222 -226
- package/pipeline/skills/.skills-index.json +77 -88
- package/pipeline/skills/shared/README.md +44 -45
- package/pipeline/skills/shared/core/apple-archive-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/google-play-compliance/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent/SKILL.md +10 -9
- package/pipeline/skills/shared/core/multi-agent-analysis/SKILL.md +6 -5
- package/pipeline/skills/shared/core/multi-agent-analysis-jira/SKILL.md +11 -3
- package/pipeline/skills/shared/core/multi-agent-analysis-resolve/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-autopilot/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-autopilot-off/SKILL.md +32 -6
- package/pipeline/skills/shared/core/multi-agent-autopilot-on/SKILL.md +66 -8
- package/pipeline/skills/shared/core/multi-agent-autopilot-status/SKILL.md +27 -9
- package/pipeline/skills/shared/core/multi-agent-build-optimize/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-channels/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-complaint-analysis/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-create-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-design-check/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-diff-explain/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-doctor/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-feedback/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-forget/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-garbage-collect/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-graph/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-help/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-kill/SKILL.md +7 -4
- package/pipeline/skills/shared/core/multi-agent-language/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-log/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-manual-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-model/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-logs/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-prune-prompts/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-purge/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-refactor/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-research/SKILL.md +35 -0
- package/pipeline/skills/shared/core/multi-agent-resume/SKILL.md +7 -3
- package/pipeline/skills/shared/core/multi-agent-review/SKILL.md +7 -5
- package/pipeline/skills/shared/core/multi-agent-review-analysis/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-review-issue/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-review-jira/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-off/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-on/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-route-status/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-routines/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-save/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-scaffold/SKILL.md +30 -0
- package/pipeline/skills/shared/core/multi-agent-scan/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-search/SKILL.md +4 -3
- package/pipeline/skills/shared/core/multi-agent-security-review/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-serve/SKILL.md +60 -0
- package/pipeline/skills/shared/core/multi-agent-setup/SKILL.md +8 -8
- package/pipeline/skills/shared/core/multi-agent-stack/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-status/SKILL.md +7 -8
- package/pipeline/skills/shared/core/multi-agent-steer/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-store-ready/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-sync/SKILL.md +10 -10
- package/pipeline/skills/shared/core/multi-agent-test/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-accessibility/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dark-mode/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-dynamic-type/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-test-screenshots/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-testflight-validation/SKILL.md +2 -1
- package/pipeline/skills/shared/core/multi-agent-uninstall/SKILL.md +3 -2
- package/pipeline/skills/shared/core/multi-agent-update/SKILL.md +2 -1
- package/pipeline/skills/shared/external/NOTICE-avdlee-swiftui-agent-skill.md +46 -0
- package/pipeline/skills/shared/external/NOTICE-dimillian-skills.md +9 -3
- package/pipeline/skills/shared/external/NOTICE-paul-hudson-skills.md +54 -0
- package/pipeline/skills/shared/external/NOTICE-swift-ios-skills.md +9 -11
- package/pipeline/skills/shared/external/NOTICE-vibeship-spawner-skills.md +203 -0
- package/pipeline/skills/shared/external/NOTICE-xcode-build-skills.md +10 -3
- package/pipeline/skills/shared/external/accessibility-compliance-accessibility-audit/SKILL.md +131 -25
- package/pipeline/skills/shared/external/agent-introspection-debugging/SKILL.md +4 -3
- package/pipeline/skills/shared/external/alarmkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/android-architecture/SKILL.md +85 -76
- package/pipeline/skills/shared/external/android-build-quality-gates/SKILL.md +51 -3
- package/pipeline/skills/shared/external/android-build-quality-gates/references/patterns.md +9 -0
- package/pipeline/skills/shared/external/android-datastore/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-design-tokens-codegen/SKILL.md +4 -3
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/SKILL.md +106 -181
- package/pipeline/skills/shared/external/android-jetpack-compose-expert/references/patterns.md +147 -0
- package/pipeline/skills/shared/external/android-mvi-viewmodel/SKILL.md +45 -4
- package/pipeline/skills/shared/external/android-performance/SKILL.md +27 -2
- package/pipeline/skills/shared/external/android-performance/references/patterns.md +37 -37
- package/pipeline/skills/shared/external/api-patterns/SKILL.md +111 -67
- package/pipeline/skills/shared/external/api-patterns/references/contract-details.md +128 -0
- package/pipeline/skills/shared/external/api-security-best-practices/SKILL.md +136 -186
- package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md +140 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/identity-and-access.md +207 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/operations.md +66 -0
- package/pipeline/skills/shared/external/api-security-best-practices/references/request-handling.md +175 -0
- package/pipeline/skills/shared/external/app-clips/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-intents/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-changelog/SKILL.md +4 -3
- package/pipeline/skills/shared/external/app-store-optimization/SKILL.md +2 -0
- package/pipeline/skills/shared/external/app-store-review/SKILL.md +2 -0
- package/pipeline/skills/shared/external/apple-on-device-ai/SKILL.md +2 -0
- package/pipeline/skills/shared/external/architecture/SKILL.md +106 -39
- package/pipeline/skills/shared/external/architecture/references/adr-and-review.md +76 -0
- package/pipeline/skills/shared/external/authentication/SKILL.md +2 -0
- package/pipeline/skills/shared/external/avkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/background-processing/SKILL.md +2 -1
- package/pipeline/skills/shared/external/backlog/SKILL.md +3 -2
- package/pipeline/skills/shared/external/callkit-voip/SKILL.md +2 -0
- package/pipeline/skills/shared/external/callkit-voip/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/ci-cd-pipelines/SKILL.md +3 -2
- package/pipeline/skills/shared/external/clean-code/SKILL.md +192 -90
- package/pipeline/skills/shared/external/cloudkit-sync/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cloudkit-sync/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/compose-components/SKILL.md +4 -4
- package/pipeline/skills/shared/external/compose-navigation/SKILL.md +22 -22
- package/pipeline/skills/shared/external/compose-navigation/references/patterns.md +10 -10
- package/pipeline/skills/shared/external/compose-testing/SKILL.md +13 -6
- package/pipeline/skills/shared/external/compose-testing/references/patterns.md +59 -59
- package/pipeline/skills/shared/external/contacts-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/context-compression/SKILL.md +118 -250
- package/pipeline/skills/shared/external/core-bluetooth/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-data/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-motion/SKILL.md +2 -0
- package/pipeline/skills/shared/external/core-nfc/SKILL.md +2 -0
- package/pipeline/skills/shared/external/coreml/SKILL.md +2 -1
- package/pipeline/skills/shared/external/council/SKILL.md +2 -1
- package/pipeline/skills/shared/external/cryptokit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/css-modern/SKILL.md +3 -2
- package/pipeline/skills/shared/external/database-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/debugging-instruments/SKILL.md +2 -0
- package/pipeline/skills/shared/external/debugging-strategies/SKILL.md +130 -20
- package/pipeline/skills/shared/external/debugging-strategies/references/hard-cases.md +54 -0
- package/pipeline/skills/shared/external/device-integrity/SKILL.md +2 -0
- package/pipeline/skills/shared/external/docker-expert/SKILL.md +137 -381
- package/pipeline/skills/shared/external/docker-expert/references/patterns.md +98 -0
- package/pipeline/skills/shared/external/energykit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/eventkit-calendar/SKILL.md +3 -1
- package/pipeline/skills/shared/external/eventkit-calendar/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/fastapi-pro/SKILL.md +116 -185
- package/pipeline/skills/shared/external/fastapi-pro/references/app-structure.md +235 -0
- package/pipeline/skills/shared/external/fastapi-pro/references/testing-and-deployment.md +69 -0
- package/pipeline/skills/shared/external/firebase/SKILL.md +4 -3
- package/pipeline/skills/shared/external/github-actions-templates/SKILL.md +151 -293
- package/pipeline/skills/shared/external/github-actions-templates/references/patterns.md +96 -0
- package/pipeline/skills/shared/external/healthkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/hig-components-content/SKILL.md +69 -72
- package/pipeline/skills/shared/external/hig-components-content/references/content-views.md +111 -0
- package/pipeline/skills/shared/external/hig-components-layout/SKILL.md +77 -86
- package/pipeline/skills/shared/external/hig-components-layout/references/containers.md +98 -0
- package/pipeline/skills/shared/external/hig-components-status/SKILL.md +150 -78
- package/pipeline/skills/shared/external/hig-components-system/SKILL.md +76 -97
- package/pipeline/skills/shared/external/hig-components-system/references/surfaces.md +98 -0
- package/pipeline/skills/shared/external/hig-foundations/SKILL.md +48 -76
- package/pipeline/skills/shared/external/hig-foundations/references/foundations-detail.md +132 -0
- package/pipeline/skills/shared/external/hig-inputs/SKILL.md +147 -106
- package/pipeline/skills/shared/external/hig-patterns/SKILL.md +61 -77
- package/pipeline/skills/shared/external/hig-patterns/references/patterns.md +92 -0
- package/pipeline/skills/shared/external/hig-platforms/SKILL.md +147 -77
- package/pipeline/skills/shared/external/hig-technologies/SKILL.md +61 -121
- package/pipeline/skills/shared/external/hig-technologies/references/technologies.md +108 -0
- package/pipeline/skills/shared/external/homekit-matter/SKILL.md +2 -0
- package/pipeline/skills/shared/external/homekit-matter/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/html-semantic/SKILL.md +3 -2
- package/pipeline/skills/shared/external/humanizer/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-accessibility/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-coding-standard/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-coding-standard/references/STANDARD.md +14 -2
- package/pipeline/skills/shared/external/ios-coding-standard/references/rules.yml +2 -2
- package/pipeline/skills/shared/external/ios-debugger-agent/SKILL.md +4 -3
- package/pipeline/skills/shared/external/ios-localization/SKILL.md +8 -6
- package/pipeline/skills/shared/external/ios-localization/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/ios-localization/references/string-catalogs.md +11 -11
- package/pipeline/skills/shared/external/ios-module-structure/SKILL.md +2 -1
- package/pipeline/skills/shared/external/ios-networking/SKILL.md +2 -0
- package/pipeline/skills/shared/external/ios-simulator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/SKILL.md +102 -193
- package/pipeline/skills/shared/external/kotlin-coroutines-expert/references/patterns.md +103 -0
- package/pipeline/skills/shared/external/live-activities/SKILL.md +4 -2
- package/pipeline/skills/shared/external/live-activities/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/localization-reuse-map/SKILL.md +7 -9
- package/pipeline/skills/shared/external/localization-reuse-map/reference/sources-and-recipes.md +3 -3
- package/pipeline/skills/shared/external/localization-reuse-map/scripts/resolve-new-values.py +2 -2
- package/pipeline/skills/shared/external/macos-menubar-tuist-app/SKILL.md +4 -3
- package/pipeline/skills/shared/external/macos-spm-app-packaging/SKILL.md +5 -3
- package/pipeline/skills/shared/external/mapkit-location/SKILL.md +2 -0
- package/pipeline/skills/shared/external/mapkit-location/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/metrickit-diagnostics/SKILL.md +2 -0
- package/pipeline/skills/shared/external/metrickit-diagnostics/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/monorepo-architect/SKILL.md +149 -46
- package/pipeline/skills/shared/external/monorepo-architect/references/patterns.md +70 -0
- package/pipeline/skills/shared/external/musickit-audio/SKILL.md +2 -0
- package/pipeline/skills/shared/external/musickit-audio/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/natural-language/SKILL.md +2 -0
- package/pipeline/skills/shared/external/nextjs-app-router/SKILL.md +3 -2
- package/pipeline/skills/shared/external/nodejs-backend-patterns/SKILL.md +91 -21
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/runtime-patterns.md +247 -0
- package/pipeline/skills/shared/external/nodejs-backend-patterns/references/testing-and-frameworks.md +57 -0
- package/pipeline/skills/shared/external/observability-engineer/SKILL.md +155 -232
- package/pipeline/skills/shared/external/observability-engineer/references/patterns.md +75 -0
- package/pipeline/skills/shared/external/passkit-wallet/SKILL.md +2 -0
- package/pipeline/skills/shared/external/passkit-wallet/evals/evals.json +2 -2
- package/pipeline/skills/shared/external/passkit-wallet/references/wallet-passes.md +18 -18
- package/pipeline/skills/shared/external/pdfkit/SKILL.md +2 -1
- package/pipeline/skills/shared/external/pencilkit-drawing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/pencilkit-drawing/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/permissionkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/photos-camera-media/SKILL.md +2 -1
- package/pipeline/skills/shared/external/push-notifications/SKILL.md +2 -0
- package/pipeline/skills/shared/external/python-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/react-best-practices/SKILL.md +3 -2
- package/pipeline/skills/shared/external/realitykit-ar/SKILL.md +2 -2
- package/pipeline/skills/shared/external/realitykit-ar/evals/evals.json +1 -1
- package/pipeline/skills/shared/external/rest-api-design/SKILL.md +3 -2
- package/pipeline/skills/shared/external/retrofit-networking/SKILL.md +7 -7
- package/pipeline/skills/shared/external/retrofit-networking/references/patterns.md +69 -69
- package/pipeline/skills/shared/external/room-database/references/patterns.md +126 -126
- package/pipeline/skills/shared/external/search-first/SKILL.md +2 -1
- package/pipeline/skills/shared/external/security-review/SKILL.md +4 -3
- package/pipeline/skills/shared/external/shareplay-activities/SKILL.md +2 -2
- package/pipeline/skills/shared/external/signal-community/SKILL.md +1 -1
- package/pipeline/skills/shared/external/skill-creator/SKILL.md +2 -1
- package/pipeline/skills/shared/external/speech-recognition/SKILL.md +2 -1
- package/pipeline/skills/shared/external/spm-build-analysis/SKILL.md +2 -0
- package/pipeline/skills/shared/external/storekit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-api-design-guidelines/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-architecture/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-charts/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-codable/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-concurrency/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-concurrency-expert/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swift-concurrency-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-formatstyle/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-language/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swift-security/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swift-testing-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swift-testing-pro/references/new-features.md +10 -0
- package/pipeline/skills/shared/external/swiftdata/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftdata-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftlint/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-animation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-expert-skill/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-gestures/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-layout-components/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-liquid-glass/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-navigation/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-patterns/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance/SKILL.md +3 -1
- package/pipeline/skills/shared/external/swiftui-performance-audit/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-pro/SKILL.md +2 -1
- package/pipeline/skills/shared/external/swiftui-ui-patterns/SKILL.md +5 -4
- package/pipeline/skills/shared/external/swiftui-uikit-interop/SKILL.md +2 -0
- package/pipeline/skills/shared/external/swiftui-view-refactor/SKILL.md +4 -3
- package/pipeline/skills/shared/external/swiftui-webkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/tailwind-css/SKILL.md +3 -2
- package/pipeline/skills/shared/external/testing-backend/SKILL.md +3 -2
- package/pipeline/skills/shared/external/tipkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/typescript-patterns/SKILL.md +3 -2
- package/pipeline/skills/shared/external/vision-framework/SKILL.md +2 -0
- package/pipeline/skills/shared/external/vue-composition/SKILL.md +3 -2
- package/pipeline/skills/shared/external/weatherkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/web-accessibility/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-performance/SKILL.md +3 -2
- package/pipeline/skills/shared/external/web-testing/SKILL.md +3 -2
- package/pipeline/skills/shared/external/widgetkit/SKILL.md +2 -0
- package/pipeline/skills/shared/external/widgetkit/references/widgetkit-advanced.md +1 -1
- package/pipeline/skills/shared/external/xcode-build-benchmark/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-fixer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-build-orchestrator/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-compilation-analyzer/SKILL.md +2 -0
- package/pipeline/skills/shared/external/xcode-project-analyzer/SKILL.md +2 -0
- package/pipeline/skills/skills-index.md +40 -41
- package/docs/token-budget-history.md +0 -24
- package/pipeline/skills/shared/external/agentflow/SKILL.md +0 -199
- package/pipeline/skills/shared/external/android-ui-verification/SKILL.md +0 -66
- package/pipeline/skills/shared/external/api-security-best-practices/references/auth.md +0 -299
- package/pipeline/skills/shared/external/api-security-best-practices/references/input-validation.md +0 -255
- package/pipeline/skills/shared/external/api-security-best-practices/references/rate-limiting.md +0 -167
- package/pipeline/skills/shared/external/closed-loop-delivery/SKILL.md +0 -116
- package/pipeline/skills/shared/external/ios-developer/SKILL.md +0 -216
|
@@ -1,212 +1,162 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: api-security-best-practices
|
|
3
|
-
description: "
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
description: "API security against the OWASP API Top 10: object-level authorization, token handling, input validation, rate limits, secrets. Use when building, reviewing or hardening an HTTP API or its auth layer."
|
|
4
|
+
metadata:
|
|
5
|
+
risk: safe
|
|
6
|
+
source: multi-agent-pipeline
|
|
7
|
+
date_added: "2026-09-25"
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
# API Security Best Practices
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
Most API breaches are not clever. A caller changes an id in the URL and reads
|
|
13
|
+
someone else's order; a client sends `"role": "admin"` in a profile update and
|
|
14
|
+
the server saves it; an endpoint returns the whole database row and the app
|
|
15
|
+
hides the sensitive columns in the UI. The controls below close those holes.
|
|
16
|
+
They are organised around the OWASP API Security Top 10 (2023) because that
|
|
17
|
+
list reflects how APIs are actually attacked.
|
|
12
18
|
|
|
13
|
-
|
|
19
|
+
This skill is for building and reviewing controls. For a structured audit of a
|
|
20
|
+
whole diff or repository with CVSS-scored findings, use `security-review`.
|
|
14
21
|
|
|
15
|
-
##
|
|
22
|
+
## Reference files
|
|
16
23
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
|
|
23
|
-
- Use when implementing rate limiting and throttling
|
|
24
|
-
- Use when handling sensitive data in APIs
|
|
24
|
+
| File | Load it when |
|
|
25
|
+
|---|---|
|
|
26
|
+
| `references/identity-and-access.md` | Validating tokens, sessions, API keys, service identity, writing authorization checks |
|
|
27
|
+
| `references/request-handling.md` | Validating input, shaping responses, preventing injection, SSRF and mass assignment |
|
|
28
|
+
| `references/abuse-controls.md` | Rate limits, quotas, payload limits, bot and enumeration defence |
|
|
29
|
+
| `references/operations.md` | Secrets, TLS and headers, security logging, testing the controls |
|
|
25
30
|
|
|
26
|
-
##
|
|
31
|
+
## The ten risks as questions
|
|
27
32
|
|
|
28
|
-
|
|
33
|
+
Ask each question of every endpoint you add or review. A "no" or "not sure" is
|
|
34
|
+
a finding.
|
|
29
35
|
|
|
30
|
-
|
|
31
|
-
- `references/input-validation.md` - parameterized queries, ORM escaping, Zod schema validation, XSS output sanitization, and the weak-password and verbose-error pitfalls. Load when handling any user input, query, or file upload.
|
|
32
|
-
- `references/rate-limiting.md` - fixed-window and per-tier rate limiters, Helmet security headers, and rate-limit response headers. Load when protecting endpoints from abuse, brute force, or DDoS.
|
|
36
|
+
### API1 Broken object level authorization (BOLA)
|
|
33
37
|
|
|
34
|
-
|
|
38
|
+
*Does the handler prove this caller may touch this specific object?*
|
|
35
39
|
|
|
36
|
-
|
|
40
|
+
Authentication says who the caller is; it says nothing about whether order
|
|
41
|
+
`o_4411` belongs to them. Scope every lookup by the principal, in the query
|
|
42
|
+
itself, not in a check after the fetch.
|
|
37
43
|
|
|
38
|
-
-
|
|
39
|
-
- Implement token-based authentication
|
|
40
|
-
- Set up role-based access control (RBAC)
|
|
41
|
-
- Secure session management
|
|
42
|
-
- Implement multi-factor authentication (MFA)
|
|
44
|
+
Query: `references/identity-and-access.md`.
|
|
43
45
|
|
|
44
|
-
|
|
46
|
+
Return 404, not 403, for rows the caller cannot see, so ids cannot be
|
|
47
|
+
probed. Opaque random ids (UUIDv7, ULID) help but are not a control on their own.
|
|
45
48
|
|
|
46
|
-
###
|
|
49
|
+
### API2 Broken authentication
|
|
47
50
|
|
|
48
|
-
|
|
49
|
-
- Sanitize user inputs
|
|
50
|
-
- Use parameterized queries
|
|
51
|
-
- Implement request schema validation
|
|
52
|
-
- Prevent SQL injection, XSS, and command injection
|
|
51
|
+
*Is every credential verified the same strict way on every route?*
|
|
53
52
|
|
|
54
|
-
|
|
53
|
+
- Verify JWT signature, `alg` against an allowlist, `iss`, `aud`, `exp` and
|
|
54
|
+
`nbf`. Never accept `alg: none` or let the token choose the key.
|
|
55
|
+
- Short-lived access tokens (5 to 15 minutes); rotate refresh tokens and detect
|
|
56
|
+
reuse.
|
|
57
|
+
- Rate limit and lock out credential endpoints (login, OTP, password reset).
|
|
58
|
+
- Prefer a maintained identity provider or library over hand-rolled crypto.
|
|
55
59
|
|
|
56
|
-
###
|
|
60
|
+
### API3 Broken object property level authorization
|
|
57
61
|
|
|
58
|
-
|
|
59
|
-
- Set up API throttling
|
|
60
|
-
- Configure request quotas
|
|
61
|
-
- Handle rate limit errors gracefully
|
|
62
|
-
- Monitor for suspicious activity
|
|
62
|
+
*Can the caller read or write a field they should not?*
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
This merges the old "excessive data exposure" and "mass assignment" risks.
|
|
65
65
|
|
|
66
|
-
|
|
66
|
+
- Response: serialise through an explicit output schema per audience; never
|
|
67
|
+
return the ORM entity.
|
|
68
|
+
- Request: bind to an input schema that lists writable fields; reject or drop
|
|
69
|
+
everything else. `isAdmin`, `accountId`, `priceOverride` are never
|
|
70
|
+
client-writable.
|
|
67
71
|
|
|
68
|
-
|
|
69
|
-
- Encrypt sensitive data at rest
|
|
70
|
-
- Implement proper error handling (no data leaks)
|
|
71
|
-
- Sanitize error messages
|
|
72
|
-
- Use secure headers (see Helmet setup in `references/rate-limiting.md`)
|
|
73
|
-
|
|
74
|
-
### Step 5: API Security Testing
|
|
75
|
-
|
|
76
|
-
- Test authentication and authorization
|
|
77
|
-
- Perform penetration testing
|
|
78
|
-
- Check for common vulnerabilities (OWASP API Top 10)
|
|
79
|
-
- Validate input handling
|
|
80
|
-
- Test rate limiting
|
|
81
|
-
|
|
82
|
-
## Illustrative Snippets
|
|
83
|
-
|
|
84
|
-
Verify a bearer token before the handler runs; full middleware in `references/auth.md`:
|
|
85
|
-
|
|
86
|
-
```javascript
|
|
87
|
-
const authHeader = req.headers['authorization'];
|
|
88
|
-
const token = authHeader && authHeader.split(' ')[1]; // Bearer TOKEN
|
|
89
|
-
if (!token) return res.status(401).json({ error: 'Access token required' });
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
Never build SQL from user input; parameterize instead (full patterns in `references/input-validation.md`):
|
|
93
|
-
|
|
94
|
-
```javascript
|
|
95
|
-
// Bad: `SELECT * FROM users WHERE id = '${userId}'`
|
|
96
|
-
// Good:
|
|
97
|
-
await db.query('SELECT id, email, name FROM users WHERE id = $1', [userId]);
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
## Best Practices
|
|
101
|
-
|
|
102
|
-
### Do This
|
|
103
|
-
|
|
104
|
-
- **Use HTTPS Everywhere** - Never send sensitive data over HTTP
|
|
105
|
-
- **Implement Authentication** - Require authentication for protected endpoints
|
|
106
|
-
- **Validate All Inputs** - Never trust user input
|
|
107
|
-
- **Use Parameterized Queries** - Prevent SQL injection
|
|
108
|
-
- **Implement Rate Limiting** - Protect against brute force and DDoS
|
|
109
|
-
- **Hash Passwords** - Use bcrypt with salt rounds >= 10
|
|
110
|
-
- **Use Short-Lived Tokens** - JWT access tokens should expire quickly
|
|
111
|
-
- **Implement CORS Properly** - Only allow trusted origins
|
|
112
|
-
- **Log Security Events** - Monitor for suspicious activity
|
|
113
|
-
- **Keep Dependencies Updated** - Regularly update packages
|
|
114
|
-
- **Use Security Headers** - Implement Helmet.js
|
|
115
|
-
- **Sanitize Error Messages** - Don't leak sensitive information
|
|
116
|
-
|
|
117
|
-
### Don't Do This
|
|
118
|
-
|
|
119
|
-
- **Don't Store Passwords in Plain Text** - Always hash passwords
|
|
120
|
-
- **Don't Use Weak Secrets** - Use strong, random JWT secrets
|
|
121
|
-
- **Don't Trust User Input** - Always validate and sanitize
|
|
122
|
-
- **Don't Expose Stack Traces** - Hide error details in production
|
|
123
|
-
- **Don't Use String Concatenation for SQL** - Use parameterized queries
|
|
124
|
-
- **Don't Store Sensitive Data in JWT** - JWTs are not encrypted
|
|
125
|
-
- **Don't Ignore Security Updates** - Update dependencies regularly
|
|
126
|
-
- **Don't Use Default Credentials** - Change all default passwords
|
|
127
|
-
- **Don't Disable CORS Completely** - Configure it properly instead
|
|
128
|
-
- **Don't Log Sensitive Data** - Sanitize logs
|
|
129
|
-
|
|
130
|
-
## Common Pitfalls
|
|
131
|
-
|
|
132
|
-
Each pitfall's symptom-to-fix code lives in the reference file for its axis.
|
|
133
|
-
|
|
134
|
-
- **JWT secret exposed in code** - hardcoded or committed secret; load from env and fail fast if missing. See `references/auth.md`.
|
|
135
|
-
- **Missing authorization checks** - authentication passes but resource ownership is never verified. See `references/auth.md`.
|
|
136
|
-
- **Weak password requirements** - no strength floor; enforce a schema or a strength library. See `references/input-validation.md`.
|
|
137
|
-
- **Verbose error messages** - raw DB errors returned to the client; log server-side, return generic messages. See `references/input-validation.md`.
|
|
138
|
-
|
|
139
|
-
## Security Checklist
|
|
140
|
-
|
|
141
|
-
### Authentication & Authorization
|
|
142
|
-
- [ ] Implement strong authentication (JWT, OAuth 2.0)
|
|
143
|
-
- [ ] Use HTTPS for all endpoints
|
|
144
|
-
- [ ] Hash passwords with bcrypt (salt rounds >= 10)
|
|
145
|
-
- [ ] Implement token expiration
|
|
146
|
-
- [ ] Add refresh token mechanism
|
|
147
|
-
- [ ] Verify user authorization for each request
|
|
148
|
-
- [ ] Implement role-based access control (RBAC)
|
|
149
|
-
|
|
150
|
-
### Input Validation
|
|
151
|
-
- [ ] Validate all user inputs
|
|
152
|
-
- [ ] Use parameterized queries or ORM
|
|
153
|
-
- [ ] Sanitize HTML content
|
|
154
|
-
- [ ] Validate file uploads
|
|
155
|
-
- [ ] Implement request schema validation
|
|
156
|
-
- [ ] Use allowlists, not blocklists
|
|
157
|
-
|
|
158
|
-
### Rate Limiting & DDoS Protection
|
|
159
|
-
- [ ] Implement rate limiting per user/IP
|
|
160
|
-
- [ ] Add stricter limits for auth endpoints
|
|
161
|
-
- [ ] Use Redis for distributed rate limiting
|
|
162
|
-
- [ ] Return proper rate limit headers
|
|
163
|
-
- [ ] Implement request throttling
|
|
164
|
-
|
|
165
|
-
### Data Protection
|
|
166
|
-
- [ ] Use HTTPS/TLS for all traffic
|
|
167
|
-
- [ ] Encrypt sensitive data at rest
|
|
168
|
-
- [ ] Don't store sensitive data in JWT
|
|
169
|
-
- [ ] Sanitize error messages
|
|
170
|
-
- [ ] Implement proper CORS configuration
|
|
171
|
-
- [ ] Use security headers (Helmet.js)
|
|
172
|
-
|
|
173
|
-
### Monitoring & Logging
|
|
174
|
-
- [ ] Log security events
|
|
175
|
-
- [ ] Monitor for suspicious activity
|
|
176
|
-
- [ ] Set up alerts for failed auth attempts
|
|
177
|
-
- [ ] Track API usage patterns
|
|
178
|
-
- [ ] Don't log sensitive data
|
|
179
|
-
|
|
180
|
-
## OWASP API Security Top 10
|
|
181
|
-
|
|
182
|
-
1. **Broken Object Level Authorization** - Always verify user can access resource
|
|
183
|
-
2. **Broken Authentication** - Implement strong authentication mechanisms
|
|
184
|
-
3. **Broken Object Property Level Authorization** - Validate which properties user can access
|
|
185
|
-
4. **Unrestricted Resource Consumption** - Implement rate limiting and quotas
|
|
186
|
-
5. **Broken Function Level Authorization** - Verify user role for each function
|
|
187
|
-
6. **Unrestricted Access to Sensitive Business Flows** - Protect critical workflows
|
|
188
|
-
7. **Server Side Request Forgery (SSRF)** - Validate and sanitize URLs
|
|
189
|
-
8. **Security Misconfiguration** - Use security best practices and headers
|
|
190
|
-
9. **Improper Inventory Management** - Document and secure all API endpoints
|
|
191
|
-
10. **Unsafe Consumption of APIs** - Validate data from third-party APIs
|
|
192
|
-
|
|
193
|
-
## Related Skills
|
|
194
|
-
|
|
195
|
-
- `@ethical-hacking-methodology` - Security testing perspective
|
|
196
|
-
- `@sql-injection-testing` - Testing for SQL injection
|
|
197
|
-
- `@xss-html-injection` - Testing for XSS vulnerabilities
|
|
198
|
-
- `@broken-authentication` - Authentication vulnerabilities
|
|
199
|
-
- `@backend-dev-guidelines` - Backend development standards
|
|
200
|
-
- `@systematic-debugging` - Debug security issues
|
|
201
|
-
|
|
202
|
-
## Additional Resources
|
|
203
|
-
|
|
204
|
-
- [OWASP API Security Top 10](https://owasp.org/www-project-api-security/)
|
|
205
|
-
- [JWT Best Practices](https://tools.ietf.org/html/rfc8725)
|
|
206
|
-
- [Express Security Best Practices](https://expressjs.com/en/advanced/best-practice-security.html)
|
|
207
|
-
- [Node.js Security Checklist](https://blog.risingstack.com/node-js-security-checklist/)
|
|
208
|
-
- [API Security Checklist](https://github.com/shieldfy/API-Security-Checklist)
|
|
72
|
+
### API4 Unrestricted resource consumption
|
|
209
73
|
|
|
210
|
-
|
|
74
|
+
*What stops one caller from exhausting CPU, memory, storage, money or a
|
|
75
|
+
downstream quota?*
|
|
76
|
+
|
|
77
|
+
Rate limits per identity, body size caps, page size caps, timeouts, GraphQL
|
|
78
|
+
depth and cost limits, upload size and type limits, and spend caps on anything
|
|
79
|
+
that calls a paid provider (SMS, email, LLM). See `references/abuse-controls.md`.
|
|
80
|
+
|
|
81
|
+
### API5 Broken function level authorization
|
|
82
|
+
|
|
83
|
+
*Is every privileged operation gated by role or permission on the server?*
|
|
84
|
+
|
|
85
|
+
Admin routes hidden from the UI are still reachable. Enforce permissions in
|
|
86
|
+
middleware or a policy layer that denies by default, and test that an ordinary
|
|
87
|
+
user gets 403 on each admin route.
|
|
88
|
+
|
|
89
|
+
### API6 Unrestricted access to sensitive business flows
|
|
90
|
+
|
|
91
|
+
*Could a script abuse this flow even though each request is individually valid?*
|
|
92
|
+
|
|
93
|
+
Checkout of limited stock, coupon redemption, account sign-up, review posting.
|
|
94
|
+
Controls are business-aware: per-account and per-device limits, velocity checks,
|
|
95
|
+
proof-of-work or CAPTCHA at the right step, and human review queues.
|
|
96
|
+
|
|
97
|
+
### API7 Server side request forgery (SSRF)
|
|
98
|
+
|
|
99
|
+
*Does any endpoint fetch a URL the caller supplied?* Fetch only through an
|
|
100
|
+
allowlisting, private-range-rejecting client; details in
|
|
101
|
+
`references/operations.md`.
|
|
102
|
+
|
|
103
|
+
### API8 Security misconfiguration
|
|
104
|
+
|
|
105
|
+
*Is the deployment as strict as the code?*
|
|
106
|
+
|
|
107
|
+
TLS everywhere, HSTS, CORS limited to known origins (never reflect the `Origin`
|
|
108
|
+
header with credentials), verbose errors off in production, default accounts
|
|
109
|
+
removed, security headers set, unused HTTP methods rejected.
|
|
110
|
+
|
|
111
|
+
### API9 Improper inventory management
|
|
112
|
+
|
|
113
|
+
*Do you know every API version and host that is live?*
|
|
114
|
+
|
|
115
|
+
Old `/v1` routes, staging hosts with production data, forgotten debug
|
|
116
|
+
endpoints. Keep an inventory generated from code (OpenAPI), retire versions on a
|
|
117
|
+
schedule, and apply the same gateway policies to every environment that holds
|
|
118
|
+
real data.
|
|
119
|
+
|
|
120
|
+
### API10 Unsafe consumption of APIs
|
|
121
|
+
|
|
122
|
+
*Do you trust third-party responses more than user input?*
|
|
123
|
+
|
|
124
|
+
Validate upstream payloads against a schema, set timeouts and size limits,
|
|
125
|
+
follow redirects only deliberately, and never pass upstream strings into SQL,
|
|
126
|
+
shell or HTML unescaped.
|
|
127
|
+
|
|
128
|
+
## Operating the controls
|
|
129
|
+
|
|
130
|
+
Detail: `references/operations.md`. Secrets come from a
|
|
131
|
+
secret store with per-environment keys, rotation and hashed API keys, never
|
|
132
|
+
in logs; TLS 1.2+ with HSTS, `no-store` on sensitive responses and `nosniff`;
|
|
133
|
+
structured security events with alerts on 401/403/404 bursts; and BOLA,
|
|
134
|
+
privileged-route, mass-assignment and size-limit tests in the suite, plus
|
|
135
|
+
dependency audit and a DAST baseline in CI.
|
|
136
|
+
|
|
137
|
+
## Review checklist
|
|
138
|
+
|
|
139
|
+
- [ ] Every object lookup is scoped by the caller's identity or tenant.
|
|
140
|
+
- [ ] Token validation checks signature, algorithm allowlist, issuer, audience, expiry.
|
|
141
|
+
- [ ] Input and output go through explicit schemas; no raw entities returned.
|
|
142
|
+
- [ ] Privileged routes deny by default and are covered by negative tests.
|
|
143
|
+
- [ ] Per-identity rate limits, body and page size caps, and timeouts are set.
|
|
144
|
+
- [ ] User-supplied URLs are fetched only through an SSRF-safe client.
|
|
145
|
+
- [ ] CORS, TLS, HSTS and error verbosity are production-strict.
|
|
146
|
+
- [ ] Secrets come from a secret store and never reach logs.
|
|
147
|
+
- [ ] Every live version and host is in the inventory.
|
|
148
|
+
- [ ] Third-party responses are validated like user input.
|
|
149
|
+
|
|
150
|
+
## Related skills
|
|
151
|
+
|
|
152
|
+
- `security-review`: full audit with threat model and scored findings.
|
|
153
|
+
- `api-patterns`: idempotency and error shapes that also limit abuse.
|
|
154
|
+
- `rest-api-design`: status code choices for auth failures.
|
|
155
|
+
- `nodejs-backend-patterns`, `fastapi-pro`: framework-level wiring.
|
|
156
|
+
- `ios-security`, `android-security`: client-side storage of the tokens issued here.
|
|
157
|
+
|
|
158
|
+
## External references
|
|
211
159
|
|
|
212
|
-
|
|
160
|
+
- OWASP API Security Top 10 2023: https://owasp.org/API-Security/editions/2023/en/0x11-t10/
|
|
161
|
+
- OWASP Cheat Sheet Series: https://cheatsheetseries.owasp.org/
|
|
162
|
+
- RFC 8725, JWT Best Current Practices: https://www.rfc-editor.org/rfc/rfc8725
|
package/pipeline/skills/shared/external/api-security-best-practices/references/abuse-controls.md
ADDED
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Abuse Controls
|
|
2
|
+
|
|
3
|
+
Limits that keep one caller, script or bug from exhausting the service or its
|
|
4
|
+
budget. Covers OWASP API4 (unrestricted resource consumption) and API6
|
|
5
|
+
(unrestricted access to sensitive business flows).
|
|
6
|
+
|
|
7
|
+
## Contents
|
|
8
|
+
|
|
9
|
+
1. Layers of limits
|
|
10
|
+
2. Choosing a rate limit algorithm
|
|
11
|
+
3. Keys: what to limit by
|
|
12
|
+
4. A shared-store limiter
|
|
13
|
+
5. Telling clients about limits
|
|
14
|
+
6. Size, time and cost limits
|
|
15
|
+
7. Protecting business flows
|
|
16
|
+
8. Operating the limits
|
|
17
|
+
|
|
18
|
+
## 1. Layers of limits
|
|
19
|
+
|
|
20
|
+
| Layer | Stops | Tooling |
|
|
21
|
+
|---|---|---|
|
|
22
|
+
| Edge / CDN | Volumetric floods, obvious bots | Cloudflare, AWS WAF + Shield, Fastly |
|
|
23
|
+
| API gateway | Per-key quotas, plan tiers | Kong, Envoy, AWS API Gateway usage plans |
|
|
24
|
+
| Application | Per-user and per-route rules that need business context | Middleware backed by Redis or the database |
|
|
25
|
+
| Downstream | Spend on paid providers | Budget counters, provider-side caps |
|
|
26
|
+
|
|
27
|
+
Do not rely on one layer. The edge cannot tell which account a request belongs
|
|
28
|
+
to; the application cannot absorb a flood.
|
|
29
|
+
|
|
30
|
+
## 2. Choosing a rate limit algorithm
|
|
31
|
+
|
|
32
|
+
- **Fixed window** (N per minute, reset on the minute): simplest, allows a burst
|
|
33
|
+
of 2N at window edges. Fine for coarse quotas.
|
|
34
|
+
- **Sliding window** (weighted count across the current and previous window):
|
|
35
|
+
smooth, cheap, the usual choice for API limits.
|
|
36
|
+
- **Token bucket** (refill rate R, capacity B): allows short bursts up to B while
|
|
37
|
+
enforcing an average of R. Good for interactive clients.
|
|
38
|
+
- **Concurrency limit** (at most K running at once): protects slow endpoints such as
|
|
39
|
+
exports and report generation, where request rate is the wrong measure.
|
|
40
|
+
|
|
41
|
+
## 3. Keys: what to limit by
|
|
42
|
+
|
|
43
|
+
- Authenticated routes: the account or API key id, possibly per route group.
|
|
44
|
+
- Credential routes: the submitted identifier (email, username) **and** the
|
|
45
|
+
source, so neither a spread-out attack on one account nor one source hitting
|
|
46
|
+
many accounts gets through.
|
|
47
|
+
- Anonymous routes: client IP as seen by your trusted proxy. Configure the
|
|
48
|
+
framework's trusted proxy list; a naively read `X-Forwarded-For` lets anyone
|
|
49
|
+
pick their own key.
|
|
50
|
+
- IPv6: limit by /64 prefix, since one host can own a whole block.
|
|
51
|
+
|
|
52
|
+
## 4. A shared-store limiter
|
|
53
|
+
|
|
54
|
+
In-memory counters break as soon as there are two instances. Use Redis (or
|
|
55
|
+
Valkey) with an atomic script. A sliding-window sketch:
|
|
56
|
+
|
|
57
|
+
```lua
|
|
58
|
+
-- KEYS[1] = current window key, KEYS[2] = previous window key
|
|
59
|
+
-- ARGV[1] = limit, ARGV[2] = window seconds, ARGV[3] = elapsed seconds in current window
|
|
60
|
+
local current = tonumber(redis.call("GET", KEYS[1]) or "0")
|
|
61
|
+
local previous = tonumber(redis.call("GET", KEYS[2]) or "0")
|
|
62
|
+
local window = tonumber(ARGV[2])
|
|
63
|
+
local weight = (window - tonumber(ARGV[3])) / window
|
|
64
|
+
local estimated = previous * weight + current
|
|
65
|
+
if estimated >= tonumber(ARGV[1]) then
|
|
66
|
+
return 0
|
|
67
|
+
end
|
|
68
|
+
redis.call("INCR", KEYS[1])
|
|
69
|
+
redis.call("EXPIRE", KEYS[1], window * 2)
|
|
70
|
+
return 1
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
In practice use a maintained implementation: `@fastify/rate-limit` or
|
|
74
|
+
`rate-limiter-flexible` on Node, `slowapi` or `limits` on Python, or the
|
|
75
|
+
gateway's built-in plugin. Decide explicitly what happens when Redis is down:
|
|
76
|
+
fail open for general traffic, fail closed for credential endpoints.
|
|
77
|
+
|
|
78
|
+
## 5. Telling clients about limits
|
|
79
|
+
|
|
80
|
+
Return `429 Too Many Requests` with a problem-details body and a `Retry-After`
|
|
81
|
+
header in seconds. Advertise the policy so well-behaved clients can pace
|
|
82
|
+
themselves; the IETF `RateLimit` and `RateLimit-Policy` header fields are the
|
|
83
|
+
emerging standard, and many APIs still send `X-RateLimit-Limit`,
|
|
84
|
+
`X-RateLimit-Remaining` and `X-RateLimit-Reset`. Pick one convention and
|
|
85
|
+
document it.
|
|
86
|
+
|
|
87
|
+
```http
|
|
88
|
+
HTTP/1.1 429 Too Many Requests
|
|
89
|
+
Retry-After: 20
|
|
90
|
+
Content-Type: application/problem+json
|
|
91
|
+
|
|
92
|
+
{ "type": "https://api.example.com/problems/rate-limited", "title": "Too many requests", "status": 429 }
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## 6. Size, time and cost limits
|
|
96
|
+
|
|
97
|
+
Rate limits count requests; these bound what a single request can cost.
|
|
98
|
+
|
|
99
|
+
- **Body size:** reject at the proxy (`client_max_body_size`) and in the
|
|
100
|
+
framework (`bodyLimit`, `max_request_size`). JSON APIs rarely need more than
|
|
101
|
+
1 MB; uploads get their own route and limit.
|
|
102
|
+
- **Collections:** cap array lengths in schemas and `limit` on list endpoints.
|
|
103
|
+
- **Time:** server-side request timeout, statement timeout on the database
|
|
104
|
+
(`SET statement_timeout`), and deadlines on outbound calls.
|
|
105
|
+
- **GraphQL:** maximum depth, maximum aliases, a query cost budget per request
|
|
106
|
+
and per minute, and persisted queries in production.
|
|
107
|
+
- **Regular expressions:** avoid catastrophic backtracking on user input; use
|
|
108
|
+
linear-time engines (RE2) or bounded patterns.
|
|
109
|
+
- **Compression:** limit decompressed size to stop decompression bombs.
|
|
110
|
+
- **Paid side effects:** per-account daily caps on SMS, email, LLM tokens and
|
|
111
|
+
payment attempts, with alerts well before the provider bill does.
|
|
112
|
+
|
|
113
|
+
## 7. Protecting business flows
|
|
114
|
+
|
|
115
|
+
Some abuse uses perfectly valid, correctly rate-limited requests. Identify the
|
|
116
|
+
flows where volume itself is the harm:
|
|
117
|
+
|
|
118
|
+
- buying limited-stock products or reserving limited slots;
|
|
119
|
+
- creating accounts, redeeming promo codes or referral rewards;
|
|
120
|
+
- posting reviews, comments or messages to other users;
|
|
121
|
+
- enumerating public identifiers (usernames, order numbers, gift card codes).
|
|
122
|
+
|
|
123
|
+
Controls, cheapest first:
|
|
124
|
+
|
|
125
|
+
1. Per-account and per-device limits specific to that flow (one redemption per
|
|
126
|
+
account, five sign-ups per device per day).
|
|
127
|
+
2. Make identifiers unguessable and responses uniform so enumeration yields
|
|
128
|
+
nothing.
|
|
129
|
+
3. Friction at the decisive step: email or phone verification, CAPTCHA or
|
|
130
|
+
privacy-preserving attestation (Turnstile, App Attest, Play Integrity).
|
|
131
|
+
4. Velocity and anomaly scoring with a review queue for borderline cases.
|
|
132
|
+
|
|
133
|
+
## 8. Operating the limits
|
|
134
|
+
|
|
135
|
+
- Log every 429 with the key and route; dashboard the top limited keys.
|
|
136
|
+
- Start new limits in report-only mode, read the data, then enforce.
|
|
137
|
+
- Give trusted partners explicit higher tiers instead of exempting them silently.
|
|
138
|
+
- Load test with the limits on, so capacity planning reflects production
|
|
139
|
+
behaviour.
|
|
140
|
+
- Review limits after incidents and when pricing plans change.
|