{
  "schema_version": 1,
  "titulo": "Recursos opcionais — a área única",
  "descricao": "Pedido do mantenedor (doc 73, desenho no doc 80): um lugar que mostra tudo o que se liga e desliga, se está ligado e onde se ajusta. Só leitura — quem grava continua sendo a tela de cada assunto. O laço de retorno é o teste: recurso novo com porta no menu que não esteja no catálogo reprova o CI.",
  "lanes": [
    {
      "id": "fontes",
      "label": "Fontes que já existiam"
    },
    {
      "id": "nucleo",
      "label": "lib/recursos-opcionais"
    },
    {
      "id": "telas",
      "label": "Telas"
    },
    {
      "id": "guarda",
      "label": "Laço de retorno"
    }
  ],
  "mainPath": [
    "modulos",
    "catalogo",
    "estado",
    "telaEmpresa"
  ],
  "nodes": [
    {
      "id": "modulos",
      "lane": "fontes",
      "label": "MODULOS_OPCIONAIS",
      "sublabel": "lib/instalacao/modulos.ts · o catálogo deriva daqui, sem lista paralela",
      "type": "lib",
      "dot": "blue"
    },
    {
      "id": "navcatalogo",
      "lane": "fontes",
      "label": "NAV_CATALOG",
      "sublabel": "lib/navigation/catalogo.ts · portas com modulo:/capacidade:",
      "type": "lib",
      "dot": "blue"
    },
    {
      "id": "settings",
      "lane": "fontes",
      "label": "organizations.settings",
      "sublabel": "lido pelos leitores de cada tela (roteamento, conversões, Jev, MFA…)",
      "type": "table",
      "dot": "sky"
    },
    {
      "id": "detectores",
      "lane": "fontes",
      "label": "Detectores do servidor",
      "sublabel": "emailConfigurado, googleEstaConfigurado, appDaMeta, vapidPronto… só booleano",
      "type": "lib",
      "dot": "blue"
    },
    {
      "id": "webhooklog",
      "lane": "fontes",
      "label": "webhook_events_log.valid_signature",
      "sublabel": "gravado por entrega pelas rotas do webhook do WhatsApp",
      "type": "table",
      "dot": "sky"
    },
    {
      "id": "assinatura",
      "lane": "fontes",
      "label": "assinatura-das-entregas.ts",
      "sublabel": "lib/channels · as últimas entregas chegaram assinadas? (doc 99, opção A)",
      "type": "lib",
      "dot": "blue"
    },
    {
      "id": "catalogo",
      "lane": "nucleo",
      "label": "catalogo.ts",
      "sublabel": "RECURSOS_OPCIONAIS + estadoDoRecurso (nunca lança)",
      "type": "lib",
      "dot": "violet"
    },
    {
      "id": "estado",
      "lane": "nucleo",
      "label": "estado.ts",
      "sublabel": "detectarServidor, fontesDaEmpresa · só servidor",
      "type": "lib",
      "dot": "violet"
    },
    {
      "id": "telaAdmin",
      "lane": "telas",
      "label": "/admin/sistema",
      "sublabel": "Recursos opcionais: Módulos, Comportamento, Depende do servidor",
      "type": "ui",
      "dot": "emerald"
    },
    {
      "id": "telaEmpresa",
      "lane": "telas",
      "label": "/app/settings/recursos",
      "sublabel": "Configurações › Sua empresa · manager+ · Ajustar leva à tela da chave",
      "type": "ui",
      "dot": "emerald"
    },
    {
      "id": "teste",
      "lane": "guarda",
      "label": "recursos-opcionais-catalogo.test.ts",
      "sublabel": "reprova módulo/porta fora do catálogo, link morto e texto sem espanhol",
      "type": "test",
      "dot": "amber"
    },
    {
      "id": "testeAssinatura",
      "lane": "guarda",
      "label": "assinatura-das-entregas.test.tsx",
      "sublabel": "regra do sim nas duas direções; sugestão só com o interruptor desligado",
      "type": "test",
      "dot": "amber"
    },
    {
      "id": "ondeaparece",
      "lane": "nucleo",
      "label": "onde-o-modulo-aparece.ts",
      "sublabel": "lib/navigation/ · caminho e grupo lidos do MENU; o grupo do rodapé vira \"Configurações\", que é o que a tela escreve",
      "type": "lib",
      "dot": "blue"
    },
    {
      "id": "interfacemenu",
      "lane": "nucleo",
      "label": "destinosDaInterface",
      "sublabel": "lib/navigation/interface.ts · porta de módulo LIGADO não é filtrada pelo preset enxuto; escolha item-a-item da empresa continua mandando",
      "type": "lib",
      "dot": "blue"
    },
    {
      "id": "menucrm",
      "lane": "telas",
      "label": "Menu do CRM",
      "sublabel": "app/app/layout.tsx → Sidebar · NavHub · CommandPalette · BarraInferior",
      "type": "tela",
      "dot": "green"
    },
    {
      "id": "testeporta",
      "lane": "guarda",
      "label": "porta-do-modulo-ligado.test.tsx",
      "sublabel": "reprova módulo sem resposta de \"onde aparece\" e porta de módulo escondida pelo preset",
      "type": "teste",
      "dot": "amber"
    }
  ],
  "edges": [
    {
      "id": "e1",
      "from": "modulos",
      "to": "catalogo",
      "label": "um item por módulo"
    },
    {
      "id": "e2",
      "from": "navcatalogo",
      "to": "catalogo",
      "label": "porta onde a empresa usa o módulo"
    },
    {
      "id": "e3",
      "from": "settings",
      "to": "estado",
      "label": "lido pela sessão"
    },
    {
      "id": "e4",
      "from": "detectores",
      "to": "estado",
      "label": "configurado / não configurado"
    },
    {
      "id": "e5",
      "from": "estado",
      "to": "catalogo",
      "label": "FontesDeEstado"
    },
    {
      "id": "e6",
      "from": "catalogo",
      "to": "telaAdmin",
      "label": "Depende do servidor"
    },
    {
      "id": "e7",
      "from": "catalogo",
      "to": "telaEmpresa",
      "label": "lista da empresa"
    },
    {
      "id": "e8",
      "from": "navcatalogo",
      "to": "telaEmpresa",
      "label": "porta em Sua empresa"
    },
    {
      "id": "e9",
      "from": "teste",
      "to": "catalogo",
      "label": "reprova recurso fora da lista"
    },
    {
      "id": "e10",
      "from": "teste",
      "to": "navcatalogo",
      "label": "varre as portas condicionadas"
    },
    {
      "id": "e11",
      "from": "webhooklog",
      "to": "assinatura",
      "label": "primeira/última assinada, última sem assinatura (7 dias)"
    },
    {
      "id": "e12",
      "from": "assinatura",
      "to": "telaAdmin",
      "label": "sim/não ao lado do interruptor + 'Pode ligar'"
    },
    {
      "id": "e13",
      "from": "testeAssinatura",
      "to": "assinatura",
      "label": "reprova o sim com número sem assinatura"
    },
    {
      "id": "e14",
      "from": "navcatalogo",
      "to": "ondeaparece",
      "label": "caminho + grupo de cada porta de módulo"
    },
    {
      "id": "e15",
      "from": "ondeaparece",
      "to": "telaAdmin",
      "label": "\"Aparece no menu em: CRM › Empresas\", antes e depois de ligar"
    },
    {
      "id": "e16",
      "from": "modulos",
      "to": "interfacemenu",
      "label": "a lista de ligados decide as portas com modulo:"
    },
    {
      "id": "e17",
      "from": "navcatalogo",
      "to": "interfacemenu",
      "label": "as portas e os papéis"
    },
    {
      "id": "e18",
      "from": "interfacemenu",
      "to": "menucrm",
      "label": "o que o menu mostra"
    },
    {
      "id": "e19",
      "from": "telaAdmin",
      "to": "menucrm",
      "label": "revalidatePath(\"/app\",\"layout\") ao ligar/desligar"
    },
    {
      "id": "e20",
      "from": "testeporta",
      "to": "ondeaparece",
      "label": "todo módulo responde: porta no menu ou onde fica"
    },
    {
      "id": "e21",
      "from": "testeporta",
      "to": "interfacemenu",
      "label": "módulo ligado acende no preset enxuto"
    }
  ]
}
