{
    "schema_version": "ecofyx_ai_capabilities_v1",
    "product": "Ecofyx",
    "product_version": "2026.10.14-knowledge-v547-seo-geo-acquisition",
    "public_safe": true,
    "purpose": "Fonte canônica somente leitura para a IA escolher recursos reais do Ecofyx ao criar formulários e aplicações.",
    "decision_policy": {
        "understand_pain_first": true,
        "reuse_first": true,
        "smallest_sufficient_solution": true,
        "interaction_mode": "adaptive",
        "generate_immediately_when_supported_and_sufficient": true,
        "ask_only_when_material": true,
        "ask_when": [
            "material_ambiguity",
            "unsupported_required_capability",
            "conflicting_requirements"
        ],
        "max_questions_per_turn": 3,
        "question_style": "short_choices_with_recommended_default",
        "allow_user_to_accept_recommendation": true,
        "unsupported_behavior": "explain_briefly_offer_supported_alternatives_do_not_fake",
        "capability_state_model": {
            "automatic": "O pedido pode ser materializado no artefato final pela IA e importado pelo Ecofyx sem configuração funcional adicional para aquele requisito.",
            "post_configuration": "O recurso existe no Ecofyx, mas depende de uma configuração posterior fora do artefato gerado. A IA deve explicar isso antes de finalizar quando o requisito for essencial.",
            "unavailable": "O recurso não pode ser prometido neste modo. A IA deve oferecer alternativas realmente suportadas."
        },
        "conditional_prerequisites_must_be_satisfied": true,
        "post_configuration_behavior": "explain_before_finalize_and_get_user_agreement_when_essential",
        "completion_claim_policy": "Só trate o pedido como integralmente concluído quando todos os requisitos essenciais estiverem representados no artefato final. Se houver configuração posterior essencial, diga isso antes da geração e não a descreva como já concluída.",
        "partial_artifact_during_clarification": false,
        "finalize_only_after_material_requirements_are_resolved": true,
        "do_not_invent_unsupported_resources": true,
        "photo_policy": "Evite fotos e uploads por padrão. Use somente quando houver valor operacional real, como evidência, avaria, vistoria, documento ou identificação visual indispensável."
    },
    "architecture": {
        "single_operational_engine": true,
        "canonical_form_creator": "motor canônico de formulários Ecofyx",
        "application_contract": "ecofyx_operation_blueprint_v2",
        "reuse_order": [
            "recurso_existente",
            "configuracao",
            "aplicacao_template_formulario",
            "semantic_key",
            "referencia",
            "workflow_acao",
            "dashboard_resultados_exportacao",
            "codigo_especializado_apenas_se_necessario"
        ]
    },
    "question_types": [
        "short_text",
        "paragraph",
        "multiple_choice",
        "checkboxes",
        "dropdown",
        "linear_scale",
        "rating",
        "date",
        "time",
        "datetime",
        "photo",
        "capture_coordinates",
        "section",
        "number",
        "currency",
        "email",
        "phone",
        "url",
        "duration",
        "entity_reference",
        "catalog",
        "order_summary"
    ],
    "form_features": {
        "quiz": {
            "available": true,
            "status": "available",
            "creation_mode": "automatic",
            "opt_in": true,
            "purpose": "Quiz, prova ou teste de conhecimento com correção automática simples.",
            "question_type": "multiple_choice",
            "correct_answers_per_question": 1,
            "unscored_questions_allowed": true,
            "scoring": {
                "timing": "on_submit",
                "correct_points": 1,
                "incorrect_points": 0,
                "denominator": "only_multiple_choice_questions_with_valid_correct_answer",
                "result_fields": [
                    "correct",
                    "incorrect",
                    "total",
                    "percent"
                ]
            },
            "participant_result": {
                "default": "show_after_submit",
                "creator_can_hide": true,
                "sequential_feedback": false
            },
            "display": {
                "modes": [
                    "all",
                    "one_by_one"
                ],
                "default_for_existing": "all",
                "ai_decides_when_user_unspecified": true,
                "ai_guidance": {
                    "one_by_one": "Prefer for study, tests, mobile focus, or longer quizzes.",
                    "all": "Prefer for short quizzes, quick review, or when seeing questions together is useful."
                }
            },
            "default_generation": {
                "participant_identification": {
                    "default": true,
                    "field_type": "short_text",
                    "title": "Nome do participante",
                    "required": true,
                    "omit_when": "user_explicitly_requests_anonymous_or_no_identification",
                    "scored": false
                },
                "number_scored_questions": true,
                "choose_display_mode_from_context_when_unspecified": true,
                "numbering_format": "1. 2. 3.",
                "correct_option_position": "vary_across_questions_without_predictable_pattern",
                "distractors": "plausible_related_and_similar_in_length_and_style",
                "avoid_answer_clues": [
                    "correct_always_first",
                    "correct_always_same_position",
                    "correct_systematically_longest",
                    "obviously_absurd_distractors"
                ]
            },
            "ai_input": {
                "structured": {
                    "field": "correct_option",
                    "rule": "Use somente em multiple_choice e informe exatamente o texto de uma das alternativas."
                },
                "ecofyx_form_text_v1": {
                    "line": "Resposta correta: <texto exato da alternativa>",
                    "display_line": "Exibição: Todas as perguntas | Uma pergunta por vez",
                    "rule": "Use Exibição no bloco Formulário e Resposta correta depois das alternativas. Se o usuário não definir a exibição, a IA escolhe a mais adequada ao contexto."
                }
            },
            "security": {
                "scoring_server_side": true,
                "correct_answer_not_exposed_to_public_form": true
            },
            "not_supported": [
                "multiple_correct_answers",
                "weighted_questions",
                "ranking",
                "timer",
                "sequential_feedback"
            ]
        },
        "gps_capture": {
            "available": true,
            "status": "available",
            "creation_mode": "automatic",
            "purpose": "Capturar latitude e longitude durante o preenchimento por meio do campo canônico de coordenadas.",
            "question_type": "capture_coordinates",
            "note": "Capturar coordenadas não equivale a restringir onde o formulário pode ser preenchido."
        },
        "geographic_access_control": {
            "available": true,
            "status": "available_post_configuration",
            "creation_mode": "post_configuration",
            "purpose": "Restringir/liberar o preenchimento por Ponto ou Área usando o mecanismo geográfico/GeoPass existente.",
            "ai_artifact_support": false,
            "configuration_surface": "Ecofyx após a criação do formulário",
            "prerequisites": [
                "form_saved",
                "operation_context",
                "point_or_area_configuration"
            ],
            "instruction": "Se o usuário pedir bloqueio/liberação por local, explique antes de finalizar que o formulário pode ser criado pela IA, mas Ponto/Área/GeoPass é configurado depois no Ecofyx. Não substitua essa restrição por simples captura de GPS."
        },
        "conditional_email_notification": {
            "available": true,
            "status": "available",
            "creation_mode": "automatic",
            "opt_in": true,
            "purpose": "Notificação por e-mail condicionada à resposta de uma pergunta após a finalização persistida do checklist.",
            "condition_operators": [
                "=",
                "!=",
                ">",
                ">=",
                "<",
                "<=",
                "between",
                "contains",
                "not_contains",
                "in",
                "not_in",
                "is_blank",
                "not_blank"
            ],
            "timing": "after_persisted_finalize",
            "max_emails_per_finalization": 1,
            "dedupe": true,
            "delivery_note": "A tentativa de envio depende do transporte de e-mail disponível no servidor; aceite pelo transporte não garante entrega final na caixa de entrada.",
            "ai_input": {
                "ecofyx_form_text_v1": {
                    "email_alert": [
                        "Alerta: E-mail",
                        "Quando: <condição>",
                        "Para: Conta Ecofyx | <e-mail(s)>",
                        "Assunto: <opcional>"
                    ],
                    "visual_alert": [
                        "Alerta: Crítico | Atenção | Verde",
                        "Quando: <condição>",
                        "Negrito: Sim | Não (opcional)"
                    ],
                    "account_recipient_rule": "Quando o usuário pedir “me avise” sem informar endereço, use Para: Conta Ecofyx. O Ecofyx resolve esse marcador para o e-mail da conta autenticada antes de salvar; nunca invente um endereço."
                }
            },
            "not_supported": [
                "arbitrary_external_webhook",
                "unlimited_email_fanout_per_finalization"
            ]
        }
    },
    "application_capabilities": {
        "available_to_ai": [
            {
                "key": "forms",
                "label": "Formulários e registros",
                "status": "generic_proven"
            },
            {
                "key": "conditional_fields",
                "label": "Campos condicionais",
                "status": "generic_proven"
            },
            {
                "key": "entity_reference",
                "label": "Referência entre cadastros",
                "status": "generic_proven"
            },
            {
                "key": "reference_copy",
                "label": "Cópia server-side de dados do cadastro relacionado",
                "status": "generic_proven"
            },
            {
                "key": "reference_filter",
                "label": "Filtro de cadastros de referência",
                "status": "generic_proven"
            },
            {
                "key": "workflow",
                "label": "Estados e transições",
                "status": "generic_proven"
            },
            {
                "key": "server_owned_initial",
                "label": "Estado inicial controlado pelo servidor",
                "status": "generic_proven"
            },
            {
                "key": "row_actions",
                "label": "Ações por registro",
                "status": "generic_proven"
            },
            {
                "key": "operational_table",
                "label": "Tabela operacional",
                "status": "generic_proven"
            },
            {
                "key": "kanban",
                "label": "Kanban quando suportado pelo layout",
                "status": "generic_proven"
            },
            {
                "key": "metrics",
                "label": "Indicadores e agregações do catálogo",
                "status": "generic_proven"
            },
            {
                "key": "filters",
                "label": "Filtros operacionais",
                "status": "generic_proven"
            },
            {
                "key": "alerts",
                "label": "Alertas declarativos",
                "status": "generic_proven"
            },
            {
                "key": "public_page",
                "label": "Página pública",
                "status": "generic_proven"
            },
            {
                "key": "scheduling_conflict",
                "label": "Conflito de agenda",
                "status": "generic_proven"
            },
            {
                "key": "scheduling_capacity",
                "label": "Capacidade da reserva",
                "status": "generic_proven"
            },
            {
                "key": "scheduling_slots",
                "label": "Horários disponíveis",
                "status": "generic_proven"
            },
            {
                "key": "scheduling_weekly_hours",
                "label": "Jornada semanal",
                "status": "generic_proven"
            },
            {
                "key": "scheduling_notice_horizon",
                "label": "Antecedência e horizonte da agenda",
                "status": "generic_proven"
            },
            {
                "key": "scheduling_blocks",
                "label": "Bloqueios de períodos",
                "status": "generic_proven"
            },
            {
                "key": "automation_open_form",
                "label": "Automação assistiva para abrir formulário",
                "status": "generic_proven"
            },
            {
                "key": "automation_suggest_form",
                "label": "Automação assistiva para sugerir formulário",
                "status": "generic_proven"
            },
            {
                "key": "automation_create_alert",
                "label": "Automação assistiva para criar alerta",
                "status": "generic_proven"
            },
            {
                "key": "resource_individual_hours",
                "label": "Jornada individual por recurso",
                "status": "generic_proven"
            },
            {
                "key": "resource_service_compatibility",
                "label": "Compatibilidade recurso × serviço",
                "status": "generic_proven"
            },
            {
                "key": "auto_assign_resource",
                "label": "Atribuição automática de recurso",
                "status": "generic_proven"
            }
        ],
        "restricted_or_specialized": [
            {
                "key": "entity_latest",
                "label": "Versão vigente por identidade estável",
                "status": "generic_internal"
            },
            {
                "key": "schedule_reference_history",
                "label": "Remarcação preservando histórico por identidade estável",
                "status": "generic_internal"
            },
            {
                "key": "pilates_replacement",
                "label": "Reposição/remarcação de Pilates",
                "status": "specialized"
            },
            {
                "key": "restaurant_delivery_coverage",
                "label": "Cobertura de entrega",
                "status": "specialized"
            },
            {
                "key": "restaurant_pricing",
                "label": "Precificação logística específica",
                "status": "specialized"
            },
            {
                "key": "arbitrary_code",
                "label": "PHP/SQL/JavaScript arbitrário",
                "status": "prohibited"
            },
            {
                "key": "arbitrary_external_integrations",
                "label": "Integrações externas arbitrárias",
                "status": "not_generic"
            }
        ],
        "note": "Compatibilidade V468. Para novas decisões de Aplicação, use capability_intelligence abaixo."
    },
    "capability_intelligence": {
        "schema_version": "ecofyx_application_capability_intelligence_v1",
        "policy": {
            "application_choice_is_final": true,
            "consider_all_direct_capabilities": true,
            "smallest_complete_solution": true,
            "do_not_omit_required_functionality_for_simplicity": true,
            "conditional_requires_existing_supported_contract": true
        },
        "direct": [
            {
                "key": "forms",
                "label": "Formulários e registros",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "conditional_fields",
                "label": "Campos condicionais",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "entity_reference",
                "label": "Referência entre cadastros",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "reference_copy",
                "label": "Cópia server-side de dados do cadastro relacionado",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "reference_filter",
                "label": "Filtro de cadastros de referência",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "workflow",
                "label": "Estados e transições",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "server_owned_initial",
                "label": "Estado inicial controlado pelo servidor",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "row_actions",
                "label": "Ações por registro",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "operational_table",
                "label": "Tabela operacional",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "kanban",
                "label": "Kanban quando suportado pelo layout",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "metrics",
                "label": "Indicadores e agregações do catálogo",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "filters",
                "label": "Filtros operacionais",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "alerts",
                "label": "Alertas declarativos",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "public_page",
                "label": "Página pública",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "scheduling_conflict",
                "label": "Conflito de agenda",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "scheduling_capacity",
                "label": "Capacidade da reserva",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "scheduling_slots",
                "label": "Horários disponíveis",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "scheduling_weekly_hours",
                "label": "Jornada semanal",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "scheduling_notice_horizon",
                "label": "Antecedência e horizonte da agenda",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "scheduling_blocks",
                "label": "Bloqueios de períodos",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "automation_open_form",
                "label": "Automação assistiva para abrir formulário",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "automation_suggest_form",
                "label": "Automação assistiva para sugerir formulário",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "automation_create_alert",
                "label": "Automação assistiva para criar alerta",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "resource_individual_hours",
                "label": "Jornada individual por recurso",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "resource_service_compatibility",
                "label": "Compatibilidade recurso × serviço",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "auto_assign_resource",
                "label": "Atribuição automática de recurso",
                "source": "application_capability_catalog",
                "status": "generic_proven",
                "mode": "direct"
            },
            {
                "key": "reuse_forms",
                "label": "Reaproveitamento de formulário avulso",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "template.reuse_forms",
                "instruction": "Quando a operação já possui um formulário avulso útil para a nova Aplicação. Preserva estrutura e registros; não retira silenciosamente formulário de outra Aplicação."
            },
            {
                "key": "entities",
                "label": "Entidades/cadastros da Aplicação",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "template.entities",
                "instruction": "Quando há objetos persistentes como Cliente, Veículo, Material, Paciente ou Equipamento."
            },
            {
                "key": "relationships",
                "label": "Relacionamentos declarativos",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "template.relationships",
                "instruction": "Documenta relações; comportamento executável usa entity_reference quando necessário."
            },
            {
                "key": "exports",
                "label": "Exportações declarativas",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "template.exports",
                "instruction": "Quando a solução precisa declarar exportações/escopos específicos além dos resultados padrão."
            },
            {
                "key": "public_access",
                "label": "Política de acesso público",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "template.public_access",
                "instruction": "Quando a solução precisa indicar acesso público required/recommended/none e formulário de entrada."
            },
            {
                "key": "catalog_field",
                "label": "Catálogo de produtos/serviços",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "question.type=catalog",
                "instruction": "Quando o usuário precisa selecionar itens/produtos/serviços com preço, categoria, disponibilidade, opções ou quantidade."
            },
            {
                "key": "order_summary_field",
                "label": "Resumo de pedido/carrinho",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "question.type=order_summary",
                "instruction": "Quando um fluxo de catálogo/pedido precisa consolidar itens e ajustes."
            },
            {
                "key": "geolocation_capture",
                "label": "Captura de localização",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "requires_location / question.type=capture_coordinates",
                "instruction": "Quando localização faz parte real do processo; não implica cerca geográfica automaticamente."
            },
            {
                "key": "photo_upload",
                "label": "Foto/evidência",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "question.type=photo",
                "instruction": "Somente quando houver valor operacional real; máximo de um campo photo por formulário no contrato universal."
            },
            {
                "key": "public_catalog_flow",
                "label": "Fluxo público de catálogo",
                "source": "blueprint_v2_contract",
                "status": "generic_proven",
                "mode": "direct",
                "surface": "public_page.mode=catalog_flow",
                "instruction": "Quando a página pública é um catálogo/pedido; para demais casos use wizard."
            }
        ],
        "conditional": [
            {
                "key": "pilates_replacement",
                "label": "Reposição/remarcação de Pilates",
                "source": "application_capability_catalog",
                "status": "specialized",
                "mode": "conditional",
                "instruction": "Recurso real do Ecofyx, porém ainda sem contrato Blueprint universal. Pode ser usado apenas por solução/template especializado que já o execute; não invente configuração genérica."
            },
            {
                "key": "restaurant_delivery_coverage",
                "label": "Cobertura de entrega",
                "source": "application_capability_catalog",
                "status": "specialized",
                "mode": "conditional",
                "instruction": "Recurso real do Ecofyx, porém ainda sem contrato Blueprint universal. Pode ser usado apenas por solução/template especializado que já o execute; não invente configuração genérica."
            },
            {
                "key": "restaurant_pricing",
                "label": "Precificação logística específica",
                "source": "application_capability_catalog",
                "status": "specialized",
                "mode": "conditional",
                "instruction": "Recurso real do Ecofyx, porém ainda sem contrato Blueprint universal. Pode ser usado apenas por solução/template especializado que já o execute; não invente configuração genérica."
            }
        ],
        "server_managed": [
            {
                "key": "entity_latest",
                "label": "Versão vigente por identidade estável",
                "source": "application_capability_catalog",
                "status": "generic_internal",
                "mode": "server_managed",
                "instruction": "A IA deve compreender o recurso, mas não declarar identidade/estado técnico controlado pelo servidor."
            },
            {
                "key": "schedule_reference_history",
                "label": "Remarcação preservando histórico por identidade estável",
                "source": "application_capability_catalog",
                "status": "generic_internal",
                "mode": "server_managed",
                "instruction": "A IA deve compreender o recurso, mas não declarar identidade/estado técnico controlado pelo servidor."
            }
        ],
        "prohibited": [
            {
                "key": "arbitrary_code",
                "label": "PHP/SQL/JavaScript arbitrário",
                "source": "application_capability_catalog",
                "status": "prohibited",
                "mode": "prohibited",
                "instruction": "Não gerar no Blueprint genérico."
            },
            {
                "key": "arbitrary_external_integrations",
                "label": "Integrações externas arbitrárias",
                "source": "application_capability_catalog",
                "status": "not_generic",
                "mode": "prohibited",
                "instruction": "Não gerar no Blueprint genérico."
            }
        ],
        "form_question_types": [
            "short_text",
            "paragraph",
            "multiple_choice",
            "checkboxes",
            "dropdown",
            "linear_scale",
            "rating",
            "date",
            "time",
            "datetime",
            "photo",
            "capture_coordinates",
            "section",
            "number",
            "currency",
            "email",
            "phone",
            "url",
            "duration",
            "entity_reference",
            "catalog",
            "order_summary"
        ],
        "dashboard_engine": {
            "source": "existing_dashboard_resource_catalog",
            "catalog_is_existing": true,
            "indicator_calculations": [
                "count",
                "distinct_count",
                "sum",
                "average",
                "min",
                "max",
                "median",
                "conditional_count",
                "conditional_sum",
                "overdue_count",
                "completion_rate",
                "conformity_rate",
                "nonconformity_count",
                "financial_total",
                "text_keyword_count",
                "days_between",
                "days_open",
                "difference"
            ],
            "column_calculations": [
                "financial_total",
                "net_total",
                "commission_value",
                "margin_percentage",
                "variance",
                "productivity_rate",
                "multiply",
                "difference",
                "percentage"
            ],
            "condition_operators": [
                "eq",
                "neq",
                "contains",
                "in",
                "gt",
                "gte",
                "lt",
                "lte",
                "empty",
                "not_empty",
                "before_today",
                "after_today"
            ],
            "metric_components": [
                "card_number",
                "card_alert",
                "card_percentage",
                "card_money"
            ],
            "structural_components": [
                "table",
                "kanban"
            ],
            "layouts_and_semantics": "Use o catálogo executável do Dashboard Engine fornecido no briefing; não invente keys fora dele."
        },
        "existing_foundation": {
            "application_capability_catalog": "Catálogo de capacidades de Aplicação existente desde V468.",
            "dashboard_resource_catalog": "Catálogo unificado já existente para IA consultar cálculos, componentes, layouts e semantic keys.",
            "dashboard_ai_contract": "Contrato executável já usado pelos prompts de configuração operacional.",
            "universal_blueprint_contract": "Blueprint V2 já filtra recursos que o runtime universal realmente executa.",
            "ready_solution_catalog": "Catálogo de soluções prontas continua sendo fonte de implementações especializadas comprovadas."
        }
    },
    "composition_model": {
        "schema_version": "ecofyx_application_composition_v1",
        "strategy": {
            "compose_capabilities_not_recipes": true,
            "outcome_first": true,
            "reuse_before_create": true,
            "single_coherent_application": true,
            "add_complexity_only_for_operational_need": true,
            "validate_dependencies_before_output": true,
            "server_is_final_authority": true
        },
        "reasoning_sequence": [
            "identify_outcome_and_actors",
            "identify_master_data_and_events",
            "reuse_existing_structure",
            "select_minimum_required_capabilities",
            "expand_dependencies",
            "connect_forms_entities_and_actions",
            "add_public_experience_only_if_needed",
            "add_monitoring_alerts_and_exports_only_if_needed",
            "validate_the_combination_against_blueprint_contract"
        ],
        "layers": {
            "data": [
                "forms",
                "reuse_forms",
                "entities",
                "relationships",
                "entity_reference",
                "reference_copy",
                "reference_filter",
                "conditional_fields"
            ],
            "behavior": [
                "workflow",
                "server_owned_initial",
                "row_actions",
                "automation_open_form",
                "automation_suggest_form",
                "automation_create_alert"
            ],
            "experience": [
                "public_page",
                "public_access",
                "catalog_field",
                "order_summary_field",
                "geolocation_capture",
                "photo_upload",
                "public_catalog_flow"
            ],
            "scheduling": [
                "scheduling_conflict",
                "scheduling_capacity",
                "scheduling_slots",
                "scheduling_weekly_hours",
                "scheduling_notice_horizon",
                "scheduling_blocks",
                "resource_individual_hours",
                "resource_service_compatibility",
                "auto_assign_resource"
            ],
            "insight": [
                "operational_table",
                "kanban",
                "metrics",
                "filters",
                "alerts",
                "exports"
            ]
        },
        "nodes": [
            {
                "key": "forms",
                "label": "Formulários e registros",
                "layer": "data",
                "when": "Sempre que a solução precise registrar ou manter dados próprios.",
                "requires": [],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "conditional_fields",
                "label": "Campos condicionais",
                "layer": "data",
                "when": "Quando uma resposta alterar quais campos devem aparecer.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "entity_reference",
                "label": "Referência entre cadastros",
                "layer": "data",
                "when": "Quando um registro precisar apontar para outro cadastro ou membro da equipe.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "entities",
                    "reference_copy",
                    "reference_filter",
                    "relationships"
                ]
            },
            {
                "key": "reference_copy",
                "label": "Cópia server-side de dados do cadastro relacionado",
                "layer": "data",
                "when": "Quando dados conhecidos do cadastro relacionado precisarem preencher tecnicamente o formulário atual.",
                "requires": [
                    "entity_reference"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [],
                "contract": "Mapa destino -> origem: a chave é o ID do campo de destino no formulário atual; o valor usa semantic_key ou field do cadastro referenciado."
            },
            {
                "key": "reference_filter",
                "label": "Filtro de cadastros de referência",
                "layer": "data",
                "when": "Quando nem todos os registros relacionados forem elegíveis para escolha.",
                "requires": [
                    "entity_reference"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "workflow",
                "label": "Estados e transições",
                "layer": "behavior",
                "when": "Quando a entidade realmente percorre estados ou etapas controladas.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "server_owned_initial",
                    "row_actions",
                    "kanban",
                    "alerts"
                ]
            },
            {
                "key": "server_owned_initial",
                "label": "Estado inicial controlado pelo servidor",
                "layer": "behavior",
                "when": "Quando o estado inicial não deve ser escolhido pelo usuário.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "workflow",
                    "public_page",
                    "scheduling_conflict"
                ]
            },
            {
                "key": "row_actions",
                "label": "Ações por registro",
                "layer": "behavior",
                "when": "Quando um registro precisar oferecer ações contextuais.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "workflow",
                    "entity_reference",
                    "automation_open_form"
                ]
            },
            {
                "key": "operational_table",
                "label": "Tabela operacional",
                "layer": "insight",
                "when": "Quando a operação precisar acompanhar registros em uma superfície tabular.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "filters",
                    "metrics",
                    "row_actions"
                ]
            },
            {
                "key": "kanban",
                "label": "Kanban quando suportado pelo layout",
                "layer": "insight",
                "when": "Quando visualizar registros por estado ajudar a operar o processo.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "workflow",
                    "server_owned_initial",
                    "row_actions"
                ],
                "note": "Kanban precisa de um estado/status operacional coerente; workflow é recomendado quando houver transições."
            },
            {
                "key": "metrics",
                "label": "Indicadores e agregações do catálogo",
                "layer": "insight",
                "when": "Quando decisões operacionais dependerem de totais, taxas, valores ou contagens.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "operational_table",
                    "filters",
                    "alerts"
                ]
            },
            {
                "key": "filters",
                "label": "Filtros operacionais",
                "layer": "insight",
                "when": "Quando a superfície operacional precisar segmentar registros.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "operational_table",
                    "metrics"
                ]
            },
            {
                "key": "alerts",
                "label": "Alertas declarativos",
                "layer": "insight",
                "when": "Quando alguma condição exigir atenção explícita.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "metrics",
                    "workflow",
                    "automation_create_alert"
                ]
            },
            {
                "key": "public_page",
                "label": "Página pública",
                "layer": "experience",
                "when": "Quando pessoas externas precisarem de uma página contínua de entrada sem conhecer a área interna.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "public_access",
                    "scheduling_slots",
                    "public_catalog_flow"
                ]
            },
            {
                "key": "scheduling_conflict",
                "label": "Conflito de agenda",
                "layer": "scheduling",
                "when": "Quando houver reserva de tempo que não pode colidir.",
                "requires": [
                    "public_page",
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "scheduling_slots",
                    "scheduling_capacity",
                    "scheduling_weekly_hours",
                    "scheduling_blocks"
                ]
            },
            {
                "key": "scheduling_capacity",
                "label": "Capacidade da reserva",
                "layer": "scheduling",
                "when": "Quando um horário puder aceitar uma ou várias reservas.",
                "requires": [
                    "scheduling_conflict"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "scheduling_slots",
                "label": "Horários disponíveis",
                "layer": "scheduling",
                "when": "Quando o usuário precisar escolher apenas horários realmente disponíveis.",
                "requires": [
                    "scheduling_conflict"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "scheduling_weekly_hours",
                    "scheduling_notice_horizon",
                    "scheduling_blocks"
                ]
            },
            {
                "key": "scheduling_weekly_hours",
                "label": "Jornada semanal",
                "layer": "scheduling",
                "when": "Quando a disponibilidade depender da jornada semanal.",
                "requires": [
                    "scheduling_conflict"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "scheduling_notice_horizon",
                "label": "Antecedência e horizonte da agenda",
                "layer": "scheduling",
                "when": "Quando houver antecedência mínima ou limite de dias futuros.",
                "requires": [
                    "scheduling_conflict"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "scheduling_blocks",
                "label": "Bloqueios de períodos",
                "layer": "scheduling",
                "when": "Quando períodos específicos precisarem ficar indisponíveis.",
                "requires": [
                    "scheduling_conflict"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "automation_open_form",
                "label": "Automação assistiva para abrir formulário",
                "layer": "behavior",
                "when": "Quando uma condição deve orientar o usuário para um próximo formulário.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "row_actions",
                    "workflow"
                ]
            },
            {
                "key": "automation_suggest_form",
                "label": "Automação assistiva para sugerir formulário",
                "layer": "behavior",
                "when": "Quando a condição deve sugerir, sem executar silenciosamente, um próximo passo.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "workflow"
                ]
            },
            {
                "key": "automation_create_alert",
                "label": "Automação assistiva para criar alerta",
                "layer": "behavior",
                "when": "Quando uma condição deve produzir um alerta assistivo.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "alerts"
                ]
            },
            {
                "key": "resource_individual_hours",
                "label": "Jornada individual por recurso",
                "layer": "scheduling",
                "when": "Quando cada profissional/recurso puder ter sua própria jornada.",
                "requires": [
                    "scheduling_conflict",
                    "entity_reference"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "resource_service_compatibility",
                    "auto_assign_resource"
                ]
            },
            {
                "key": "resource_service_compatibility",
                "label": "Compatibilidade recurso × serviço",
                "layer": "scheduling",
                "when": "Quando determinados recursos só puderem executar determinados serviços.",
                "requires": [
                    "scheduling_conflict",
                    "entity_reference"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "resource_individual_hours",
                    "auto_assign_resource"
                ]
            },
            {
                "key": "auto_assign_resource",
                "label": "Atribuição automática de recurso",
                "layer": "scheduling",
                "when": "Quando o cliente puder escolher qualquer recurso e o servidor precisar selecionar um elegível.",
                "requires": [
                    "scheduling_conflict",
                    "entity_reference"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "resource_individual_hours",
                    "resource_service_compatibility"
                ]
            },
            {
                "key": "reuse_forms",
                "label": "Reaproveitamento de formulário avulso",
                "layer": "data",
                "when": "Quando já existir formulário avulso útil na operação.",
                "requires": [],
                "requires_any": [],
                "requires_context": [
                    "existing_unambiguous_form"
                ],
                "pairs_with": [
                    "entity_reference",
                    "row_actions",
                    "workflow",
                    "operational_table"
                ]
            },
            {
                "key": "entities",
                "label": "Entidades/cadastros da Aplicação",
                "layer": "data",
                "when": "Quando houver objetos persistentes acompanhados ao longo do tempo.",
                "requires": [],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "forms",
                    "entity_reference",
                    "relationships",
                    "workflow"
                ]
            },
            {
                "key": "relationships",
                "label": "Relacionamentos declarativos",
                "layer": "data",
                "when": "Quando for útil documentar relações entre entidades.",
                "requires": [],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "entity_reference",
                    "entities"
                ],
                "note": "A relação executável normalmente é materializada por entity_reference."
            },
            {
                "key": "exports",
                "label": "Exportações declarativas",
                "layer": "insight",
                "when": "Quando houver necessidade real de saída estruturada além da consulta normal.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "public_access",
                "label": "Política de acesso público",
                "layer": "experience",
                "when": "Quando a solução precisar explicitar política de entrada pública.",
                "requires": [],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "public_page"
                ]
            },
            {
                "key": "catalog_field",
                "label": "Catálogo de produtos/serviços",
                "layer": "experience",
                "when": "Quando o usuário precisar escolher produtos, serviços ou itens estruturados.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "order_summary_field",
                    "public_catalog_flow",
                    "workflow"
                ]
            },
            {
                "key": "order_summary_field",
                "label": "Resumo de pedido/carrinho",
                "layer": "experience",
                "when": "Quando uma seleção de catálogo/pedido precisar ser revisada ou consolidada.",
                "requires": [
                    "catalog_field"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "geolocation_capture",
                "label": "Captura de localização",
                "layer": "experience",
                "when": "Quando a localização for dado operacional relevante.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "photo_upload",
                "label": "Foto/evidência",
                "layer": "experience",
                "when": "Quando evidência visual tiver valor operacional real.",
                "requires": [
                    "forms"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": []
            },
            {
                "key": "public_catalog_flow",
                "label": "Fluxo público de catálogo",
                "layer": "experience",
                "when": "Quando o público navegar por catálogo/pedido em página pública.",
                "requires": [
                    "public_page",
                    "catalog_field"
                ],
                "requires_any": [],
                "requires_context": [],
                "pairs_with": [
                    "order_summary_field"
                ]
            }
        ],
        "generic_decision_hints": {
            "persistent_object": "Use cadastro/entidade quando algo precisa existir e ser reutilizado ao longo do tempo.",
            "repeated_event": "Use formulário de evento/movimentação ligado por entity_reference quando algo acontece repetidamente com a entidade.",
            "stateful_process": "Use workflow somente quando o estado altera o que pode acontecer depois.",
            "resource_booking": "Combine agenda, disponibilidade, capacidade e recursos somente quando houver reserva real de tempo/recurso.",
            "external_journey": "Use página pública quando a pessoa externa precisa concluir uma jornada sem entrar na operação interna.",
            "operational_attention": "Use métricas/alertas/filtros quando ajudarem alguém a decidir ou agir; não apenas para ornamentação."
        }
    },
    "application_blocks": [
        "forms",
        "reuse_forms",
        "entities",
        "relationships",
        "workflows",
        "dashboard",
        "exports",
        "automation_rules",
        "public_page",
        "public_access"
    ],
    "scheduling_contract": [
        "enabled",
        "start_date_field",
        "start_time_field",
        "end_date_field",
        "end_time_field",
        "duration_field",
        "duration_unit",
        "duration_default_minutes",
        "resource_fields",
        "service_field",
        "status_field",
        "blocking_statuses",
        "cancellation_statuses",
        "minimum_notice_minutes",
        "maximum_days_ahead",
        "capacity",
        "all_day",
        "public_check",
        "confirmation_mode",
        "automatic_status",
        "manual_status",
        "slot_picker",
        "slot_step_minutes",
        "interval_minutes",
        "weekly_hours",
        "blocked_periods",
        "resource_schedule_form",
        "resource_service_compatibility",
        "allow_any_resource",
        "auto_assign_resource"
    ],
    "reference_copy_contract": {
        "direction": "destination_field_id_to_source_descriptor",
        "rule": "A chave é sempre o ID exato do campo de destino no formulário atual. O valor identifica a origem no cadastro referenciado por semantic_key ou field.",
        "example": {
            "agendamento_duracao": {
                "semantic_key": "duration"
            }
        },
        "invalid_inverted_example": {
            "duration": "agendamento_duracao"
        },
        "server_authority": true
    },
    "resource_scheduling_model": {
        "resource_schedule_form": "Nome exato de um cadastro de recursos/profissionais declarado em forms[] da mesma Aplicação.",
        "resource_field": "Exatamente um campo entity_reference em resource_fields apontando para resource_schedule_form.",
        "resource_semantics": {
            "item_name": "obrigatório: nome visível do recurso/profissional",
            "schedule_days": "opcional: dias individuais de atendimento",
            "time_start": "opcional: início individual",
            "time_end": "opcional: fim individual",
            "categories": "necessário quando resource_service_compatibility=true; lista de serviços/categorias atendidos",
            "status": "opcional: registros Inativo/Bloqueado não entram na agenda"
        },
        "rules": [
            "allow_any_resource=true exige que o campo de recurso seja opcional",
            "auto_assign_resource=true exige allow_any_resource=true",
            "resource_service_compatibility=true exige service_field e semantic_key=categories no cadastro de recursos",
            "nunca invente jornada, compatibilidade ou profissionais; deixe dados desconhecidos para configuração posterior"
        ]
    },
    "public_page_policy": {
        "persona": "Pessoa comum que pode ter recebido apenas um link, geralmente pelo celular e sem conhecer o Ecofyx.",
        "principles": [
            "linguagem_comum",
            "minimo_de_campos",
            "uma_acao_principal",
            "nao_expor_termos_tecnicos",
            "nao_repetir_informacao_ja_conhecida",
            "mobile_first",
            "confirmacao_simples"
        ],
        "avoid": [
            "ids_internos",
            "entity_id_visivel",
            "semantic_keys_visiveis",
            "workflow_tecnico",
            "campos_administrativos_sem_necessidade",
            "tabelas_complexas",
            "fotos_sem_valor_operacional"
        ]
    },
    "limits": {
        "application_templates_per_proposal": 12,
        "forms_per_application": 24,
        "questions_per_form": 50,
        "choice_options_max": 30,
        "catalog_items_max": 100,
        "recommended_forms_per_solution": "1-5",
        "recommended_questions_per_form": "3-15"
    },
    "safety": {
        "never_expose": [
            "credentials",
            "tokens",
            "passwords",
            "private_operation_data",
            "sql",
            "database_columns",
            "internal_server_paths"
        ],
        "never_generate": [
            "arbitrary_php",
            "arbitrary_sql",
            "arbitrary_javascript",
            "arbitrary_external_integrations"
        ],
        "server_validates": [
            "permissions",
            "isolation",
            "entity_reference",
            "workflow",
            "availability",
            "capacity",
            "public_access"
        ]
    },
    "update_model": {
        "dynamic_sources": {
            "question_types": "canonical_form_type_registry",
            "form_features": "canonical_form_feature_registry",
            "application_capabilities": "canonical_application_capability_registry",
            "dashboard_resources": "existing_dashboard_resource_catalog",
            "application_intelligence": "aggregated_existing_capability_sources",
            "product_version": "canonical_release_manifest"
        },
        "release_gate": "O gate V484 deve falhar se o manifesto público deixar de refletir as fontes canônicas acima."
    }
}