# F4: execução da collection Partner API contra HML (2026-07-18)

Validação viva (G3) da frente F4 sobre o HML `core-api:166` (rollout COMPLETED, running 1/1), como parceiro OAuth (credencial do Secrets Manager `monetarie/homolog/partner/herbeth-santana/api_credentials`), via túnel SSM `127.0.0.1:18080` para o ALB interno com roteamento por Host header (`coreapi-h.monetarie.internal`). Nenhuma credencial foi gravada em arquivo versionado.

**Regra de escopo desta execução (G3 do plano mestre, instrução do orquestrador):** somente operações seguras foram executadas, isto é, GET de consulta e POST idempotente de consulta/QR de teste. Nenhum POST de money-path (envio de PIX, devolução, TED, transferência interna) e nenhuma mutação de cadastro (criar cliente, registrar/excluir chave, bloquear/desbloquear/encerrar conta, CRUD de webhook, claims, MED). Esses itens ficam marcados como "janela do orquestrador" e a receita de execução é a própria collection (pastas correspondentes) na janela combinada.

Executor: `scripts/partner_validation_report/harness.py` (harness versionado da frente; grava ledger JSONL de evidências usado pelo relatório do cliente da Task 15). Resultado geral: **27/27 verificações conformes, zero divergências**.

## Resultado por request

| Pasta / request | Esperado | Obtido |
|---|---|---|
| OAuth: Obter token | 200 com access_token | **200** (82ms), token emitido |
| OAuth: Verificar credencial (ping) | 200 `{"status":"ok","partner_id":...}` | **200** (45ms), `status: "ok"` + `partner_id` da credencial |
| Clientes: criar / consultar / conta adicional | 201 / 200 / 201 | janela do orquestrador (mutação de cadastro) |
| Contas: listar | 200 | **200** (166ms), contas do parceiro listadas |
| Contas: detalhar | 200 | **200** (60ms), conta 10024414 |
| Contas: saldo | 200 | **200** (51ms) |
| Contas: extrato | 200 | **200** (679ms) |
| Contas: comprovante (exemplo estático inexistente) | 404 recusa esperada | **404** (68ms), recusa de proteção correta |
| Contas: limites GET | 200 | **200** (112ms) |
| Contas: limites PUT | 200 | janela do orquestrador (mutação) |
| Contas: block/unblock/close | 200 em conta descartável | janela do orquestrador (mutação; exige conta descartável criada na rodada) |
| PIX: registrar chave EVP / excluir chave | 202 / 202 | janela do orquestrador (mutação DICT) |
| PIX: listar chaves | 200 | **200** (77ms) |
| PIX: consultar chave externa (DICT) | 200 found ou not_found legítimo | **404** (120ms) para chave inexistente, recusa legítima do diretório |
| PIX: QR estático valor aberto | 201, brcode SEM tag 54, CRC válido | **201** (167ms); decode EMV local: tag 54 AUSENTE, CRC **MATCH** |
| PIX: QR estático valor fixo | 201, tag 54 presente, CRC válido | **201** (224ms); tag 54 = `1.01` (amount 101 centavos), CRC **MATCH** |
| PIX: decodificar BR Code | 200 com o brcode gerado | **200** (56ms), campos interpretados do QR fixo |
| PIX: enviar PIX R$0,01 | 202 (desfecho RJCT AB09 esperado em HML) | janela do orquestrador (money-path) |
| PIX: status (id inexistente) | 404 | **404** (43ms) |
| PIX: devolver (POST /refund) | 404/422 recusa de proteção no teste negativo | janela do orquestrador (POST em endpoint de money-path, mesmo negativo) |
| PIX: trilha de devoluções (id inexistente) | 404 | **404** (55ms), rota nova viva |
| PIX: criar cobrança / CobV | 201 / 201 | janela do orquestrador (mantido fora por escopo conservador da rodada) |
| PIX: consultar cobrança (id inexistente) | 404 | **404** (46ms) |
| PIX: claims criar/confirmar/cancelar | 4xx recusa em HML sem contraparte | janela do orquestrador (mutação DICT) |
| PIX: claims consultar (id sintético) | 404 | **404** (55ms) |
| PIX: MED abrir | 422 recusa com e2e inexistente | janela do orquestrador (mutação) |
| PIX: MED consultar (id sintético) | 404 | **404** (57ms) |
| Transferências: TED / interna | 202 | janela do orquestrador (money-path) |
| Transferências: status (id inexistente) | 404 | **404** (46ms) |
| Transferências: criar/excluir favorito | 201 / 200 | janela do orquestrador (mutação) |
| Transferências: listar favoritos | 200 | **200** (75ms) |
| Tarifas: catálogo / cobradas | 200 / 200 | **200** (68ms) / **200** (62ms) |
| Webhooks: events | 200 com os 35 eventos do catálogo | **200** (49ms), **35 eventos**, contagem igual a `Webhook.valid_events()` |
| Webhooks: listar | 200 | **200** (67ms) |
| Webhooks: CRUD + rotate + test + replay | 201/200/.../404 | janela do orquestrador (mutação) |

## Verificações adicionais (fora da tabela da collection)

- QR estático em aberto: decode EMV local confirma ausência da tag 54 e CRC16-CCITT conferido byte a byte (MATCH).
- QR estático fixo: tag 54 presente com `1.01` e CRC MATCH; o mesmo brcode foi aceito pelo endpoint `POST /pix/brcode/decode` (200).
- Catálogo `GET /webhooks/events`: 35 eventos, batendo 1:1 com o catálogo do código (o gate de paridade da frente valida a mesma lista contra o portal e a collection).

## Triagem de divergências

Nenhuma divergência entre esperado e obtido nas 27 verificações executadas. Nenhum defeito de doc novo e nenhum defeito de API observado nesta rodada.

## Pendências para a janela do orquestrador

Executar, na janela combinada (nunca durante operação de money-path ao vivo do dono), as pastas restantes da collection: Clientes (criar/consultar/conta adicional), Contas (limites PUT, block/unblock/close em conta descartável), PIX (registrar/excluir chave EVP, enviar PIX R$0,01, devolver PIX com testes negativo e positivo, criar cobrança e CobV, claims, MED), Transferências (TED, interna, favoritos create/delete) e Webhooks (CRUD completo + rotate + test + replay). O harness da Task 15 anexa essas evidências ao PDF v2.
