|
496 | 496 | - [x] Modelar endpoint, subscription, secret, filter e delivery attempt. Evidência F0-034: domínios canônicos, registro transacional, cinco tabelas, constraints e regressões de segurança. |
497 | 497 | - [x] Implementar challenge, assinatura, timestamp e anti-replay. Evidência F0-035/F0-036: challenge durável one-shot, HMAC dos bytes exatos, janela de timestamp, receipt anti-replay e transporte HTTPS pinado com resolução DNS fail-closed. |
498 | 498 | - [x] Implementar at-least-once, backoff, dead-letter e replay controlado. Evidência F0-031/F0-046: render possui lease/fencing, backoff, checkpoint, dead-letter e retry manual; webhooks possuem outbox/fan-out, claim/lease/fencing, dispatch assinado, transporte DNS-pinado, heartbeat, discovery, coordenação durável de shards, secret provider configurado, entrypoint operacional, backoff, dead-letter e replay idempotente individual ou por evento exato. Replay por intervalo permanece enhancement administrativo separado. |
499 | | -- [ ] Criar UI/API administrativa de status, attempts e rotação de secret. Parcial F0-042/F0-044/F0-047/F0-048/F0-049: API externa lista/lê endpoints, subscriptions e deliveries, executa replay e altera lifecycle de endpoints/subscriptions; UI, criação/challenge e rotação de secret continuam abertas. |
| 499 | +- [ ] Criar UI/API administrativa de status, attempts e rotação de secret. Parcial F0-042/F0-044/F0-047/F0-048/F0-049/F0-050: API externa lista/lê endpoints, subscriptions e deliveries, cria subscriptions com filtros exatos, executa replay e altera lifecycle de endpoints/subscriptions; UI, criação/challenge de endpoint e rotação de secret continuam abertas. |
500 | 500 | - [x] Criar integration tests de duplicação, timeout, assinatura inválida e replay. Evidência F0-035/F0-043: assinatura adulterada, anti-replay durável, deadline absoluto, DNS/rebinding, claim concorrente, lease/fencing, retry/dead-letter e replay administrativo idempotente estão cobertos em contratos, Prisma e HTTP. |
501 | 501 |
|
502 | 502 | ### F0.039 — Idempotência e concorrência externa [FR-245] |
|
539 | 539 | ### F0.043 — Governança da API [FR-249] |
540 | 540 |
|
541 | 541 | - [ ] Criar administração de clients, scopes, secrets, environments e status. |
542 | | -- [ ] Criar administração de webhooks, subscriptions e delivery diagnostics. Parcial F0-042/F0-044/F0-047/F0-048/F0-049: capabilities de endpoints, subscriptions, deliveries e replay entregam consulta, lifecycle com cascatas e replay workspace-scoped; criação, challenge, rotação e UI continuam abertas. |
| 542 | +- [ ] Criar administração de webhooks, subscriptions e delivery diagnostics. Parcial F0-042/F0-044/F0-047/F0-048/F0-049/F0-050: capabilities de endpoints, subscriptions, deliveries e replay entregam consulta, criação idempotente de subscription, lifecycle com cascatas e replay workspace-scoped; criação/challenge de endpoint, rotação e UI continuam abertas. |
543 | 543 | - [ ] Implementar rate limits, quotas, concurrency e spend budgets por client/workspace. |
544 | 544 | - [ ] Criar usage e audit queries paginadas com redaction. |
545 | 545 | - [ ] Criar sandbox isolado com provider fakes e custos simulados. |
@@ -3991,7 +3991,7 @@ Limites explícitos desta slice: |
3991 | 3991 |
|
3992 | 3992 | ### Slice F0-049 — Lifecycle e cascatas de endpoints de webhook |
3993 | 3993 |
|
3994 | | -**Status:** concluído localmente em 15 de julho de 2026; ainda não commitado. |
| 3994 | +**Status:** publicado no `main` em 15 de julho de 2026 (`47faab8`); hosted CI `29445313005` aprovada. |
3995 | 3995 |
|
3996 | 3996 | Entregas: |
3997 | 3997 |
|
@@ -4026,3 +4026,34 @@ Limites explícitos desta slice: |
4026 | 4026 | - criação e alteração de filtros de subscription permanecem abertas; |
4027 | 4027 | - rotação de signing secret e reload dinâmico de provider permanecem abertas; |
4028 | 4028 | - UI administrativa, audit query, métricas e alertas operacionais continuam futuros. |
| 4029 | + |
| 4030 | +### Slice F0-050 — Criação externa idempotente de subscriptions |
| 4031 | + |
| 4032 | +**Status:** concluído localmente em 15 de julho de 2026; ainda não commitado. |
| 4033 | + |
| 4034 | +Entregas: |
| 4035 | + |
| 4036 | +- capability `apollo.webhooks.subscriptions.create` expõe `POST /v1/webhooks/subscriptions` sob `webhooks:admin`; |
| 4037 | +- body fechado aceita endpoint, tipos do catálogo e IDs de recurso opcionais, sempre convertidos para filtro canônico exato; |
| 4038 | +- `Idempotency-Key` obrigatória é vinculada a workspace, API client, endpoint e hash do filtro; |
| 4039 | +- primeira criação retorna 201; repetição idêntica retorna o mesmo recurso com 200 e `replayed: true`; |
| 4040 | +- mesma chave com payload diferente retorna `IDEMPOTENCY_PAYLOAD_MISMATCH`; filtro idêntico com outra chave retorna `WEBHOOK_SUBSCRIPTION_ALREADY_EXISTS`; |
| 4041 | +- ledger e subscription são gravados atomicamente em transação serializável; |
| 4042 | +- endpoint ativo cria subscription ativa; endpoint pendente cria subscription pendente; suspenso ou revogado rejeita o command; |
| 4043 | +- resposta reutiliza presenter redigido e não expõe workspace, URL, `filterHash`, secrets ou ledger; |
| 4044 | +- ADR-039 formaliza idempotência, unicidade exata, estados iniciais e concorrência. |
| 4045 | + |
| 4046 | +Regressões e evidências locais: |
| 4047 | + |
| 4048 | +- suíte global passa com 108 testes; 40 são contratos de webhook; |
| 4049 | +- integração Prisma cobre criação pendente, replay, payload divergente, filtro duplicado e ausência de duplicação; |
| 4050 | +- jornada HTTP cobre OpenAPI, 201/200, chave ausente, replay, conflitos distintos e 403 sem scope; |
| 4051 | +- contratos públicos passam com 38 capabilities, 46 schemas, 62 exemplos e 34 paths; |
| 4052 | +- build registra `POST /v1/webhooks/subscriptions` junto do GET existente; |
| 4053 | +- integração de webhook e jornada pública passam no protótipo SQLite. |
| 4054 | + |
| 4055 | +Limites explícitos desta slice: |
| 4056 | + |
| 4057 | +- criação, alteração de URL e challenge público de endpoint continuam abertos; |
| 4058 | +- alteração de filtro de subscription permanece um command futuro separado; |
| 4059 | +- rotação de signing secret, UI administrativa, audit query, métricas e alertas continuam futuros. |
0 commit comments