@luanpdd/kit-mcp 1.33.0 → 1.34.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 -21
- package/README.md +168 -168
- package/gates/agent-no-recursive-dispatch.md +84 -84
- package/kit/COMANDOS.md +138 -138
- package/kit/COMPATIBILITY.md +70 -70
- package/kit/README.md +76 -76
- package/kit/agents/advisor-researcher.md +109 -109
- package/kit/agents/ai-mutation-tester.md +289 -289
- package/kit/agents/assumptions-analyzer.md +110 -110
- package/kit/agents/audit-log-implementer.md +314 -314
- package/kit/agents/auditor-consistencia-isolamento.md +414 -414
- package/kit/agents/b2b-saas-architect.md +157 -157
- package/kit/agents/burn-rate-forecaster.md +153 -153
- package/kit/agents/cascading-failures-auditor.md +299 -299
- package/kit/agents/codebase-mapper.md +769 -769
- package/kit/agents/crm-pipeline-implementer.md +257 -257
- package/kit/agents/debugger.md +814 -814
- package/kit/agents/designer-ui.md +216 -216
- package/kit/agents/detector-tenant-quente.md +338 -338
- package/kit/agents/evolution-go-integrator.md +201 -201
- package/kit/agents/example-reviewer.md +22 -22
- package/kit/agents/executor.md +565 -565
- package/kit/agents/golden-signals-instrumenter.md +232 -232
- package/kit/agents/incident-investigator.md +238 -238
- package/kit/agents/integration-checker.md +203 -203
- package/kit/agents/invite-flow-implementer.md +190 -190
- package/kit/agents/legacy-characterizer.md +369 -369
- package/kit/agents/lgpd-compliance-auditor.md +296 -296
- package/kit/agents/load-shedding-instrumenter.md +290 -290
- package/kit/agents/multi-tenant-isolation-auditor.md +254 -254
- package/kit/agents/multi-tenant-rls-writer.md +341 -341
- package/kit/agents/nyquist-auditor.md +181 -181
- package/kit/agents/observability-coverage-auditor.md +316 -316
- package/kit/agents/observability-instrumenter.md +191 -191
- package/kit/agents/omm-auditor.md +291 -291
- package/kit/agents/org-onboarding-implementer.md +224 -224
- package/kit/agents/payload-capture-instrumenter.md +274 -274
- package/kit/agents/phase-researcher.md +697 -697
- package/kit/agents/plan-checker.md +275 -275
- package/kit/agents/planner.md +923 -923
- package/kit/agents/postmortem-writer.md +273 -273
- package/kit/agents/project-researcher.md +653 -653
- package/kit/agents/prr-conductor.md +287 -287
- package/kit/agents/refactor-safety-auditor.md +405 -405
- package/kit/agents/release-pipeline-auditor.md +364 -364
- package/kit/agents/research-synthesizer.md +246 -246
- package/kit/agents/roadmapper.md +678 -678
- package/kit/agents/schema-checker.md +160 -160
- package/kit/agents/seam-finder.md +360 -360
- package/kit/agents/shotgun-surgery-detector.md +350 -350
- package/kit/agents/slo-engineer.md +217 -217
- package/kit/agents/storytelling-analyst.md +300 -300
- package/kit/agents/supabase-architect.md +249 -249
- package/kit/agents/supabase-auth-bootstrapper.md +400 -400
- package/kit/agents/supabase-auth-hook-writer.md +418 -418
- package/kit/agents/supabase-branching-architect.md +563 -563
- package/kit/agents/supabase-cicd-pipeline-implementer.md +778 -778
- package/kit/agents/supabase-column-privileges-writer.md +400 -400
- package/kit/agents/supabase-edge-fn-tester.md +288 -288
- package/kit/agents/supabase-edge-fn-writer.md +341 -341
- package/kit/agents/supabase-mfa-implementer.md +439 -439
- package/kit/agents/supabase-migration-writer.md +386 -386
- package/kit/agents/supabase-oauth-server-implementer.md +507 -507
- package/kit/agents/supabase-rbac-implementer.md +393 -393
- package/kit/agents/supabase-realtime-implementer.md +364 -364
- package/kit/agents/supabase-rls-hardener.md +522 -522
- package/kit/agents/supabase-rls-writer.md +324 -324
- package/kit/agents/supabase-roles-implementer.md +356 -356
- package/kit/agents/supabase-social-auth-implementer.md +451 -451
- package/kit/agents/supabase-sso-saml-architect.md +549 -549
- package/kit/agents/supabase-storage-implementer.md +407 -407
- package/kit/agents/super-admin-implementer.md +282 -282
- package/kit/agents/toil-auditor.md +268 -268
- package/kit/agents/ui-auditor.md +438 -438
- package/kit/agents/ui-checker.md +305 -305
- package/kit/agents/ui-researcher.md +356 -356
- package/kit/agents/user-profiler.md +176 -176
- package/kit/agents/validador-evolucao-schema.md +336 -336
- package/kit/agents/verifier.md +729 -729
- package/kit/commands/adicionar-backlog.md +75 -75
- package/kit/commands/adicionar-fase.md +42 -42
- package/kit/commands/adicionar-tarefa.md +45 -45
- package/kit/commands/adicionar-testes.md +41 -41
- package/kit/commands/ajuda.md +21 -21
- package/kit/commands/atualizar.md +37 -37
- package/kit/commands/auditar-cascading.md +111 -111
- package/kit/commands/auditar-marco.md +179 -179
- package/kit/commands/auditar-observabilidade-cobertura-workflow.md +121 -0
- package/kit/commands/auditar-observabilidade-cobertura.md +183 -183
- package/kit/commands/auditar-refactor.md +219 -219
- package/kit/commands/auditar-release.md +109 -109
- package/kit/commands/auditar-uat.md +23 -23
- package/kit/commands/autonomo.md +40 -40
- package/kit/commands/branch-pr.md +24 -24
- package/kit/commands/burn-rate-status.md +408 -408
- package/kit/commands/capturar-payloads.md +193 -193
- package/kit/commands/caracterizar.md +212 -212
- package/kit/commands/concluir-marco.md +247 -247
- package/kit/commands/configuracoes.md +36 -36
- package/kit/commands/dados-distribuidos.md +188 -188
- package/kit/commands/definir-perfil.md +10 -10
- package/kit/commands/depurar.md +190 -190
- package/kit/commands/detectar-duplicacao.md +197 -197
- package/kit/commands/discutir-fase.md +131 -131
- package/kit/commands/encontrar-seams.md +136 -136
- package/kit/commands/entrar-discord.md +17 -17
- package/kit/commands/estatisticas.md +18 -18
- package/kit/commands/example-greeting.md +33 -33
- package/kit/commands/executar-fase.md +58 -58
- package/kit/commands/expresso.md +56 -56
- package/kit/commands/fase-ui.md +34 -34
- package/kit/commands/fazer.md +57 -57
- package/kit/commands/fio.md +125 -125
- package/kit/commands/fluxos-trabalho.md +64 -64
- package/kit/commands/forense.md +176 -176
- package/kit/commands/gerenciador.md +38 -38
- package/kit/commands/inserir-fase.md +31 -31
- package/kit/commands/legacy.md +263 -263
- package/kit/commands/limpeza.md +17 -17
- package/kit/commands/listar-hipoteses-fase.md +45 -45
- package/kit/commands/listar-workspaces.md +18 -18
- package/kit/commands/load-shedding.md +117 -117
- package/kit/commands/mapear-codebase.md +70 -70
- package/kit/commands/multi-tenant.md +163 -163
- package/kit/commands/nota.md +33 -33
- package/kit/commands/novo-marco.md +43 -43
- package/kit/commands/novo-projeto.md +41 -41
- package/kit/commands/novo-workspace.md +43 -43
- package/kit/commands/pausar-trabalho.md +37 -37
- package/kit/commands/perfil-usuario.md +45 -45
- package/kit/commands/pesquisar-fase.md +195 -195
- package/kit/commands/planejar-fase.md +67 -67
- package/kit/commands/planejar-lacunas.md +33 -33
- package/kit/commands/plantar-ideia.md +25 -25
- package/kit/commands/progresso.md +24 -24
- package/kit/commands/proximo.md +30 -30
- package/kit/commands/publicar.md +490 -490
- package/kit/commands/rapido.md +35 -35
- package/kit/commands/reaplicar-patches.md +124 -124
- package/kit/commands/refactor-seguro.md +321 -321
- package/kit/commands/relatorio-sessao.md +19 -19
- package/kit/commands/remover-fase.md +31 -31
- package/kit/commands/remover-workspace.md +26 -26
- package/kit/commands/resumo-marco.md +50 -50
- package/kit/commands/retomar-trabalho.md +40 -40
- package/kit/commands/revisar-backlog.md +60 -60
- package/kit/commands/revisar-ui.md +32 -32
- package/kit/commands/revisar.md +37 -37
- package/kit/commands/saude.md +21 -21
- package/kit/commands/setup-notion.md +93 -93
- package/kit/commands/storytelling.md +179 -179
- package/kit/commands/supabase.md +238 -238
- package/kit/commands/sync-main.md +68 -68
- package/kit/commands/validar-fase.md +35 -35
- package/kit/commands/verificar-tarefas.md +44 -44
- package/kit/commands/verificar-trabalho.md +64 -64
- package/kit/file-manifest.json +13 -11
- package/kit/framework/bin/lib/commands.cjs +959 -959
- package/kit/framework/bin/lib/config.cjs +442 -442
- package/kit/framework/bin/lib/core.cjs +1230 -1230
- package/kit/framework/bin/lib/frontmatter.cjs +336 -336
- package/kit/framework/bin/lib/init.cjs +1442 -1442
- package/kit/framework/bin/lib/milestone.cjs +252 -252
- package/kit/framework/bin/lib/model-profiles.cjs +68 -68
- package/kit/framework/bin/lib/phase.cjs +888 -888
- package/kit/framework/bin/lib/profile-output.cjs +952 -952
- package/kit/framework/bin/lib/profile-pipeline.cjs +539 -539
- package/kit/framework/bin/lib/roadmap.cjs +329 -329
- package/kit/framework/bin/lib/security.cjs +382 -382
- package/kit/framework/bin/lib/state.cjs +1031 -1031
- package/kit/framework/bin/lib/template.cjs +222 -222
- package/kit/framework/bin/lib/uat.cjs +282 -282
- package/kit/framework/bin/lib/verify.cjs +888 -888
- package/kit/framework/bin/lib/workstream.cjs +491 -491
- package/kit/framework/bin/tools.cjs +918 -918
- package/kit/framework/commands/workstreams.md +63 -63
- package/kit/framework/references/checkpoints.md +778 -778
- package/kit/framework/references/continuation-format.md +249 -249
- package/kit/framework/references/decimal-phase-calculation.md +64 -64
- package/kit/framework/references/git-integration.md +295 -295
- package/kit/framework/references/git-planning-commit.md +38 -38
- package/kit/framework/references/model-profile-resolution.md +36 -36
- package/kit/framework/references/model-profiles.md +139 -139
- package/kit/framework/references/phase-argument-parsing.md +61 -61
- package/kit/framework/references/planning-config.md +202 -202
- package/kit/framework/references/questioning.md +162 -162
- package/kit/framework/references/tdd.md +263 -263
- package/kit/framework/references/ui-brand.md +160 -160
- package/kit/framework/references/user-profiling.md +657 -657
- package/kit/framework/references/verification-patterns.md +612 -612
- package/kit/framework/references/workstream-flag.md +58 -58
- package/kit/framework/templates/DEBUG.md +164 -164
- package/kit/framework/templates/UAT.md +265 -265
- package/kit/framework/templates/UI-SPEC.md +100 -100
- package/kit/framework/templates/VALIDATION.md +76 -76
- package/kit/framework/templates/claude-md.md +122 -122
- package/kit/framework/templates/codebase/architecture.md +185 -185
- package/kit/framework/templates/codebase/concerns.md +205 -205
- package/kit/framework/templates/codebase/conventions.md +204 -204
- package/kit/framework/templates/codebase/integrations.md +192 -192
- package/kit/framework/templates/codebase/stack.md +158 -158
- package/kit/framework/templates/codebase/structure.md +199 -199
- package/kit/framework/templates/codebase/testing.md +301 -301
- package/kit/framework/templates/config.json +44 -44
- package/kit/framework/templates/context.md +352 -352
- package/kit/framework/templates/continue-here.md +78 -78
- package/kit/framework/templates/copilot-instructions.md +7 -7
- package/kit/framework/templates/debug-subagent-prompt.md +91 -91
- package/kit/framework/templates/dev-preferences.md +20 -20
- package/kit/framework/templates/discovery.md +146 -146
- package/kit/framework/templates/discussion-log.md +63 -63
- package/kit/framework/templates/milestone-archive.md +123 -123
- package/kit/framework/templates/milestone.md +115 -115
- package/kit/framework/templates/phase-prompt.md +610 -610
- package/kit/framework/templates/planner-subagent-prompt.md +117 -117
- package/kit/framework/templates/project.md +186 -186
- package/kit/framework/templates/requirements.md +231 -231
- package/kit/framework/templates/research-project/ARCHITECTURE.md +204 -204
- package/kit/framework/templates/research-project/FEATURES.md +147 -147
- package/kit/framework/templates/research-project/PITFALLS.md +200 -200
- package/kit/framework/templates/research-project/STACK.md +120 -120
- package/kit/framework/templates/research-project/SUMMARY.md +170 -170
- package/kit/framework/templates/research.md +419 -419
- package/kit/framework/templates/retrospective.md +54 -54
- package/kit/framework/templates/roadmap.md +202 -202
- package/kit/framework/templates/state.md +176 -176
- package/kit/framework/templates/summary-complex.md +59 -59
- package/kit/framework/templates/summary-minimal.md +41 -41
- package/kit/framework/templates/summary-standard.md +48 -48
- package/kit/framework/templates/summary.md +209 -209
- package/kit/framework/templates/user-profile.md +146 -146
- package/kit/framework/templates/user-setup.md +256 -256
- package/kit/framework/templates/verification-report.md +258 -258
- package/kit/framework/workflows/add-phase.md +112 -112
- package/kit/framework/workflows/add-tests.md +351 -351
- package/kit/framework/workflows/add-todo.md +158 -158
- package/kit/framework/workflows/audit-milestone.md +340 -340
- package/kit/framework/workflows/audit-uat.md +109 -109
- package/kit/framework/workflows/autonomous.md +891 -891
- package/kit/framework/workflows/check-todos.md +177 -177
- package/kit/framework/workflows/cleanup.md +152 -152
- package/kit/framework/workflows/complete-milestone.md +696 -696
- package/kit/framework/workflows/diagnose-issues.md +231 -231
- package/kit/framework/workflows/discovery-phase.md +289 -289
- package/kit/framework/workflows/discuss-phase-assumptions.md +653 -653
- package/kit/framework/workflows/discuss-phase.md +784 -784
- package/kit/framework/workflows/do.md +104 -104
- package/kit/framework/workflows/execute-phase.md +838 -838
- package/kit/framework/workflows/execute-plan.md +510 -510
- package/kit/framework/workflows/fast.md +102 -102
- package/kit/framework/workflows/forensics.md +265 -265
- package/kit/framework/workflows/health.md +181 -181
- package/kit/framework/workflows/help.md +619 -619
- package/kit/framework/workflows/insert-phase.md +130 -130
- package/kit/framework/workflows/list-phase-assumptions.md +178 -178
- package/kit/framework/workflows/list-workspaces.md +56 -56
- package/kit/framework/workflows/manager.md +362 -362
- package/kit/framework/workflows/map-codebase.md +377 -377
- package/kit/framework/workflows/milestone-summary.md +223 -223
- package/kit/framework/workflows/new-milestone.md +486 -486
- package/kit/framework/workflows/new-project.md +1159 -1159
- package/kit/framework/workflows/new-workspace.md +237 -237
- package/kit/framework/workflows/next.md +97 -97
- package/kit/framework/workflows/node-repair.md +92 -92
- package/kit/framework/workflows/note.md +156 -156
- package/kit/framework/workflows/pause-work.md +176 -176
- package/kit/framework/workflows/plan-milestone-gaps.md +273 -273
- package/kit/framework/workflows/plan-phase.md +765 -765
- package/kit/framework/workflows/plant-seed.md +169 -169
- package/kit/framework/workflows/pr-branch.md +129 -129
- package/kit/framework/workflows/profile-user.md +450 -450
- package/kit/framework/workflows/progress.md +507 -507
- package/kit/framework/workflows/quick.md +757 -757
- package/kit/framework/workflows/remove-phase.md +155 -155
- package/kit/framework/workflows/remove-workspace.md +90 -90
- package/kit/framework/workflows/research-phase.md +82 -82
- package/kit/framework/workflows/resume-project.md +326 -326
- package/kit/framework/workflows/review.md +228 -228
- package/kit/framework/workflows/session-report.md +146 -146
- package/kit/framework/workflows/settings.md +283 -283
- package/kit/framework/workflows/ship.md +228 -228
- package/kit/framework/workflows/stats.md +60 -60
- package/kit/framework/workflows/transition.md +671 -671
- package/kit/framework/workflows/ui-phase.md +302 -302
- package/kit/framework/workflows/ui-review.md +165 -165
- package/kit/framework/workflows/update.md +323 -323
- package/kit/framework/workflows/validate-phase.md +174 -174
- package/kit/framework/workflows/verify-phase.md +252 -252
- package/kit/framework/workflows/verify-work.md +637 -637
- package/kit/hooks/check-update.js +118 -118
- package/kit/hooks/context-monitor.js +163 -163
- package/kit/hooks/kit-attribution-reminder.cjs +92 -92
- package/kit/hooks/kit-router.cjs +137 -137
- package/kit/hooks/prompt-guard.js +103 -103
- package/kit/hooks/statusline.js +125 -125
- package/kit/hooks/workflow-guard.js +101 -101
- package/kit/settings.json +45 -45
- package/kit/skills/ai-prompt-characterization/SKILL.md +335 -335
- package/kit/skills/armadilhas-sistemas-distribuidos/SKILL.md +447 -447
- package/kit/skills/audit-log-multi-tenant/SKILL.md +340 -340
- package/kit/skills/b2b-saas-architecture/SKILL.md +300 -300
- package/kit/skills/consistencia-leitura-replica/SKILL.md +385 -385
- package/kit/skills/crm-lead-pipeline-patterns/SKILL.md +343 -343
- package/kit/skills/escolha-modelo-consistencia/SKILL.md +494 -494
- package/kit/skills/evolucao-schema-compativel/SKILL.md +448 -448
- package/kit/skills/evolution-go-whatsapp-integration/SKILL.md +322 -322
- package/kit/skills/example-skill/SKILL.md +42 -42
- package/kit/skills/legacy-api-only-applications/SKILL.md +358 -358
- package/kit/skills/legacy-characterization-tests/SKILL.md +330 -330
- package/kit/skills/legacy-effect-analysis/SKILL.md +331 -331
- package/kit/skills/legacy-extract-class/SKILL.md +203 -203
- package/kit/skills/legacy-programming-by-difference/SKILL.md +252 -252
- package/kit/skills/legacy-seams-and-test-harness/SKILL.md +460 -460
- package/kit/skills/legacy-shotgun-surgery/SKILL.md +286 -286
- package/kit/skills/legacy-sprout-wrap-techniques/SKILL.md +434 -434
- package/kit/skills/legacy-storytelling-naked-crc/SKILL.md +270 -270
- package/kit/skills/lgpd-multi-tenant-compliance/SKILL.md +340 -340
- package/kit/skills/member-invite-flow/SKILL.md +305 -305
- package/kit/skills/member-management-react-shadcn/SKILL.md +328 -328
- package/kit/skills/multi-tenant-performance-scaling/SKILL.md +316 -316
- package/kit/skills/multi-tenant-rls-hierarchy/SKILL.md +342 -342
- package/kit/skills/org-onboarding-flow/SKILL.md +257 -257
- package/kit/skills/org-switcher-react-pattern/SKILL.md +349 -349
- package/kit/skills/permission-gate-react-pattern/SKILL.md +271 -271
- package/kit/skills/postgres-isolamento-concorrencia/SKILL.md +552 -552
- package/kit/skills/pre-refactor-characterization/SKILL.md +421 -421
- package/kit/skills/rbac-permissions-matrix-supabase/SKILL.md +338 -338
- package/kit/skills/streams-eventos-cdc/SKILL.md +711 -711
- package/kit/skills/supabase-auth-hardening/SKILL.md +674 -674
- package/kit/skills/supabase-auth-hooks/SKILL.md +875 -875
- package/kit/skills/supabase-auth-methods/SKILL.md +486 -486
- package/kit/skills/supabase-auth-sessions/SKILL.md +579 -579
- package/kit/skills/supabase-auth-ssr/SKILL.md +306 -306
- package/kit/skills/supabase-branching-workflow/SKILL.md +544 -544
- package/kit/skills/supabase-ci-cd-github-actions/SKILL.md +880 -880
- package/kit/skills/supabase-column-level-security/SKILL.md +426 -426
- package/kit/skills/supabase-config-toml-remotes/SKILL.md +807 -807
- package/kit/skills/supabase-custom-claims-rbac/SKILL.md +472 -472
- package/kit/skills/supabase-edge-functions/SKILL.md +330 -330
- package/kit/skills/supabase-edge-functions-auth/SKILL.md +309 -309
- package/kit/skills/supabase-edge-functions-limits/SKILL.md +302 -302
- package/kit/skills/supabase-edge-functions-mcp-server/SKILL.md +279 -279
- package/kit/skills/supabase-edge-functions-testing/SKILL.md +277 -277
- package/kit/skills/supabase-edge-runtime-builtins/SKILL.md +357 -357
- package/kit/skills/supabase-enterprise-sso-saml/SKILL.md +545 -545
- package/kit/skills/supabase-jwt-signing-keys/SKILL.md +399 -399
- package/kit/skills/supabase-mfa/SKILL.md +488 -488
- package/kit/skills/supabase-migration-repair/SKILL.md +823 -823
- package/kit/skills/supabase-migrations/SKILL.md +297 -297
- package/kit/skills/supabase-oauth-server/SKILL.md +537 -537
- package/kit/skills/supabase-pgtap-testing/SKILL.md +1053 -1053
- package/kit/skills/supabase-postgres-roles/SKILL.md +392 -392
- package/kit/skills/supabase-realtime/SKILL.md +460 -460
- package/kit/skills/supabase-rls-defense-in-depth/SKILL.md +418 -418
- package/kit/skills/supabase-rls-policies/SKILL.md +635 -635
- package/kit/skills/supabase-social-oauth/SKILL.md +480 -480
- package/kit/skills/supabase-third-party-auth/SKILL.md +450 -450
- package/kit/skills/super-admin-platform-pattern/SKILL.md +326 -326
- package/kit/skills/tenant-quente-mitigacao/SKILL.md +605 -605
- package/kit/skills/ui-anti-padroes-ia/SKILL.md +261 -261
- package/kit/skills/ui-contexto-produto/SKILL.md +248 -248
- package/kit/skills/ui-cor-estrategia/SKILL.md +213 -213
- package/kit/skills/ui-critica-auditoria/SKILL.md +260 -260
- package/kit/skills/ui-motion-funcional/SKILL.md +264 -264
- package/kit/skills/ui-ritmo-espacial/SKILL.md +259 -259
- package/kit/skills/ui-tipografia/SKILL.md +211 -211
- package/kit/skills/whatsapp-conversation-state-machine/SKILL.md +287 -287
- package/kit/workflows/auditar-observabilidade-cobertura.workflow.js +250 -0
- package/package.json +65 -63
- package/src/core/kit.js +333 -216
- package/src/core/reflect.js +247 -247
- package/src/core/registry.js +123 -112
- package/src/core/reverse-sync.js +448 -372
- package/src/core/sync.js +477 -437
- package/src/core/watch.js +121 -121
- package/src/mcp-server/index.js +794 -794
|
@@ -1,290 +1,290 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: load-shedding-instrumenter
|
|
3
|
-
tier: specialized
|
|
4
|
-
description: Aplica patches de load shedding em código (queue depth gauge, drop policy, deadline-aware handler via AbortSignal, server-side rate limit). Foca em Edge Functions e serviços HTTP.
|
|
5
|
-
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
|
-
color: orange
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
Você é o **instrumentador de load shedding**. Recebe `target_path` (Edge Function ou handler HTTP) e aplica patches via Edit tool: queue depth gauge, drop policy, deadline-aware handler, server-side rate limit, slow start na recovery.
|
|
10
|
-
|
|
11
|
-
Você consulta:
|
|
12
|
-
- [`load-shedding-graceful-degradation`](../skills/load-shedding-graceful-degradation/SKILL.md)
|
|
13
|
-
- [`retry-strategies`](../skills/retry-strategies/SKILL.md) — caller-side coopera com server-side
|
|
14
|
-
- [`four-golden-signals`](../skills/four-golden-signals/SKILL.md) (v1.10) — Saturation gauge é trigger
|
|
15
|
-
|
|
16
|
-
**Compat:** Full em todos os IDEs (filesystem-only). Veja [COMPATIBILITY.md](../COMPATIBILITY.md).
|
|
17
|
-
|
|
18
|
-
## Por que existe
|
|
19
|
-
|
|
20
|
-
Load shedding é cross-cutting concern — server detecta saturation E rejeita 503 graceful E dispara observability E não cai. Sem template canônico, cada equipe reinventa de forma frágil. Esse agent aplica os 5 patterns canônicos em código existente, preservando lógica core.
|
|
21
|
-
|
|
22
|
-
## Inputs esperados (do caller)
|
|
23
|
-
|
|
24
|
-
- `target_path`: arquivo a instrumentar (Edge Function ou handler HTTP)
|
|
25
|
-
- (Opcional) `patterns`: subset de `[concurrency-limit, queue-bound, deadline-aware, rate-limit, slow-start]` (default: todos aplicáveis)
|
|
26
|
-
- (Opcional) `max_concurrent`: default 1000
|
|
27
|
-
- (Opcional) `cpu_threshold`: default 90
|
|
28
|
-
- (Opcional) `queue_max_size`: default 10000
|
|
29
|
-
|
|
30
|
-
## Passos
|
|
31
|
-
|
|
32
|
-
### Step 0 — Preflight
|
|
33
|
-
|
|
34
|
-
```bash
|
|
35
|
-
TARGET_PATH="${target_path}"
|
|
36
|
-
[ ! -f "$TARGET_PATH" ] && { echo "ERROR: $TARGET_PATH not found"; exit 1; }
|
|
37
|
-
|
|
38
|
-
# detectar runtime
|
|
39
|
-
case "$TARGET_PATH" in
|
|
40
|
-
*.ts|*.tsx|*.js|*.mjs)
|
|
41
|
-
RUNTIME="node-deno"
|
|
42
|
-
;;
|
|
43
|
-
*.py)
|
|
44
|
-
RUNTIME="python"
|
|
45
|
-
;;
|
|
46
|
-
*)
|
|
47
|
-
echo "ERROR: runtime não suportado: $TARGET_PATH"
|
|
48
|
-
exit 1
|
|
49
|
-
;;
|
|
50
|
-
esac
|
|
51
|
-
|
|
52
|
-
# detectar tipo de handler
|
|
53
|
-
HANDLER_TYPE=""
|
|
54
|
-
if grep -q "Deno.serve" "$TARGET_PATH"; then
|
|
55
|
-
HANDLER_TYPE="deno-serve"
|
|
56
|
-
elif grep -qE "app\.(post|get|put)" "$TARGET_PATH"; then
|
|
57
|
-
HANDLER_TYPE="express-like"
|
|
58
|
-
fi
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
### Step 1 — Aplicar pattern: concurrency limit + 503 graceful
|
|
62
|
-
|
|
63
|
-
Para Deno Edge Function:
|
|
64
|
-
|
|
65
|
-
```ts
|
|
66
|
-
// PATCH: shared load shedder
|
|
67
|
-
// Criar arquivo se não existe: supabase/functions/_shared/load-shedder.ts
|
|
68
|
-
|
|
69
|
-
interface LoadShedderOpts {
|
|
70
|
-
maxConcurrent: number
|
|
71
|
-
cpuThreshold?: number
|
|
72
|
-
saturationGauge?: () => Promise<number>
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export class LoadShedder {
|
|
76
|
-
private inFlight = 0
|
|
77
|
-
constructor(private opts: LoadShedderOpts) {}
|
|
78
|
-
|
|
79
|
-
async tryAcquire(): Promise<{ ok: true } | { ok: false; reason: string; retryAfterSec: number }> {
|
|
80
|
-
if (this.inFlight >= this.opts.maxConcurrent) {
|
|
81
|
-
return { ok: false, reason: 'concurrency_limit', retryAfterSec: 5 }
|
|
82
|
-
}
|
|
83
|
-
if (this.opts.saturationGauge) {
|
|
84
|
-
const sat = await this.opts.saturationGauge()
|
|
85
|
-
if (sat > 0.95) {
|
|
86
|
-
return { ok: false, reason: 'saturation', retryAfterSec: 30 }
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
this.inFlight++
|
|
90
|
-
return { ok: true }
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
release(): void {
|
|
94
|
-
this.inFlight = Math.max(0, this.inFlight - 1)
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
PATCH no handler target:
|
|
100
|
-
|
|
101
|
-
```ts
|
|
102
|
-
// ANTES
|
|
103
|
-
Deno.serve(async (req) => {
|
|
104
|
-
return await handleRequest(req)
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
// DEPOIS
|
|
108
|
-
import { LoadShedder } from '../_shared/load-shedder.ts'
|
|
109
|
-
|
|
110
|
-
const shedder = new LoadShedder({ maxConcurrent: ${MAX_CONCURRENT} })
|
|
111
|
-
|
|
112
|
-
Deno.serve(async (req) => {
|
|
113
|
-
const acq = await shedder.tryAcquire()
|
|
114
|
-
if (!acq.ok) {
|
|
115
|
-
return new Response('Service Unavailable', {
|
|
116
|
-
status: 503,
|
|
117
|
-
headers: {
|
|
118
|
-
'Retry-After': String(acq.retryAfterSec),
|
|
119
|
-
'X-Shed-Reason': acq.reason,
|
|
120
|
-
'Content-Type': 'application/json',
|
|
121
|
-
},
|
|
122
|
-
})
|
|
123
|
-
}
|
|
124
|
-
try {
|
|
125
|
-
return await handleRequest(req)
|
|
126
|
-
} finally {
|
|
127
|
-
shedder.release()
|
|
128
|
-
}
|
|
129
|
-
})
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
### Step 2 — Aplicar pattern: deadline-aware handler
|
|
133
|
-
|
|
134
|
-
```ts
|
|
135
|
-
// PATCH: deadline-aware wrapper
|
|
136
|
-
async function handleWithDeadline(req: Request): Promise<Response> {
|
|
137
|
-
const deadlineHeader = req.headers.get('x-deadline-ms')
|
|
138
|
-
const deadlineMs = deadlineHeader ? parseInt(deadlineHeader, 10) : null
|
|
139
|
-
|
|
140
|
-
if (deadlineMs && Date.now() > deadlineMs) {
|
|
141
|
-
return new Response('Deadline Exceeded', { status: 408 })
|
|
142
|
-
}
|
|
143
|
-
|
|
144
|
-
if (deadlineMs) {
|
|
145
|
-
const remaining = deadlineMs - Date.now()
|
|
146
|
-
const signal = AbortSignal.timeout(remaining)
|
|
147
|
-
return await handleRequestWithSignal(req, signal)
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
return await handleRequest(req)
|
|
151
|
-
}
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
### Step 3 — Aplicar pattern: queue bound + drop policy
|
|
155
|
-
|
|
156
|
-
Se target tem queue:
|
|
157
|
-
|
|
158
|
-
```ts
|
|
159
|
-
// ANTES
|
|
160
|
-
class MessageProcessor {
|
|
161
|
-
private queue: Message[] = []
|
|
162
|
-
enqueue(msg: Message) {
|
|
163
|
-
this.queue.push(msg) // unbounded
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// DEPOIS
|
|
168
|
-
class MessageProcessor {
|
|
169
|
-
private queue: Message[] = []
|
|
170
|
-
private readonly MAX_SIZE = ${QUEUE_MAX_SIZE}
|
|
171
|
-
private dropCounter = 0
|
|
172
|
-
|
|
173
|
-
enqueue(msg: Message) {
|
|
174
|
-
if (this.queue.length >= this.MAX_SIZE) {
|
|
175
|
-
this.queue.shift() // drop oldest (FIFO drop)
|
|
176
|
-
this.dropCounter++
|
|
177
|
-
// emit metric
|
|
178
|
-
metrics.counter('queue_drops_total').inc({ reason: 'overflow' })
|
|
179
|
-
}
|
|
180
|
-
this.queue.push(msg)
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
```
|
|
184
|
-
|
|
185
|
-
### Step 4 — Aplicar pattern: server-side rate limit
|
|
186
|
-
|
|
187
|
-
```ts
|
|
188
|
-
// PATCH: token bucket rate limiter
|
|
189
|
-
import { TokenBucket } from '../_shared/token-bucket.ts'
|
|
190
|
-
|
|
191
|
-
const rateLimiter = new TokenBucket({
|
|
192
|
-
tokensPerInterval: 100, // 100 req/s/client
|
|
193
|
-
interval: 'second',
|
|
194
|
-
})
|
|
195
|
-
|
|
196
|
-
Deno.serve(async (req) => {
|
|
197
|
-
const clientId = req.headers.get('x-api-key') ?? req.headers.get('x-forwarded-for') ?? 'anonymous'
|
|
198
|
-
|
|
199
|
-
if (!rateLimiter.tryConsume(clientId, 1)) {
|
|
200
|
-
return new Response('Too Many Requests', {
|
|
201
|
-
status: 429,
|
|
202
|
-
headers: { 'Retry-After': '1' },
|
|
203
|
-
})
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
return await handleWithDeadline(req)
|
|
207
|
-
})
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
### Step 5 — Aplicar pattern: slow start na recovery
|
|
211
|
-
|
|
212
|
-
```ts
|
|
213
|
-
// PATCH: slow start state machine
|
|
214
|
-
class SlowStartGate {
|
|
215
|
-
private acceptanceRatio = 1.0
|
|
216
|
-
private startedAt: number | null = null
|
|
217
|
-
private rampMs = 5 * 60 * 1000 // 5 min
|
|
218
|
-
|
|
219
|
-
recoveryDetected(): void {
|
|
220
|
-
this.acceptanceRatio = 0.1
|
|
221
|
-
this.startedAt = Date.now()
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
shouldAccept(): boolean {
|
|
225
|
-
if (this.acceptanceRatio >= 1.0) return true
|
|
226
|
-
if (!this.startedAt) return true
|
|
227
|
-
const elapsed = Date.now() - this.startedAt
|
|
228
|
-
const progress = Math.min(elapsed / this.rampMs, 1.0)
|
|
229
|
-
this.acceptanceRatio = 0.1 + 0.9 * progress
|
|
230
|
-
return Math.random() < this.acceptanceRatio
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
```
|
|
234
|
-
|
|
235
|
-
### Step 6 — Verify e Output
|
|
236
|
-
|
|
237
|
-
```bash
|
|
238
|
-
# 1. Compilação verde após patches
|
|
239
|
-
deno check "$TARGET_PATH" 2>&1 | head -5
|
|
240
|
-
|
|
241
|
-
# 2. Verificar imports adicionados
|
|
242
|
-
grep -E "load-shedder|deadline|rate-limit|slow-start" "$TARGET_PATH"
|
|
243
|
-
|
|
244
|
-
# 3. Smoke run mental — handler ainda chama lógica core
|
|
245
|
-
grep -E "handleRequest|handleWithDeadline" "$TARGET_PATH" | head -3
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
Output:
|
|
249
|
-
|
|
250
|
-
```text
|
|
251
|
-
═══════════════════════════════════════════════════════════
|
|
252
|
-
LOAD-SHEDDING-INSTRUMENTER · <target>
|
|
253
|
-
═══════════════════════════════════════════════════════════
|
|
254
|
-
|
|
255
|
-
## Patches aplicados
|
|
256
|
-
✓ Concurrency limit (maxConcurrent=${MAX_CONCURRENT})
|
|
257
|
-
✓ Deadline-aware handler (x-deadline-ms header)
|
|
258
|
-
✓ Queue bound + drop oldest (max=${QUEUE_MAX_SIZE})
|
|
259
|
-
✓ Server-side rate limit (token bucket, 100 req/s/client)
|
|
260
|
-
✓ Slow start state machine (5 min ramp)
|
|
261
|
-
|
|
262
|
-
## Arquivos modificados
|
|
263
|
-
- $TARGET_PATH
|
|
264
|
-
- supabase/functions/_shared/load-shedder.ts (criado)
|
|
265
|
-
- supabase/functions/_shared/token-bucket.ts (criado)
|
|
266
|
-
|
|
267
|
-
## Próximos passos
|
|
268
|
-
1. Smoke local: enviar request, verificar 200 OK
|
|
269
|
-
2. Stress test: rampar tráfego acima de maxConcurrent, verificar 503 + Retry-After
|
|
270
|
-
3. Game day exercise — verificar slow start em recovery
|
|
271
|
-
4. /golden-signals <fn> — instrumentar saturation gauge (cross-suite v1.10)
|
|
272
|
-
5. /caracterizar <fn> — characterization tests pós-patches (cross-suite v1.12)
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
## Quando NÃO invocar
|
|
276
|
-
|
|
277
|
-
- Função batch/cron (não user-facing) — load shedding overhead
|
|
278
|
-
- Edge Function com tráfego baixíssimo (< 1 req/min)
|
|
279
|
-
- Arquivo já tem load shedding — re-rodar pode duplicar imports
|
|
280
|
-
|
|
281
|
-
## Ver também
|
|
282
|
-
|
|
283
|
-
- [`load-shedding-graceful-degradation`](../skills/load-shedding-graceful-degradation/SKILL.md)
|
|
284
|
-
- [`cascading-failures`](../skills/cascading-failures/SKILL.md) — caller-side coopera
|
|
285
|
-
- [`retry-strategies`](../skills/retry-strategies/SKILL.md) — Retry-After respeito
|
|
286
|
-
- [`four-golden-signals`](../skills/four-golden-signals/SKILL.md) (v1.10) — Saturation gauge dispara load shed
|
|
287
|
-
- [`cascading-failures-auditor`](./cascading-failures-auditor.md) (v1.11) — agent complementar
|
|
288
|
-
- [`supabase-edge-fn-writer`](./supabase-edge-fn-writer.md) (v1.8 + patch v1.11) — Edge Functions ganham load shed built-in
|
|
289
|
-
|
|
290
|
-
*Material-fonte: cap 22 livro Google SRE.*
|
|
1
|
+
---
|
|
2
|
+
name: load-shedding-instrumenter
|
|
3
|
+
tier: specialized
|
|
4
|
+
description: Aplica patches de load shedding em código (queue depth gauge, drop policy, deadline-aware handler via AbortSignal, server-side rate limit). Foca em Edge Functions e serviços HTTP.
|
|
5
|
+
tools: Read, Write, Edit, Bash, Grep, Glob
|
|
6
|
+
color: orange
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
Você é o **instrumentador de load shedding**. Recebe `target_path` (Edge Function ou handler HTTP) e aplica patches via Edit tool: queue depth gauge, drop policy, deadline-aware handler, server-side rate limit, slow start na recovery.
|
|
10
|
+
|
|
11
|
+
Você consulta:
|
|
12
|
+
- [`load-shedding-graceful-degradation`](../skills/load-shedding-graceful-degradation/SKILL.md)
|
|
13
|
+
- [`retry-strategies`](../skills/retry-strategies/SKILL.md) — caller-side coopera com server-side
|
|
14
|
+
- [`four-golden-signals`](../skills/four-golden-signals/SKILL.md) (v1.10) — Saturation gauge é trigger
|
|
15
|
+
|
|
16
|
+
**Compat:** Full em todos os IDEs (filesystem-only). Veja [COMPATIBILITY.md](../COMPATIBILITY.md).
|
|
17
|
+
|
|
18
|
+
## Por que existe
|
|
19
|
+
|
|
20
|
+
Load shedding é cross-cutting concern — server detecta saturation E rejeita 503 graceful E dispara observability E não cai. Sem template canônico, cada equipe reinventa de forma frágil. Esse agent aplica os 5 patterns canônicos em código existente, preservando lógica core.
|
|
21
|
+
|
|
22
|
+
## Inputs esperados (do caller)
|
|
23
|
+
|
|
24
|
+
- `target_path`: arquivo a instrumentar (Edge Function ou handler HTTP)
|
|
25
|
+
- (Opcional) `patterns`: subset de `[concurrency-limit, queue-bound, deadline-aware, rate-limit, slow-start]` (default: todos aplicáveis)
|
|
26
|
+
- (Opcional) `max_concurrent`: default 1000
|
|
27
|
+
- (Opcional) `cpu_threshold`: default 90
|
|
28
|
+
- (Opcional) `queue_max_size`: default 10000
|
|
29
|
+
|
|
30
|
+
## Passos
|
|
31
|
+
|
|
32
|
+
### Step 0 — Preflight
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
TARGET_PATH="${target_path}"
|
|
36
|
+
[ ! -f "$TARGET_PATH" ] && { echo "ERROR: $TARGET_PATH not found"; exit 1; }
|
|
37
|
+
|
|
38
|
+
# detectar runtime
|
|
39
|
+
case "$TARGET_PATH" in
|
|
40
|
+
*.ts|*.tsx|*.js|*.mjs)
|
|
41
|
+
RUNTIME="node-deno"
|
|
42
|
+
;;
|
|
43
|
+
*.py)
|
|
44
|
+
RUNTIME="python"
|
|
45
|
+
;;
|
|
46
|
+
*)
|
|
47
|
+
echo "ERROR: runtime não suportado: $TARGET_PATH"
|
|
48
|
+
exit 1
|
|
49
|
+
;;
|
|
50
|
+
esac
|
|
51
|
+
|
|
52
|
+
# detectar tipo de handler
|
|
53
|
+
HANDLER_TYPE=""
|
|
54
|
+
if grep -q "Deno.serve" "$TARGET_PATH"; then
|
|
55
|
+
HANDLER_TYPE="deno-serve"
|
|
56
|
+
elif grep -qE "app\.(post|get|put)" "$TARGET_PATH"; then
|
|
57
|
+
HANDLER_TYPE="express-like"
|
|
58
|
+
fi
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
### Step 1 — Aplicar pattern: concurrency limit + 503 graceful
|
|
62
|
+
|
|
63
|
+
Para Deno Edge Function:
|
|
64
|
+
|
|
65
|
+
```ts
|
|
66
|
+
// PATCH: shared load shedder
|
|
67
|
+
// Criar arquivo se não existe: supabase/functions/_shared/load-shedder.ts
|
|
68
|
+
|
|
69
|
+
interface LoadShedderOpts {
|
|
70
|
+
maxConcurrent: number
|
|
71
|
+
cpuThreshold?: number
|
|
72
|
+
saturationGauge?: () => Promise<number>
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export class LoadShedder {
|
|
76
|
+
private inFlight = 0
|
|
77
|
+
constructor(private opts: LoadShedderOpts) {}
|
|
78
|
+
|
|
79
|
+
async tryAcquire(): Promise<{ ok: true } | { ok: false; reason: string; retryAfterSec: number }> {
|
|
80
|
+
if (this.inFlight >= this.opts.maxConcurrent) {
|
|
81
|
+
return { ok: false, reason: 'concurrency_limit', retryAfterSec: 5 }
|
|
82
|
+
}
|
|
83
|
+
if (this.opts.saturationGauge) {
|
|
84
|
+
const sat = await this.opts.saturationGauge()
|
|
85
|
+
if (sat > 0.95) {
|
|
86
|
+
return { ok: false, reason: 'saturation', retryAfterSec: 30 }
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
this.inFlight++
|
|
90
|
+
return { ok: true }
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
release(): void {
|
|
94
|
+
this.inFlight = Math.max(0, this.inFlight - 1)
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
PATCH no handler target:
|
|
100
|
+
|
|
101
|
+
```ts
|
|
102
|
+
// ANTES
|
|
103
|
+
Deno.serve(async (req) => {
|
|
104
|
+
return await handleRequest(req)
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
// DEPOIS
|
|
108
|
+
import { LoadShedder } from '../_shared/load-shedder.ts'
|
|
109
|
+
|
|
110
|
+
const shedder = new LoadShedder({ maxConcurrent: ${MAX_CONCURRENT} })
|
|
111
|
+
|
|
112
|
+
Deno.serve(async (req) => {
|
|
113
|
+
const acq = await shedder.tryAcquire()
|
|
114
|
+
if (!acq.ok) {
|
|
115
|
+
return new Response('Service Unavailable', {
|
|
116
|
+
status: 503,
|
|
117
|
+
headers: {
|
|
118
|
+
'Retry-After': String(acq.retryAfterSec),
|
|
119
|
+
'X-Shed-Reason': acq.reason,
|
|
120
|
+
'Content-Type': 'application/json',
|
|
121
|
+
},
|
|
122
|
+
})
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
return await handleRequest(req)
|
|
126
|
+
} finally {
|
|
127
|
+
shedder.release()
|
|
128
|
+
}
|
|
129
|
+
})
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Step 2 — Aplicar pattern: deadline-aware handler
|
|
133
|
+
|
|
134
|
+
```ts
|
|
135
|
+
// PATCH: deadline-aware wrapper
|
|
136
|
+
async function handleWithDeadline(req: Request): Promise<Response> {
|
|
137
|
+
const deadlineHeader = req.headers.get('x-deadline-ms')
|
|
138
|
+
const deadlineMs = deadlineHeader ? parseInt(deadlineHeader, 10) : null
|
|
139
|
+
|
|
140
|
+
if (deadlineMs && Date.now() > deadlineMs) {
|
|
141
|
+
return new Response('Deadline Exceeded', { status: 408 })
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (deadlineMs) {
|
|
145
|
+
const remaining = deadlineMs - Date.now()
|
|
146
|
+
const signal = AbortSignal.timeout(remaining)
|
|
147
|
+
return await handleRequestWithSignal(req, signal)
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return await handleRequest(req)
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Step 3 — Aplicar pattern: queue bound + drop policy
|
|
155
|
+
|
|
156
|
+
Se target tem queue:
|
|
157
|
+
|
|
158
|
+
```ts
|
|
159
|
+
// ANTES
|
|
160
|
+
class MessageProcessor {
|
|
161
|
+
private queue: Message[] = []
|
|
162
|
+
enqueue(msg: Message) {
|
|
163
|
+
this.queue.push(msg) // unbounded
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// DEPOIS
|
|
168
|
+
class MessageProcessor {
|
|
169
|
+
private queue: Message[] = []
|
|
170
|
+
private readonly MAX_SIZE = ${QUEUE_MAX_SIZE}
|
|
171
|
+
private dropCounter = 0
|
|
172
|
+
|
|
173
|
+
enqueue(msg: Message) {
|
|
174
|
+
if (this.queue.length >= this.MAX_SIZE) {
|
|
175
|
+
this.queue.shift() // drop oldest (FIFO drop)
|
|
176
|
+
this.dropCounter++
|
|
177
|
+
// emit metric
|
|
178
|
+
metrics.counter('queue_drops_total').inc({ reason: 'overflow' })
|
|
179
|
+
}
|
|
180
|
+
this.queue.push(msg)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
### Step 4 — Aplicar pattern: server-side rate limit
|
|
186
|
+
|
|
187
|
+
```ts
|
|
188
|
+
// PATCH: token bucket rate limiter
|
|
189
|
+
import { TokenBucket } from '../_shared/token-bucket.ts'
|
|
190
|
+
|
|
191
|
+
const rateLimiter = new TokenBucket({
|
|
192
|
+
tokensPerInterval: 100, // 100 req/s/client
|
|
193
|
+
interval: 'second',
|
|
194
|
+
})
|
|
195
|
+
|
|
196
|
+
Deno.serve(async (req) => {
|
|
197
|
+
const clientId = req.headers.get('x-api-key') ?? req.headers.get('x-forwarded-for') ?? 'anonymous'
|
|
198
|
+
|
|
199
|
+
if (!rateLimiter.tryConsume(clientId, 1)) {
|
|
200
|
+
return new Response('Too Many Requests', {
|
|
201
|
+
status: 429,
|
|
202
|
+
headers: { 'Retry-After': '1' },
|
|
203
|
+
})
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return await handleWithDeadline(req)
|
|
207
|
+
})
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Step 5 — Aplicar pattern: slow start na recovery
|
|
211
|
+
|
|
212
|
+
```ts
|
|
213
|
+
// PATCH: slow start state machine
|
|
214
|
+
class SlowStartGate {
|
|
215
|
+
private acceptanceRatio = 1.0
|
|
216
|
+
private startedAt: number | null = null
|
|
217
|
+
private rampMs = 5 * 60 * 1000 // 5 min
|
|
218
|
+
|
|
219
|
+
recoveryDetected(): void {
|
|
220
|
+
this.acceptanceRatio = 0.1
|
|
221
|
+
this.startedAt = Date.now()
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
shouldAccept(): boolean {
|
|
225
|
+
if (this.acceptanceRatio >= 1.0) return true
|
|
226
|
+
if (!this.startedAt) return true
|
|
227
|
+
const elapsed = Date.now() - this.startedAt
|
|
228
|
+
const progress = Math.min(elapsed / this.rampMs, 1.0)
|
|
229
|
+
this.acceptanceRatio = 0.1 + 0.9 * progress
|
|
230
|
+
return Math.random() < this.acceptanceRatio
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Step 6 — Verify e Output
|
|
236
|
+
|
|
237
|
+
```bash
|
|
238
|
+
# 1. Compilação verde após patches
|
|
239
|
+
deno check "$TARGET_PATH" 2>&1 | head -5
|
|
240
|
+
|
|
241
|
+
# 2. Verificar imports adicionados
|
|
242
|
+
grep -E "load-shedder|deadline|rate-limit|slow-start" "$TARGET_PATH"
|
|
243
|
+
|
|
244
|
+
# 3. Smoke run mental — handler ainda chama lógica core
|
|
245
|
+
grep -E "handleRequest|handleWithDeadline" "$TARGET_PATH" | head -3
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Output:
|
|
249
|
+
|
|
250
|
+
```text
|
|
251
|
+
═══════════════════════════════════════════════════════════
|
|
252
|
+
LOAD-SHEDDING-INSTRUMENTER · <target>
|
|
253
|
+
═══════════════════════════════════════════════════════════
|
|
254
|
+
|
|
255
|
+
## Patches aplicados
|
|
256
|
+
✓ Concurrency limit (maxConcurrent=${MAX_CONCURRENT})
|
|
257
|
+
✓ Deadline-aware handler (x-deadline-ms header)
|
|
258
|
+
✓ Queue bound + drop oldest (max=${QUEUE_MAX_SIZE})
|
|
259
|
+
✓ Server-side rate limit (token bucket, 100 req/s/client)
|
|
260
|
+
✓ Slow start state machine (5 min ramp)
|
|
261
|
+
|
|
262
|
+
## Arquivos modificados
|
|
263
|
+
- $TARGET_PATH
|
|
264
|
+
- supabase/functions/_shared/load-shedder.ts (criado)
|
|
265
|
+
- supabase/functions/_shared/token-bucket.ts (criado)
|
|
266
|
+
|
|
267
|
+
## Próximos passos
|
|
268
|
+
1. Smoke local: enviar request, verificar 200 OK
|
|
269
|
+
2. Stress test: rampar tráfego acima de maxConcurrent, verificar 503 + Retry-After
|
|
270
|
+
3. Game day exercise — verificar slow start em recovery
|
|
271
|
+
4. /golden-signals <fn> — instrumentar saturation gauge (cross-suite v1.10)
|
|
272
|
+
5. /caracterizar <fn> — characterization tests pós-patches (cross-suite v1.12)
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
## Quando NÃO invocar
|
|
276
|
+
|
|
277
|
+
- Função batch/cron (não user-facing) — load shedding overhead
|
|
278
|
+
- Edge Function com tráfego baixíssimo (< 1 req/min)
|
|
279
|
+
- Arquivo já tem load shedding — re-rodar pode duplicar imports
|
|
280
|
+
|
|
281
|
+
## Ver também
|
|
282
|
+
|
|
283
|
+
- [`load-shedding-graceful-degradation`](../skills/load-shedding-graceful-degradation/SKILL.md)
|
|
284
|
+
- [`cascading-failures`](../skills/cascading-failures/SKILL.md) — caller-side coopera
|
|
285
|
+
- [`retry-strategies`](../skills/retry-strategies/SKILL.md) — Retry-After respeito
|
|
286
|
+
- [`four-golden-signals`](../skills/four-golden-signals/SKILL.md) (v1.10) — Saturation gauge dispara load shed
|
|
287
|
+
- [`cascading-failures-auditor`](./cascading-failures-auditor.md) (v1.11) — agent complementar
|
|
288
|
+
- [`supabase-edge-fn-writer`](./supabase-edge-fn-writer.md) (v1.8 + patch v1.11) — Edge Functions ganham load shed built-in
|
|
289
|
+
|
|
290
|
+
*Material-fonte: cap 22 livro Google SRE.*
|