Três camadas de extensão

Config declarativa, código extensível e core LTS — sem fork por cliente.

CamadaQuem editaUpgrade
Config (manifest, features, workflows)Mirá + cliente (YAML)Git + deploy
Plugins GoMirá / backend customsemver plugin + compatibleCore
Apps UX substituíveisMirá, parceiro ou clientenpm pin + deploy front
Core LTSMirá platformPin LTS no manifest

Contrato de compatibilidade

O core pode evoluir sem quebrar plugins pinados. Breaking só com major do protocolo + notificação.

Mudança no corePlugin existenteQuem age
Aditiva (hook novo, campo opcional, refactor interno)Continua no pin actualNinguém obrigatório
Patch CVE na mesma linha LTSContinuaCliente só se bumpa o pin da imagem
Breaking (hook removido, deny code, campo obrigatório)Fora do range após CoreLine majorAutor do plugin no upgrade; cliente opt-in

Plugin declara compatibleCore (ex. ^0.2.0) contra commerceext.CoreLine. Breaking sobe 0.2 → 1.0, nunca 0.3. Notificação: Release do commerce-ext + issues nos templates. Detalhe: docs/extensibility-model.md · ADR 0048.

Estado de implementação

Atualize esta tabela no repo ao entregar cada componente.

ComponenteDocumentadoCódigoNotas
OpenAPI contrato
Documentado
Protótipo
Fase 2a: handlers Go
MCP tools (6)
Documentado
Protótipo
Mock explorer → servidor real
Extension Protocol
Documentado
Documentado
commerce-ext/ in-process
Extension Host
Documentado
Documentado
internal/ext Bootstrap
Hook points (10+)
Documentado
Documentado
10/10 wired
Event bus
Documentado
Protótipo
In-process · outbox Fase 3a
Workflow YAML
Documentado
Protótipo
UX protótipo; engine Fase 3a
manifest.yaml cliente
Documentado
Planejado
Fase 4 template

Extension Protocol — regras

Contrato entre core LTS e plugins. Pacote público: commerce-ext (Go). Plugins nunca importam core/internal/*.

RegraMotivo
Interfaces pequenas e estáveisSemver previsível
Plugin só importa commerce-extIsolamento
Extensões declaradas em manifest.yamlCI auditable
Negócio no core ou pluginNunca metade no front
Eventos at-least-onceHandlers idempotentes
Falha de plugin não derruba processoDegradação controlada

Manifest do plugin (referência)

kind: Plugin — reference-antifraud (in-process)
apiVersion: commerce.mira.dev/v1
kind: Plugin

id: reference-antifraud
version: 1.0.0
compatibleCore: "^0.2.0"

runtime:
  type: in-process
  binary: extensions/reference-antifraud

capabilities:
  hooks:
    - checkout.risk_assess
  events:
    subscribe:
      - payment.attempt.failed
      - payment.attempt.blocked

Verify: go run ./cmd/commerce-ext verify --manifest extensions/reference-antifraud/manifest.yaml

Hook points v1 (síncronos)

Timeout default 300ms · panic capturado → PLUGIN_FAILURE.

HookMomentoPode bloquear?
checkout.validateAntes criar/submeter pedidoSim
checkout.quote_adjustAjuste de totaisSim
order.pre_confirmAntes confirmarSim
order.pre_cancelAntes cancelarSim
payment.routeRota gateway/splitSim
catalog.price_resolvePreço final SKUSim
inventory.allocateReserva estoqueSim
member.eligibilityElegibilidade revendedorSim
integration.transform_outboundPayload ERP saídaTransform
integration.transform_inboundPayload ERP entradaTransform

Eventos core (assíncronos)

Plugins publicam eventos namespaced, ex.: acme.erp.synced.

EventoQuando
order.createdPedido criado
order.confirmedConfirmado
order.cancelledCancelado
payment.authorizedPagamento autorizado
payment.capturedCaptura
inventory.reservedReserva
inventory.releasedLiberação

Manifest cliente (repo deploy)

Pin do core LTS e módulos opcionais — Fase 4 template.

core:
  image: mira-commerce-core:1.2.4   # pin LTS — nunca :latest em prod
modules:
  member_network: true
  marketplace_split: true
  conversational: true
plugins:
  - id: acme-erp-adapter
    version: 1.0.0
vertical:
  preset: generic-b2c

Verify CI (Fase 2b): commerce-ext verify --manifest manifest.yaml

Checklist — nova extensão

  1. Hook/evento listado em ARCHITECTURE ou ADR novo
  2. Contrato em OpenAPI ou commerce-ext IDL (se exposto a integradores)
  3. Timeout, idempotência e falha degradada documentados
  4. Schema Postgres ext_<plugin> se persistência (ADR 0004)
  5. Exemplo no plugin referência ou mock do protótipo
  6. Atualizar estado de implementação em extensibility-model.md

Anti-patterns

EvitarPreferir
Fork core por clientePin LTS + plugins
Regra de negócio só no ReactAPI + hook
Plugin importa internal/Só commerce-ext
SQL direto em core.*CoreReader / CoreWriter
:latest em produçãoPin no manifest
Breaking silencioso no protocoloADR + CoreLine major + issues nos templates
Forçar upgrade porque o main avançouPin LTS; migrate opt-in