From 4e125749c25f4dc9e455971bb41bd50c018824b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Bosc=C3=A1?= Date: Mon, 23 Mar 2026 11:55:09 -0300 Subject: [PATCH 1/3] Complete final packaging and review workflow (Plan 4) --- .../00_scope_and_goal.md | 19 + .../01_macro_synthesis_protocol.md | 35 + .../02_whole_macro_validation_protocol.md | 36 + ...03_response_policy_for_complex_requests.md | 27 + ...sibility_and_partial_possibility_policy.md | 19 + .../05_complex_pattern_cookbook.md | 36 + .../06_debugging_and_review_mode.md | 16 + .../07_instruction_patch_for_gpt.md | 25 + .../08_examples_of_full_macro_design.md | 41 + .../09_files_to_update_in_knowledge_ready.md | 16 + .../audit_full/00_audit_scope_and_method.md | 22 + .../audit_full/01_file_inventory.md | 177 + .../02_eventmacro_canonical_spec.md | 37 + .../audit_full/03_grammar_and_parsing.md | 27 + .../audit_full/04_commands_and_runtime.md | 26 + .../05_variables_and_special_variables.md | 34 + .../06_macro_keywords_and_functions.md | 23 + .../audit_full/07_automacro_parameters.md | 24 + .../audit_full/08_condition_catalog.md | 7 + .../audit_full/09_condition_catalog.json | 6516 ++++++++ .../10_invalid_syntax_and_negative_catalog.md | 25 + .../audit_full/11_examples_valid.md | 41 + .../audit_full/12_examples_invalid.md | 34 + ...gaps_ambiguities_and_nonprovable_claims.md | 12 + .../14_gpt_system_instructions_draft.md | 29 + .../knowledge_ready/00_scope_and_rules.md | 22 + .../01_architecture_and_runtime.md | 26 + .../knowledge_ready/02_grammar_and_parsing.md | 27 + .../03_variables_and_special_variables.md | 34 + .../04_macro_keywords_and_functions.md | 23 + .../knowledge_ready/05_console_commands.md | 24 + .../06_automacro_parameters.md | 24 + .../07_conditions_state_part_1.md | 49 + .../08_conditions_state_part_2.md | 49 + .../knowledge_ready/09_conditions_event.md | 36 + .../10_condition_reference_tables.md | 15 + .../11_invalid_syntax_and_negative_catalog.md | 25 + .../knowledge_ready/12_examples_valid.md | 41 + .../knowledge_ready/13_examples_invalid.md | 34 + ...gaps_ambiguities_and_nonprovable_claims.md | 12 + .../15_gpt_system_instructions_draft.md | 29 + .../knowledge_ready/16_upload_manifest.md | 24 + .../knowledge_ready/17_condition_catalog.json | 6516 ++++++++ .../tools/extract_condition_catalog.py | 179 + .../00_scope_rules_and_usage.md | 22 + .../01_architecture_and_runtime.md | 26 + .../knowledge_ready/02_grammar_and_parsing.md | 27 + .../03_variables_and_special_variables.md | 34 + ..._operators_regex_ranges_and_comparisons.md | 27 + .../knowledge_ready/05_console_commands.md | 24 + .../06_macro_keywords_and_functions.md | 31 + .../07_automacro_parameters.md | 31 + .../08_conditions_state_part_1.md | 49 + .../09_conditions_state_part_2.md | 49 + .../knowledge_ready/10_conditions_event.md | 36 + .../11_condition_reference_tables.md | 47 + .../12_invalid_syntax_and_negative_catalog.md | 25 + .../knowledge_ready/13_examples_valid.md | 57 + .../knowledge_ready/14_examples_invalid.md | 44 + .../15_ambiguities_and_nonprovable_claims.md | 12 + .../16_gpt_system_instructions_final.md | 121 + .../knowledge_ready/17_upload_manifest.md | 61 + .../knowledge_ready/18_condition_catalog.json | 12457 ++++++++++++++++ .../19_macro_and_parameter_contracts.json | 1064 ++ .../support/00_consolidation_decisions.md | 13 + .../support/01_removed_or_merged_files.md | 15 + .../support/02_final_risk_notes.md | 30 + .../support/03_improvement_stages.md | 71 + .../support/04_regression_report.md | 25 + .../support/05_release_readiness_report.md | 22 + .../support/06_final_review_and_packaging.md | 41 + .../support/generate_regression_report.py | 93 + .../generate_release_readiness_report.py | 72 + .../support/golden_macro_cases.json | 432 + .../support/package_knowledge_ready.py | 42 + .../support/validate_curation_consistency.py | 83 + .../support/validate_final_package.py | 84 + .../validate_function_parameter_contracts.py | 43 + .../support/validate_golden_macro_cases.py | 70 + .../support/validate_lexical_contracts.py | 59 + .../00_validation_scope_and_method.md | 24 + .../01_inventory_of_audited_outputs.md | 34 + .../02_source_vs_curation_mismatches.md | 31 + .../03_condition_validation_matrix.md | 29 + .../04_examples_validation.md | 25 + .../05_internal_contradictions.md | 18 + .../06_gpt_risk_assessment.md | 14 + .../07_required_corrections_summary.md | 15 + .../08_final_upload_recommendation.md | 35 + .../09_files_changed_and_why.md | 39 + .../_validation_data.json | 57 + .../tools/validate_curation.py | 169 + .../00_patch_scope_and_method.md | 16 + .../01_lexical_contract_failures_found.md | 12 + .../02_condition_lexical_contract_patch.json | 3839 +++++ .../03_generation_safety_reclassification.md | 19 + .../04_examples_revalidated_for_delimiters.md | 10 + .../05_gpt_instruction_patch.md | 13 + ...onditions_requiring_delimiter_attention.md | 5 + .../07_files_changed_and_why.md | 34 + .../08_final_upload_recommendation.md | 14 + .../00_patch_scope_and_method.md | 22 + .../01_lacunas_criticas_identificadas.md | 15 + .../02_condition_contract_fixes.json | 156 + .../03_generation_safety_patch.md | 26 + docs/eventmacro_patch/04_examples_patch.md | 8 + .../05_gpt_instruction_patch.md | 14 + .../06_files_changed_and_why.md | 21 + .../07_final_upload_recommendation.md | 15 + plugins/eventMacro/eventMacro/FileParser.pm | 2 +- .../eventMacro/Validator/RegexCheck.pm | 2 +- 111 files changed, 34663 insertions(+), 2 deletions(-) create mode 100644 docs/eventmacro_expert_behavior_patch/00_scope_and_goal.md create mode 100644 docs/eventmacro_expert_behavior_patch/01_macro_synthesis_protocol.md create mode 100644 docs/eventmacro_expert_behavior_patch/02_whole_macro_validation_protocol.md create mode 100644 docs/eventmacro_expert_behavior_patch/03_response_policy_for_complex_requests.md create mode 100644 docs/eventmacro_expert_behavior_patch/04_impossibility_and_partial_possibility_policy.md create mode 100644 docs/eventmacro_expert_behavior_patch/05_complex_pattern_cookbook.md create mode 100644 docs/eventmacro_expert_behavior_patch/06_debugging_and_review_mode.md create mode 100644 docs/eventmacro_expert_behavior_patch/07_instruction_patch_for_gpt.md create mode 100644 docs/eventmacro_expert_behavior_patch/08_examples_of_full_macro_design.md create mode 100644 docs/eventmacro_expert_behavior_patch/09_files_to_update_in_knowledge_ready.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/00_audit_scope_and_method.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/01_file_inventory.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/02_eventmacro_canonical_spec.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/03_grammar_and_parsing.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/04_commands_and_runtime.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/05_variables_and_special_variables.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/06_macro_keywords_and_functions.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/07_automacro_parameters.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/08_condition_catalog.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/09_condition_catalog.json create mode 100644 docs/eventmacro_gpt_audit/audit_full/10_invalid_syntax_and_negative_catalog.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/11_examples_valid.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/12_examples_invalid.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/13_gaps_ambiguities_and_nonprovable_claims.md create mode 100644 docs/eventmacro_gpt_audit/audit_full/14_gpt_system_instructions_draft.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/00_scope_and_rules.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/01_architecture_and_runtime.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/02_grammar_and_parsing.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/03_variables_and_special_variables.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/04_macro_keywords_and_functions.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/05_console_commands.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/06_automacro_parameters.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/07_conditions_state_part_1.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/08_conditions_state_part_2.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/09_conditions_event.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/10_condition_reference_tables.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/11_invalid_syntax_and_negative_catalog.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/12_examples_valid.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/13_examples_invalid.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/14_gaps_ambiguities_and_nonprovable_claims.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/15_gpt_system_instructions_draft.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/16_upload_manifest.md create mode 100644 docs/eventmacro_gpt_audit/knowledge_ready/17_condition_catalog.json create mode 100644 docs/eventmacro_gpt_audit/tools/extract_condition_catalog.py create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/00_scope_rules_and_usage.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/01_architecture_and_runtime.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/02_grammar_and_parsing.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/03_variables_and_special_variables.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/04_operators_regex_ranges_and_comparisons.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/05_console_commands.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/07_automacro_parameters.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/08_conditions_state_part_1.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/09_conditions_state_part_2.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/10_conditions_event.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/11_condition_reference_tables.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/12_invalid_syntax_and_negative_catalog.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/13_examples_valid.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/14_examples_invalid.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/16_gpt_system_instructions_final.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/17_upload_manifest.md create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/18_condition_catalog.json create mode 100644 docs/eventmacro_gpt_final/knowledge_ready/19_macro_and_parameter_contracts.json create mode 100644 docs/eventmacro_gpt_final/support/00_consolidation_decisions.md create mode 100644 docs/eventmacro_gpt_final/support/01_removed_or_merged_files.md create mode 100644 docs/eventmacro_gpt_final/support/02_final_risk_notes.md create mode 100644 docs/eventmacro_gpt_final/support/03_improvement_stages.md create mode 100644 docs/eventmacro_gpt_final/support/04_regression_report.md create mode 100644 docs/eventmacro_gpt_final/support/05_release_readiness_report.md create mode 100644 docs/eventmacro_gpt_final/support/06_final_review_and_packaging.md create mode 100755 docs/eventmacro_gpt_final/support/generate_regression_report.py create mode 100755 docs/eventmacro_gpt_final/support/generate_release_readiness_report.py create mode 100644 docs/eventmacro_gpt_final/support/golden_macro_cases.json create mode 100755 docs/eventmacro_gpt_final/support/package_knowledge_ready.py create mode 100755 docs/eventmacro_gpt_final/support/validate_curation_consistency.py create mode 100755 docs/eventmacro_gpt_final/support/validate_final_package.py create mode 100755 docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py create mode 100755 docs/eventmacro_gpt_final/support/validate_golden_macro_cases.py create mode 100755 docs/eventmacro_gpt_final/support/validate_lexical_contracts.py create mode 100644 docs/eventmacro_gpt_validation/00_validation_scope_and_method.md create mode 100644 docs/eventmacro_gpt_validation/01_inventory_of_audited_outputs.md create mode 100644 docs/eventmacro_gpt_validation/02_source_vs_curation_mismatches.md create mode 100644 docs/eventmacro_gpt_validation/03_condition_validation_matrix.md create mode 100644 docs/eventmacro_gpt_validation/04_examples_validation.md create mode 100644 docs/eventmacro_gpt_validation/05_internal_contradictions.md create mode 100644 docs/eventmacro_gpt_validation/06_gpt_risk_assessment.md create mode 100644 docs/eventmacro_gpt_validation/07_required_corrections_summary.md create mode 100644 docs/eventmacro_gpt_validation/08_final_upload_recommendation.md create mode 100644 docs/eventmacro_gpt_validation/09_files_changed_and_why.md create mode 100644 docs/eventmacro_gpt_validation/_validation_data.json create mode 100644 docs/eventmacro_gpt_validation/tools/validate_curation.py create mode 100644 docs/eventmacro_lexical_contract_patch/00_patch_scope_and_method.md create mode 100644 docs/eventmacro_lexical_contract_patch/01_lexical_contract_failures_found.md create mode 100644 docs/eventmacro_lexical_contract_patch/02_condition_lexical_contract_patch.json create mode 100644 docs/eventmacro_lexical_contract_patch/03_generation_safety_reclassification.md create mode 100644 docs/eventmacro_lexical_contract_patch/04_examples_revalidated_for_delimiters.md create mode 100644 docs/eventmacro_lexical_contract_patch/05_gpt_instruction_patch.md create mode 100644 docs/eventmacro_lexical_contract_patch/06_conditions_requiring_delimiter_attention.md create mode 100644 docs/eventmacro_lexical_contract_patch/07_files_changed_and_why.md create mode 100644 docs/eventmacro_lexical_contract_patch/08_final_upload_recommendation.md create mode 100644 docs/eventmacro_patch/00_patch_scope_and_method.md create mode 100644 docs/eventmacro_patch/01_lacunas_criticas_identificadas.md create mode 100644 docs/eventmacro_patch/02_condition_contract_fixes.json create mode 100644 docs/eventmacro_patch/03_generation_safety_patch.md create mode 100644 docs/eventmacro_patch/04_examples_patch.md create mode 100644 docs/eventmacro_patch/05_gpt_instruction_patch.md create mode 100644 docs/eventmacro_patch/06_files_changed_and_why.md create mode 100644 docs/eventmacro_patch/07_final_upload_recommendation.md diff --git a/docs/eventmacro_expert_behavior_patch/00_scope_and_goal.md b/docs/eventmacro_expert_behavior_patch/00_scope_and_goal.md new file mode 100644 index 0000000000..45c1ddf6f6 --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/00_scope_and_goal.md @@ -0,0 +1,19 @@ +# 00 Scope and Goal + +## Escopo +Este patch adiciona uma camada de **comportamento especialista** sobre a curadoria factual já existente do `eventMacro`. +Não reaudita o plugin do zero; apenas operacionaliza como o GPT deve **projetar, compor, validar e depurar** macros completas. + +## Meta operacional +O GPT deve: +1. Entender objetivo do usuário. +2. Decompor em primitivas reais do eventMacro. +3. Checar `generation_safety` por condition. +4. Escolher arquitetura correta (macro/automacro/call/sub/chain/estado/timeout). +5. Montar solução completa. +6. Validar solução completa. +7. Declarar limitações e riscos. +8. Só então responder com implementação final. + +## Resultado esperado +Sair de "assistente que explica" para "especialista que entrega solução completa com validação e recusa precisa". diff --git a/docs/eventmacro_expert_behavior_patch/01_macro_synthesis_protocol.md b/docs/eventmacro_expert_behavior_patch/01_macro_synthesis_protocol.md new file mode 100644 index 0000000000..1598dd96dd --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/01_macro_synthesis_protocol.md @@ -0,0 +1,35 @@ +# 01 Macro Synthesis Protocol + +## Protocolo obrigatório (antes de escrever código) + +### Etapa A — Leitura do objetivo +- Classificar intenção: reação a evento, rotina periódica, cadeia de ações, fallback/recuperação, controle de estado. +- Definir gatilhos de ativação e critérios de parada. + +### Etapa B — Decomposição em blocos +- Bloco de detecção (`automacro` + conditions). +- Bloco de execução (`call` para `macro` alvo). +- Bloco de estado (variáveis, flags de reentrada, timeout de cooldown). +- Bloco de recuperação (retry/fallback). + +### Etapa C — Seleção de primitives +- `automacro` quando houver gatilho condicional/evento. +- `macro` para sequência procedural. +- `sub` apenas quando o fluxo exigir lógica Perl específica e comprovada. +- `call` para separar trigger e execução. +- labels/goto/while com guardas de parada explícitas. + +### Etapa D — Decisão arquitetural +- Macro simples: quando não há trigger complexo. +- Automacro + call: padrão preferencial para robustez. +- Chain de macros: para workflows longos com checkpoints. + +### Etapa E — Padrões defensivos mínimos +- Guardas contra reentrada. +- Limite explícito de tentativas. +- Delay/timeout para evitar loop quente. +- Caminho de fallback em falha. + +### Etapa F — Gate de segurança de generation +- Para cada condition: consultar `generation_safety` no catálogo. +- Se qualquer condition não for `GENERATION_SAFE`, bloquear geração final e responder em modo controlado (`EXPLAIN_ONLY`/`UNSAFE`). diff --git a/docs/eventmacro_expert_behavior_patch/02_whole_macro_validation_protocol.md b/docs/eventmacro_expert_behavior_patch/02_whole_macro_validation_protocol.md new file mode 100644 index 0000000000..0c864baad8 --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/02_whole_macro_validation_protocol.md @@ -0,0 +1,36 @@ +# 02 Whole Macro Validation Protocol + +## Checklist obrigatório pré-entrega + +### 1) Sintaxe global +- Blocos `{}` balanceados. +- `automacro` com `call` definido. +- Sem duplicidades inválidas de parâmetro/condition única. + +### 2) Segurança de conditions +- Todas as conditions usadas na solução final devem ser `GENERATION_SAFE`. +- Conditions `EXPLAIN_ONLY` podem aparecer apenas em seção de alternativa/rascunho não final. + +### 3) Compatibilidade entre partes +- Conditions compatíveis com parâmetros de automacro. +- Macro chamada existe e recebe parâmetros esperados. +- Variáveis usadas foram definidas antes de leitura crítica. + +### 4) Fluxo e controle +- Labels válidos e alcançáveis. +- Loops com condição de saída explícita. +- Retry com contador máximo. + +### 5) Riscos de runtime +- Loop infinito: mitigado por contagem ou timeout. +- Reentrada inesperada: mitigada por lock flag. +- Orphan: macro dependente sem trigger/cleanup tratado. +- Bloqueio: evitar espera indefinida sem fallback. + +### 6) Confiabilidade semântica +- Marcar trechos `PROVADO`, `INFERIDO`, `NÃO COMPROVADO` quando aplicável. +- Declarar explicitamente limitações do runtime que não são garantidas. + +### 7) Impossibilidades +- Se parte do pedido for inviável, não inventar. +- Entregar aproximação realista + explicação da limitação. diff --git a/docs/eventmacro_expert_behavior_patch/03_response_policy_for_complex_requests.md b/docs/eventmacro_expert_behavior_patch/03_response_policy_for_complex_requests.md new file mode 100644 index 0000000000..b5b38a9c7f --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/03_response_policy_for_complex_requests.md @@ -0,0 +1,27 @@ +# 03 Response Policy for Complex Requests + +## Regra de resposta para pedidos complexos +Quando o usuário pedir automação grande, responder em 5 blocos: + +1. **Arquitetura proposta** + - quais macros/automacros/subs serão usadas + - como as peças se conectam + +2. **Implementação completa** + - código completo e consistente + - sem placeholders vagos + +3. **Validação aplicada** + - checklist resumido do protocolo de validação + - confirmação de `GENERATION_SAFE` das conditions usadas + +4. **Limitações e pressupostos** + - dependências implícitas + - riscos residuais + - pontos parcialmente comprovados + +5. **Plano de teste rápido** + - como validar em runtime com segurança + +## Proibição +- Não simplificar demais um pedido complexo a ponto de perder a arquitetura principal. diff --git a/docs/eventmacro_expert_behavior_patch/04_impossibility_and_partial_possibility_policy.md b/docs/eventmacro_expert_behavior_patch/04_impossibility_and_partial_possibility_policy.md new file mode 100644 index 0000000000..089cd3cb25 --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/04_impossibility_and_partial_possibility_policy.md @@ -0,0 +1,19 @@ +# 04 Impossibility and Partial Possibility Policy + +## Quando o pedido está fora das capacidades do eventMacro + +### Política +1. Não inventar sintaxe/recurso inexistente. +2. Declarar claramente o que é impossível. +3. Separar o que é parcialmente possível. +4. Oferecer a melhor aproximação realista dentro do plugin. + +### Formato recomendado +- **Impossível**: requisito X não é suportado pelo contrato comprovado. +- **Parcialmente possível**: Y pode ser aproximado usando A+B+C. +- **Alternativa segura**: implementação concreta dentro do que é `GENERATION_SAFE`. + +### Regras de confiança +- Sem evidência: marcar `NÃO COMPROVADO`. +- Evidência indireta: marcar `INFERIDO`. +- Nunca converter inferência em macro pronta automaticamente. diff --git a/docs/eventmacro_expert_behavior_patch/05_complex_pattern_cookbook.md b/docs/eventmacro_expert_behavior_patch/05_complex_pattern_cookbook.md new file mode 100644 index 0000000000..a77830aa10 --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/05_complex_pattern_cookbook.md @@ -0,0 +1,36 @@ +# 05 Complex Pattern Cookbook + +## Padrão 1 — Trigger + execução separada +- `automacro` com conditions seguras. +- `call` para macro executora. +- Guard de reentrada por variável. + +## Padrão 2 — Chain de macros com checkpoints +- Macro A prepara estado. +- Macro B executa ação principal. +- Macro C valida resultado / fallback. + +## Padrão 3 — Retry controlado +- Variável contador `retry_count`. +- Loop com limite máximo. +- Delay entre tentativas. + +## Padrão 4 — Fallback defensivo +- Se condição principal falhar N vezes, chamar macro fallback. +- Registrar estado de falha para evitar thrashing. + +## Padrão 5 — Exclusividade/Interrupção +- Lock flag (`$state_lock`) antes de fluxo crítico. +- Liberação explícita ao final/erro. + +## Padrão 6 — Reentrada controlada +- Automacro checa lock/cooldown antes de `call`. +- Define lock no início da macro chamada. + +## Padrão 7 — Delay e timeout robustos +- `delay`/`timeout` em pontos de espera. +- Nunca depender de espera infinita sem escape. + +## Padrão 8 — Validação defensiva de parâmetros +- Checar argumento esperado antes de ação sensível. +- Em dúvida, abortar com log e fallback. diff --git a/docs/eventmacro_expert_behavior_patch/06_debugging_and_review_mode.md b/docs/eventmacro_expert_behavior_patch/06_debugging_and_review_mode.md new file mode 100644 index 0000000000..2458623f62 --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/06_debugging_and_review_mode.md @@ -0,0 +1,16 @@ +# 06 Debugging and Review Mode + +## Modo de revisão obrigatória +Ao revisar macro/automacro do usuário, separar achados em: + +1. **Erros de sintaxe** +2. **Erros de tipagem/argumento** +3. **Erros de lógica de fluxo** +4. **Riscos de runtime** (loop, bloqueio, reentrada, orphan) +5. **Refatorações sugeridas** +6. **Trechos dependentes de contrato não comprovado** + +## Política de saída +- Priorizar correções que tornam a macro executável e segura. +- Não sugerir refatoração cosmética antes de corrigir riscos críticos. +- Marcar claramente qualquer ajuste baseado em inferência. diff --git a/docs/eventmacro_expert_behavior_patch/07_instruction_patch_for_gpt.md b/docs/eventmacro_expert_behavior_patch/07_instruction_patch_for_gpt.md new file mode 100644 index 0000000000..fc53efc1c0 --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/07_instruction_patch_for_gpt.md @@ -0,0 +1,25 @@ +# 07 Instruction Patch for GPT + +## Patch de instrução (texto normativo) + +Você deve operar em dois modos complementares: +1. **Factual mode**: usar apenas contratos comprovados. +2. **Expert synthesis mode**: arquitetar solução completa com validação pré-entrega. + +### Regras mandatórias +- Projetar antes de escrever. +- Validar antes de entregar. +- Nunca gerar usando condition não `GENERATION_SAFE`. +- Nunca inventar solução fora das capacidades reais do eventMacro. +- Distinguir explicitamente `PROVADO`, `INFERIDO`, `NÃO COMPROVADO`. +- Em pedidos complexos: responder com arquitetura + implementação + validação + limitações. + +### Sequência obrigatória +1. Entender objetivo. +2. Decompor em primitivas. +3. Verificar safety das conditions. +4. Definir arquitetura. +5. Gerar implementação. +6. Rodar checklist de validação. +7. Declarar riscos e pressupostos. +8. Entregar resposta final. diff --git a/docs/eventmacro_expert_behavior_patch/08_examples_of_full_macro_design.md b/docs/eventmacro_expert_behavior_patch/08_examples_of_full_macro_design.md new file mode 100644 index 0000000000..c945149882 --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/08_examples_of_full_macro_design.md @@ -0,0 +1,41 @@ +# 08 Examples of Full Macro Design + +## Exemplo A — Arquitetura trigger + execução + fallback + +### Arquitetura +- `automacro`: detecta gatilho seguro. +- `macro principal`: executa ação. +- `macro fallback`: recupera em falha. + +### Implementação (esqueleto) +```txt +automacro am_main { + CurrentHP < 40% + call do_main + timeout 1 +} + +macro do_main { + if ($.state_lock == 1) stop + $.state_lock = 1 + # ação principal + if ($.retry_count > 2) call do_fallback + $.state_lock = 0 +} + +macro do_fallback { + # ação de recuperação + $.retry_count = 0 + $.state_lock = 0 +} +``` + +### Validação resumida +- Condition usada: precisa ser `GENERATION_SAFE`. +- Loop/reentrada: lock + contador + fallback. +- Limitação: ajustar comandos concretos ao cenário do usuário. + +## Exemplo B — Revisão de macro com risco de loop +- Problema: `while` sem condição de saída forte. +- Correção: inserir contador máximo e timeout. +- Resultado: fluxo determinístico com fail-safe. diff --git a/docs/eventmacro_expert_behavior_patch/09_files_to_update_in_knowledge_ready.md b/docs/eventmacro_expert_behavior_patch/09_files_to_update_in_knowledge_ready.md new file mode 100644 index 0000000000..6189fd9346 --- /dev/null +++ b/docs/eventmacro_expert_behavior_patch/09_files_to_update_in_knowledge_ready.md @@ -0,0 +1,16 @@ +# 09 Files to Update in knowledge_ready + +## Atualizações mínimas necessárias +1. `docs/eventmacro_gpt_final/knowledge_ready/16_gpt_system_instructions_final.md` + - Incorporar protocolo de síntese e validação de macro completa. + - Forçar política para pedidos complexos e impossibilidades. + +2. `docs/eventmacro_gpt_final/knowledge_ready/11_condition_reference_tables.md` + - Referenciar explicitamente uso de `generation_safety` no fluxo de criação completa. + +3. (Opcional) `docs/eventmacro_gpt_final/knowledge_ready/13_examples_valid.md` + - Adicionar nota de que exemplos são blocos-base; solução final exige validação whole-macro. + +## Limite de arquivos +- Não é necessário adicionar novo arquivo ao `knowledge_ready`. +- Limite <=20 permanece preservado com as atualizações acima. diff --git a/docs/eventmacro_gpt_audit/audit_full/00_audit_scope_and_method.md b/docs/eventmacro_gpt_audit/audit_full/00_audit_scope_and_method.md new file mode 100644 index 0000000000..75f01cfc0a --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/00_audit_scope_and_method.md @@ -0,0 +1,22 @@ +# 00 Audit Scope and Method + +## Escopo +- **PROVADO**: A auditoria usa exclusivamente código-fonte local do repositório (`plugins/eventMacro/...`). +- **PROVADO**: Sem wiki/documentação externa como fonte de verdade. +- **PROVADO**: Foco em parser, gramática, validação, runtime, variáveis, comandos e todas as conditions. + +## Método (9 passagens) +1. Inventário de arquivos (parser/core/runner/conditions/validators/comandos). +2. Extração canônica de gramática, parâmetros, operadores, funções e variáveis. +3. Normalização por condition (catálogo JSON + tabela consolidada). +4. Auditoria profunda de parser (`FileParser.pm`, `Runner.pm`). +5. Auditoria de comparação/range/regex (`Utilities.pm`, `Validator/*`). +6. Auditoria de variáveis/tipagem/callbacks (`Data.pm`, `Utilities.pm`, `Core.pm`). +7. Auditoria de runtime/fila/prioridade/pause/orphan (`Core.pm`, `Automacro.pm`, `Runner.pm`). +8. Catálogo de negativos e não-suportado. +9. Produção em dois níveis: `audit_full/` e `knowledge_ready/`. + +## Regras de classificação de conclusões +- **PROVADO**: comportamento explícito no código. +- **INFERIDO**: dedução estrutural (ex.: por herança/base class). +- **NÃO COMPROVADO**: não há evidência suficiente no código auditado. diff --git a/docs/eventmacro_gpt_audit/audit_full/01_file_inventory.md b/docs/eventmacro_gpt_audit/audit_full/01_file_inventory.md new file mode 100644 index 0000000000..dd49a13874 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/01_file_inventory.md @@ -0,0 +1,177 @@ +# 01 File Inventory + +Status: **PROVADO** (levantado diretamente do repositório). + +## Escopo auditado +- Core/runtime: Core.pm, Automacro.pm, Runner.pm, Macro.pm, Lists.pm, Data.pm, Utilities.pm. +- Parser/gramática: FileParser.pm e parser de comandos/condições em Runner.pm. +- Validação: Validator/*.pm e lógica de validação nos módulos Condition*. +- Conditions: Condition.pm, Conditiontypes/*.pm, Condition/Base/*.pm, Condition/*.pm. +- Entrada plugin/comandos console: eventMacro.pl. + +## Árvore (arquivos principais) +``` +plugins/eventMacro/eventMacro/Automacro.pm +plugins/eventMacro/eventMacro/Condition.pm +plugins/eventMacro/eventMacro/Core.pm +plugins/eventMacro/eventMacro/Data.pm +plugins/eventMacro/eventMacro/FileParser.pm +plugins/eventMacro/eventMacro/Lists.pm +plugins/eventMacro/eventMacro/Macro.pm +plugins/eventMacro/eventMacro/Runner.pm +plugins/eventMacro/eventMacro/Utilities.pm +plugins/eventMacro/eventMacro/Validator.pm +plugins/eventMacro/eventMacro/Condition/ (118 módulos) + AttackEnd.pm + AttackStart.pm + AttackStartRegex.pm + BaseLevel.pm + BusMsg.pm + CartCurrentSize.pm + CartCurrentWeight.pm + CartMaxSize.pm + CartMaxWeight.pm + CharCurrentWeight.pm + CharMaxWeight.pm + ChatRoomNear.pm + ConfigKey.pm + ConfigKeyDefined.pm + ConfigKeyDualDifferentDefinedValue.pm + ConfigKeyDualSameDefinedValue.pm + ConfigKeyNot.pm + ConfigKeyNotExist.pm + ConfigKeyUndefined.pm + Console.pm + CurrentHP.pm + CurrentSP.pm + Eval.pm + EvalHook.pm + FreeSkillPoints.pm + FreeStatPoints.pm + GuildMsg.pm + GuildMsgDist.pm + GuildMsgName.pm + GuildMsgNameDist.pm + InCart.pm + InCartID.pm + InChatRoom.pm + InCity.pm + InInventory.pm + InInventoryID.pm + InLockMap.pm + InMap.pm + InMapRegex.pm + InProgressBar.pm + InPvP.pm + InSaveMap.pm + InStorage.pm + InStorageID.pm + InventoryCurrentSize.pm + InventoryReady.pm + IsEquippedID.pm + IsInCoordinate.pm + IsInMapAndCoordinate.pm + IsNotEquippedID.pm + IsNotInCoordinate.pm + IsNotInMapAndCoordinate.pm + JobID.pm + JobIDNot.pm + JobLevel.pm + LocalMsg.pm + MapLoaded.pm + MaxHP.pm + MaxSP.pm + MobNear.pm + MobNearCount.pm + MobNearDist.pm + MobNotNear.pm + NoMobNear.pm + NoNpcNear.pm + NoPlayerNear.pm + NoPortalNear.pm + NotInMap.pm + NpcMsg.pm + NpcMsgDist.pm + NpcMsgName.pm + NpcMsgNameDist.pm + NpcNear.pm + NpcNearCount.pm + NpcNearDist.pm + NpcNotNear.pm + OnCharLogIn.pm + PartyMsg.pm + PartyMsgDist.pm + PartyMsgName.pm + PartyMsgNameDist.pm + PlayerNear.pm + PlayerNearCount.pm + PlayerNearDist.pm + PlayerNotNear.pm + PortalNearCount.pm + PrivMsg.pm + PrivMsgDist.pm + PrivMsgName.pm + PrivMsgNameDist.pm + PubMsg.pm + PubMsgDist.pm + PubMsgName.pm + PubMsgNameDist.pm + QuestActive.pm + QuestComplete.pm + QuestHuntCompleted.pm + QuestHuntOngoing.pm + QuestInactive.pm + QuestIncomplete.pm + QuestNotComplete.pm + QuestNotIncomplete.pm + QuestOnTime.pm + QuestTimeOverdue.pm + ShopOpened.pm + SimpleHookEvent.pm + SkillLevel.pm + Spirits.pm + StatAdded.pm + StatusActiveHandle.pm + StatusInactiveHandle.pm + StorageOpened.pm + SystemMsg.pm + VarValue.pm + Zeny.pm + ZenyChanged.pm + isInMapAndCloseToCoordinate.pm + isNotInMapOrNotCloseToCoordinate.pm +plugins/eventMacro/eventMacro/Condition/Base/ (13 módulos) + ActorNear.pm + ActorNearCount.pm + ActorNearDist.pm + ActorNotNear.pm + InCart.pm + InInventory.pm + InStorage.pm + Inventory.pm + Msg.pm + MsgDist.pm + MsgName.pm + MsgNameDist.pm + NoActorNear.pm +plugins/eventMacro/eventMacro/Conditiontypes/ (7 módulos) + ListConditionEvent.pm + ListConditionState.pm + NumericConditionEvent.pm + NumericConditionState.pm + RegexConditionEvent.pm + RegexConditionState.pm + SimpleEvent.pm +plugins/eventMacro/eventMacro/Validator/ (3 módulos) + ListMemberCheck.pm + NumericComparison.pm + RegexCheck.pm +``` + +## Mapa de responsabilidade +- **Gramática de arquivo**: `FileParser::parseMacroFile`, `isNewCommandBlock`, `isNewWrongCommandBlock`. +- **Execução de linguagem macro**: `Runner::define_next_valid_command`, `Runner::next`, `Runner::parse_command`. +- **Comparação/range/regex/lista**: `Utilities::cmpr`, `Utilities::match`, `Validator::NumericComparison`, `Validator::RegexCheck`, `Validator::ListMemberCheck`. +- **Variáveis/sistema de tipos**: `Data.pm` (regex de variável), `Utilities::find_variable`, `Core` (set/get callbacks e especiais). +- **Semântica de automacro/fila/prioridade**: `Core.pm`, `Automacro.pm`. +- **Comandos console (`eventMacro`/`emacro`)**: `eventMacro.pl::commandHandler`. diff --git a/docs/eventmacro_gpt_audit/audit_full/02_eventmacro_canonical_spec.md b/docs/eventmacro_gpt_audit/audit_full/02_eventmacro_canonical_spec.md new file mode 100644 index 0000000000..d7335959a7 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/02_eventmacro_canonical_spec.md @@ -0,0 +1,37 @@ +# 02 EventMacro Canonical Spec + +## Conceitos +- **macro**: bloco executável com linhas de comando (`macro { ... }`). **PROVADO**. +- **automacro**: bloco declarativo com parâmetros + conditions que dispara `call`. **PROVADO**. +- **sub**: bloco perl registrado dinamicamente (`sub { ... }`). **PROVADO**. + +## Tipos de condition +- **state condition**: mantém estado (`is_fulfilled`) e participa da fila de automacros. **PROVADO**. +- **event condition**: valida apenas no evento; não mantém estado persistente igual state para fila contínua. **PROVADO**. +- Restrição: no máximo **1 event-type condition por automacro**. **PROVADO**. + +## Parâmetros de automacro suportados +`timeout, delay, run-once, disabled, call, overrideAI, orphan, macro_delay, priority, exclusive, self_interruptible, repeat, CheckOnAI`. **PROVADO**. + +## Restrições de automacro +- Nome sem espaços. **PROVADO**. +- Requer conditions e parameters, e parâmetro `call` válido. **PROVADO**. +- Parâmetro duplicado rejeita automacro. **PROVADO**. +- Condition única (quando módulo define `is_unique_condition`) não pode repetir no mesmo automacro. **PROVADO**. + +## Operadores e comparações +- Numérico/texto/lista/regex em `Utilities::cmpr`. **PROVADO**. +- Range `a..b` suportado para igualdade/inequidade (`==`, `=`, `!=`, `=~`, `~` no `cmpr`). **PROVADO**. +- Regex literal `/.../i?` suportado. **PROVADO**. +- Lista CSV com `~` (membro em lista, case-insensitive no `cmpr`). **PROVADO**. + +## Variáveis +- Tipos: scalar `$`, array `@`, hash `%`, acessos `$a[i]`, `$h{k}`. **PROVADO**. +- Variáveis de sistema iniciando com `.` existem (somente leitura para set manual/assign). **PROVADO**. +- Uso de variáveis de sistema em automacro conditions geralmente bloqueado pelos validadores. **PROVADO**. + +## NÃO SUPORTADO (núcleo) +- Mais de uma event condition por automacro. **PROVADO**. +- `eventMacro` dentro de `do ...` em macro script. **PROVADO**. +- `do ai clear` em macro script. **PROVADO**. +- Misturar `&&` e `||` sem agrupamento apropriado em statement. **PROVADO** (erro em `resolve_multi...`). diff --git a/docs/eventmacro_gpt_audit/audit_full/03_grammar_and_parsing.md b/docs/eventmacro_gpt_audit/audit_full/03_grammar_and_parsing.md new file mode 100644 index 0000000000..fef6986f7f --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/03_grammar_and_parsing.md @@ -0,0 +1,27 @@ +# 03 Grammar and Parsing + +## Arquivo eventMacros +- `macro { ... }` abre macro. **PROVADO**. +- `automacro { ... }` abre automacro. **PROVADO**. +- `sub { ... }` abre sub perl. **PROVADO**. +- Comentário de fim de linha (`#...`) removido no parser de arquivo. **PROVADO**. +- Espaços são normalizados (`trim` e colapso de múltiplos espaços). **PROVADO**. + +## include/call/sub +- `!include ` **NÃO foi comprovado** em `FileParser.pm` como diretiva de parse recursivo nesta revisão. +- Em automacro: `call nomeMacro [args...]` grava em parâmetro `call`. **PROVADO**. +- Em automacro: `call { ... }` gera macro interna `automacro__call_block`. **PROVADO**. +- `sub` vira código perl compilado em runtime via `eval`, e registrado em `main::`. **PROVADO**. + +## Parser de fluxo de macro (Runner) +- Blocos reconhecidos: `if/elsif/else`, `switch/case/else`, `while`, labels `:x`, `goto`. **PROVADO**. +- `[` e `]` ativam/desativam `macro_block` (execução sem esperar timeout entre linhas do bloco). **PROVADO**. +- `if` pós-fixado (`cmd if (...)`) suportado. **PROVADO**. +- `switch` aceita apenas `case` e `else` dentro do bloco. **PROVADO**. + +## Erros de parsing/validação que invalidam automacro +- Nome com espaço, sem conditions, sem parameters, sem `call`, parâmetro inválido, módulo de condition inexistente, sintaxe inválida de condition. **PROVADO**. +- Duplicidade de parâmetro, duplicidade de condition única, múltiplas event-type conditions. **PROVADO**. + +## Ambiguidades +- Há regex permissivas em `isNewCommandBlock/isNewWrongCommandBlock` (ex.: `else*`), podendo aceitar padrões inesperados. **INFERIDO**. diff --git a/docs/eventmacro_gpt_audit/audit_full/04_commands_and_runtime.md b/docs/eventmacro_gpt_audit/audit_full/04_commands_and_runtime.md new file mode 100644 index 0000000000..475f16fe70 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/04_commands_and_runtime.md @@ -0,0 +1,26 @@ +# 04 Commands and Runtime + +## Comandos console +`eventMacro|emacro`: +- `auto`, `list`, `status`, `check`, `stop`, `pause`, `unpause`, `var_get`, `var_set`, `enable`, `disable`, `include`, ou nome de macro. **PROVADO**. + +## Comandos da linguagem macro +- Atribuição (`$x = ...`, `$x++`, `$x--`, `@a=(...)`, `%h=(k=>v,...)`). **PROVADO**. +- `do ...`, `log|warning|error ...`, `pause [n]`, `stop`, `release`, `lock`, `call`, `set`, `include`. **PROVADO**. +- Suporte a `push/unshift/pop/shift`, `delete/exists`, `defined` via macro keywords. **PROVADO**. + +## Fila/prioridade/disparo +- Automacros state fulfilled entram em fila ordenada por `priority` (menor valor = maior prioridade efetiva na frente). **PROVADO**. +- Event conditions não entram na fila contínua; disparam no callback e escolhem melhor prioridade entre candidatos no evento. **PROVADO**. +- `timeout` controla re-disparo de automacro; `delay` atraso inicial do macro chamado; `macro_delay` atraso entre comandos. **PROVADO**. +- `run-once` desabilita automacro após chamada. **PROVADO**. + +## interruptibilidade/AI/orphan +- `exclusive=1` => macro não interruptível (`interruptible=0`) e pausa checking de automacros (salvo force user). **PROVADO**. +- `self_interruptible` bloqueia interrupção por seu próprio automacro chamador quando 0. **PROVADO**. +- `overrideAI=1` retira `eventMacro` da AI queue. **PROVADO**. +- `orphan`: `terminate|terminate_last_call|reregister|reregister_safe`. **PROVADO**. + +## clear_queue/handoff +- `clear_queue` encerra runner, remove hook de iteração e restaura checking quando necessário. **PROVADO**. +- Ao limpar fila sem `skip`, `handoff_to_pending_automacros` pode chamar automacro pendente imediatamente. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/audit_full/05_variables_and_special_variables.md b/docs/eventmacro_gpt_audit/audit_full/05_variables_and_special_variables.md new file mode 100644 index 0000000000..826f81a098 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/05_variables_and_special_variables.md @@ -0,0 +1,34 @@ +# 05 Variables and Special Variables + +## Sintaxe de variáveis +- Escalar: `$name` +- Array: `@name` +- Hash: `%name` +- Acesso array: `$name[index]` (index numérico ou variável resolvível) +- Acesso hash: `$name{key}` (key alfanumérico/underscore ou variável resolvível) + +Status: **PROVADO**. + +## Regex-base de nomes +- Nomes válidos: `\.?[a-zA-Z][a-zA-Z\d_]*`. **PROVADO**. +- Complementos em parse amplo: índices/chaves dinâmicos aceitos em regex mais ampla. **PROVADO**. + +## Variáveis especiais `.xxx` +Exemplos implementados em `Core::get_scalar_var`: +- tempo: `.time .datetime .hour ...` +- mapa: `.map .incity .inlockmap` +- personagem: `.job .pos .name .hp .sp .lvl .joblvl .spirits .zeny .weight ...` +- status: `.status .statushandle` +- inventário/carrinho/storage: `.inventoryitems .cart* .shopopen .storage*` + +Status: **PROVADO**. + +## Restrições +- Definição manual de variáveis de sistema (prefixo `.`) é bloqueada em `var_set` e em atribuição de macro runner. **PROVADO**. +- Validadores de conditions geralmente rejeitam variáveis de sistema como argumento de automacro. **PROVADO**. + +## Callbacks de mudança +- `Core` dispara callbacks por tipo (`scalar`, `array`, `hash`, `accessed_array`, `accessed_hash`) e gerencia complementos dinâmicos para acessos aninhados via variáveis. **PROVADO**. + +## Arrays e hashes completos +- `set_full_array`, `set_full_hash`, `clear_array`, `clear_hash`, `push/pop/shift/unshift`, `delete_key`, `exists_hash`, `keys`, `values`. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/audit_full/06_macro_keywords_and_functions.md b/docs/eventmacro_gpt_audit/audit_full/06_macro_keywords_and_functions.md new file mode 100644 index 0000000000..f50277ffa2 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/06_macro_keywords_and_functions.md @@ -0,0 +1,23 @@ +# 06 Macro Keywords and Functions + +## Macro keywords (`&keyword(...)`) +Base em `Data.pm` + execução em `Runner::parse_command`. + +Principais suportados (PROVADO): +- lookup/ids: `npc player monster vender inventory Inventory InventoryType cart Cart storage Storage` +- quantidades/preços: `invamount cartamount shopamount storamount venderamount venderprice` +- utilitários: `arg random rand split strip config` +- hash/array: `keys values push pop shift unshift exists delete defined` +- quest: `questStatus questInactiveCount questIncompleteCount questCompleteCount` +- equipamento: `itemCard itemCardAmount itemOption itemOptAmount` +- `eval` (bloqueado por lockdown global) + +## Subrotinas perl +- Subs registradas por bloco `sub` podem ser chamadas como `nomeSub(...)` no parser de comando. **PROVADO**. +- Se sub inexistente: erro. +- Pode retornar scalar/ref array/ref hash, com tratamento específico no parser. **PROVADO**. + +## Funções internas de comparação +- `cmpr` suporta operadores: `= == != > < >= <= ~ =~`. **PROVADO**. +- Regex literal somente formato `/.../` com opcional `i`. **PROVADO**. +- Range com `..` suportado para igualdade/inequidade. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/audit_full/07_automacro_parameters.md b/docs/eventmacro_gpt_audit/audit_full/07_automacro_parameters.md new file mode 100644 index 0000000000..e130b696d4 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/07_automacro_parameters.md @@ -0,0 +1,24 @@ +# 07 Automacro Parameters + +Status de validação: **PROVADO** (Core::create_automacro_list + Automacro::set_parameters). + +| Parâmetro | Regra de validação | Default | +|---|---|---| +| timeout | número (uso runtime) | 0 | +| delay | número (`^[\d\.]*\d+$`) | 0 | +| run-once | `0|1` | 0 | +| disabled | `0|1` | 0 | +| call | macro existente; pode conter args | obrigatório | +| overrideAI | `0|1` | 0 | +| orphan | `terminate|terminate_last_call|reregister|reregister_safe` | `config{eventMacro_orphans}` | +| macro_delay | número decimal permitido | `timeout{eventMacro_delay}` | +| priority | inteiro não-negativo | 0 | +| exclusive | `0|1` | 0 | +| self_interruptible | `0|1` | 0 | +| repeat | inteiro não-negativo | 1 | +| CheckOnAI | CSV de `auto|off|manual` | `config{eventMacro_CheckOnAI}` | + +## Regras adicionais +- Parâmetro duplicado invalida automacro. **PROVADO**. +- Ausência de `call` invalida automacro. **PROVADO**. +- `call` com args separa nome e grava `.param` quando executar. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/audit_full/08_condition_catalog.md b/docs/eventmacro_gpt_audit/audit_full/08_condition_catalog.md new file mode 100644 index 0000000000..c7165a632d --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/08_condition_catalog.md @@ -0,0 +1,7 @@ +# 08 Condition Catalog + +Status geral: nome/módulo/herança/tipo/hooks **PROVADO**; `parser_mode`/`argument_contract` em `custom` podem ser **INFERIDO**. + +| Condition | Tipo | Parser mode | Hooks | regex | range | csv | var | +|---|---|---|---|---|---|---|---| +| AttackEnd | EVENT | csv_list | attack_end | false | false | true | false |\n| AttackStart | EVENT | csv_list | attack_start | false | false | true | false |\n| AttackStartRegex | EVENT | regex_literal | attack_start | true | false | false | false |\n| BaseLevel | STATE | numeric_comparison | base_level_changed, Network::Receive::map_changed, in_game, packet/stat_info | false | true | false | false |\n| BusMsg | EVENT | regex_literal | - | true | false | false | false |\n| CartCurrentSize | STATE | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false |\n| CartCurrentWeight | STATE | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false |\n| CartMaxSize | STATE | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false |\n| CartMaxWeight | STATE | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false |\n| CharCurrentWeight | STATE | numeric_comparison | inventory_clear, inventory_ready, packet/stat_info | false | true | false | false |\n| CharMaxWeight | STATE | numeric_comparison | inventory_clear, inventory_ready, packet/stat_info | false | true | false | false |\n| ChatRoomNear | STATE | regex_literal | packet_mapChange, chat_created, packet_chatinfo, chat_removed, chat_modified | true | false | false | false |\n| ConfigKey | STATE | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true |\n| ConfigKeyDefined | STATE | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true |\n| ConfigKeyDualDifferentDefinedValue | STATE | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | false |\n| ConfigKeyDualSameDefinedValue | STATE | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | false |\n| ConfigKeyNot | STATE | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true |\n| ConfigKeyNotExist | STATE | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true |\n| ConfigKeyUndefined | STATE | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true |\n| Console | EVENT | regex_literal | log | true | false | false | false |\n| CurrentHP | STATE | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false |\n| CurrentSP | STATE | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false |\n| Eval | STATE | composite_regex_numeric | AI_pre | true | true | false | false |\n| EvalHook | STATE | composite_regex_numeric | - | true | true | false | true |\n| FreeSkillPoints | STATE | numeric_comparison | packet/stat_info, packet_charSkills, packet_homunSkills | false | true | false | false |\n| FreeStatPoints | STATE | numeric_comparison | packet/stat_info, packet/stats_info | false | true | false | false |\n| GuildMsg | EVENT | regex_literal | - | true | false | false | false |\n| GuildMsgDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| GuildMsgName | EVENT | composite_regex_numeric | - | true | true | false | false |\n| GuildMsgNameDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| InCart | STATE | numeric_comparison | - | false | true | false | false |\n| InCartID | STATE | numeric_comparison | - | false | true | false | false |\n| InChatRoom | STATE | composite_regex_numeric | packet_mapChange, chat_created, chat_leave, chat_joined | true | true | false | false |\n| InCity | STATE | composite_regex_numeric | Network::Receive::map_changed, in_game, packet_mapChange | true | true | false | false |\n| InInventory | STATE | numeric_comparison | - | false | true | false | false |\n| InInventoryID | STATE | numeric_comparison | - | false | true | false | false |\n| InLockMap | STATE | composite_regex_numeric | packet_mapChange, configModify, pos_load_config.txt, in_game | true | true | false | false |\n| InMap | STATE | csv_list | Network::Receive::map_changed, in_game, packet_mapChange | false | false | true | false |\n| InMapRegex | STATE | regex_literal | Network::Receive::map_changed, in_game, packet_mapChange | true | false | false | false |\n| InProgressBar | STATE | composite_regex_numeric | packet/progress_bar, packet/progress_bar_stop, packet_mapChange, packet/map_property3 | true | true | false | false |\n| InPvP | STATE | csv_list | packet_mapChange, pvp_mode | false | false | true | false |\n| InSaveMap | STATE | composite_regex_numeric | Network::Receive::map_changed, in_game, packet_mapChange, configModify, pos_load_config.txt | true | true | false | false |\n| InStorage | STATE | numeric_comparison | - | false | true | false | false |\n| InStorageID | STATE | numeric_comparison | - | false | true | false | false |\n| InventoryCurrentSize | STATE | numeric_comparison | inventory_clear, inventory_ready, item_gathered, inventory_item_removed | false | true | false | false |\n| InventoryReady | STATE | composite_regex_numeric | inventory_clear, inventory_ready | true | true | false | false |\n| IsEquippedID | STATE | composite_regex_numeric | inventory_clear, equipped_item, unequipped_item, inventory_ready | true | true | false | true |\n| IsInCoordinate | STATE | composite_regex_numeric | - | true | true | false | true |\n| IsInMapAndCoordinate | STATE | composite_regex_numeric | packet/actor_movement_interrupted, packet/high_jump, packet/character_moves, packet_mapChange, packet/map_property3 | true | true | false | true |\n| IsNotEquippedID | STATE | composite_regex_numeric | inventory_clear, equipped_item, unequipped_item, inventory_ready | true | true | false | true |\n| IsNotInCoordinate | STATE | composite_regex_numeric | - | true | true | false | true |\n| IsNotInMapAndCoordinate | STATE | composite_regex_numeric | - | true | true | false | true |\n| JobID | STATE | composite_regex_numeric | Network::Receive::map_changed, in_game, sprite_job_change | true | true | false | true |\n| JobIDNot | STATE | composite_regex_numeric | Network::Receive::map_changed, in_game, sprite_job_change | true | true | false | true |\n| JobLevel | STATE | numeric_comparison | job_level_changed, Network::Receive::map_changed, in_game, packet/stat_info | false | true | false | false |\n| LocalMsg | EVENT | regex_literal | - | true | false | false | false |\n| MapLoaded | EVENT | csv_list | packet_mapChange | false | false | true | false |\n| MaxHP | STATE | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false |\n| MaxSP | STATE | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false |\n| MobNear | STATE | regex_literal | - | true | false | false | false |\n| MobNearCount | STATE | numeric_comparison | - | false | true | false | false |\n| MobNearDist | STATE | composite_regex_numeric | - | true | true | false | false |\n| MobNotNear | STATE | regex_literal | - | true | false | false | false |\n| NoMobNear | STATE | composite_regex_numeric | - | true | true | false | false |\n| NoNpcNear | STATE | composite_regex_numeric | - | true | true | false | false |\n| NoPlayerNear | STATE | composite_regex_numeric | - | true | true | false | false |\n| NoPortalNear | STATE | composite_regex_numeric | - | true | true | false | false |\n| NotInMap | STATE | csv_list | - | false | false | true | false |\n| NpcMsg | EVENT | regex_literal | - | true | false | false | false |\n| NpcMsgDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| NpcMsgName | EVENT | composite_regex_numeric | - | true | true | false | false |\n| NpcMsgNameDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| NpcNear | STATE | regex_literal | - | true | false | false | false |\n| NpcNearCount | STATE | numeric_comparison | - | false | true | false | false |\n| NpcNearDist | STATE | composite_regex_numeric | - | true | true | false | false |\n| NpcNotNear | STATE | regex_literal | - | true | false | false | false |\n| OnCharLogIn | EVENT | simple_event | in_game | false | false | false | false |\n| PartyMsg | EVENT | regex_literal | - | true | false | false | false |\n| PartyMsgDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| PartyMsgName | EVENT | composite_regex_numeric | - | true | true | false | false |\n| PartyMsgNameDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| PlayerNear | STATE | regex_literal | - | true | false | false | false |\n| PlayerNearCount | STATE | numeric_comparison | - | false | true | false | false |\n| PlayerNearDist | STATE | composite_regex_numeric | - | true | true | false | false |\n| PlayerNotNear | STATE | regex_literal | - | true | false | false | false |\n| PortalNearCount | STATE | numeric_comparison | - | false | true | false | false |\n| PrivMsg | EVENT | regex_literal | - | true | false | false | false |\n| PrivMsgDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| PrivMsgName | EVENT | composite_regex_numeric | - | true | true | false | false |\n| PrivMsgNameDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| PubMsg | EVENT | regex_literal | - | true | false | false | false |\n| PubMsgDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| PubMsgName | EVENT | composite_regex_numeric | - | true | true | false | false |\n| PubMsgNameDist | EVENT | composite_regex_numeric | - | true | true | false | false |\n| QuestActive | STATE | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| QuestComplete | STATE | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| QuestHuntCompleted | STATE | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| QuestHuntOngoing | STATE | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| QuestInactive | STATE | composite_regex_numeric | achievement_list, quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| QuestIncomplete | STATE | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| QuestNotComplete | STATE | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| QuestNotIncomplete | STATE | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| QuestOnTime | STATE | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| QuestTimeOverdue | STATE | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true |\n| ShopOpened | STATE | composite_regex_numeric | in_game, open_shop, packet_send/shop_open, packet_send/shop_close, shop_closed, packet_mapChange | true | true | false | false |\n| SimpleHookEvent | EVENT | composite_regex_numeric | - | true | true | false | true |\n| SkillLevel | STATE | numeric_comparison | packet/skill_update, packet/skills_list, packet/skill_add, packet/skill_delete | false | true | false | false |\n| Spirits | STATE | numeric_comparison | packet/revolving_entity | false | true | false | false |\n| StatAdded | EVENT | csv_list | packet_charStats | false | false | true | false |\n| StatusActiveHandle | STATE | composite_regex_numeric | Actor::setStatus::change | true | true | false | true |\n| StatusInactiveHandle | STATE | composite_regex_numeric | in_game, Actor::setStatus::change | true | true | false | true |\n| StorageOpened | STATE | composite_regex_numeric | in_game, packet_storage_open, packet_storage_close | true | true | false | false |\n| SystemMsg | EVENT | regex_literal | - | true | false | false | false |\n| VarValue | STATE | composite_regex_numeric | - | true | true | false | true |\n| Zeny | STATE | numeric_comparison | zeny_change, packet/stat_info, packet/stats_info, complete_deal | false | true | false | false |\n| ZenyChanged | EVENT | numeric_comparison | zeny_change | false | true | false | false |\n| isInMapAndCloseToCoordinate | STATE | composite_regex_numeric | packet/actor_movement_interrupted, packet/high_jump, packet/character_moves, packet_mapChange, packet/map_property3 | true | true | false | false |\n| isNotInMapOrNotCloseToCoordinate | STATE | composite_regex_numeric | packet/actor_movement_interrupted, packet/high_jump, packet/character_moves, packet_mapChange, packet/map_property3 | true | true | false | false |\n \ No newline at end of file diff --git a/docs/eventmacro_gpt_audit/audit_full/09_condition_catalog.json b/docs/eventmacro_gpt_audit/audit_full/09_condition_catalog.json new file mode 100644 index 0000000000..f2c3d52775 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/09_condition_catalog.json @@ -0,0 +1,6516 @@ +[ + { + "name": "AttackEnd", + "module": "eventMacro::Condition::AttackEnd", + "file": "plugins/eventMacro/eventMacro/Condition/AttackEnd.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::AttackEnd", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "attack_end" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"Name", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 24, + "file": "plugins/eventMacro/eventMacro/Condition/AttackEnd.pm" + } + }, + { + "name": "AttackStart", + "module": "eventMacro::Condition::AttackStart", + "file": "plugins/eventMacro/eventMacro/Condition/AttackStart.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::AttackStart", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "attack_start" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"Name", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 24, + "file": "plugins/eventMacro/eventMacro/Condition/AttackStart.pm" + } + }, + { + "name": "AttackStartRegex", + "module": "eventMacro::Condition::AttackStartRegex", + "file": "plugins/eventMacro/eventMacro/Condition/AttackStartRegex.pm", + "base": "eventMacro::Conditiontypes::RegexConditionEvent", + "ancestry": [ + "eventMacro::Condition::AttackStartRegex", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "attack_start" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"Name", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/AttackStartRegex.pm" + } + }, + { + "name": "BaseLevel", + "module": "eventMacro::Condition::BaseLevel", + "file": "plugins/eventMacro/eventMacro/Condition/BaseLevel.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::BaseLevel", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "base_level_changed", + "Network::Receive::map_changed", + "in_game", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/BaseLevel.pm" + } + }, + { + "name": "BusMsg", + "module": "eventMacro::Condition::BusMsg", + "file": "plugins/eventMacro/eventMacro/Condition/BusMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::BusMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/BusMsg.pm" + } + }, + { + "name": "CartCurrentSize", + "module": "eventMacro::Condition::CartCurrentSize", + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentSize.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartCurrentSize", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 32, + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentSize.pm" + } + }, + { + "name": "CartCurrentWeight", + "module": "eventMacro::Condition::CartCurrentWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartCurrentWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 32, + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentWeight.pm" + } + }, + { + "name": "CartMaxSize", + "module": "eventMacro::Condition::CartMaxSize", + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxSize.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartMaxSize", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxSize.pm" + } + }, + { + "name": "CartMaxWeight", + "module": "eventMacro::Condition::CartMaxWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartMaxWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxWeight.pm" + } + }, + { + "name": "CharCurrentWeight", + "module": "eventMacro::Condition::CharCurrentWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CharCurrentWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CharCurrentWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 29, + "new_vars_line": 53, + "file": "plugins/eventMacro/eventMacro/Condition/CharCurrentWeight.pm" + } + }, + { + "name": "CharMaxWeight", + "module": "eventMacro::Condition::CharMaxWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CharMaxWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CharMaxWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/CharMaxWeight.pm" + } + }, + { + "name": "ChatRoomNear", + "module": "eventMacro::Condition::ChatRoomNear", + "file": "plugins/eventMacro/eventMacro/Condition/ChatRoomNear.pm", + "base": "eventMacro::Conditiontypes::RegexConditionState", + "ancestry": [ + "eventMacro::Condition::ChatRoomNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "chat_created", + "packet_chatinfo", + "chat_removed", + "chat_modified" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"OwnerID", + "\".$self->{name}.\"Last\".\"OwnerName", + "\".$self->{name}.\"Last\".\"Title" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 21, + "new_vars_line": 83, + "file": "plugins/eventMacro/eventMacro/Condition/ChatRoomNear.pm" + } + }, + { + "name": "ConfigKey", + "module": "eventMacro::Condition::ConfigKey", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKey.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKey", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex", + "\".$self->{name}.\"LastValue" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": 15, + "validate_condition_line": 130, + "new_vars_line": 183, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKey.pm" + } + }, + { + "name": "ConfigKeyDefined", + "module": "eventMacro::Condition::ConfigKeyDefined", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDefined.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyDefined", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 55, + "new_vars_line": 103, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDefined.pm" + } + }, + { + "name": "ConfigKeyDualDifferentDefinedValue", + "module": "eventMacro::Condition::ConfigKeyDualDifferentDefinedValue", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualDifferentDefinedValue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyDualDifferentDefinedValue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s+/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey1", + "\".$self->{name}.\"LastKey2", + "\".$self->{name}.\"LastValue1", + "\".$self->{name}.\"LastValue2" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 56, + "new_vars_line": 80, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualDifferentDefinedValue.pm" + } + }, + { + "name": "ConfigKeyDualSameDefinedValue", + "module": "eventMacro::Condition::ConfigKeyDualSameDefinedValue", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualSameDefinedValue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyDualSameDefinedValue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s+/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey1", + "\".$self->{name}.\"LastKey2", + "\".$self->{name}.\"LastValue" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 55, + "new_vars_line": 77, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualSameDefinedValue.pm" + } + }, + { + "name": "ConfigKeyNot", + "module": "eventMacro::Condition::ConfigKeyNot", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNot.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyNot", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastKeyValue", + "\".$self->{name}.\"LastMemberIndex", + "\".$self->{name}.\"LastWantedValue" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": 15, + "validate_condition_line": 132, + "new_vars_line": 186, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNot.pm" + } + }, + { + "name": "ConfigKeyNotExist", + "module": "eventMacro::Condition::ConfigKeyNotExist", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNotExist.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyNotExist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 55, + "new_vars_line": 103, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNotExist.pm" + } + }, + { + "name": "ConfigKeyUndefined", + "module": "eventMacro::Condition::ConfigKeyUndefined", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyUndefined.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyUndefined", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 55, + "new_vars_line": 104, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyUndefined.pm" + } + }, + { + "name": "Console", + "module": "eventMacro::Condition::Console", + "file": "plugins/eventMacro/eventMacro/Condition/Console.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::Console", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "log" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 11, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/Console.pm" + } + }, + { + "name": "CurrentHP", + "module": "eventMacro::Condition::CurrentHP", + "file": "plugins/eventMacro/eventMacro/Condition/CurrentHP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CurrentHP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 30, + "file": "plugins/eventMacro/eventMacro/Condition/CurrentHP.pm" + } + }, + { + "name": "CurrentSP", + "module": "eventMacro::Condition::CurrentSP", + "file": "plugins/eventMacro/eventMacro/Condition/CurrentSP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CurrentSP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 30, + "file": "plugins/eventMacro/eventMacro/Condition/CurrentSP.pm" + } + }, + { + "name": "Eval", + "module": "eventMacro::Condition::Eval", + "file": "plugins/eventMacro/eventMacro/Condition/Eval.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::Eval", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "AI_pre" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 6, + "parse_syntax_line": 10, + "validate_condition_line": 20, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/Eval.pm" + } + }, + { + "name": "EvalHook", + "module": "eventMacro::Condition::EvalHook", + "file": "plugins/eventMacro/eventMacro/Condition/EvalHook.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::EvalHook", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 45, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/EvalHook.pm" + } + }, + { + "name": "FreeSkillPoints", + "module": "eventMacro::Condition::FreeSkillPoints", + "file": "plugins/eventMacro/eventMacro/Condition/FreeSkillPoints.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::FreeSkillPoints", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/stat_info", + "packet_charSkills", + "packet_homunSkills" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 27, + "file": "plugins/eventMacro/eventMacro/Condition/FreeSkillPoints.pm" + } + }, + { + "name": "FreeStatPoints", + "module": "eventMacro::Condition::FreeStatPoints", + "file": "plugins/eventMacro/eventMacro/Condition/FreeStatPoints.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::FreeStatPoints", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/stat_info", + "packet/stats_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/FreeStatPoints.pm" + } + }, + { + "name": "GuildMsg", + "module": "eventMacro::Condition::GuildMsg", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::GuildMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsg.pm" + } + }, + { + "name": "GuildMsgDist", + "module": "eventMacro::Condition::GuildMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::GuildMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgDist.pm" + } + }, + { + "name": "GuildMsgName", + "module": "eventMacro::Condition::GuildMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::GuildMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 16, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgName.pm" + } + }, + { + "name": "GuildMsgNameDist", + "module": "eventMacro::Condition::GuildMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::GuildMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgNameDist.pm" + } + }, + { + "name": "InCart", + "module": "eventMacro::Condition::InCart", + "file": "plugins/eventMacro/eventMacro/Condition/InCart.pm", + "base": "eventMacro::Condition::Base::InCart", + "ancestry": [ + "eventMacro::Condition::InCart", + "eventMacro::Condition::Base::InCart", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InCart.pm" + } + }, + { + "name": "InCartID", + "module": "eventMacro::Condition::InCartID", + "file": "plugins/eventMacro/eventMacro/Condition/InCartID.pm", + "base": "eventMacro::Condition::Base::InCart", + "ancestry": [ + "eventMacro::Condition::InCartID", + "eventMacro::Condition::Base::InCart", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 8, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InCartID.pm" + } + }, + { + "name": "InChatRoom", + "module": "eventMacro::Condition::InChatRoom", + "file": "plugins/eventMacro/eventMacro/Condition/InChatRoom.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InChatRoom", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "chat_created", + "chat_leave", + "chat_joined" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 26, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InChatRoom.pm" + } + }, + { + "name": "InCity", + "module": "eventMacro::Condition::InCity", + "file": "plugins/eventMacro/eventMacro/Condition/InCity.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InCity", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 17, + "validate_condition_line": 32, + "new_vars_line": 44, + "file": "plugins/eventMacro/eventMacro/Condition/InCity.pm" + } + }, + { + "name": "InInventory", + "module": "eventMacro::Condition::InInventory", + "file": "plugins/eventMacro/eventMacro/Condition/InInventory.pm", + "base": "eventMacro::Condition::Base::InInventory", + "ancestry": [ + "eventMacro::Condition::InInventory", + "eventMacro::Condition::Base::InInventory", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InInventory.pm" + } + }, + { + "name": "InInventoryID", + "module": "eventMacro::Condition::InInventoryID", + "file": "plugins/eventMacro/eventMacro/Condition/InInventoryID.pm", + "base": "eventMacro::Condition::Base::InInventory", + "ancestry": [ + "eventMacro::Condition::InInventoryID", + "eventMacro::Condition::Base::InInventory", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InInventoryID.pm" + } + }, + { + "name": "InLockMap", + "module": "eventMacro::Condition::InLockMap", + "file": "plugins/eventMacro/eventMacro/Condition/InLockMap.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InLockMap", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 32, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InLockMap.pm" + } + }, + { + "name": "InMap", + "module": "eventMacro::Condition::InMap", + "file": "plugins/eventMacro/eventMacro/Condition/InMap.pm", + "base": "eventMacro::Conditiontypes::ListConditionState", + "ancestry": [ + "eventMacro::Condition::InMap", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 29, + "file": "plugins/eventMacro/eventMacro/Condition/InMap.pm" + } + }, + { + "name": "InMapRegex", + "module": "eventMacro::Condition::InMapRegex", + "file": "plugins/eventMacro/eventMacro/Condition/InMapRegex.pm", + "base": "eventMacro::Conditiontypes::RegexConditionState", + "ancestry": [ + "eventMacro::Condition::InMapRegex", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 29, + "file": "plugins/eventMacro/eventMacro/Condition/InMapRegex.pm" + } + }, + { + "name": "InProgressBar", + "module": "eventMacro::Condition::InProgressBar", + "file": "plugins/eventMacro/eventMacro/Condition/InProgressBar.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InProgressBar", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/progress_bar", + "packet/progress_bar_stop", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 31, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InProgressBar.pm" + } + }, + { + "name": "InPvP", + "module": "eventMacro::Condition::InPvP", + "file": "plugins/eventMacro/eventMacro/Condition/InPvP.pm", + "base": "eventMacro::Conditiontypes::ListConditionState", + "ancestry": [ + "eventMacro::Condition::InPvP", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "pvp_mode" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 19, + "parse_syntax_line": 23, + "validate_condition_line": 36, + "new_vars_line": 53, + "file": "plugins/eventMacro/eventMacro/Condition/InPvP.pm" + } + }, + { + "name": "InSaveMap", + "module": "eventMacro::Condition::InSaveMap", + "file": "plugins/eventMacro/eventMacro/Condition/InSaveMap.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InSaveMap", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange", + "configModify", + "pos_load_config.txt" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 32, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InSaveMap.pm" + } + }, + { + "name": "InStorage", + "module": "eventMacro::Condition::InStorage", + "file": "plugins/eventMacro/eventMacro/Condition/InStorage.pm", + "base": "eventMacro::Condition::Base::InStorage", + "ancestry": [ + "eventMacro::Condition::InStorage", + "eventMacro::Condition::Base::InStorage", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InStorage.pm" + } + }, + { + "name": "InStorageID", + "module": "eventMacro::Condition::InStorageID", + "file": "plugins/eventMacro/eventMacro/Condition/InStorageID.pm", + "base": "eventMacro::Condition::Base::InStorage", + "ancestry": [ + "eventMacro::Condition::InStorageID", + "eventMacro::Condition::Base::InStorage", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 10, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InStorageID.pm" + } + }, + { + "name": "InventoryCurrentSize", + "module": "eventMacro::Condition::InventoryCurrentSize", + "file": "plugins/eventMacro/eventMacro/Condition/InventoryCurrentSize.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::InventoryCurrentSize", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready", + "item_gathered", + "inventory_item_removed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 32, + "file": "plugins/eventMacro/eventMacro/Condition/InventoryCurrentSize.pm" + } + }, + { + "name": "InventoryReady", + "module": "eventMacro::Condition::InventoryReady", + "file": "plugins/eventMacro/eventMacro/Condition/InventoryReady.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InventoryReady", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 28, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InventoryReady.pm" + } + }, + { + "name": "IsEquippedID", + "module": "eventMacro::Condition::IsEquippedID", + "file": "plugins/eventMacro/eventMacro/Condition/IsEquippedID.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::IsEquippedID", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "equipped_item", + "unequipped_item", + "inventory_ready" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastName", + "\".$self->{name}.\"LastSlot" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": 18, + "validate_condition_line": 176, + "new_vars_line": 211, + "file": "plugins/eventMacro/eventMacro/Condition/IsEquippedID.pm" + } + }, + { + "name": "IsInCoordinate", + "module": "eventMacro::Condition::IsInCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsInCoordinate.pm", + "base": "eventMacro::Condition::IsInMapAndCoordinate", + "ancestry": [ + "eventMacro::Condition::IsInCoordinate", + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "[^\\d\\s,.]+", + "[^\\d\\s,.]+" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/IsInCoordinate.pm" + } + }, + { + "name": "IsInMapAndCoordinate", + "module": "eventMacro::Condition::IsInMapAndCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsInMapAndCoordinate.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/actor_movement_interrupted", + "packet/high_jump", + "packet/character_moves", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 161, + "new_vars_line": 223, + "file": "plugins/eventMacro/eventMacro/Condition/IsInMapAndCoordinate.pm" + } + }, + { + "name": "IsNotEquippedID", + "module": "eventMacro::Condition::IsNotEquippedID", + "file": "plugins/eventMacro/eventMacro/Condition/IsNotEquippedID.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::IsNotEquippedID", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "equipped_item", + "unequipped_item", + "inventory_ready" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"LastIsEmpty", + "\".$self->{name}.\"LastSlot" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 16, + "validate_condition_line": 178, + "new_vars_line": 223, + "file": "plugins/eventMacro/eventMacro/Condition/IsNotEquippedID.pm" + } + }, + { + "name": "IsNotInCoordinate", + "module": "eventMacro::Condition::IsNotInCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInCoordinate.pm", + "base": "eventMacro::Condition::IsInCoordinate", + "ancestry": [ + "eventMacro::Condition::IsNotInCoordinate", + "eventMacro::Condition::IsInCoordinate", + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + ",", + "," + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 10, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInCoordinate.pm" + } + }, + { + "name": "IsNotInMapAndCoordinate", + "module": "eventMacro::Condition::IsNotInMapAndCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInMapAndCoordinate.pm", + "base": "eventMacro::Condition::IsInMapAndCoordinate", + "ancestry": [ + "eventMacro::Condition::IsNotInMapAndCoordinate", + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + ",", + "," + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 8, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInMapAndCoordinate.pm" + } + }, + { + "name": "JobID", + "module": "eventMacro::Condition::JobID", + "file": "plugins/eventMacro/eventMacro/Condition/JobID.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::JobID", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "sprite_job_change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 63, + "new_vars_line": 88, + "file": "plugins/eventMacro/eventMacro/Condition/JobID.pm" + } + }, + { + "name": "JobIDNot", + "module": "eventMacro::Condition::JobIDNot", + "file": "plugins/eventMacro/eventMacro/Condition/JobIDNot.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::JobIDNot", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "sprite_job_change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(\\d+)$", + "^(\\d+)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 45, + "new_vars_line": 59, + "file": "plugins/eventMacro/eventMacro/Condition/JobIDNot.pm" + } + }, + { + "name": "JobLevel", + "module": "eventMacro::Condition::JobLevel", + "file": "plugins/eventMacro/eventMacro/Condition/JobLevel.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::JobLevel", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "job_level_changed", + "Network::Receive::map_changed", + "in_game", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 27, + "file": "plugins/eventMacro/eventMacro/Condition/JobLevel.pm" + } + }, + { + "name": "LocalMsg", + "module": "eventMacro::Condition::LocalMsg", + "file": "plugins/eventMacro/eventMacro/Condition/LocalMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::LocalMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/LocalMsg.pm" + } + }, + { + "name": "MapLoaded", + "module": "eventMacro::Condition::MapLoaded", + "file": "plugins/eventMacro/eventMacro/Condition/MapLoaded.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::MapLoaded", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 24, + "file": "plugins/eventMacro/eventMacro/Condition/MapLoaded.pm" + } + }, + { + "name": "MaxHP", + "module": "eventMacro::Condition::MaxHP", + "file": "plugins/eventMacro/eventMacro/Condition/MaxHP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::MaxHP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/MaxHP.pm" + } + }, + { + "name": "MaxSP", + "module": "eventMacro::Condition::MaxSP", + "file": "plugins/eventMacro/eventMacro/Condition/MaxSP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::MaxSP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/MaxSP.pm" + } + }, + { + "name": "MobNear", + "module": "eventMacro::Condition::MobNear", + "file": "plugins/eventMacro/eventMacro/Condition/MobNear.pm", + "base": "eventMacro::Condition::Base::ActorNear", + "ancestry": [ + "eventMacro::Condition::MobNear", + "eventMacro::Condition::Base::ActorNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Id", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 17, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/MobNear.pm" + } + }, + { + "name": "MobNearCount", + "module": "eventMacro::Condition::MobNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/MobNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::MobNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 20, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/MobNearCount.pm" + } + }, + { + "name": "MobNearDist", + "module": "eventMacro::Condition::MobNearDist", + "file": "plugins/eventMacro/eventMacro/Condition/MobNearDist.pm", + "base": "eventMacro::Condition::Base::ActorNearDist", + "ancestry": [ + "eventMacro::Condition::MobNearDist", + "eventMacro::Condition::Base::ActorNearDist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Id", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 25, + "validate_condition_line": 34, + "new_vars_line": 67, + "file": "plugins/eventMacro/eventMacro/Condition/MobNearDist.pm" + } + }, + { + "name": "MobNotNear", + "module": "eventMacro::Condition::MobNotNear", + "file": "plugins/eventMacro/eventMacro/Condition/MobNotNear.pm", + "base": "eventMacro::Condition::Base::ActorNotNear", + "ancestry": [ + "eventMacro::Condition::MobNotNear", + "eventMacro::Condition::Base::ActorNotNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/MobNotNear.pm" + } + }, + { + "name": "NoMobNear", + "module": "eventMacro::Condition::NoMobNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoMobNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoMobNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoMobNear.pm" + } + }, + { + "name": "NoNpcNear", + "module": "eventMacro::Condition::NoNpcNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoNpcNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoNpcNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoNpcNear.pm" + } + }, + { + "name": "NoPlayerNear", + "module": "eventMacro::Condition::NoPlayerNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoPlayerNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoPlayerNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoPlayerNear.pm" + } + }, + { + "name": "NoPortalNear", + "module": "eventMacro::Condition::NoPortalNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoPortalNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoPortalNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoPortalNear.pm" + } + }, + { + "name": "NotInMap", + "module": "eventMacro::Condition::NotInMap", + "file": "plugins/eventMacro/eventMacro/Condition/NotInMap.pm", + "base": "eventMacro::Condition::InMap", + "ancestry": [ + "eventMacro::Condition::NotInMap", + "eventMacro::Condition::InMap", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [ + ",", + "," + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 7, + "validate_condition_line": 18, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NotInMap.pm" + } + }, + { + "name": "NpcMsg", + "module": "eventMacro::Condition::NpcMsg", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::NpcMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsg.pm" + } + }, + { + "name": "NpcMsgDist", + "module": "eventMacro::Condition::NpcMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::NpcMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgDist.pm" + } + }, + { + "name": "NpcMsgName", + "module": "eventMacro::Condition::NpcMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::NpcMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgName.pm" + } + }, + { + "name": "NpcMsgNameDist", + "module": "eventMacro::Condition::NpcMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::NpcMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgNameDist.pm" + } + }, + { + "name": "NpcNear", + "module": "eventMacro::Condition::NpcNear", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNear.pm", + "base": "eventMacro::Condition::Base::ActorNear", + "ancestry": [ + "eventMacro::Condition::NpcNear", + "eventMacro::Condition::Base::ActorNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 17, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNear.pm" + } + }, + { + "name": "NpcNearCount", + "module": "eventMacro::Condition::NpcNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::NpcNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearCount.pm" + } + }, + { + "name": "NpcNearDist", + "module": "eventMacro::Condition::NpcNearDist", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearDist.pm", + "base": "eventMacro::Condition::Base::ActorNearDist", + "ancestry": [ + "eventMacro::Condition::NpcNearDist", + "eventMacro::Condition::Base::ActorNearDist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 25, + "validate_condition_line": 34, + "new_vars_line": 67, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearDist.pm" + } + }, + { + "name": "NpcNotNear", + "module": "eventMacro::Condition::NpcNotNear", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNotNear.pm", + "base": "eventMacro::Condition::Base::ActorNotNear", + "ancestry": [ + "eventMacro::Condition::NpcNotNear", + "eventMacro::Condition::Base::ActorNotNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNotNear.pm" + } + }, + { + "name": "OnCharLogIn", + "module": "eventMacro::Condition::OnCharLogIn", + "file": "plugins/eventMacro/eventMacro/Condition/OnCharLogIn.pm", + "base": "eventMacro::Conditiontypes::SimpleEvent", + "ancestry": [ + "eventMacro::Condition::OnCharLogIn", + "eventMacro::Conditiontypes::SimpleEvent", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "in_game" + ], + "parser_mode": "simple_event", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/OnCharLogIn.pm" + } + }, + { + "name": "PartyMsg", + "module": "eventMacro::Condition::PartyMsg", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::PartyMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsg.pm" + } + }, + { + "name": "PartyMsgDist", + "module": "eventMacro::Condition::PartyMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::PartyMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgDist.pm" + } + }, + { + "name": "PartyMsgName", + "module": "eventMacro::Condition::PartyMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::PartyMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgName.pm" + } + }, + { + "name": "PartyMsgNameDist", + "module": "eventMacro::Condition::PartyMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::PartyMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgNameDist.pm" + } + }, + { + "name": "PlayerNear", + "module": "eventMacro::Condition::PlayerNear", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNear.pm", + "base": "eventMacro::Condition::Base::ActorNear", + "ancestry": [ + "eventMacro::Condition::PlayerNear", + "eventMacro::Condition::Base::ActorNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"AccountId", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Job", + "\".$self->{name}.\"Last\".\"Level", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 17, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNear.pm" + } + }, + { + "name": "PlayerNearCount", + "module": "eventMacro::Condition::PlayerNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::PlayerNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": -1, + "validate_condition_line": 23, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearCount.pm" + } + }, + { + "name": "PlayerNearDist", + "module": "eventMacro::Condition::PlayerNearDist", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearDist.pm", + "base": "eventMacro::Condition::Base::ActorNearDist", + "ancestry": [ + "eventMacro::Condition::PlayerNearDist", + "eventMacro::Condition::Base::ActorNearDist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"AccountId", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Job", + "\".$self->{name}.\"Last\".\"Level", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 25, + "validate_condition_line": 34, + "new_vars_line": 67, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearDist.pm" + } + }, + { + "name": "PlayerNotNear", + "module": "eventMacro::Condition::PlayerNotNear", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNotNear.pm", + "base": "eventMacro::Condition::Base::ActorNotNear", + "ancestry": [ + "eventMacro::Condition::PlayerNotNear", + "eventMacro::Condition::Base::ActorNotNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNotNear.pm" + } + }, + { + "name": "PortalNearCount", + "module": "eventMacro::Condition::PortalNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/PortalNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::PortalNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PortalNearCount.pm" + } + }, + { + "name": "PrivMsg", + "module": "eventMacro::Condition::PrivMsg", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::PrivMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsg.pm" + } + }, + { + "name": "PrivMsgDist", + "module": "eventMacro::Condition::PrivMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::PrivMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgDist.pm" + } + }, + { + "name": "PrivMsgName", + "module": "eventMacro::Condition::PrivMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::PrivMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgName.pm" + } + }, + { + "name": "PrivMsgNameDist", + "module": "eventMacro::Condition::PrivMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::PrivMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgNameDist.pm" + } + }, + { + "name": "PubMsg", + "module": "eventMacro::Condition::PubMsg", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::PubMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsg.pm" + } + }, + { + "name": "PubMsgDist", + "module": "eventMacro::Condition::PubMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::PubMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgDist.pm" + } + }, + { + "name": "PubMsgName", + "module": "eventMacro::Condition::PubMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::PubMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgName.pm" + } + }, + { + "name": "PubMsgNameDist", + "module": "eventMacro::Condition::PubMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::PubMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgNameDist.pm" + } + }, + { + "name": "QuestActive", + "module": "eventMacro::Condition::QuestActive", + "file": "plugins/eventMacro/eventMacro/Condition/QuestActive.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestActive", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 81, + "new_vars_line": 103, + "file": "plugins/eventMacro/eventMacro/Condition/QuestActive.pm" + } + }, + { + "name": "QuestComplete", + "module": "eventMacro::Condition::QuestComplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestComplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestComplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestComplete.pm" + } + }, + { + "name": "QuestHuntCompleted", + "module": "eventMacro::Condition::QuestHuntCompleted", + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntCompleted.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestHuntCompleted", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastMobID", + "\".$self->{name}.\"LastQuestID" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 149, + "new_vars_line": 171, + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntCompleted.pm" + } + }, + { + "name": "QuestHuntOngoing", + "module": "eventMacro::Condition::QuestHuntOngoing", + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntOngoing.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestHuntOngoing", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastMobID", + "\".$self->{name}.\"LastQuestID" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 150, + "new_vars_line": 172, + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntOngoing.pm" + } + }, + { + "name": "QuestInactive", + "module": "eventMacro::Condition::QuestInactive", + "file": "plugins/eventMacro/eventMacro/Condition/QuestInactive.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestInactive", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "achievement_list", + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 80, + "new_vars_line": 102, + "file": "plugins/eventMacro/eventMacro/Condition/QuestInactive.pm" + } + }, + { + "name": "QuestIncomplete", + "module": "eventMacro::Condition::QuestIncomplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestIncomplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestIncomplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestIncomplete.pm" + } + }, + { + "name": "QuestNotComplete", + "module": "eventMacro::Condition::QuestNotComplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotComplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestNotComplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotComplete.pm" + } + }, + { + "name": "QuestNotIncomplete", + "module": "eventMacro::Condition::QuestNotIncomplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotIncomplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestNotIncomplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotIncomplete.pm" + } + }, + { + "name": "QuestOnTime", + "module": "eventMacro::Condition::QuestOnTime", + "file": "plugins/eventMacro/eventMacro/Condition/QuestOnTime.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestOnTime", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 85, + "new_vars_line": 107, + "file": "plugins/eventMacro/eventMacro/Condition/QuestOnTime.pm" + } + }, + { + "name": "QuestTimeOverdue", + "module": "eventMacro::Condition::QuestTimeOverdue", + "file": "plugins/eventMacro/eventMacro/Condition/QuestTimeOverdue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestTimeOverdue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 85, + "new_vars_line": 107, + "file": "plugins/eventMacro/eventMacro/Condition/QuestTimeOverdue.pm" + } + }, + { + "name": "ShopOpened", + "module": "eventMacro::Condition::ShopOpened", + "file": "plugins/eventMacro/eventMacro/Condition/ShopOpened.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ShopOpened", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "in_game", + "open_shop", + "packet_send/shop_open", + "packet_send/shop_close", + "shop_closed", + "packet_mapChange" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 28, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/ShopOpened.pm" + } + }, + { + "name": "SimpleHookEvent", + "module": "eventMacro::Condition::SimpleHookEvent", + "file": "plugins/eventMacro/eventMacro/Condition/SimpleHookEvent.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::SimpleHookEvent", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 24, + "parse_syntax_line": 10, + "validate_condition_line": 28, + "new_vars_line": 38, + "file": "plugins/eventMacro/eventMacro/Condition/SimpleHookEvent.pm" + } + }, + { + "name": "SkillLevel", + "module": "eventMacro::Condition::SkillLevel", + "file": "plugins/eventMacro/eventMacro/Condition/SkillLevel.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::SkillLevel", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/skill_update", + "packet/skills_list", + "packet/skill_add", + "packet/skill_delete" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(\\S+)\\s+(\\S.*)$", + "^(\\S+)\\s+(\\S.*)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastHandle", + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastLevel", + "\".$self->{name}.\"LastName" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 18, + "validate_condition_line": 37, + "new_vars_line": 47, + "file": "plugins/eventMacro/eventMacro/Condition/SkillLevel.pm" + } + }, + { + "name": "Spirits", + "module": "eventMacro::Condition::Spirits", + "file": "plugins/eventMacro/eventMacro/Condition/Spirits.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::Spirits", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/revolving_entity" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 25, + "file": "plugins/eventMacro/eventMacro/Condition/Spirits.pm" + } + }, + { + "name": "StatAdded", + "module": "eventMacro::Condition::StatAdded", + "file": "plugins/eventMacro/eventMacro/Condition/StatAdded.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::StatAdded", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "packet_charStats" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Quantity" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 39, + "parse_syntax_line": 26, + "validate_condition_line": 43, + "new_vars_line": 54, + "file": "plugins/eventMacro/eventMacro/Condition/StatAdded.pm" + } + }, + { + "name": "StatusActiveHandle", + "module": "eventMacro::Condition::StatusActiveHandle", + "file": "plugins/eventMacro/eventMacro/Condition/StatusActiveHandle.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::StatusActiveHandle", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Actor::setStatus::change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastHandle", + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastName" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 69, + "new_vars_line": 98, + "file": "plugins/eventMacro/eventMacro/Condition/StatusActiveHandle.pm" + } + }, + { + "name": "StatusInactiveHandle", + "module": "eventMacro::Condition::StatusInactiveHandle", + "file": "plugins/eventMacro/eventMacro/Condition/StatusInactiveHandle.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::StatusInactiveHandle", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "in_game", + "Actor::setStatus::change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastHandle", + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastName" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 69, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/StatusInactiveHandle.pm" + } + }, + { + "name": "StorageOpened", + "module": "eventMacro::Condition::StorageOpened", + "file": "plugins/eventMacro/eventMacro/Condition/StorageOpened.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::StorageOpened", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "in_game", + "packet_storage_open", + "packet_storage_close" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 28, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/StorageOpened.pm" + } + }, + { + "name": "SystemMsg", + "module": "eventMacro::Condition::SystemMsg", + "file": "plugins/eventMacro/eventMacro/Condition/SystemMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::SystemMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/SystemMsg.pm" + } + }, + { + "name": "VarValue", + "module": "eventMacro::Condition::VarValue", + "file": "plugins/eventMacro/eventMacro/Condition/VarValue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::VarValue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"LastMemberIndex", + "\".$self->{name}.\"LastValue", + "\".$self->{name}.\"LastVar" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 10, + "validate_condition_line": 48, + "new_vars_line": 72, + "file": "plugins/eventMacro/eventMacro/Condition/VarValue.pm" + } + }, + { + "name": "Zeny", + "module": "eventMacro::Condition::Zeny", + "file": "plugins/eventMacro/eventMacro/Condition/Zeny.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::Zeny", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "zeny_change", + "packet/stat_info", + "packet/stats_info", + "complete_deal" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/Zeny.pm" + } + }, + { + "name": "ZenyChanged", + "module": "eventMacro::Condition::ZenyChanged", + "file": "plugins/eventMacro/eventMacro/Condition/ZenyChanged.pm", + "base": "eventMacro::Conditiontypes::NumericConditionEvent", + "ancestry": [ + "eventMacro::Condition::ZenyChanged", + "eventMacro::Conditiontypes::NumericConditionEvent", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "zeny_change" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"Change", + "\".$self->{name}.\"Last\".\"ZenyAfter" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 11, + "new_vars_line": 23, + "file": "plugins/eventMacro/eventMacro/Condition/ZenyChanged.pm" + } + }, + { + "name": "isInMapAndCloseToCoordinate", + "module": "eventMacro::Condition::isInMapAndCloseToCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/isInMapAndCloseToCoordinate.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::isInMapAndCloseToCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/actor_movement_interrupted", + "packet/high_jump", + "packet/character_moves", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$", + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 14, + "validate_condition_line": 30, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/isInMapAndCloseToCoordinate.pm" + } + }, + { + "name": "isNotInMapOrNotCloseToCoordinate", + "module": "eventMacro::Condition::isNotInMapOrNotCloseToCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/isNotInMapOrNotCloseToCoordinate.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::isNotInMapOrNotCloseToCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/actor_movement_interrupted", + "packet/high_jump", + "packet/character_moves", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$", + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Map", + "\".$self->{name}.\"Last\".\"X", + "\".$self->{name}.\"Last\".\"Y" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 14, + "validate_condition_line": 30, + "new_vars_line": 46, + "file": "plugins/eventMacro/eventMacro/Condition/isNotInMapOrNotCloseToCoordinate.pm" + } + } +] diff --git a/docs/eventmacro_gpt_audit/audit_full/10_invalid_syntax_and_negative_catalog.md b/docs/eventmacro_gpt_audit/audit_full/10_invalid_syntax_and_negative_catalog.md new file mode 100644 index 0000000000..1b2409f719 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/10_invalid_syntax_and_negative_catalog.md @@ -0,0 +1,25 @@ +# 10 Invalid Syntax and Negative Catalog + +- Automacro sem conditions/parameters/call: rejeitado. **PROVADO**. +- Duplicidade de automacro/macro: rejeitado. **PROVADO**. +- Mais de 1 event condition no mesmo automacro: rejeitado. **PROVADO**. +- Condition única duplicada: rejeitado. **PROVADO**. +- Nome com espaço (macro/automacro): rejeitado. **PROVADO**. +- `set` com parâmetro desconhecido: erro em runtime macro. **PROVADO**. +- `do eventMacro ...` e `do ai clear`: proibidos. **PROVADO**. +- `defined()` em array/hash sem acesso (`@a`/`%h`) é inválido (aceita escalar, `$a[i]`, `$h{k}`). **PROVADO**. +- Índice de array não numérico e chave de hash inválida após parse dinâmico: erro. **PROVADO**. +- Uso de variáveis sistema (`.x`) em diversas conditions/validators: bloqueado. **PROVADO**. +- Regex malformada em validação (`RegexCheck`) ou statement (`parse_and_check_condition_text`): erro. **PROVADO**. +- Misturar `&&` e `||` sem estrutura válida de grupos: erro. **PROVADO**. + +## Itens potencialmente alucináveis +- `~` não é regex; em `cmpr` é membership CSV case-insensitive. **PROVADO**. +- Range é `a..b` dentro de comparação; não é operador genérico separado. **PROVADO**. +- Event conditions não substituem state queueing; semântica é diferente. **PROVADO**. + +## Mitigações práticas para GPT especialista +- Sempre mapear operador para backend real: `Utilities::cmpr` + `Validator::*` antes de sugerir sintaxe. **PROVADO**. +- Bloquear resposta que proponha >1 event condition por automacro. **PROVADO**. +- Separar resposta em “state condition” vs “event condition” com semântica de fila/disparo distinta. **PROVADO**. +- Se comparar com macro plugin antigo sem evidência local, marcar **NÃO COMPROVADO**. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/audit_full/11_examples_valid.md b/docs/eventmacro_gpt_audit/audit_full/11_examples_valid.md new file mode 100644 index 0000000000..6041386f6f --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/11_examples_valid.md @@ -0,0 +1,41 @@ +# 11 Examples Valid + +## Automacro state + call +```txt +automacro hp_pot { + CurrentHP < 40% + call use_pot + priority 0 + CheckOnAI auto +} +``` +Status: **PROVADO** (numeric validator aceita `%`, operador `<`, call obrigatório). + +## Automacro event + regex +```txt +automacro got_priv { + PrivMsg /^hi$/i + call answer_hi +} +``` +Status: **PROVADO** (RegexConditionEvent). + +## Call com parâmetros +```txt +automacro call_args { + OnCharLogIn any + call buff_me 123 "abc" +} +``` +Status: **PROVADO** (`call` guarda args; execução define `.param`). + +## Macro com fluxo +```txt +macro test_flow { + if ($x == 1) log ok + while ($x < 3) { + $x++ + } +} +``` +Status: **PROVADO** (`if` pós-fixado e `while` em runner). diff --git a/docs/eventmacro_gpt_audit/audit_full/12_examples_invalid.md b/docs/eventmacro_gpt_audit/audit_full/12_examples_invalid.md new file mode 100644 index 0000000000..a5e4d3c8e3 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/12_examples_invalid.md @@ -0,0 +1,34 @@ +# 12 Examples Invalid + +## Dois event-type na mesma automacro +```txt +automacro bad { + OnCharLogIn any + AttackStart poring + call foo +} +``` +Resultado: automacro ignorada. **PROVADO**. + +## Parâmetro inválido +```txt +automacro bad2 { + InMap prontera + call foo + run-once maybe +} +``` +Resultado: automacro ignorada. **PROVADO**. + +## Índice de array inválido dinâmico +```txt +$idx = "abc" +$x = $arr[$idx] +``` +Resultado: erro (índice array deve numérico após parse). **PROVADO**. + +## `defined` em tipo não suportado +```txt +if (&defined(@arr)) { log x } +``` +Resultado: erro (defined só escalar/acesso array/acesso hash). **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/audit_full/13_gaps_ambiguities_and_nonprovable_claims.md b/docs/eventmacro_gpt_audit/audit_full/13_gaps_ambiguities_and_nonprovable_claims.md new file mode 100644 index 0000000000..27906b8ad1 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/13_gaps_ambiguities_and_nonprovable_claims.md @@ -0,0 +1,12 @@ +# 13 Gaps, Ambiguities and Nonprovable Claims + +- `isNewWrongCommandBlock` tinha `else*` e uso de `$_` em vez de `$line`; isto era passível de falso-positivo/falso-negativo no parser de bloco. **PROVADO**. + **Status de solução**: **SOLUCIONADO NO CÓDIGO** (ajustado para `^else\\s*{$` e uso consistente de `$line`). +- `FileParser` colapsa múltiplos espaços em todas as linhas; isso pode afetar strings sem aspas em condições/comandos. Comportamento exato em todos cenários: **NÃO COMPROVADO**. +- `FileParser` remove comentários com `s/\\s+#.*$//`, sem awareness de aspas; `#` dentro de string pode ser truncado dependendo do formato da linha. **PROVADO**. + **Status de solução**: **PARCIALMENTE SOLUCIONÁVEL**, exige refatoração lexical (state machine para strings/escapes) antes de `trim/comment-strip`. +- Algumas conditions grandes têm lógica complexa com estados transitórios (`is_on_stand_by`) dependentes de hooks de rede; sem execução integrada, cobertura temporal completa é **NÃO COMPROVADO**. + **Status de solução**: **NÃO SOLUCIONÁVEL SÓ POR LEITURA ESTÁTICA**; requer suíte de integração por hook/evento. +- `RegexCheck` validava variável de sistema com `if ($var =~ /^\\./)` (hashref), não `display_name`; isso podia deixar `.vars` passar no caminho de regex. **PROVADO**. + **Status de solução**: **SOLUCIONADO NO CÓDIGO** (validação ajustada para `$var_name`). +- Diferenças históricas para plugin macro antigo só podem ser afirmadas onde há evidência direta de nomes/comandos no código atual; demais afirmações: **NÃO COMPROVADO**. diff --git a/docs/eventmacro_gpt_audit/audit_full/14_gpt_system_instructions_draft.md b/docs/eventmacro_gpt_audit/audit_full/14_gpt_system_instructions_draft.md new file mode 100644 index 0000000000..7bcee4c054 --- /dev/null +++ b/docs/eventmacro_gpt_audit/audit_full/14_gpt_system_instructions_draft.md @@ -0,0 +1,29 @@ +# 14 GPT System Instructions Draft + +## Regras canônicas +1. Nunca invente sintaxe/operador/condition/evento/parâmetro. +2. Priorize comportamento comprovado no código-fonte atual. +3. Se não houver prova no código: responda **NÃO COMPROVADO**. +4. Diferencie claramente: conceito, sintaxe, exemplo, restrição. +5. Não confundir `eventMacro` com plugin macro antigo. + +## Modo de revisão de scripts do usuário +Sempre separar: +- Erro de sintaxe +- Erro de tipagem/argumento +- Erro de lógica +- Erro de semântica/runtime + +## Ambiguidade +- Quando houver múltiplas leituras possíveis e o código não fechar conclusão, declarar ambiguidade explicitamente. + +## Citações internas recomendadas +- Informar arquivo e linha local em cada afirmação factual. + +## Segurança contra alucinação +- Não presumir support para operadores fora de `cmpr`/validators. +- Não presumir condições além dos módulos em `Condition/`. +- Não presumir comportamento de regex/lista/range fora de implementação. +- Nunca tratar `~` como regex; em eventMacro é lista CSV em `cmpr`. +- Nunca aceitar mais de uma condition do tipo evento por automacro. +- Sempre explicar separadamente semântica de **state condition** (fila/estado) e **event condition** (disparo por callback). diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/00_scope_and_rules.md b/docs/eventmacro_gpt_audit/knowledge_ready/00_scope_and_rules.md new file mode 100644 index 0000000000..75f01cfc0a --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/00_scope_and_rules.md @@ -0,0 +1,22 @@ +# 00 Audit Scope and Method + +## Escopo +- **PROVADO**: A auditoria usa exclusivamente código-fonte local do repositório (`plugins/eventMacro/...`). +- **PROVADO**: Sem wiki/documentação externa como fonte de verdade. +- **PROVADO**: Foco em parser, gramática, validação, runtime, variáveis, comandos e todas as conditions. + +## Método (9 passagens) +1. Inventário de arquivos (parser/core/runner/conditions/validators/comandos). +2. Extração canônica de gramática, parâmetros, operadores, funções e variáveis. +3. Normalização por condition (catálogo JSON + tabela consolidada). +4. Auditoria profunda de parser (`FileParser.pm`, `Runner.pm`). +5. Auditoria de comparação/range/regex (`Utilities.pm`, `Validator/*`). +6. Auditoria de variáveis/tipagem/callbacks (`Data.pm`, `Utilities.pm`, `Core.pm`). +7. Auditoria de runtime/fila/prioridade/pause/orphan (`Core.pm`, `Automacro.pm`, `Runner.pm`). +8. Catálogo de negativos e não-suportado. +9. Produção em dois níveis: `audit_full/` e `knowledge_ready/`. + +## Regras de classificação de conclusões +- **PROVADO**: comportamento explícito no código. +- **INFERIDO**: dedução estrutural (ex.: por herança/base class). +- **NÃO COMPROVADO**: não há evidência suficiente no código auditado. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/01_architecture_and_runtime.md b/docs/eventmacro_gpt_audit/knowledge_ready/01_architecture_and_runtime.md new file mode 100644 index 0000000000..475f16fe70 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/01_architecture_and_runtime.md @@ -0,0 +1,26 @@ +# 04 Commands and Runtime + +## Comandos console +`eventMacro|emacro`: +- `auto`, `list`, `status`, `check`, `stop`, `pause`, `unpause`, `var_get`, `var_set`, `enable`, `disable`, `include`, ou nome de macro. **PROVADO**. + +## Comandos da linguagem macro +- Atribuição (`$x = ...`, `$x++`, `$x--`, `@a=(...)`, `%h=(k=>v,...)`). **PROVADO**. +- `do ...`, `log|warning|error ...`, `pause [n]`, `stop`, `release`, `lock`, `call`, `set`, `include`. **PROVADO**. +- Suporte a `push/unshift/pop/shift`, `delete/exists`, `defined` via macro keywords. **PROVADO**. + +## Fila/prioridade/disparo +- Automacros state fulfilled entram em fila ordenada por `priority` (menor valor = maior prioridade efetiva na frente). **PROVADO**. +- Event conditions não entram na fila contínua; disparam no callback e escolhem melhor prioridade entre candidatos no evento. **PROVADO**. +- `timeout` controla re-disparo de automacro; `delay` atraso inicial do macro chamado; `macro_delay` atraso entre comandos. **PROVADO**. +- `run-once` desabilita automacro após chamada. **PROVADO**. + +## interruptibilidade/AI/orphan +- `exclusive=1` => macro não interruptível (`interruptible=0`) e pausa checking de automacros (salvo force user). **PROVADO**. +- `self_interruptible` bloqueia interrupção por seu próprio automacro chamador quando 0. **PROVADO**. +- `overrideAI=1` retira `eventMacro` da AI queue. **PROVADO**. +- `orphan`: `terminate|terminate_last_call|reregister|reregister_safe`. **PROVADO**. + +## clear_queue/handoff +- `clear_queue` encerra runner, remove hook de iteração e restaura checking quando necessário. **PROVADO**. +- Ao limpar fila sem `skip`, `handoff_to_pending_automacros` pode chamar automacro pendente imediatamente. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/02_grammar_and_parsing.md b/docs/eventmacro_gpt_audit/knowledge_ready/02_grammar_and_parsing.md new file mode 100644 index 0000000000..fef6986f7f --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/02_grammar_and_parsing.md @@ -0,0 +1,27 @@ +# 03 Grammar and Parsing + +## Arquivo eventMacros +- `macro { ... }` abre macro. **PROVADO**. +- `automacro { ... }` abre automacro. **PROVADO**. +- `sub { ... }` abre sub perl. **PROVADO**. +- Comentário de fim de linha (`#...`) removido no parser de arquivo. **PROVADO**. +- Espaços são normalizados (`trim` e colapso de múltiplos espaços). **PROVADO**. + +## include/call/sub +- `!include ` **NÃO foi comprovado** em `FileParser.pm` como diretiva de parse recursivo nesta revisão. +- Em automacro: `call nomeMacro [args...]` grava em parâmetro `call`. **PROVADO**. +- Em automacro: `call { ... }` gera macro interna `automacro__call_block`. **PROVADO**. +- `sub` vira código perl compilado em runtime via `eval`, e registrado em `main::`. **PROVADO**. + +## Parser de fluxo de macro (Runner) +- Blocos reconhecidos: `if/elsif/else`, `switch/case/else`, `while`, labels `:x`, `goto`. **PROVADO**. +- `[` e `]` ativam/desativam `macro_block` (execução sem esperar timeout entre linhas do bloco). **PROVADO**. +- `if` pós-fixado (`cmd if (...)`) suportado. **PROVADO**. +- `switch` aceita apenas `case` e `else` dentro do bloco. **PROVADO**. + +## Erros de parsing/validação que invalidam automacro +- Nome com espaço, sem conditions, sem parameters, sem `call`, parâmetro inválido, módulo de condition inexistente, sintaxe inválida de condition. **PROVADO**. +- Duplicidade de parâmetro, duplicidade de condition única, múltiplas event-type conditions. **PROVADO**. + +## Ambiguidades +- Há regex permissivas em `isNewCommandBlock/isNewWrongCommandBlock` (ex.: `else*`), podendo aceitar padrões inesperados. **INFERIDO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/03_variables_and_special_variables.md b/docs/eventmacro_gpt_audit/knowledge_ready/03_variables_and_special_variables.md new file mode 100644 index 0000000000..826f81a098 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/03_variables_and_special_variables.md @@ -0,0 +1,34 @@ +# 05 Variables and Special Variables + +## Sintaxe de variáveis +- Escalar: `$name` +- Array: `@name` +- Hash: `%name` +- Acesso array: `$name[index]` (index numérico ou variável resolvível) +- Acesso hash: `$name{key}` (key alfanumérico/underscore ou variável resolvível) + +Status: **PROVADO**. + +## Regex-base de nomes +- Nomes válidos: `\.?[a-zA-Z][a-zA-Z\d_]*`. **PROVADO**. +- Complementos em parse amplo: índices/chaves dinâmicos aceitos em regex mais ampla. **PROVADO**. + +## Variáveis especiais `.xxx` +Exemplos implementados em `Core::get_scalar_var`: +- tempo: `.time .datetime .hour ...` +- mapa: `.map .incity .inlockmap` +- personagem: `.job .pos .name .hp .sp .lvl .joblvl .spirits .zeny .weight ...` +- status: `.status .statushandle` +- inventário/carrinho/storage: `.inventoryitems .cart* .shopopen .storage*` + +Status: **PROVADO**. + +## Restrições +- Definição manual de variáveis de sistema (prefixo `.`) é bloqueada em `var_set` e em atribuição de macro runner. **PROVADO**. +- Validadores de conditions geralmente rejeitam variáveis de sistema como argumento de automacro. **PROVADO**. + +## Callbacks de mudança +- `Core` dispara callbacks por tipo (`scalar`, `array`, `hash`, `accessed_array`, `accessed_hash`) e gerencia complementos dinâmicos para acessos aninhados via variáveis. **PROVADO**. + +## Arrays e hashes completos +- `set_full_array`, `set_full_hash`, `clear_array`, `clear_hash`, `push/pop/shift/unshift`, `delete_key`, `exists_hash`, `keys`, `values`. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/04_macro_keywords_and_functions.md b/docs/eventmacro_gpt_audit/knowledge_ready/04_macro_keywords_and_functions.md new file mode 100644 index 0000000000..f50277ffa2 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/04_macro_keywords_and_functions.md @@ -0,0 +1,23 @@ +# 06 Macro Keywords and Functions + +## Macro keywords (`&keyword(...)`) +Base em `Data.pm` + execução em `Runner::parse_command`. + +Principais suportados (PROVADO): +- lookup/ids: `npc player monster vender inventory Inventory InventoryType cart Cart storage Storage` +- quantidades/preços: `invamount cartamount shopamount storamount venderamount venderprice` +- utilitários: `arg random rand split strip config` +- hash/array: `keys values push pop shift unshift exists delete defined` +- quest: `questStatus questInactiveCount questIncompleteCount questCompleteCount` +- equipamento: `itemCard itemCardAmount itemOption itemOptAmount` +- `eval` (bloqueado por lockdown global) + +## Subrotinas perl +- Subs registradas por bloco `sub` podem ser chamadas como `nomeSub(...)` no parser de comando. **PROVADO**. +- Se sub inexistente: erro. +- Pode retornar scalar/ref array/ref hash, com tratamento específico no parser. **PROVADO**. + +## Funções internas de comparação +- `cmpr` suporta operadores: `= == != > < >= <= ~ =~`. **PROVADO**. +- Regex literal somente formato `/.../` com opcional `i`. **PROVADO**. +- Range com `..` suportado para igualdade/inequidade. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/05_console_commands.md b/docs/eventmacro_gpt_audit/knowledge_ready/05_console_commands.md new file mode 100644 index 0000000000..afa731b0cf --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/05_console_commands.md @@ -0,0 +1,24 @@ +# 05 Console Commands + +Comando raiz: `eventMacro` (alias `emacro`). + +## Subcomandos +- `auto ` +- `list` +- `status [macro|automacro]` +- `check [force_stop|force_start|resume]` +- `stop` +- `pause` +- `unpause` +- `var_get [var]` +- `var_set ` +- `enable [all|automacro...]` +- `disable [all|automacro...]` +- `include [on|off|list] ...` +- ` [--repeat|-r N] [--overrideAI] [--exclusive] [--macro_delay F] [--orphan S] [args...]` + +Status: **PROVADO**. + +## Notas +- Se macro já está rodando, chamada direta avisa e não inicia outra. **PROVADO**. +- `var_set` não permite variável de sistema (`.`). **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/06_automacro_parameters.md b/docs/eventmacro_gpt_audit/knowledge_ready/06_automacro_parameters.md new file mode 100644 index 0000000000..e130b696d4 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/06_automacro_parameters.md @@ -0,0 +1,24 @@ +# 07 Automacro Parameters + +Status de validação: **PROVADO** (Core::create_automacro_list + Automacro::set_parameters). + +| Parâmetro | Regra de validação | Default | +|---|---|---| +| timeout | número (uso runtime) | 0 | +| delay | número (`^[\d\.]*\d+$`) | 0 | +| run-once | `0|1` | 0 | +| disabled | `0|1` | 0 | +| call | macro existente; pode conter args | obrigatório | +| overrideAI | `0|1` | 0 | +| orphan | `terminate|terminate_last_call|reregister|reregister_safe` | `config{eventMacro_orphans}` | +| macro_delay | número decimal permitido | `timeout{eventMacro_delay}` | +| priority | inteiro não-negativo | 0 | +| exclusive | `0|1` | 0 | +| self_interruptible | `0|1` | 0 | +| repeat | inteiro não-negativo | 1 | +| CheckOnAI | CSV de `auto|off|manual` | `config{eventMacro_CheckOnAI}` | + +## Regras adicionais +- Parâmetro duplicado invalida automacro. **PROVADO**. +- Ausência de `call` invalida automacro. **PROVADO**. +- `call` com args separa nome e grava `.param` quando executar. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/07_conditions_state_part_1.md b/docs/eventmacro_gpt_audit/knowledge_ready/07_conditions_state_part_1.md new file mode 100644 index 0000000000..7c6e0fa5d1 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/07_conditions_state_part_1.md @@ -0,0 +1,49 @@ +# 07 Conditions State Part 1 + +Classificação: nome/tipo/hook **PROVADO**; `argument_contract` em `custom` pode ser **INFERIDO**. + +| Condition | Parser mode | Hooks | regex | range | csv | var | +|---|---|---|---|---|---|---| +| BaseLevel | numeric_comparison | base_level_changed, Network::Receive::map_changed, in_game, packet/stat_info | false | true | false | false | +| CartCurrentSize | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false | +| CartCurrentWeight | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false | +| CartMaxSize | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false | +| CartMaxWeight | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false | +| CharCurrentWeight | numeric_comparison | inventory_clear, inventory_ready, packet/stat_info | false | true | false | false | +| CharMaxWeight | numeric_comparison | inventory_clear, inventory_ready, packet/stat_info | false | true | false | false | +| ChatRoomNear | regex_literal | packet_mapChange, chat_created, packet_chatinfo, chat_removed, chat_modified | true | false | false | false | +| ConfigKey | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| ConfigKeyDefined | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| ConfigKeyDualDifferentDefinedValue | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | false | +| ConfigKeyDualSameDefinedValue | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | false | +| ConfigKeyNot | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| ConfigKeyNotExist | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| ConfigKeyUndefined | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| CurrentHP | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false | +| CurrentSP | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false | +| Eval | composite_regex_numeric | AI_pre | true | true | false | false | +| EvalHook | composite_regex_numeric | - | true | true | false | true | +| FreeSkillPoints | numeric_comparison | packet/stat_info, packet_charSkills, packet_homunSkills | false | true | false | false | +| FreeStatPoints | numeric_comparison | packet/stat_info, packet/stats_info | false | true | false | false | +| InCart | numeric_comparison | - | false | true | false | false | +| InCartID | numeric_comparison | - | false | true | false | false | +| InChatRoom | composite_regex_numeric | packet_mapChange, chat_created, chat_leave, chat_joined | true | true | false | false | +| InCity | composite_regex_numeric | Network::Receive::map_changed, in_game, packet_mapChange | true | true | false | false | +| InInventory | numeric_comparison | - | false | true | false | false | +| InInventoryID | numeric_comparison | - | false | true | false | false | +| InLockMap | composite_regex_numeric | packet_mapChange, configModify, pos_load_config.txt, in_game | true | true | false | false | +| InMap | csv_list | Network::Receive::map_changed, in_game, packet_mapChange | false | false | true | false | +| InMapRegex | regex_literal | Network::Receive::map_changed, in_game, packet_mapChange | true | false | false | false | +| InProgressBar | composite_regex_numeric | packet/progress_bar, packet/progress_bar_stop, packet_mapChange, packet/map_property3 | true | true | false | false | +| InPvP | csv_list | packet_mapChange, pvp_mode | false | false | true | false | +| InSaveMap | composite_regex_numeric | Network::Receive::map_changed, in_game, packet_mapChange, configModify, pos_load_config.txt | true | true | false | false | +| InStorage | numeric_comparison | - | false | true | false | false | +| InStorageID | numeric_comparison | - | false | true | false | false | +| InventoryCurrentSize | numeric_comparison | inventory_clear, inventory_ready, item_gathered, inventory_item_removed | false | true | false | false | +| InventoryReady | composite_regex_numeric | inventory_clear, inventory_ready | true | true | false | false | +| IsEquippedID | composite_regex_numeric | inventory_clear, equipped_item, unequipped_item, inventory_ready | true | true | false | true | +| IsInCoordinate | composite_regex_numeric | - | true | true | false | true | +| IsInMapAndCoordinate | composite_regex_numeric | packet/actor_movement_interrupted, packet/high_jump, packet/character_moves, packet_mapChange, packet/map_property3 | true | true | false | true | +| IsNotEquippedID | composite_regex_numeric | inventory_clear, equipped_item, unequipped_item, inventory_ready | true | true | false | true | +| IsNotInCoordinate | composite_regex_numeric | - | true | true | false | true | +| IsNotInMapAndCoordinate | composite_regex_numeric | - | true | true | false | true | diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/08_conditions_state_part_2.md b/docs/eventmacro_gpt_audit/knowledge_ready/08_conditions_state_part_2.md new file mode 100644 index 0000000000..639555263c --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/08_conditions_state_part_2.md @@ -0,0 +1,49 @@ +# 08 Conditions State Part 2 + +Classificação: nome/tipo/hook **PROVADO**; `argument_contract` em `custom` pode ser **INFERIDO**. + +| Condition | Parser mode | Hooks | regex | range | csv | var | +|---|---|---|---|---|---|---| +| JobID | composite_regex_numeric | Network::Receive::map_changed, in_game, sprite_job_change | true | true | false | true | +| JobIDNot | composite_regex_numeric | Network::Receive::map_changed, in_game, sprite_job_change | true | true | false | true | +| JobLevel | numeric_comparison | job_level_changed, Network::Receive::map_changed, in_game, packet/stat_info | false | true | false | false | +| MaxHP | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false | +| MaxSP | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false | +| MobNear | regex_literal | - | true | false | false | false | +| MobNearCount | numeric_comparison | - | false | true | false | false | +| MobNearDist | composite_regex_numeric | - | true | true | false | false | +| MobNotNear | regex_literal | - | true | false | false | false | +| NoMobNear | composite_regex_numeric | - | true | true | false | false | +| NoNpcNear | composite_regex_numeric | - | true | true | false | false | +| NoPlayerNear | composite_regex_numeric | - | true | true | false | false | +| NoPortalNear | composite_regex_numeric | - | true | true | false | false | +| NotInMap | csv_list | - | false | false | true | false | +| NpcNear | regex_literal | - | true | false | false | false | +| NpcNearCount | numeric_comparison | - | false | true | false | false | +| NpcNearDist | composite_regex_numeric | - | true | true | false | false | +| NpcNotNear | regex_literal | - | true | false | false | false | +| PlayerNear | regex_literal | - | true | false | false | false | +| PlayerNearCount | numeric_comparison | - | false | true | false | false | +| PlayerNearDist | composite_regex_numeric | - | true | true | false | false | +| PlayerNotNear | regex_literal | - | true | false | false | false | +| PortalNearCount | numeric_comparison | - | false | true | false | false | +| QuestActive | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestComplete | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestHuntCompleted | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestHuntOngoing | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestInactive | composite_regex_numeric | achievement_list, quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestIncomplete | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestNotComplete | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestNotIncomplete | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestOnTime | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestTimeOverdue | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| ShopOpened | composite_regex_numeric | in_game, open_shop, packet_send/shop_open, packet_send/shop_close, shop_closed, packet_mapChange | true | true | false | false | +| SkillLevel | numeric_comparison | packet/skill_update, packet/skills_list, packet/skill_add, packet/skill_delete | false | true | false | false | +| Spirits | numeric_comparison | packet/revolving_entity | false | true | false | false | +| StatusActiveHandle | composite_regex_numeric | Actor::setStatus::change | true | true | false | true | +| StatusInactiveHandle | composite_regex_numeric | in_game, Actor::setStatus::change | true | true | false | true | +| StorageOpened | composite_regex_numeric | in_game, packet_storage_open, packet_storage_close | true | true | false | false | +| VarValue | composite_regex_numeric | - | true | true | false | true | +| Zeny | numeric_comparison | zeny_change, packet/stat_info, packet/stats_info, complete_deal | false | true | false | false | +| isInMapAndCloseToCoordinate | composite_regex_numeric | packet/actor_movement_interrupted, packet/high_jump, packet/character_moves, packet_mapChange, packet/map_property3 | true | true | false | false | +| isNotInMapOrNotCloseToCoordinate | composite_regex_numeric | packet/actor_movement_interrupted, packet/high_jump, packet/character_moves, packet_mapChange, packet/map_property3 | true | true | false | false | diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/09_conditions_event.md b/docs/eventmacro_gpt_audit/knowledge_ready/09_conditions_event.md new file mode 100644 index 0000000000..dc78dd9afa --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/09_conditions_event.md @@ -0,0 +1,36 @@ +# 09 Conditions Event + +| Condition | Parser mode | Hooks | regex | range | csv | var | +|---|---|---|---|---|---|---| +| AttackEnd | csv_list | attack_end | false | false | true | false | +| AttackStart | csv_list | attack_start | false | false | true | false | +| AttackStartRegex | regex_literal | attack_start | true | false | false | false | +| BusMsg | regex_literal | - | true | false | false | false | +| Console | regex_literal | log | true | false | false | false | +| GuildMsg | regex_literal | - | true | false | false | false | +| GuildMsgDist | composite_regex_numeric | - | true | true | false | false | +| GuildMsgName | composite_regex_numeric | - | true | true | false | false | +| GuildMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| LocalMsg | regex_literal | - | true | false | false | false | +| MapLoaded | csv_list | packet_mapChange | false | false | true | false | +| NpcMsg | regex_literal | - | true | false | false | false | +| NpcMsgDist | composite_regex_numeric | - | true | true | false | false | +| NpcMsgName | composite_regex_numeric | - | true | true | false | false | +| NpcMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| OnCharLogIn | simple_event | in_game | false | false | false | false | +| PartyMsg | regex_literal | - | true | false | false | false | +| PartyMsgDist | composite_regex_numeric | - | true | true | false | false | +| PartyMsgName | composite_regex_numeric | - | true | true | false | false | +| PartyMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| PrivMsg | regex_literal | - | true | false | false | false | +| PrivMsgDist | composite_regex_numeric | - | true | true | false | false | +| PrivMsgName | composite_regex_numeric | - | true | true | false | false | +| PrivMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| PubMsg | regex_literal | - | true | false | false | false | +| PubMsgDist | composite_regex_numeric | - | true | true | false | false | +| PubMsgName | composite_regex_numeric | - | true | true | false | false | +| PubMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| SimpleHookEvent | composite_regex_numeric | - | true | true | false | true | +| StatAdded | csv_list | packet_charStats | false | false | true | false | +| SystemMsg | regex_literal | - | true | false | false | false | +| ZenyChanged | numeric_comparison | zeny_change | false | true | false | false | diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/10_condition_reference_tables.md b/docs/eventmacro_gpt_audit/knowledge_ready/10_condition_reference_tables.md new file mode 100644 index 0000000000..4202ec5fd3 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/10_condition_reference_tables.md @@ -0,0 +1,15 @@ +# 10 Condition Reference Tables + +- Total conditions: 118 (PROVADO) +- State: 86 (PROVADO) +- Event: 32 (PROVADO) + +## Parser mode +- composite_regex_numeric: 63 +- csv_list: 7 +- numeric_comparison: 29 +- regex_literal: 18 +- simple_event: 1 + +## Nota de precisão +- `parser_mode` e `argument_contract` são PROVADO nas famílias resolvidas por herança e por uso explícito de validators; em `custom`, parte da tipagem continua INFERIDO e deve ser checada no módulo da condition. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/11_invalid_syntax_and_negative_catalog.md b/docs/eventmacro_gpt_audit/knowledge_ready/11_invalid_syntax_and_negative_catalog.md new file mode 100644 index 0000000000..1b2409f719 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/11_invalid_syntax_and_negative_catalog.md @@ -0,0 +1,25 @@ +# 10 Invalid Syntax and Negative Catalog + +- Automacro sem conditions/parameters/call: rejeitado. **PROVADO**. +- Duplicidade de automacro/macro: rejeitado. **PROVADO**. +- Mais de 1 event condition no mesmo automacro: rejeitado. **PROVADO**. +- Condition única duplicada: rejeitado. **PROVADO**. +- Nome com espaço (macro/automacro): rejeitado. **PROVADO**. +- `set` com parâmetro desconhecido: erro em runtime macro. **PROVADO**. +- `do eventMacro ...` e `do ai clear`: proibidos. **PROVADO**. +- `defined()` em array/hash sem acesso (`@a`/`%h`) é inválido (aceita escalar, `$a[i]`, `$h{k}`). **PROVADO**. +- Índice de array não numérico e chave de hash inválida após parse dinâmico: erro. **PROVADO**. +- Uso de variáveis sistema (`.x`) em diversas conditions/validators: bloqueado. **PROVADO**. +- Regex malformada em validação (`RegexCheck`) ou statement (`parse_and_check_condition_text`): erro. **PROVADO**. +- Misturar `&&` e `||` sem estrutura válida de grupos: erro. **PROVADO**. + +## Itens potencialmente alucináveis +- `~` não é regex; em `cmpr` é membership CSV case-insensitive. **PROVADO**. +- Range é `a..b` dentro de comparação; não é operador genérico separado. **PROVADO**. +- Event conditions não substituem state queueing; semântica é diferente. **PROVADO**. + +## Mitigações práticas para GPT especialista +- Sempre mapear operador para backend real: `Utilities::cmpr` + `Validator::*` antes de sugerir sintaxe. **PROVADO**. +- Bloquear resposta que proponha >1 event condition por automacro. **PROVADO**. +- Separar resposta em “state condition” vs “event condition” com semântica de fila/disparo distinta. **PROVADO**. +- Se comparar com macro plugin antigo sem evidência local, marcar **NÃO COMPROVADO**. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/12_examples_valid.md b/docs/eventmacro_gpt_audit/knowledge_ready/12_examples_valid.md new file mode 100644 index 0000000000..6041386f6f --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/12_examples_valid.md @@ -0,0 +1,41 @@ +# 11 Examples Valid + +## Automacro state + call +```txt +automacro hp_pot { + CurrentHP < 40% + call use_pot + priority 0 + CheckOnAI auto +} +``` +Status: **PROVADO** (numeric validator aceita `%`, operador `<`, call obrigatório). + +## Automacro event + regex +```txt +automacro got_priv { + PrivMsg /^hi$/i + call answer_hi +} +``` +Status: **PROVADO** (RegexConditionEvent). + +## Call com parâmetros +```txt +automacro call_args { + OnCharLogIn any + call buff_me 123 "abc" +} +``` +Status: **PROVADO** (`call` guarda args; execução define `.param`). + +## Macro com fluxo +```txt +macro test_flow { + if ($x == 1) log ok + while ($x < 3) { + $x++ + } +} +``` +Status: **PROVADO** (`if` pós-fixado e `while` em runner). diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/13_examples_invalid.md b/docs/eventmacro_gpt_audit/knowledge_ready/13_examples_invalid.md new file mode 100644 index 0000000000..a5e4d3c8e3 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/13_examples_invalid.md @@ -0,0 +1,34 @@ +# 12 Examples Invalid + +## Dois event-type na mesma automacro +```txt +automacro bad { + OnCharLogIn any + AttackStart poring + call foo +} +``` +Resultado: automacro ignorada. **PROVADO**. + +## Parâmetro inválido +```txt +automacro bad2 { + InMap prontera + call foo + run-once maybe +} +``` +Resultado: automacro ignorada. **PROVADO**. + +## Índice de array inválido dinâmico +```txt +$idx = "abc" +$x = $arr[$idx] +``` +Resultado: erro (índice array deve numérico após parse). **PROVADO**. + +## `defined` em tipo não suportado +```txt +if (&defined(@arr)) { log x } +``` +Resultado: erro (defined só escalar/acesso array/acesso hash). **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/14_gaps_ambiguities_and_nonprovable_claims.md b/docs/eventmacro_gpt_audit/knowledge_ready/14_gaps_ambiguities_and_nonprovable_claims.md new file mode 100644 index 0000000000..8fa0d25ec8 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/14_gaps_ambiguities_and_nonprovable_claims.md @@ -0,0 +1,12 @@ +# 14 Gaps, Ambiguities and Nonprovable Claims + +- `isNewWrongCommandBlock` tinha `else*` e uso de `$_` em vez de `$line`; isto era passível de falso-positivo/falso-negativo no parser de bloco. **PROVADO**. + **Status de solução**: **SOLUCIONADO NO CÓDIGO** (ajustado para `^else\\s*{$` e uso consistente de `$line`). +- `FileParser` colapsa múltiplos espaços em todas as linhas; isso pode afetar strings sem aspas em condições/comandos. Comportamento exato em todos cenários: **NÃO COMPROVADO**. +- `FileParser` remove comentários com `s/\\s+#.*$//`, sem awareness de aspas; `#` dentro de string pode ser truncado dependendo do formato da linha. **PROVADO**. + **Status de solução**: **PARCIALMENTE SOLUCIONÁVEL**, exige refatoração lexical (state machine para strings/escapes) antes de `trim/comment-strip`. +- Algumas conditions grandes têm lógica complexa com estados transitórios (`is_on_stand_by`) dependentes de hooks de rede; sem execução integrada, cobertura temporal completa é **NÃO COMPROVADO**. + **Status de solução**: **NÃO SOLUCIONÁVEL SÓ POR LEITURA ESTÁTICA**; requer suíte de integração por hook/evento. +- `RegexCheck` validava variável de sistema com `if ($var =~ /^\\./)` (hashref), não `display_name`; isso podia deixar `.vars` passar no caminho de regex. **PROVADO**. + **Status de solução**: **SOLUCIONADO NO CÓDIGO** (validação ajustada para `$var_name`). +- Diferenças históricas para plugin macro antigo só podem ser afirmadas onde há evidência direta de nomes/comandos no código atual; demais afirmações: **NÃO COMPROVADO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/15_gpt_system_instructions_draft.md b/docs/eventmacro_gpt_audit/knowledge_ready/15_gpt_system_instructions_draft.md new file mode 100644 index 0000000000..d23b8fc096 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/15_gpt_system_instructions_draft.md @@ -0,0 +1,29 @@ +# 15 GPT System Instructions Draft + +## Regras canônicas +1. Nunca invente sintaxe/operador/condition/evento/parâmetro. +2. Priorize comportamento comprovado no código-fonte atual. +3. Se não houver prova no código: responda **NÃO COMPROVADO**. +4. Diferencie claramente: conceito, sintaxe, exemplo, restrição. +5. Não confundir `eventMacro` com plugin macro antigo. + +## Modo de revisão de scripts do usuário +Sempre separar: +- Erro de sintaxe +- Erro de tipagem/argumento +- Erro de lógica +- Erro de semântica/runtime + +## Ambiguidade +- Quando houver múltiplas leituras possíveis e o código não fechar conclusão, declarar ambiguidade explicitamente. + +## Citações internas recomendadas +- Informar arquivo e linha local em cada afirmação factual. + +## Segurança contra alucinação +- Não presumir support para operadores fora de `cmpr`/validators. +- Não presumir condições além dos módulos em `Condition/`. +- Não presumir comportamento de regex/lista/range fora de implementação. +- Nunca tratar `~` como regex; em eventMacro é lista CSV em `cmpr`. +- Nunca aceitar mais de uma condition do tipo evento por automacro. +- Sempre explicar separadamente semântica de **state condition** (fila/estado) e **event condition** (disparo por callback). diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/16_upload_manifest.md b/docs/eventmacro_gpt_audit/knowledge_ready/16_upload_manifest.md new file mode 100644 index 0000000000..dd7ec9b9f1 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/16_upload_manifest.md @@ -0,0 +1,24 @@ +# 16 Upload Manifest + +Seleção recomendada para Knowledge GPT (<=20 arquivos): +1. 00_scope_and_rules.md +2. 01_architecture_and_runtime.md +3. 02_grammar_and_parsing.md +4. 03_variables_and_special_variables.md +5. 04_macro_keywords_and_functions.md +6. 05_console_commands.md +7. 06_automacro_parameters.md +8. 07_conditions_state_part_1.md +9. 08_conditions_state_part_2.md +10. 09_conditions_event.md +11. 10_condition_reference_tables.md +12. 11_invalid_syntax_and_negative_catalog.md +13. 12_examples_valid.md +14. 13_examples_invalid.md +15. 14_gaps_ambiguities_and_nonprovable_claims.md +16. 15_gpt_system_instructions_draft.md +17. 16_upload_manifest.md +18. 17_condition_catalog.json + +Contagem: **18** arquivos. **PROVADO**. +Confirmação: **NÃO excede 20 arquivos**. **PROVADO**. diff --git a/docs/eventmacro_gpt_audit/knowledge_ready/17_condition_catalog.json b/docs/eventmacro_gpt_audit/knowledge_ready/17_condition_catalog.json new file mode 100644 index 0000000000..f2c3d52775 --- /dev/null +++ b/docs/eventmacro_gpt_audit/knowledge_ready/17_condition_catalog.json @@ -0,0 +1,6516 @@ +[ + { + "name": "AttackEnd", + "module": "eventMacro::Condition::AttackEnd", + "file": "plugins/eventMacro/eventMacro/Condition/AttackEnd.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::AttackEnd", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "attack_end" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"Name", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 24, + "file": "plugins/eventMacro/eventMacro/Condition/AttackEnd.pm" + } + }, + { + "name": "AttackStart", + "module": "eventMacro::Condition::AttackStart", + "file": "plugins/eventMacro/eventMacro/Condition/AttackStart.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::AttackStart", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "attack_start" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"Name", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 24, + "file": "plugins/eventMacro/eventMacro/Condition/AttackStart.pm" + } + }, + { + "name": "AttackStartRegex", + "module": "eventMacro::Condition::AttackStartRegex", + "file": "plugins/eventMacro/eventMacro/Condition/AttackStartRegex.pm", + "base": "eventMacro::Conditiontypes::RegexConditionEvent", + "ancestry": [ + "eventMacro::Condition::AttackStartRegex", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "attack_start" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"Name", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/AttackStartRegex.pm" + } + }, + { + "name": "BaseLevel", + "module": "eventMacro::Condition::BaseLevel", + "file": "plugins/eventMacro/eventMacro/Condition/BaseLevel.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::BaseLevel", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "base_level_changed", + "Network::Receive::map_changed", + "in_game", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/BaseLevel.pm" + } + }, + { + "name": "BusMsg", + "module": "eventMacro::Condition::BusMsg", + "file": "plugins/eventMacro/eventMacro/Condition/BusMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::BusMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/BusMsg.pm" + } + }, + { + "name": "CartCurrentSize", + "module": "eventMacro::Condition::CartCurrentSize", + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentSize.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartCurrentSize", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 32, + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentSize.pm" + } + }, + { + "name": "CartCurrentWeight", + "module": "eventMacro::Condition::CartCurrentWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartCurrentWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 32, + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentWeight.pm" + } + }, + { + "name": "CartMaxSize", + "module": "eventMacro::Condition::CartMaxSize", + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxSize.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartMaxSize", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxSize.pm" + } + }, + { + "name": "CartMaxWeight", + "module": "eventMacro::Condition::CartMaxWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartMaxWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxWeight.pm" + } + }, + { + "name": "CharCurrentWeight", + "module": "eventMacro::Condition::CharCurrentWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CharCurrentWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CharCurrentWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 29, + "new_vars_line": 53, + "file": "plugins/eventMacro/eventMacro/Condition/CharCurrentWeight.pm" + } + }, + { + "name": "CharMaxWeight", + "module": "eventMacro::Condition::CharMaxWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CharMaxWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CharMaxWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/CharMaxWeight.pm" + } + }, + { + "name": "ChatRoomNear", + "module": "eventMacro::Condition::ChatRoomNear", + "file": "plugins/eventMacro/eventMacro/Condition/ChatRoomNear.pm", + "base": "eventMacro::Conditiontypes::RegexConditionState", + "ancestry": [ + "eventMacro::Condition::ChatRoomNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "chat_created", + "packet_chatinfo", + "chat_removed", + "chat_modified" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"OwnerID", + "\".$self->{name}.\"Last\".\"OwnerName", + "\".$self->{name}.\"Last\".\"Title" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 21, + "new_vars_line": 83, + "file": "plugins/eventMacro/eventMacro/Condition/ChatRoomNear.pm" + } + }, + { + "name": "ConfigKey", + "module": "eventMacro::Condition::ConfigKey", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKey.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKey", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex", + "\".$self->{name}.\"LastValue" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": 15, + "validate_condition_line": 130, + "new_vars_line": 183, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKey.pm" + } + }, + { + "name": "ConfigKeyDefined", + "module": "eventMacro::Condition::ConfigKeyDefined", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDefined.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyDefined", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 55, + "new_vars_line": 103, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDefined.pm" + } + }, + { + "name": "ConfigKeyDualDifferentDefinedValue", + "module": "eventMacro::Condition::ConfigKeyDualDifferentDefinedValue", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualDifferentDefinedValue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyDualDifferentDefinedValue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s+/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey1", + "\".$self->{name}.\"LastKey2", + "\".$self->{name}.\"LastValue1", + "\".$self->{name}.\"LastValue2" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 56, + "new_vars_line": 80, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualDifferentDefinedValue.pm" + } + }, + { + "name": "ConfigKeyDualSameDefinedValue", + "module": "eventMacro::Condition::ConfigKeyDualSameDefinedValue", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualSameDefinedValue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyDualSameDefinedValue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s+/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey1", + "\".$self->{name}.\"LastKey2", + "\".$self->{name}.\"LastValue" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 55, + "new_vars_line": 77, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualSameDefinedValue.pm" + } + }, + { + "name": "ConfigKeyNot", + "module": "eventMacro::Condition::ConfigKeyNot", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNot.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyNot", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastKeyValue", + "\".$self->{name}.\"LastMemberIndex", + "\".$self->{name}.\"LastWantedValue" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": 15, + "validate_condition_line": 132, + "new_vars_line": 186, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNot.pm" + } + }, + { + "name": "ConfigKeyNotExist", + "module": "eventMacro::Condition::ConfigKeyNotExist", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNotExist.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyNotExist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 55, + "new_vars_line": 103, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNotExist.pm" + } + }, + { + "name": "ConfigKeyUndefined", + "module": "eventMacro::Condition::ConfigKeyUndefined", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyUndefined.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyUndefined", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 55, + "new_vars_line": 104, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyUndefined.pm" + } + }, + { + "name": "Console", + "module": "eventMacro::Condition::Console", + "file": "plugins/eventMacro/eventMacro/Condition/Console.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::Console", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "log" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 11, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/Console.pm" + } + }, + { + "name": "CurrentHP", + "module": "eventMacro::Condition::CurrentHP", + "file": "plugins/eventMacro/eventMacro/Condition/CurrentHP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CurrentHP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 30, + "file": "plugins/eventMacro/eventMacro/Condition/CurrentHP.pm" + } + }, + { + "name": "CurrentSP", + "module": "eventMacro::Condition::CurrentSP", + "file": "plugins/eventMacro/eventMacro/Condition/CurrentSP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CurrentSP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 30, + "file": "plugins/eventMacro/eventMacro/Condition/CurrentSP.pm" + } + }, + { + "name": "Eval", + "module": "eventMacro::Condition::Eval", + "file": "plugins/eventMacro/eventMacro/Condition/Eval.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::Eval", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "AI_pre" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 6, + "parse_syntax_line": 10, + "validate_condition_line": 20, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/Eval.pm" + } + }, + { + "name": "EvalHook", + "module": "eventMacro::Condition::EvalHook", + "file": "plugins/eventMacro/eventMacro/Condition/EvalHook.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::EvalHook", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 45, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/EvalHook.pm" + } + }, + { + "name": "FreeSkillPoints", + "module": "eventMacro::Condition::FreeSkillPoints", + "file": "plugins/eventMacro/eventMacro/Condition/FreeSkillPoints.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::FreeSkillPoints", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/stat_info", + "packet_charSkills", + "packet_homunSkills" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 27, + "file": "plugins/eventMacro/eventMacro/Condition/FreeSkillPoints.pm" + } + }, + { + "name": "FreeStatPoints", + "module": "eventMacro::Condition::FreeStatPoints", + "file": "plugins/eventMacro/eventMacro/Condition/FreeStatPoints.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::FreeStatPoints", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/stat_info", + "packet/stats_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/FreeStatPoints.pm" + } + }, + { + "name": "GuildMsg", + "module": "eventMacro::Condition::GuildMsg", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::GuildMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsg.pm" + } + }, + { + "name": "GuildMsgDist", + "module": "eventMacro::Condition::GuildMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::GuildMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgDist.pm" + } + }, + { + "name": "GuildMsgName", + "module": "eventMacro::Condition::GuildMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::GuildMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 16, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgName.pm" + } + }, + { + "name": "GuildMsgNameDist", + "module": "eventMacro::Condition::GuildMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::GuildMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgNameDist.pm" + } + }, + { + "name": "InCart", + "module": "eventMacro::Condition::InCart", + "file": "plugins/eventMacro/eventMacro/Condition/InCart.pm", + "base": "eventMacro::Condition::Base::InCart", + "ancestry": [ + "eventMacro::Condition::InCart", + "eventMacro::Condition::Base::InCart", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InCart.pm" + } + }, + { + "name": "InCartID", + "module": "eventMacro::Condition::InCartID", + "file": "plugins/eventMacro/eventMacro/Condition/InCartID.pm", + "base": "eventMacro::Condition::Base::InCart", + "ancestry": [ + "eventMacro::Condition::InCartID", + "eventMacro::Condition::Base::InCart", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 8, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InCartID.pm" + } + }, + { + "name": "InChatRoom", + "module": "eventMacro::Condition::InChatRoom", + "file": "plugins/eventMacro/eventMacro/Condition/InChatRoom.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InChatRoom", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "chat_created", + "chat_leave", + "chat_joined" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 26, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InChatRoom.pm" + } + }, + { + "name": "InCity", + "module": "eventMacro::Condition::InCity", + "file": "plugins/eventMacro/eventMacro/Condition/InCity.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InCity", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 17, + "validate_condition_line": 32, + "new_vars_line": 44, + "file": "plugins/eventMacro/eventMacro/Condition/InCity.pm" + } + }, + { + "name": "InInventory", + "module": "eventMacro::Condition::InInventory", + "file": "plugins/eventMacro/eventMacro/Condition/InInventory.pm", + "base": "eventMacro::Condition::Base::InInventory", + "ancestry": [ + "eventMacro::Condition::InInventory", + "eventMacro::Condition::Base::InInventory", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InInventory.pm" + } + }, + { + "name": "InInventoryID", + "module": "eventMacro::Condition::InInventoryID", + "file": "plugins/eventMacro/eventMacro/Condition/InInventoryID.pm", + "base": "eventMacro::Condition::Base::InInventory", + "ancestry": [ + "eventMacro::Condition::InInventoryID", + "eventMacro::Condition::Base::InInventory", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InInventoryID.pm" + } + }, + { + "name": "InLockMap", + "module": "eventMacro::Condition::InLockMap", + "file": "plugins/eventMacro/eventMacro/Condition/InLockMap.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InLockMap", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 32, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InLockMap.pm" + } + }, + { + "name": "InMap", + "module": "eventMacro::Condition::InMap", + "file": "plugins/eventMacro/eventMacro/Condition/InMap.pm", + "base": "eventMacro::Conditiontypes::ListConditionState", + "ancestry": [ + "eventMacro::Condition::InMap", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 29, + "file": "plugins/eventMacro/eventMacro/Condition/InMap.pm" + } + }, + { + "name": "InMapRegex", + "module": "eventMacro::Condition::InMapRegex", + "file": "plugins/eventMacro/eventMacro/Condition/InMapRegex.pm", + "base": "eventMacro::Conditiontypes::RegexConditionState", + "ancestry": [ + "eventMacro::Condition::InMapRegex", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 29, + "file": "plugins/eventMacro/eventMacro/Condition/InMapRegex.pm" + } + }, + { + "name": "InProgressBar", + "module": "eventMacro::Condition::InProgressBar", + "file": "plugins/eventMacro/eventMacro/Condition/InProgressBar.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InProgressBar", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/progress_bar", + "packet/progress_bar_stop", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 31, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InProgressBar.pm" + } + }, + { + "name": "InPvP", + "module": "eventMacro::Condition::InPvP", + "file": "plugins/eventMacro/eventMacro/Condition/InPvP.pm", + "base": "eventMacro::Conditiontypes::ListConditionState", + "ancestry": [ + "eventMacro::Condition::InPvP", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "pvp_mode" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 19, + "parse_syntax_line": 23, + "validate_condition_line": 36, + "new_vars_line": 53, + "file": "plugins/eventMacro/eventMacro/Condition/InPvP.pm" + } + }, + { + "name": "InSaveMap", + "module": "eventMacro::Condition::InSaveMap", + "file": "plugins/eventMacro/eventMacro/Condition/InSaveMap.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InSaveMap", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange", + "configModify", + "pos_load_config.txt" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 32, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InSaveMap.pm" + } + }, + { + "name": "InStorage", + "module": "eventMacro::Condition::InStorage", + "file": "plugins/eventMacro/eventMacro/Condition/InStorage.pm", + "base": "eventMacro::Condition::Base::InStorage", + "ancestry": [ + "eventMacro::Condition::InStorage", + "eventMacro::Condition::Base::InStorage", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InStorage.pm" + } + }, + { + "name": "InStorageID", + "module": "eventMacro::Condition::InStorageID", + "file": "plugins/eventMacro/eventMacro/Condition/InStorageID.pm", + "base": "eventMacro::Condition::Base::InStorage", + "ancestry": [ + "eventMacro::Condition::InStorageID", + "eventMacro::Condition::Base::InStorage", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 10, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InStorageID.pm" + } + }, + { + "name": "InventoryCurrentSize", + "module": "eventMacro::Condition::InventoryCurrentSize", + "file": "plugins/eventMacro/eventMacro/Condition/InventoryCurrentSize.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::InventoryCurrentSize", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready", + "item_gathered", + "inventory_item_removed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 32, + "file": "plugins/eventMacro/eventMacro/Condition/InventoryCurrentSize.pm" + } + }, + { + "name": "InventoryReady", + "module": "eventMacro::Condition::InventoryReady", + "file": "plugins/eventMacro/eventMacro/Condition/InventoryReady.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InventoryReady", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 28, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InventoryReady.pm" + } + }, + { + "name": "IsEquippedID", + "module": "eventMacro::Condition::IsEquippedID", + "file": "plugins/eventMacro/eventMacro/Condition/IsEquippedID.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::IsEquippedID", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "equipped_item", + "unequipped_item", + "inventory_ready" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastName", + "\".$self->{name}.\"LastSlot" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": 18, + "validate_condition_line": 176, + "new_vars_line": 211, + "file": "plugins/eventMacro/eventMacro/Condition/IsEquippedID.pm" + } + }, + { + "name": "IsInCoordinate", + "module": "eventMacro::Condition::IsInCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsInCoordinate.pm", + "base": "eventMacro::Condition::IsInMapAndCoordinate", + "ancestry": [ + "eventMacro::Condition::IsInCoordinate", + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "[^\\d\\s,.]+", + "[^\\d\\s,.]+" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/IsInCoordinate.pm" + } + }, + { + "name": "IsInMapAndCoordinate", + "module": "eventMacro::Condition::IsInMapAndCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsInMapAndCoordinate.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/actor_movement_interrupted", + "packet/high_jump", + "packet/character_moves", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 161, + "new_vars_line": 223, + "file": "plugins/eventMacro/eventMacro/Condition/IsInMapAndCoordinate.pm" + } + }, + { + "name": "IsNotEquippedID", + "module": "eventMacro::Condition::IsNotEquippedID", + "file": "plugins/eventMacro/eventMacro/Condition/IsNotEquippedID.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::IsNotEquippedID", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "equipped_item", + "unequipped_item", + "inventory_ready" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"LastIsEmpty", + "\".$self->{name}.\"LastSlot" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 16, + "validate_condition_line": 178, + "new_vars_line": 223, + "file": "plugins/eventMacro/eventMacro/Condition/IsNotEquippedID.pm" + } + }, + { + "name": "IsNotInCoordinate", + "module": "eventMacro::Condition::IsNotInCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInCoordinate.pm", + "base": "eventMacro::Condition::IsInCoordinate", + "ancestry": [ + "eventMacro::Condition::IsNotInCoordinate", + "eventMacro::Condition::IsInCoordinate", + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + ",", + "," + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 10, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInCoordinate.pm" + } + }, + { + "name": "IsNotInMapAndCoordinate", + "module": "eventMacro::Condition::IsNotInMapAndCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInMapAndCoordinate.pm", + "base": "eventMacro::Condition::IsInMapAndCoordinate", + "ancestry": [ + "eventMacro::Condition::IsNotInMapAndCoordinate", + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + ",", + "," + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 8, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInMapAndCoordinate.pm" + } + }, + { + "name": "JobID", + "module": "eventMacro::Condition::JobID", + "file": "plugins/eventMacro/eventMacro/Condition/JobID.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::JobID", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "sprite_job_change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 63, + "new_vars_line": 88, + "file": "plugins/eventMacro/eventMacro/Condition/JobID.pm" + } + }, + { + "name": "JobIDNot", + "module": "eventMacro::Condition::JobIDNot", + "file": "plugins/eventMacro/eventMacro/Condition/JobIDNot.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::JobIDNot", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "sprite_job_change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(\\d+)$", + "^(\\d+)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 45, + "new_vars_line": 59, + "file": "plugins/eventMacro/eventMacro/Condition/JobIDNot.pm" + } + }, + { + "name": "JobLevel", + "module": "eventMacro::Condition::JobLevel", + "file": "plugins/eventMacro/eventMacro/Condition/JobLevel.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::JobLevel", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "job_level_changed", + "Network::Receive::map_changed", + "in_game", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 27, + "file": "plugins/eventMacro/eventMacro/Condition/JobLevel.pm" + } + }, + { + "name": "LocalMsg", + "module": "eventMacro::Condition::LocalMsg", + "file": "plugins/eventMacro/eventMacro/Condition/LocalMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::LocalMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/LocalMsg.pm" + } + }, + { + "name": "MapLoaded", + "module": "eventMacro::Condition::MapLoaded", + "file": "plugins/eventMacro/eventMacro/Condition/MapLoaded.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::MapLoaded", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 24, + "file": "plugins/eventMacro/eventMacro/Condition/MapLoaded.pm" + } + }, + { + "name": "MaxHP", + "module": "eventMacro::Condition::MaxHP", + "file": "plugins/eventMacro/eventMacro/Condition/MaxHP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::MaxHP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/MaxHP.pm" + } + }, + { + "name": "MaxSP", + "module": "eventMacro::Condition::MaxSP", + "file": "plugins/eventMacro/eventMacro/Condition/MaxSP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::MaxSP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/MaxSP.pm" + } + }, + { + "name": "MobNear", + "module": "eventMacro::Condition::MobNear", + "file": "plugins/eventMacro/eventMacro/Condition/MobNear.pm", + "base": "eventMacro::Condition::Base::ActorNear", + "ancestry": [ + "eventMacro::Condition::MobNear", + "eventMacro::Condition::Base::ActorNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Id", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 17, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/MobNear.pm" + } + }, + { + "name": "MobNearCount", + "module": "eventMacro::Condition::MobNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/MobNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::MobNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 20, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/MobNearCount.pm" + } + }, + { + "name": "MobNearDist", + "module": "eventMacro::Condition::MobNearDist", + "file": "plugins/eventMacro/eventMacro/Condition/MobNearDist.pm", + "base": "eventMacro::Condition::Base::ActorNearDist", + "ancestry": [ + "eventMacro::Condition::MobNearDist", + "eventMacro::Condition::Base::ActorNearDist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Id", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 25, + "validate_condition_line": 34, + "new_vars_line": 67, + "file": "plugins/eventMacro/eventMacro/Condition/MobNearDist.pm" + } + }, + { + "name": "MobNotNear", + "module": "eventMacro::Condition::MobNotNear", + "file": "plugins/eventMacro/eventMacro/Condition/MobNotNear.pm", + "base": "eventMacro::Condition::Base::ActorNotNear", + "ancestry": [ + "eventMacro::Condition::MobNotNear", + "eventMacro::Condition::Base::ActorNotNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/MobNotNear.pm" + } + }, + { + "name": "NoMobNear", + "module": "eventMacro::Condition::NoMobNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoMobNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoMobNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoMobNear.pm" + } + }, + { + "name": "NoNpcNear", + "module": "eventMacro::Condition::NoNpcNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoNpcNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoNpcNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoNpcNear.pm" + } + }, + { + "name": "NoPlayerNear", + "module": "eventMacro::Condition::NoPlayerNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoPlayerNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoPlayerNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoPlayerNear.pm" + } + }, + { + "name": "NoPortalNear", + "module": "eventMacro::Condition::NoPortalNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoPortalNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoPortalNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoPortalNear.pm" + } + }, + { + "name": "NotInMap", + "module": "eventMacro::Condition::NotInMap", + "file": "plugins/eventMacro/eventMacro/Condition/NotInMap.pm", + "base": "eventMacro::Condition::InMap", + "ancestry": [ + "eventMacro::Condition::NotInMap", + "eventMacro::Condition::InMap", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [ + ",", + "," + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 7, + "validate_condition_line": 18, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NotInMap.pm" + } + }, + { + "name": "NpcMsg", + "module": "eventMacro::Condition::NpcMsg", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::NpcMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsg.pm" + } + }, + { + "name": "NpcMsgDist", + "module": "eventMacro::Condition::NpcMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::NpcMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgDist.pm" + } + }, + { + "name": "NpcMsgName", + "module": "eventMacro::Condition::NpcMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::NpcMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgName.pm" + } + }, + { + "name": "NpcMsgNameDist", + "module": "eventMacro::Condition::NpcMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::NpcMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgNameDist.pm" + } + }, + { + "name": "NpcNear", + "module": "eventMacro::Condition::NpcNear", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNear.pm", + "base": "eventMacro::Condition::Base::ActorNear", + "ancestry": [ + "eventMacro::Condition::NpcNear", + "eventMacro::Condition::Base::ActorNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 17, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNear.pm" + } + }, + { + "name": "NpcNearCount", + "module": "eventMacro::Condition::NpcNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::NpcNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearCount.pm" + } + }, + { + "name": "NpcNearDist", + "module": "eventMacro::Condition::NpcNearDist", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearDist.pm", + "base": "eventMacro::Condition::Base::ActorNearDist", + "ancestry": [ + "eventMacro::Condition::NpcNearDist", + "eventMacro::Condition::Base::ActorNearDist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 25, + "validate_condition_line": 34, + "new_vars_line": 67, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearDist.pm" + } + }, + { + "name": "NpcNotNear", + "module": "eventMacro::Condition::NpcNotNear", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNotNear.pm", + "base": "eventMacro::Condition::Base::ActorNotNear", + "ancestry": [ + "eventMacro::Condition::NpcNotNear", + "eventMacro::Condition::Base::ActorNotNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNotNear.pm" + } + }, + { + "name": "OnCharLogIn", + "module": "eventMacro::Condition::OnCharLogIn", + "file": "plugins/eventMacro/eventMacro/Condition/OnCharLogIn.pm", + "base": "eventMacro::Conditiontypes::SimpleEvent", + "ancestry": [ + "eventMacro::Condition::OnCharLogIn", + "eventMacro::Conditiontypes::SimpleEvent", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "in_game" + ], + "parser_mode": "simple_event", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/OnCharLogIn.pm" + } + }, + { + "name": "PartyMsg", + "module": "eventMacro::Condition::PartyMsg", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::PartyMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsg.pm" + } + }, + { + "name": "PartyMsgDist", + "module": "eventMacro::Condition::PartyMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::PartyMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgDist.pm" + } + }, + { + "name": "PartyMsgName", + "module": "eventMacro::Condition::PartyMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::PartyMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgName.pm" + } + }, + { + "name": "PartyMsgNameDist", + "module": "eventMacro::Condition::PartyMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::PartyMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgNameDist.pm" + } + }, + { + "name": "PlayerNear", + "module": "eventMacro::Condition::PlayerNear", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNear.pm", + "base": "eventMacro::Condition::Base::ActorNear", + "ancestry": [ + "eventMacro::Condition::PlayerNear", + "eventMacro::Condition::Base::ActorNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"AccountId", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Job", + "\".$self->{name}.\"Last\".\"Level", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 17, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNear.pm" + } + }, + { + "name": "PlayerNearCount", + "module": "eventMacro::Condition::PlayerNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::PlayerNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": -1, + "validate_condition_line": 23, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearCount.pm" + } + }, + { + "name": "PlayerNearDist", + "module": "eventMacro::Condition::PlayerNearDist", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearDist.pm", + "base": "eventMacro::Condition::Base::ActorNearDist", + "ancestry": [ + "eventMacro::Condition::PlayerNearDist", + "eventMacro::Condition::Base::ActorNearDist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"AccountId", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Job", + "\".$self->{name}.\"Last\".\"Level", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 25, + "validate_condition_line": 34, + "new_vars_line": 67, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearDist.pm" + } + }, + { + "name": "PlayerNotNear", + "module": "eventMacro::Condition::PlayerNotNear", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNotNear.pm", + "base": "eventMacro::Condition::Base::ActorNotNear", + "ancestry": [ + "eventMacro::Condition::PlayerNotNear", + "eventMacro::Condition::Base::ActorNotNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNotNear.pm" + } + }, + { + "name": "PortalNearCount", + "module": "eventMacro::Condition::PortalNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/PortalNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::PortalNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PortalNearCount.pm" + } + }, + { + "name": "PrivMsg", + "module": "eventMacro::Condition::PrivMsg", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::PrivMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsg.pm" + } + }, + { + "name": "PrivMsgDist", + "module": "eventMacro::Condition::PrivMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::PrivMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgDist.pm" + } + }, + { + "name": "PrivMsgName", + "module": "eventMacro::Condition::PrivMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::PrivMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgName.pm" + } + }, + { + "name": "PrivMsgNameDist", + "module": "eventMacro::Condition::PrivMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::PrivMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgNameDist.pm" + } + }, + { + "name": "PubMsg", + "module": "eventMacro::Condition::PubMsg", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::PubMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsg.pm" + } + }, + { + "name": "PubMsgDist", + "module": "eventMacro::Condition::PubMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::PubMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgDist.pm" + } + }, + { + "name": "PubMsgName", + "module": "eventMacro::Condition::PubMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::PubMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgName.pm" + } + }, + { + "name": "PubMsgNameDist", + "module": "eventMacro::Condition::PubMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::PubMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgNameDist.pm" + } + }, + { + "name": "QuestActive", + "module": "eventMacro::Condition::QuestActive", + "file": "plugins/eventMacro/eventMacro/Condition/QuestActive.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestActive", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 81, + "new_vars_line": 103, + "file": "plugins/eventMacro/eventMacro/Condition/QuestActive.pm" + } + }, + { + "name": "QuestComplete", + "module": "eventMacro::Condition::QuestComplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestComplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestComplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestComplete.pm" + } + }, + { + "name": "QuestHuntCompleted", + "module": "eventMacro::Condition::QuestHuntCompleted", + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntCompleted.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestHuntCompleted", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastMobID", + "\".$self->{name}.\"LastQuestID" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 149, + "new_vars_line": 171, + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntCompleted.pm" + } + }, + { + "name": "QuestHuntOngoing", + "module": "eventMacro::Condition::QuestHuntOngoing", + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntOngoing.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestHuntOngoing", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastMobID", + "\".$self->{name}.\"LastQuestID" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 150, + "new_vars_line": 172, + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntOngoing.pm" + } + }, + { + "name": "QuestInactive", + "module": "eventMacro::Condition::QuestInactive", + "file": "plugins/eventMacro/eventMacro/Condition/QuestInactive.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestInactive", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "achievement_list", + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 80, + "new_vars_line": 102, + "file": "plugins/eventMacro/eventMacro/Condition/QuestInactive.pm" + } + }, + { + "name": "QuestIncomplete", + "module": "eventMacro::Condition::QuestIncomplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestIncomplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestIncomplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestIncomplete.pm" + } + }, + { + "name": "QuestNotComplete", + "module": "eventMacro::Condition::QuestNotComplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotComplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestNotComplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotComplete.pm" + } + }, + { + "name": "QuestNotIncomplete", + "module": "eventMacro::Condition::QuestNotIncomplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotIncomplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestNotIncomplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotIncomplete.pm" + } + }, + { + "name": "QuestOnTime", + "module": "eventMacro::Condition::QuestOnTime", + "file": "plugins/eventMacro/eventMacro/Condition/QuestOnTime.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestOnTime", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 85, + "new_vars_line": 107, + "file": "plugins/eventMacro/eventMacro/Condition/QuestOnTime.pm" + } + }, + { + "name": "QuestTimeOverdue", + "module": "eventMacro::Condition::QuestTimeOverdue", + "file": "plugins/eventMacro/eventMacro/Condition/QuestTimeOverdue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestTimeOverdue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 85, + "new_vars_line": 107, + "file": "plugins/eventMacro/eventMacro/Condition/QuestTimeOverdue.pm" + } + }, + { + "name": "ShopOpened", + "module": "eventMacro::Condition::ShopOpened", + "file": "plugins/eventMacro/eventMacro/Condition/ShopOpened.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ShopOpened", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "in_game", + "open_shop", + "packet_send/shop_open", + "packet_send/shop_close", + "shop_closed", + "packet_mapChange" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 28, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/ShopOpened.pm" + } + }, + { + "name": "SimpleHookEvent", + "module": "eventMacro::Condition::SimpleHookEvent", + "file": "plugins/eventMacro/eventMacro/Condition/SimpleHookEvent.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::SimpleHookEvent", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 24, + "parse_syntax_line": 10, + "validate_condition_line": 28, + "new_vars_line": 38, + "file": "plugins/eventMacro/eventMacro/Condition/SimpleHookEvent.pm" + } + }, + { + "name": "SkillLevel", + "module": "eventMacro::Condition::SkillLevel", + "file": "plugins/eventMacro/eventMacro/Condition/SkillLevel.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::SkillLevel", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/skill_update", + "packet/skills_list", + "packet/skill_add", + "packet/skill_delete" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(\\S+)\\s+(\\S.*)$", + "^(\\S+)\\s+(\\S.*)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastHandle", + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastLevel", + "\".$self->{name}.\"LastName" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 18, + "validate_condition_line": 37, + "new_vars_line": 47, + "file": "plugins/eventMacro/eventMacro/Condition/SkillLevel.pm" + } + }, + { + "name": "Spirits", + "module": "eventMacro::Condition::Spirits", + "file": "plugins/eventMacro/eventMacro/Condition/Spirits.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::Spirits", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/revolving_entity" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 25, + "file": "plugins/eventMacro/eventMacro/Condition/Spirits.pm" + } + }, + { + "name": "StatAdded", + "module": "eventMacro::Condition::StatAdded", + "file": "plugins/eventMacro/eventMacro/Condition/StatAdded.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::StatAdded", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "packet_charStats" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Quantity" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 39, + "parse_syntax_line": 26, + "validate_condition_line": 43, + "new_vars_line": 54, + "file": "plugins/eventMacro/eventMacro/Condition/StatAdded.pm" + } + }, + { + "name": "StatusActiveHandle", + "module": "eventMacro::Condition::StatusActiveHandle", + "file": "plugins/eventMacro/eventMacro/Condition/StatusActiveHandle.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::StatusActiveHandle", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Actor::setStatus::change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastHandle", + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastName" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 69, + "new_vars_line": 98, + "file": "plugins/eventMacro/eventMacro/Condition/StatusActiveHandle.pm" + } + }, + { + "name": "StatusInactiveHandle", + "module": "eventMacro::Condition::StatusInactiveHandle", + "file": "plugins/eventMacro/eventMacro/Condition/StatusInactiveHandle.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::StatusInactiveHandle", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "in_game", + "Actor::setStatus::change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastHandle", + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastName" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 69, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/StatusInactiveHandle.pm" + } + }, + { + "name": "StorageOpened", + "module": "eventMacro::Condition::StorageOpened", + "file": "plugins/eventMacro/eventMacro/Condition/StorageOpened.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::StorageOpened", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "in_game", + "packet_storage_open", + "packet_storage_close" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 28, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/StorageOpened.pm" + } + }, + { + "name": "SystemMsg", + "module": "eventMacro::Condition::SystemMsg", + "file": "plugins/eventMacro/eventMacro/Condition/SystemMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::SystemMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/SystemMsg.pm" + } + }, + { + "name": "VarValue", + "module": "eventMacro::Condition::VarValue", + "file": "plugins/eventMacro/eventMacro/Condition/VarValue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::VarValue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"LastMemberIndex", + "\".$self->{name}.\"LastValue", + "\".$self->{name}.\"LastVar" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 10, + "validate_condition_line": 48, + "new_vars_line": 72, + "file": "plugins/eventMacro/eventMacro/Condition/VarValue.pm" + } + }, + { + "name": "Zeny", + "module": "eventMacro::Condition::Zeny", + "file": "plugins/eventMacro/eventMacro/Condition/Zeny.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::Zeny", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "zeny_change", + "packet/stat_info", + "packet/stats_info", + "complete_deal" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/Zeny.pm" + } + }, + { + "name": "ZenyChanged", + "module": "eventMacro::Condition::ZenyChanged", + "file": "plugins/eventMacro/eventMacro/Condition/ZenyChanged.pm", + "base": "eventMacro::Conditiontypes::NumericConditionEvent", + "ancestry": [ + "eventMacro::Condition::ZenyChanged", + "eventMacro::Conditiontypes::NumericConditionEvent", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "zeny_change" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"Change", + "\".$self->{name}.\"Last\".\"ZenyAfter" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 11, + "new_vars_line": 23, + "file": "plugins/eventMacro/eventMacro/Condition/ZenyChanged.pm" + } + }, + { + "name": "isInMapAndCloseToCoordinate", + "module": "eventMacro::Condition::isInMapAndCloseToCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/isInMapAndCloseToCoordinate.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::isInMapAndCloseToCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/actor_movement_interrupted", + "packet/high_jump", + "packet/character_moves", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$", + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 14, + "validate_condition_line": 30, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/isInMapAndCloseToCoordinate.pm" + } + }, + { + "name": "isNotInMapOrNotCloseToCoordinate", + "module": "eventMacro::Condition::isNotInMapOrNotCloseToCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/isNotInMapOrNotCloseToCoordinate.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::isNotInMapOrNotCloseToCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/actor_movement_interrupted", + "packet/high_jump", + "packet/character_moves", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$", + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Map", + "\".$self->{name}.\"Last\".\"X", + "\".$self->{name}.\"Last\".\"Y" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 14, + "validate_condition_line": 30, + "new_vars_line": 46, + "file": "plugins/eventMacro/eventMacro/Condition/isNotInMapOrNotCloseToCoordinate.pm" + } + } +] diff --git a/docs/eventmacro_gpt_audit/tools/extract_condition_catalog.py b/docs/eventmacro_gpt_audit/tools/extract_condition_catalog.py new file mode 100644 index 0000000000..fab3a3433b --- /dev/null +++ b/docs/eventmacro_gpt_audit/tools/extract_condition_catalog.py @@ -0,0 +1,179 @@ +import glob +import json +import os +import re +from typing import Dict, List + +ROOT = 'plugins/eventMacro/eventMacro' +COND_FILES = sorted(glob.glob(f'{ROOT}/Condition/*.pm')) +META_FILES = sorted(glob.glob(f'{ROOT}/Condition/*.pm')) + sorted(glob.glob(f'{ROOT}/Condition/Base/*.pm')) + sorted(glob.glob(f'{ROOT}/Conditiontypes/*.pm')) + [f'{ROOT}/Condition.pm'] + + +def first_line(text: str, pattern: str) -> int: + m = re.search(pattern, text, re.S) + if not m: + return -1 + return text[:m.start()].count('\n') + 1 + + +def extract_hooks(text: str) -> List[str]: + hm = re.search(r'sub\s+_hooks\s*\{\s*\[(.*?)\]\s*;?\s*\}', text, re.S) + if not hm: + return [] + return re.findall(r"'([^']+)'", hm.group(1)) + + +meta: Dict[str, Dict] = {} +for path in META_FILES: + text = open(path, encoding='utf-8').read() + pkg_m = re.search(r'package\s+([\w:]+);', text) + if not pkg_m: + continue + pkg = pkg_m.group(1) + base_m = re.search(r"use base '([^']+)'", text) + base = base_m.group(1) if base_m else None + + explicit_event = bool(re.search(r'sub\s+condition_type\s*\{\s*EVENT_TYPE\s*;?\s*\}', text, re.S)) + explicit_unique = bool(re.search(r'sub\s+is_unique_condition\s*\{\s*1\s*;?\s*\}', text, re.S)) + + meta[pkg] = { + 'file': path, + 'base': base, + 'hooks': extract_hooks(text), + 'explicit_event': explicit_event, + 'explicit_unique': explicit_unique, + 'text': text, + } + + +def ancestry(pkg: str) -> List[str]: + out = [] + seen = set() + while pkg and pkg not in seen: + seen.add(pkg) + out.append(pkg) + pkg = meta.get(pkg, {}).get('base') + return out + + +def resolve_event(pkg: str) -> str: + for p in ancestry(pkg): + if meta.get(p, {}).get('explicit_event'): + return 'EVENT' + return 'STATE' + + +def resolve_unique(pkg: str) -> bool: + for p in ancestry(pkg): + if meta.get(p, {}).get('explicit_unique'): + return True + return False + + +def parser_mode(pkg: str) -> str: + chain = ancestry(pkg) + chain_text = '\\n'.join(meta[p]['text'] for p in chain if p in meta) + if any('Conditiontypes::NumericCondition' in p for p in chain): + return 'numeric_comparison' + if any('Conditiontypes::RegexCondition' in p for p in chain): + return 'regex_literal' + if any('Conditiontypes::ListCondition' in p for p in chain): + return 'csv_list' + if any('Conditiontypes::SimpleEvent' in p for p in chain): + return 'simple_event' + has_numeric_validator = 'Validator::NumericComparison' in chain_text + has_regex_validator = 'Validator::RegexCheck' in chain_text + has_list_validator = 'Validator::ListMemberCheck' in chain_text + if has_regex_validator and has_numeric_validator: + return 'composite_regex_numeric' + if has_regex_validator and has_list_validator: + return 'composite_regex_list' + if has_numeric_validator and has_list_validator: + return 'composite_numeric_list' + if has_regex_validator: + return 'regex_literal' + if has_numeric_validator: + return 'numeric_comparison' + if has_list_validator: + return 'csv_list' + return 'custom' + + +def collect_new_vars(text: str) -> List[str]: + return sorted(set(re.findall(r'\{"\.(.*?)"\}', text))) + + +catalog = [] +for path in COND_FILES: + text = open(path, encoding='utf-8').read() + pkg = re.search(r'package\s+([\w:]+);', text).group(1) + name = pkg.split('::')[-1] + mode = parser_mode(pkg) + + syntax_fragments = [] + for pat in [ + r'\$condition_code\s*=~\s*/(.*?)/', + r'if\s*\(\s*\$condition_code\s*=~\s*/(.*?)/', + r'my\s+\@members\s*=\s*split\((.*?)\$condition_code\)', + ]: + for m in re.finditer(pat, text): + syntax_fragments.append(m.group(1).strip()) + + chain = ancestry(pkg) + uses_find_variable = any('find_variable(' in meta[p]['text'] for p in chain if p in meta) + + accepts_regex = mode in ('regex_literal', 'composite_regex_numeric', 'composite_regex_list') + accepts_range = mode in ('numeric_comparison', 'composite_regex_numeric', 'composite_numeric_list') + accepts_csv = mode in ('csv_list', 'composite_regex_list', 'composite_numeric_list') + accepts_variable = uses_find_variable + + operators = [] + if accepts_range: + operators.extend(['=', '==', '!=', '!', '<', '<=', '>', '>=', 'range(..)']) + if accepts_regex: + operators.append('regex(/.../i?)') + if accepts_csv: + operators.append('csv membership') + + new_vars = collect_new_vars(text) + + entry = { + 'name': name, + 'module': pkg, + 'file': path, + 'base': meta[pkg]['base'], + 'ancestry': chain, + 'condition_type': resolve_event(pkg), + 'is_unique_condition': resolve_unique(pkg), + 'hooks': meta[pkg]['hooks'], + 'parser_mode': mode, + 'argument_contract': { + 'accepts_regex': accepts_regex, + 'accepts_range': accepts_range, + 'accepts_csv_list': accepts_csv, + 'accepts_variable': accepts_variable, + 'operators': operators, + 'regex_flags_supported': ['i'] if accepts_regex else [], + 'implicit_comparison_default': '==' if accepts_range else None, + }, + 'syntax_regex_fragments': syntax_fragments[:8], + 'sets_special_variables': new_vars, + 'confidence': { + 'condition_type': 'PROVADO', + 'hooks': 'PROVADO', + 'parser_mode': 'INFERIDO' if mode == 'custom' else 'PROVADO', + 'argument_contract': 'INFERIDO' if mode == 'custom' else 'PROVADO', + }, + 'evidence': { + 'package_line': first_line(text, r'package\s+[\w:]+;'), + 'hooks_line': first_line(text, r'sub\s+_hooks\s*\{'), + 'parse_syntax_line': first_line(text, r'sub\s+_parse_syntax\s*\{'), + 'validate_condition_line': first_line(text, r'sub\s+validate_condition\s*\{'), + 'new_vars_line': first_line(text, r'sub\s+get_new_variable_list\s*\{'), + 'file': path, + }, + } + + catalog.append(entry) + +print(json.dumps(catalog, indent=2, ensure_ascii=False)) diff --git a/docs/eventmacro_gpt_final/knowledge_ready/00_scope_rules_and_usage.md b/docs/eventmacro_gpt_final/knowledge_ready/00_scope_rules_and_usage.md new file mode 100644 index 0000000000..75f01cfc0a --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/00_scope_rules_and_usage.md @@ -0,0 +1,22 @@ +# 00 Audit Scope and Method + +## Escopo +- **PROVADO**: A auditoria usa exclusivamente código-fonte local do repositório (`plugins/eventMacro/...`). +- **PROVADO**: Sem wiki/documentação externa como fonte de verdade. +- **PROVADO**: Foco em parser, gramática, validação, runtime, variáveis, comandos e todas as conditions. + +## Método (9 passagens) +1. Inventário de arquivos (parser/core/runner/conditions/validators/comandos). +2. Extração canônica de gramática, parâmetros, operadores, funções e variáveis. +3. Normalização por condition (catálogo JSON + tabela consolidada). +4. Auditoria profunda de parser (`FileParser.pm`, `Runner.pm`). +5. Auditoria de comparação/range/regex (`Utilities.pm`, `Validator/*`). +6. Auditoria de variáveis/tipagem/callbacks (`Data.pm`, `Utilities.pm`, `Core.pm`). +7. Auditoria de runtime/fila/prioridade/pause/orphan (`Core.pm`, `Automacro.pm`, `Runner.pm`). +8. Catálogo de negativos e não-suportado. +9. Produção em dois níveis: `audit_full/` e `knowledge_ready/`. + +## Regras de classificação de conclusões +- **PROVADO**: comportamento explícito no código. +- **INFERIDO**: dedução estrutural (ex.: por herança/base class). +- **NÃO COMPROVADO**: não há evidência suficiente no código auditado. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/01_architecture_and_runtime.md b/docs/eventmacro_gpt_final/knowledge_ready/01_architecture_and_runtime.md new file mode 100644 index 0000000000..475f16fe70 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/01_architecture_and_runtime.md @@ -0,0 +1,26 @@ +# 04 Commands and Runtime + +## Comandos console +`eventMacro|emacro`: +- `auto`, `list`, `status`, `check`, `stop`, `pause`, `unpause`, `var_get`, `var_set`, `enable`, `disable`, `include`, ou nome de macro. **PROVADO**. + +## Comandos da linguagem macro +- Atribuição (`$x = ...`, `$x++`, `$x--`, `@a=(...)`, `%h=(k=>v,...)`). **PROVADO**. +- `do ...`, `log|warning|error ...`, `pause [n]`, `stop`, `release`, `lock`, `call`, `set`, `include`. **PROVADO**. +- Suporte a `push/unshift/pop/shift`, `delete/exists`, `defined` via macro keywords. **PROVADO**. + +## Fila/prioridade/disparo +- Automacros state fulfilled entram em fila ordenada por `priority` (menor valor = maior prioridade efetiva na frente). **PROVADO**. +- Event conditions não entram na fila contínua; disparam no callback e escolhem melhor prioridade entre candidatos no evento. **PROVADO**. +- `timeout` controla re-disparo de automacro; `delay` atraso inicial do macro chamado; `macro_delay` atraso entre comandos. **PROVADO**. +- `run-once` desabilita automacro após chamada. **PROVADO**. + +## interruptibilidade/AI/orphan +- `exclusive=1` => macro não interruptível (`interruptible=0`) e pausa checking de automacros (salvo force user). **PROVADO**. +- `self_interruptible` bloqueia interrupção por seu próprio automacro chamador quando 0. **PROVADO**. +- `overrideAI=1` retira `eventMacro` da AI queue. **PROVADO**. +- `orphan`: `terminate|terminate_last_call|reregister|reregister_safe`. **PROVADO**. + +## clear_queue/handoff +- `clear_queue` encerra runner, remove hook de iteração e restaura checking quando necessário. **PROVADO**. +- Ao limpar fila sem `skip`, `handoff_to_pending_automacros` pode chamar automacro pendente imediatamente. **PROVADO**. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/02_grammar_and_parsing.md b/docs/eventmacro_gpt_final/knowledge_ready/02_grammar_and_parsing.md new file mode 100644 index 0000000000..fef6986f7f --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/02_grammar_and_parsing.md @@ -0,0 +1,27 @@ +# 03 Grammar and Parsing + +## Arquivo eventMacros +- `macro { ... }` abre macro. **PROVADO**. +- `automacro { ... }` abre automacro. **PROVADO**. +- `sub { ... }` abre sub perl. **PROVADO**. +- Comentário de fim de linha (`#...`) removido no parser de arquivo. **PROVADO**. +- Espaços são normalizados (`trim` e colapso de múltiplos espaços). **PROVADO**. + +## include/call/sub +- `!include ` **NÃO foi comprovado** em `FileParser.pm` como diretiva de parse recursivo nesta revisão. +- Em automacro: `call nomeMacro [args...]` grava em parâmetro `call`. **PROVADO**. +- Em automacro: `call { ... }` gera macro interna `automacro__call_block`. **PROVADO**. +- `sub` vira código perl compilado em runtime via `eval`, e registrado em `main::`. **PROVADO**. + +## Parser de fluxo de macro (Runner) +- Blocos reconhecidos: `if/elsif/else`, `switch/case/else`, `while`, labels `:x`, `goto`. **PROVADO**. +- `[` e `]` ativam/desativam `macro_block` (execução sem esperar timeout entre linhas do bloco). **PROVADO**. +- `if` pós-fixado (`cmd if (...)`) suportado. **PROVADO**. +- `switch` aceita apenas `case` e `else` dentro do bloco. **PROVADO**. + +## Erros de parsing/validação que invalidam automacro +- Nome com espaço, sem conditions, sem parameters, sem `call`, parâmetro inválido, módulo de condition inexistente, sintaxe inválida de condition. **PROVADO**. +- Duplicidade de parâmetro, duplicidade de condition única, múltiplas event-type conditions. **PROVADO**. + +## Ambiguidades +- Há regex permissivas em `isNewCommandBlock/isNewWrongCommandBlock` (ex.: `else*`), podendo aceitar padrões inesperados. **INFERIDO**. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/03_variables_and_special_variables.md b/docs/eventmacro_gpt_final/knowledge_ready/03_variables_and_special_variables.md new file mode 100644 index 0000000000..826f81a098 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/03_variables_and_special_variables.md @@ -0,0 +1,34 @@ +# 05 Variables and Special Variables + +## Sintaxe de variáveis +- Escalar: `$name` +- Array: `@name` +- Hash: `%name` +- Acesso array: `$name[index]` (index numérico ou variável resolvível) +- Acesso hash: `$name{key}` (key alfanumérico/underscore ou variável resolvível) + +Status: **PROVADO**. + +## Regex-base de nomes +- Nomes válidos: `\.?[a-zA-Z][a-zA-Z\d_]*`. **PROVADO**. +- Complementos em parse amplo: índices/chaves dinâmicos aceitos em regex mais ampla. **PROVADO**. + +## Variáveis especiais `.xxx` +Exemplos implementados em `Core::get_scalar_var`: +- tempo: `.time .datetime .hour ...` +- mapa: `.map .incity .inlockmap` +- personagem: `.job .pos .name .hp .sp .lvl .joblvl .spirits .zeny .weight ...` +- status: `.status .statushandle` +- inventário/carrinho/storage: `.inventoryitems .cart* .shopopen .storage*` + +Status: **PROVADO**. + +## Restrições +- Definição manual de variáveis de sistema (prefixo `.`) é bloqueada em `var_set` e em atribuição de macro runner. **PROVADO**. +- Validadores de conditions geralmente rejeitam variáveis de sistema como argumento de automacro. **PROVADO**. + +## Callbacks de mudança +- `Core` dispara callbacks por tipo (`scalar`, `array`, `hash`, `accessed_array`, `accessed_hash`) e gerencia complementos dinâmicos para acessos aninhados via variáveis. **PROVADO**. + +## Arrays e hashes completos +- `set_full_array`, `set_full_hash`, `clear_array`, `clear_hash`, `push/pop/shift/unshift`, `delete_key`, `exists_hash`, `keys`, `values`. **PROVADO**. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/04_operators_regex_ranges_and_comparisons.md b/docs/eventmacro_gpt_final/knowledge_ready/04_operators_regex_ranges_and_comparisons.md new file mode 100644 index 0000000000..c98b5d6913 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/04_operators_regex_ranges_and_comparisons.md @@ -0,0 +1,27 @@ +# 04 Operators, Regex, Ranges and Comparisons + +## Objetivo +Resumo operacional dos operadores e formatos de comparação usados em conditions do `eventMacro`. + +## Comparações numéricas +- Operadores suportados em parsers numéricos: `>`, `<`, `>=`, `<=`, `==`, `!=`. **PROVADO**. +- Formato base: ` `. **PROVADO**. +- Em condições compostas, comparação numérica pode coexistir com parte regex/evento conforme o módulo de condição. **PROVADO**. + +## Regex +- Literais regex com delimitadores `/.../` são suportados por várias condições (`RegexCheck` e variações por parser). **PROVADO**. +- Case-sensitivity e grupos dependem do regex Perl padrão no ponto de uso. **INFERIDO**. +- Não assumir suporte universal a flags customizadas em todas as conditions; validar no módulo da condition. **PROVADO** (princípio de segurança da curadoria). + +## Ranges/listas +- Há condições com parser de lista CSV (`csv_list`) para argumentos múltiplos. **PROVADO**. +- Há condições com parser composto (`composite_regex_numeric`) que aceitam combinação de componentes regex + numérico no mesmo statement. **PROVADO**. + +## Operadores lógicos e fluxo +- O gating de automacro usa semântica AND entre parâmetros/conditions necessárias para disparo da `call`. **PROVADO**. +- Estruturas de fluxo de macro (`if/elsif/else`, `while`, `switch/case/else`) são do runtime de macro, não operadores de condition em si. **PROVADO**. + +## Restrições para evitar alucinação +- Não generalizar sintaxe entre plugins (`macro` antigo vs `eventMacro`). **PROVADO**. +- Não inventar operadores não documentados na condition específica. **PROVADO**. +- Em caso de dúvida de parser por condition, classificar como **NÃO COMPROVADO** até confirmar no módulo fonte. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/05_console_commands.md b/docs/eventmacro_gpt_final/knowledge_ready/05_console_commands.md new file mode 100644 index 0000000000..afa731b0cf --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/05_console_commands.md @@ -0,0 +1,24 @@ +# 05 Console Commands + +Comando raiz: `eventMacro` (alias `emacro`). + +## Subcomandos +- `auto ` +- `list` +- `status [macro|automacro]` +- `check [force_stop|force_start|resume]` +- `stop` +- `pause` +- `unpause` +- `var_get [var]` +- `var_set ` +- `enable [all|automacro...]` +- `disable [all|automacro...]` +- `include [on|off|list] ...` +- ` [--repeat|-r N] [--overrideAI] [--exclusive] [--macro_delay F] [--orphan S] [args...]` + +Status: **PROVADO**. + +## Notas +- Se macro já está rodando, chamada direta avisa e não inicia outra. **PROVADO**. +- `var_set` não permite variável de sistema (`.`). **PROVADO**. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md b/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md new file mode 100644 index 0000000000..e8ac5c2845 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md @@ -0,0 +1,31 @@ +# 06 Macro Keywords and Functions + +## Macro keywords (`&keyword(...)`) +Base em `Data.pm` + execução em `Runner::parse_command`. + +Principais suportados (PROVADO): +- lookup/ids: `npc player monster vender inventory Inventory InventoryType cart Cart storage Storage` +- quantidades/preços: `invamount cartamount shopamount storamount venderamount venderprice` +- utilitários: `arg random rand split strip config` +- hash/array: `keys values push pop shift unshift exists delete defined` +- quest: `questStatus questInactiveCount questIncompleteCount questCompleteCount` +- equipamento: `itemCard itemCardAmount itemOption itemOptAmount` +- `eval` (bloqueado por lockdown global) + +## Subrotinas perl +- Subs registradas por bloco `sub` podem ser chamadas como `nomeSub(...)` no parser de comando. **PROVADO**. +- Se sub inexistente: erro. +- Pode retornar scalar/ref array/ref hash, com tratamento específico no parser. **PROVADO**. + +## Funções internas de comparação +- `cmpr` suporta operadores: `= == != > < >= <= ~ =~`. **PROVADO**. +- Regex literal somente formato `/.../` com opcional `i`. **PROVADO**. +- Range com `..` suportado para igualdade/inequidade. **PROVADO**. + + +## Contratos lexicais estruturados +- Fonte estruturada complementar: `19_macro_and_parameter_contracts.json` (`macro_functions`). +- Regra de geração: só usar forma pronta quando `lexical_contract_status == COMPLETE`. +- Se `PARTIAL`, explicar e pedir confirmação antes de gerar chamada final. + +- Cobertura atual do catálogo estruturado: funções críticas + funções frequentes com status COMPLETE/PARTIAL para controle de geração. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/07_automacro_parameters.md b/docs/eventmacro_gpt_final/knowledge_ready/07_automacro_parameters.md new file mode 100644 index 0000000000..a1d0a3e6de --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/07_automacro_parameters.md @@ -0,0 +1,31 @@ +# 07 Automacro Parameters + +Status de validação: **PROVADO** (Core::create_automacro_list + Automacro::set_parameters). + +| Parâmetro | Regra de validação | Default | +|---|---|---| +| timeout | número (uso runtime) | 0 | +| delay | número (`^[\d\.]*\d+$`) | 0 | +| run-once | `0|1` | 0 | +| disabled | `0|1` | 0 | +| call | macro existente; pode conter args | obrigatório | +| overrideAI | `0|1` | 0 | +| orphan | `terminate|terminate_last_call|reregister|reregister_safe` | `config{eventMacro_orphans}` | +| macro_delay | número decimal permitido | `timeout{eventMacro_delay}` | +| priority | inteiro não-negativo | 0 | +| exclusive | `0|1` | 0 | +| self_interruptible | `0|1` | 0 | +| repeat | inteiro não-negativo | 1 | +| CheckOnAI | CSV de `auto|off|manual` | `config{eventMacro_CheckOnAI}` | + +## Regras adicionais +- Parâmetro duplicado invalida automacro. **PROVADO**. +- Ausência de `call` invalida automacro. **PROVADO**. +- `call` com args separa nome e grava `.param` quando executar. **PROVADO**. + + +## Contratos lexicais estruturados +- Fonte estruturada complementar: `19_macro_and_parameter_contracts.json` (`automacro_parameters`). +- Para cada parâmetro, validar separador, tipo e enum antes de gerar automacro final. +- Em parâmetro com contrato `PARTIAL`, não gerar por plausibilidade. +- Cobertura atual do catálogo estruturado: parâmetros principais de automacro com regras de separador/tipo/enum. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/08_conditions_state_part_1.md b/docs/eventmacro_gpt_final/knowledge_ready/08_conditions_state_part_1.md new file mode 100644 index 0000000000..7c6e0fa5d1 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/08_conditions_state_part_1.md @@ -0,0 +1,49 @@ +# 07 Conditions State Part 1 + +Classificação: nome/tipo/hook **PROVADO**; `argument_contract` em `custom` pode ser **INFERIDO**. + +| Condition | Parser mode | Hooks | regex | range | csv | var | +|---|---|---|---|---|---|---| +| BaseLevel | numeric_comparison | base_level_changed, Network::Receive::map_changed, in_game, packet/stat_info | false | true | false | false | +| CartCurrentSize | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false | +| CartCurrentWeight | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false | +| CartMaxSize | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false | +| CartMaxWeight | numeric_comparison | cart_ready, cart_info_updated, packet_mapChange, packet/cart_off | false | true | false | false | +| CharCurrentWeight | numeric_comparison | inventory_clear, inventory_ready, packet/stat_info | false | true | false | false | +| CharMaxWeight | numeric_comparison | inventory_clear, inventory_ready, packet/stat_info | false | true | false | false | +| ChatRoomNear | regex_literal | packet_mapChange, chat_created, packet_chatinfo, chat_removed, chat_modified | true | false | false | false | +| ConfigKey | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| ConfigKeyDefined | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| ConfigKeyDualDifferentDefinedValue | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | false | +| ConfigKeyDualSameDefinedValue | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | false | +| ConfigKeyNot | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| ConfigKeyNotExist | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| ConfigKeyUndefined | composite_regex_numeric | post_configModify, pos_load_config.txt, in_game | true | true | false | true | +| CurrentHP | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false | +| CurrentSP | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false | +| Eval | composite_regex_numeric | AI_pre | true | true | false | false | +| EvalHook | composite_regex_numeric | - | true | true | false | true | +| FreeSkillPoints | numeric_comparison | packet/stat_info, packet_charSkills, packet_homunSkills | false | true | false | false | +| FreeStatPoints | numeric_comparison | packet/stat_info, packet/stats_info | false | true | false | false | +| InCart | numeric_comparison | - | false | true | false | false | +| InCartID | numeric_comparison | - | false | true | false | false | +| InChatRoom | composite_regex_numeric | packet_mapChange, chat_created, chat_leave, chat_joined | true | true | false | false | +| InCity | composite_regex_numeric | Network::Receive::map_changed, in_game, packet_mapChange | true | true | false | false | +| InInventory | numeric_comparison | - | false | true | false | false | +| InInventoryID | numeric_comparison | - | false | true | false | false | +| InLockMap | composite_regex_numeric | packet_mapChange, configModify, pos_load_config.txt, in_game | true | true | false | false | +| InMap | csv_list | Network::Receive::map_changed, in_game, packet_mapChange | false | false | true | false | +| InMapRegex | regex_literal | Network::Receive::map_changed, in_game, packet_mapChange | true | false | false | false | +| InProgressBar | composite_regex_numeric | packet/progress_bar, packet/progress_bar_stop, packet_mapChange, packet/map_property3 | true | true | false | false | +| InPvP | csv_list | packet_mapChange, pvp_mode | false | false | true | false | +| InSaveMap | composite_regex_numeric | Network::Receive::map_changed, in_game, packet_mapChange, configModify, pos_load_config.txt | true | true | false | false | +| InStorage | numeric_comparison | - | false | true | false | false | +| InStorageID | numeric_comparison | - | false | true | false | false | +| InventoryCurrentSize | numeric_comparison | inventory_clear, inventory_ready, item_gathered, inventory_item_removed | false | true | false | false | +| InventoryReady | composite_regex_numeric | inventory_clear, inventory_ready | true | true | false | false | +| IsEquippedID | composite_regex_numeric | inventory_clear, equipped_item, unequipped_item, inventory_ready | true | true | false | true | +| IsInCoordinate | composite_regex_numeric | - | true | true | false | true | +| IsInMapAndCoordinate | composite_regex_numeric | packet/actor_movement_interrupted, packet/high_jump, packet/character_moves, packet_mapChange, packet/map_property3 | true | true | false | true | +| IsNotEquippedID | composite_regex_numeric | inventory_clear, equipped_item, unequipped_item, inventory_ready | true | true | false | true | +| IsNotInCoordinate | composite_regex_numeric | - | true | true | false | true | +| IsNotInMapAndCoordinate | composite_regex_numeric | - | true | true | false | true | diff --git a/docs/eventmacro_gpt_final/knowledge_ready/09_conditions_state_part_2.md b/docs/eventmacro_gpt_final/knowledge_ready/09_conditions_state_part_2.md new file mode 100644 index 0000000000..639555263c --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/09_conditions_state_part_2.md @@ -0,0 +1,49 @@ +# 08 Conditions State Part 2 + +Classificação: nome/tipo/hook **PROVADO**; `argument_contract` em `custom` pode ser **INFERIDO**. + +| Condition | Parser mode | Hooks | regex | range | csv | var | +|---|---|---|---|---|---|---| +| JobID | composite_regex_numeric | Network::Receive::map_changed, in_game, sprite_job_change | true | true | false | true | +| JobIDNot | composite_regex_numeric | Network::Receive::map_changed, in_game, sprite_job_change | true | true | false | true | +| JobLevel | numeric_comparison | job_level_changed, Network::Receive::map_changed, in_game, packet/stat_info | false | true | false | false | +| MaxHP | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false | +| MaxSP | numeric_comparison | Network::Receive::map_changed, in_game, packet/stat_info, packet/hp_sp_changed | false | true | false | false | +| MobNear | regex_literal | - | true | false | false | false | +| MobNearCount | numeric_comparison | - | false | true | false | false | +| MobNearDist | composite_regex_numeric | - | true | true | false | false | +| MobNotNear | regex_literal | - | true | false | false | false | +| NoMobNear | composite_regex_numeric | - | true | true | false | false | +| NoNpcNear | composite_regex_numeric | - | true | true | false | false | +| NoPlayerNear | composite_regex_numeric | - | true | true | false | false | +| NoPortalNear | composite_regex_numeric | - | true | true | false | false | +| NotInMap | csv_list | - | false | false | true | false | +| NpcNear | regex_literal | - | true | false | false | false | +| NpcNearCount | numeric_comparison | - | false | true | false | false | +| NpcNearDist | composite_regex_numeric | - | true | true | false | false | +| NpcNotNear | regex_literal | - | true | false | false | false | +| PlayerNear | regex_literal | - | true | false | false | false | +| PlayerNearCount | numeric_comparison | - | false | true | false | false | +| PlayerNearDist | composite_regex_numeric | - | true | true | false | false | +| PlayerNotNear | regex_literal | - | true | false | false | false | +| PortalNearCount | numeric_comparison | - | false | true | false | false | +| QuestActive | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestComplete | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestHuntCompleted | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestHuntOngoing | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestInactive | composite_regex_numeric | achievement_list, quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestIncomplete | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestNotComplete | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestNotIncomplete | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestOnTime | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| QuestTimeOverdue | composite_regex_numeric | quest_all_list_end, quest_all_mission_end, quest_added, quest_update_mission_hunt_end, quest_delete, quest_active | true | true | false | true | +| ShopOpened | composite_regex_numeric | in_game, open_shop, packet_send/shop_open, packet_send/shop_close, shop_closed, packet_mapChange | true | true | false | false | +| SkillLevel | numeric_comparison | packet/skill_update, packet/skills_list, packet/skill_add, packet/skill_delete | false | true | false | false | +| Spirits | numeric_comparison | packet/revolving_entity | false | true | false | false | +| StatusActiveHandle | composite_regex_numeric | Actor::setStatus::change | true | true | false | true | +| StatusInactiveHandle | composite_regex_numeric | in_game, Actor::setStatus::change | true | true | false | true | +| StorageOpened | composite_regex_numeric | in_game, packet_storage_open, packet_storage_close | true | true | false | false | +| VarValue | composite_regex_numeric | - | true | true | false | true | +| Zeny | numeric_comparison | zeny_change, packet/stat_info, packet/stats_info, complete_deal | false | true | false | false | +| isInMapAndCloseToCoordinate | composite_regex_numeric | packet/actor_movement_interrupted, packet/high_jump, packet/character_moves, packet_mapChange, packet/map_property3 | true | true | false | false | +| isNotInMapOrNotCloseToCoordinate | composite_regex_numeric | packet/actor_movement_interrupted, packet/high_jump, packet/character_moves, packet_mapChange, packet/map_property3 | true | true | false | false | diff --git a/docs/eventmacro_gpt_final/knowledge_ready/10_conditions_event.md b/docs/eventmacro_gpt_final/knowledge_ready/10_conditions_event.md new file mode 100644 index 0000000000..dc78dd9afa --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/10_conditions_event.md @@ -0,0 +1,36 @@ +# 09 Conditions Event + +| Condition | Parser mode | Hooks | regex | range | csv | var | +|---|---|---|---|---|---|---| +| AttackEnd | csv_list | attack_end | false | false | true | false | +| AttackStart | csv_list | attack_start | false | false | true | false | +| AttackStartRegex | regex_literal | attack_start | true | false | false | false | +| BusMsg | regex_literal | - | true | false | false | false | +| Console | regex_literal | log | true | false | false | false | +| GuildMsg | regex_literal | - | true | false | false | false | +| GuildMsgDist | composite_regex_numeric | - | true | true | false | false | +| GuildMsgName | composite_regex_numeric | - | true | true | false | false | +| GuildMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| LocalMsg | regex_literal | - | true | false | false | false | +| MapLoaded | csv_list | packet_mapChange | false | false | true | false | +| NpcMsg | regex_literal | - | true | false | false | false | +| NpcMsgDist | composite_regex_numeric | - | true | true | false | false | +| NpcMsgName | composite_regex_numeric | - | true | true | false | false | +| NpcMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| OnCharLogIn | simple_event | in_game | false | false | false | false | +| PartyMsg | regex_literal | - | true | false | false | false | +| PartyMsgDist | composite_regex_numeric | - | true | true | false | false | +| PartyMsgName | composite_regex_numeric | - | true | true | false | false | +| PartyMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| PrivMsg | regex_literal | - | true | false | false | false | +| PrivMsgDist | composite_regex_numeric | - | true | true | false | false | +| PrivMsgName | composite_regex_numeric | - | true | true | false | false | +| PrivMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| PubMsg | regex_literal | - | true | false | false | false | +| PubMsgDist | composite_regex_numeric | - | true | true | false | false | +| PubMsgName | composite_regex_numeric | - | true | true | false | false | +| PubMsgNameDist | composite_regex_numeric | - | true | true | false | false | +| SimpleHookEvent | composite_regex_numeric | - | true | true | false | true | +| StatAdded | csv_list | packet_charStats | false | false | true | false | +| SystemMsg | regex_literal | - | true | false | false | false | +| ZenyChanged | numeric_comparison | zeny_change | false | true | false | false | diff --git a/docs/eventmacro_gpt_final/knowledge_ready/11_condition_reference_tables.md b/docs/eventmacro_gpt_final/knowledge_ready/11_condition_reference_tables.md new file mode 100644 index 0000000000..de5588cd3a --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/11_condition_reference_tables.md @@ -0,0 +1,47 @@ +# 10 Condition Reference Tables + +- Total conditions: 118 (PROVADO) +- State: 86 (PROVADO) +- Event: 32 (PROVADO) + +## Parser mode +- composite_regex_numeric: 63 +- csv_list: 7 +- numeric_comparison: 29 +- regex_literal: 18 +- simple_event: 1 + +## Nota de precisão +- `parser_mode` e `argument_contract` são PROVADO nas famílias resolvidas por herança e por uso explícito de validators; em `custom`, parte da tipagem continua INFERIDO e deve ser checada no módulo da condition. + + +## Camada de segurança de geração (obrigatória) +- O catálogo JSON (`18_condition_catalog.json`) agora inclui, para cada condition: + - `generation_safety`: `GENERATION_SAFE` | `EXPLAIN_ONLY` | `UNSAFE` + - `generation_safety_reason` + - `generation_policy.can_generate_ready_syntax` +- Regra operacional: + - `GENERATION_SAFE`: pode gerar sintaxe pronta + - `EXPLAIN_ONLY`: explicar e pedir confirmação/contexto; não gerar sintaxe final automaticamente + - `UNSAFE`: não gerar sintaxe; limitar resposta ao comprovado + +## Resumo atual de status (catálogo final) +- `GENERATION_SAFE`: 57 +- `EXPLAIN_ONLY`: 61 +- `UNSAFE`: 0 + +Condições `EXPLAIN_ONLY` atuais: +- Lista completa em `docs/eventmacro_lexical_contract_patch/06_conditions_requiring_delimiter_attention.md`. +- Use essa lista para evitar geração pronta com separador/aridade não totalmente fechados. + + +## Uso em criação de macro completa +- Esta tabela/catálogo não serve só para explicar conditions: serve para decidir se uma condition pode entrar na solução final gerada. +- Regra: versão final entregue ao usuário deve conter somente conditions `GENERATION_SAFE`. +- Se qualquer condition da arquitetura for `EXPLAIN_ONLY` ou `UNSAFE`, mudar para modo de proposta controlada (sem template final "pronto"). + + +## Contrato lexical mínimo para gerar +- Só gerar sintaxe final quando `lexical_contract_status == COMPLETE` e `generation_safety == GENERATION_SAFE`. +- `PARTIAL`/`INSUFFICIENT`: explicar apenas o comprovado; não escolher separador por plausibilidade. +- Sempre validar: separador aceito/proibido, aridade e ordem posicional antes de emitir macro final. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/12_invalid_syntax_and_negative_catalog.md b/docs/eventmacro_gpt_final/knowledge_ready/12_invalid_syntax_and_negative_catalog.md new file mode 100644 index 0000000000..1b2409f719 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/12_invalid_syntax_and_negative_catalog.md @@ -0,0 +1,25 @@ +# 10 Invalid Syntax and Negative Catalog + +- Automacro sem conditions/parameters/call: rejeitado. **PROVADO**. +- Duplicidade de automacro/macro: rejeitado. **PROVADO**. +- Mais de 1 event condition no mesmo automacro: rejeitado. **PROVADO**. +- Condition única duplicada: rejeitado. **PROVADO**. +- Nome com espaço (macro/automacro): rejeitado. **PROVADO**. +- `set` com parâmetro desconhecido: erro em runtime macro. **PROVADO**. +- `do eventMacro ...` e `do ai clear`: proibidos. **PROVADO**. +- `defined()` em array/hash sem acesso (`@a`/`%h`) é inválido (aceita escalar, `$a[i]`, `$h{k}`). **PROVADO**. +- Índice de array não numérico e chave de hash inválida após parse dinâmico: erro. **PROVADO**. +- Uso de variáveis sistema (`.x`) em diversas conditions/validators: bloqueado. **PROVADO**. +- Regex malformada em validação (`RegexCheck`) ou statement (`parse_and_check_condition_text`): erro. **PROVADO**. +- Misturar `&&` e `||` sem estrutura válida de grupos: erro. **PROVADO**. + +## Itens potencialmente alucináveis +- `~` não é regex; em `cmpr` é membership CSV case-insensitive. **PROVADO**. +- Range é `a..b` dentro de comparação; não é operador genérico separado. **PROVADO**. +- Event conditions não substituem state queueing; semântica é diferente. **PROVADO**. + +## Mitigações práticas para GPT especialista +- Sempre mapear operador para backend real: `Utilities::cmpr` + `Validator::*` antes de sugerir sintaxe. **PROVADO**. +- Bloquear resposta que proponha >1 event condition por automacro. **PROVADO**. +- Separar resposta em “state condition” vs “event condition” com semântica de fila/disparo distinta. **PROVADO**. +- Se comparar com macro plugin antigo sem evidência local, marcar **NÃO COMPROVADO**. **PROVADO**. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/13_examples_valid.md b/docs/eventmacro_gpt_final/knowledge_ready/13_examples_valid.md new file mode 100644 index 0000000000..c0984badc0 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/13_examples_valid.md @@ -0,0 +1,57 @@ +# 11 Examples Valid + +## Automacro state + call +```txt +automacro hp_pot { + CurrentHP < 40% + call use_pot + priority 0 + CheckOnAI auto +} +``` +Status: **PROVADO** (lexical COMPLETE: forma positional com whitespace e operador numérico). + +## Automacro event + regex +```txt +automacro got_priv { + PrivMsg /^hi$/i + call answer_hi +} +``` +Status: **REBAIXADO para EXPLAIN_ONLY** (condition `PrivMsg` depende de contrato de parser composto herdado; evitar gerar pronto sem confirmação do contexto). + +## Call com parâmetros +```txt +automacro call_args { + OnCharLogIn any + call buff_me 123 "abc" +} +``` +Status: **PROVADO** (`call` guarda args; execução define `.param`). + +## Macro com fluxo +```txt +macro test_flow { + if ($x == 1) log ok + while ($x < 3) { + $x++ + } +} +``` +Status: **PROVADO** (`if` pós-fixado e `while` em runner). + + +## Regra de uso destes exemplos para geração +- Exemplo com condition marcada `EXPLAIN_ONLY` não deve ser emitido como template final automático. +- Use apenas como explicação e peça confirmação de formato/escopo antes de gerar macro pronta. +- Exemplo com condition `GENERATION_SAFE` pode ser usado como base de geração controlada. + + +## Nota de arquitetura +- Estes exemplos são blocos-base; uma solução completa exige passagem pelo protocolo de síntese e pelo checklist whole-macro antes da entrega final. + + +## Checagem lexical aplicada aos exemplos +- `CurrentHP < 40%`: separador por whitespace posicional + operador explícito (`<`). +- `PrivMsg /^hi$/i`: regex delimitada; exemplo permanece apenas para EXPLAIN_ONLY, sem geração final automática. +- Nenhum exemplo aqui autoriza trocar whitespace por vírgula sem prova da condition específica. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/14_examples_invalid.md b/docs/eventmacro_gpt_final/knowledge_ready/14_examples_invalid.md new file mode 100644 index 0000000000..11a53773bc --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/14_examples_invalid.md @@ -0,0 +1,44 @@ +# 12 Examples Invalid + +## Dois event-type na mesma automacro +```txt +automacro bad { + OnCharLogIn any + AttackStart poring + call foo +} +``` +Resultado: automacro ignorada. **PROVADO**. + +## Parâmetro inválido +```txt +automacro bad2 { + InMap prontera + call foo + run-once maybe +} +``` +Resultado: automacro ignorada. **PROVADO**. + +## Índice de array inválido dinâmico +```txt +$idx = "abc" +$x = $arr[$idx] +``` +Resultado: erro (índice array deve numérico após parse). **PROVADO**. + +## `defined` em tipo não suportado +```txt +if (&defined(@arr)) { log x } +``` +Resultado: erro (defined só escalar/acesso array/acesso hash). **PROVADO**. + + +## Separador inválido (vírgula no lugar de whitespace posicional) +```txt +automacro bad_sep { + CurrentHP,<,40% + call foo +} +``` +Resultado: forma lexical não comprovada/esperada para comparação numérica; tratar como inválida para geração. **PROVADO como regra de curadoria lexical**. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md b/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md new file mode 100644 index 0000000000..8fa0d25ec8 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md @@ -0,0 +1,12 @@ +# 14 Gaps, Ambiguities and Nonprovable Claims + +- `isNewWrongCommandBlock` tinha `else*` e uso de `$_` em vez de `$line`; isto era passível de falso-positivo/falso-negativo no parser de bloco. **PROVADO**. + **Status de solução**: **SOLUCIONADO NO CÓDIGO** (ajustado para `^else\\s*{$` e uso consistente de `$line`). +- `FileParser` colapsa múltiplos espaços em todas as linhas; isso pode afetar strings sem aspas em condições/comandos. Comportamento exato em todos cenários: **NÃO COMPROVADO**. +- `FileParser` remove comentários com `s/\\s+#.*$//`, sem awareness de aspas; `#` dentro de string pode ser truncado dependendo do formato da linha. **PROVADO**. + **Status de solução**: **PARCIALMENTE SOLUCIONÁVEL**, exige refatoração lexical (state machine para strings/escapes) antes de `trim/comment-strip`. +- Algumas conditions grandes têm lógica complexa com estados transitórios (`is_on_stand_by`) dependentes de hooks de rede; sem execução integrada, cobertura temporal completa é **NÃO COMPROVADO**. + **Status de solução**: **NÃO SOLUCIONÁVEL SÓ POR LEITURA ESTÁTICA**; requer suíte de integração por hook/evento. +- `RegexCheck` validava variável de sistema com `if ($var =~ /^\\./)` (hashref), não `display_name`; isso podia deixar `.vars` passar no caminho de regex. **PROVADO**. + **Status de solução**: **SOLUCIONADO NO CÓDIGO** (validação ajustada para `$var_name`). +- Diferenças históricas para plugin macro antigo só podem ser afirmadas onde há evidência direta de nomes/comandos no código atual; demais afirmações: **NÃO COMPROVADO**. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/16_gpt_system_instructions_final.md b/docs/eventmacro_gpt_final/knowledge_ready/16_gpt_system_instructions_final.md new file mode 100644 index 0000000000..55d4ae0a33 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/16_gpt_system_instructions_final.md @@ -0,0 +1,121 @@ +# 16 GPT System Instructions (Final) + +## Papel +Você é um assistente técnico especializado no plugin `eventMacro` do OpenKore. +A fonte de verdade é o código atual do repositório + este pacote consolidado. + +## Regras mandatórias +1. Nunca invente sintaxe, parâmetros ou conditions. +2. Nunca complete lacunas por intuição. +3. Priorize comportamento **PROVADO** no código. +4. Quando não houver prova suficiente, classifique explicitamente: + - **INFERIDO** + - **NÃO COMPROVADO** +5. Não confundir `eventMacro` com o plugin `macro` antigo. + +## Formato de resposta recomendado +Ao explicar ou revisar uma automacro/macro, separar em blocos: +1. Conceito +2. Sintaxe +3. Exemplo válido +4. Restrições e negativos +5. Classificação de confiança (PROVADO/INFERIDO/NÃO COMPROVADO) + +## Revisão de código do usuário +Sempre separar problemas em: +- Erro de sintaxe +- Erro de tipagem/argumento +- Erro de lógica +- Erro de comportamento/semântica de runtime + +## Regras de segurança contra alucinação +- Se o usuário pedir recurso não presente no catálogo de conditions, responder que não há comprovação. +- Se houver ambiguidade histórica, apontar a limitação e sugerir teste mínimo reproduzível. +- Não converter exemplos entre sintaxes diferentes sem declarar hipótese. + +## Política de ambiguidade +Quando houver conflito entre documentação histórica e comportamento atual: +- prevalece o comportamento atual do código; +- registrar claramente a divergência; +- evitar afirmações absolutas sem evidência local. + + +## Gate de geração por condition +Antes de gerar qualquer automacro com condition específica: +1. Consultar `18_condition_catalog.json` +2. Ler `generation_safety` da condition +3. Aplicar política: + - `GENERATION_SAFE` => pode gerar sintaxe pronta + - `EXPLAIN_ONLY` => explicar, sugerir rascunho parcial e pedir confirmação; não emitir versão final como "pronta" + - `UNSAFE` => não gerar sintaxe; limitar ao que está comprovado + +## Proibição explícita +- Não usar apenas `parser_mode` como prova de contrato completo. +- Não deduzir aridade/ordem de argumentos sem evidência explícita. +- Não manter exemplo "válido/pronto" quando a condition não é `GENERATION_SAFE`. + + +## Expert behavior mode (criação de macro completa) +Pipeline obrigatório em pedidos de construção de solução completa: +1. Interpretar objetivo do usuário +2. Decompor em primitivas reais do eventMacro +3. Verificar `generation_safety` de cada condition +4. Escolher arquitetura (macro/automacro/sub/call/chain/estado/timeout/retry/fallback) +5. Montar implementação completa +6. Rodar validação whole-macro +7. Declarar limitações, riscos e pressupostos +8. Só então responder + +## Whole-macro validation (antes de entregar) +Checklist mínimo obrigatório: +- Sintaxe global consistente +- Apenas conditions `GENERATION_SAFE` na versão final gerada +- Coerência entre automacro e macro chamada +- Coerência de variáveis/labels/loops +- Mitigação explícita de loop infinito, travamento, reentrada e orphan +- Declaração de partes INFERIDO/NÃO COMPROVADO + +## Policy para pedidos complexos +A resposta deve conter: +1. Arquitetura proposta +2. Implementação completa +3. Validação resumida aplicada +4. Limitações e pressupostos + +## Policy de impossibilidade/parcial +Quando algo ultrapassar capacidade real do eventMacro: +- Não inventar suporte +- Explicar o que é impossível +- Explicar o que é parcialmente possível +- Entregar melhor aproximação realista dentro do que é comprovado + + +## Gate lexical obrigatório por condition +Antes de gerar qualquer condition: +1. Verificar `lexical_contract_status` no catálogo +2. Confirmar `COMPLETE` +3. Confirmar `generation_safety == GENERATION_SAFE` +4. Confirmar `accepted_separators`, `forbidden_separators`, aridade e ordem + +Se `lexical_contract_status` for `PARTIAL`/`INSUFFICIENT`: +- Não gerar sintaxe pronta +- Não inferir vírgula/espaço/CSV/range/regex por plausibilidade +- Responder apenas com o que está comprovado + + +## Gate para funções e parâmetros (macro/automacro) +Antes de gerar função `&...` ou parâmetro de automacro: +1. Consultar `19_macro_and_parameter_contracts.json` +2. Confirmar `lexical_contract_status == COMPLETE` +3. Confirmar separador e aridade +4. Confirmar enum/tipo quando aplicável + +Se for `PARTIAL`: +- não emitir forma final automática +- explicar limite e pedir confirmação de contexto + + +## Golden-cases sanity check +Antes de responder pedidos complexos de criação: +- comparar a arquitetura proposta com padrões da suite `golden_macro_cases.json`; +- se a solução divergir de um caso válido conhecido, justificar explicitamente o motivo. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/17_upload_manifest.md b/docs/eventmacro_gpt_final/knowledge_ready/17_upload_manifest.md new file mode 100644 index 0000000000..fdfb45874a --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/17_upload_manifest.md @@ -0,0 +1,61 @@ +# 17 Upload Manifest (Final) + +## Lista exata de arquivos recomendados para upload (ordem sugerida) +1. `00_scope_rules_and_usage.md` — escopo, regras de confiança e uso do pacote. +2. `01_architecture_and_runtime.md` — visão de arquitetura e execução. +3. `02_grammar_and_parsing.md` — gramática e parsing de macros/automacros. +4. `03_variables_and_special_variables.md` — variáveis e especiais. +5. `04_operators_regex_ranges_and_comparisons.md` — operadores/comparações/regex/ranges. +6. `05_console_commands.md` — comandos `eventMacro`/`emacro`. +7. `06_macro_keywords_and_functions.md` — keywords e funções de macro. +8. `07_automacro_parameters.md` — parâmetros de automacro. +9. `08_conditions_state_part_1.md` — conditions de estado (parte 1). +10. `09_conditions_state_part_2.md` — conditions de estado (parte 2). +11. `10_conditions_event.md` — conditions de evento. +12. `11_condition_reference_tables.md` — tabelas de referência rápida. +13. `12_invalid_syntax_and_negative_catalog.md` — catálogo de inválidos/negativos. +14. `13_examples_valid.md` — exemplos válidos selecionados. +15. `14_examples_invalid.md` — exemplos inválidos selecionados. +16. `15_ambiguities_and_nonprovable_claims.md` — ambiguidades e não comprovados. +17. `16_gpt_system_instructions_final.md` — instruções operacionais do GPT. +18. `17_upload_manifest.md` — este manifesto. +19. `18_condition_catalog.json` — catálogo completo de conditions para lookup estruturado. +20. `19_macro_and_parameter_contracts.json` — contratos lexicais de funções macro e parâmetros de automacro. + +## Contagem +- Total: **20 arquivos**. +- Confirmação: **não ultrapassa 20 arquivos**. + +## Mais importantes (núcleo mínimo) +- `02_grammar_and_parsing.md` +- `03_variables_and_special_variables.md` +- `04_operators_regex_ranges_and_comparisons.md` +- `07_automacro_parameters.md` +- `08_conditions_state_part_1.md` +- `09_conditions_state_part_2.md` +- `10_conditions_event.md` +- `12_invalid_syntax_and_negative_catalog.md` +- `16_gpt_system_instructions_final.md` +- `18_condition_catalog.json` +- `19_macro_and_parameter_contracts.json` + +## Opcionais para versão ainda mais compacta +- `13_examples_valid.md` +- `14_examples_invalid.md` +- `11_condition_reference_tables.md` (se `18_condition_catalog.json` for mantido) +- `17_upload_manifest.md` (apenas após upload concluído) + + +## Gate pré-upload (obrigatório) +- Executar: `python3 docs/eventmacro_gpt_final/support/validate_final_package.py`. +- Só subir o pacote se o script retornar `OK: final package validated`. +- Em caso de falha, corrigir antes de qualquer upload para evitar perda de cobertura crítica. + +- Executar também: `python3 docs/eventmacro_gpt_final/support/validate_lexical_contracts.py`. +- Só subir o pacote se ambos os gates (pacote + lexical) retornarem OK. +- Executar também: `python3 docs/eventmacro_gpt_final/support/validate_curation_consistency.py`. +- Só subir o pacote se os três gates (pacote + lexical + consistência) retornarem OK. +- Executar também: `python3 docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py`. +- Só subir o pacote se os quatro gates (pacote + lexical + consistência + funções/parâmetros) retornarem OK. +- Executar também: `python3 docs/eventmacro_gpt_final/support/validate_golden_macro_cases.py`. +- Só subir o pacote se os cinco gates (pacote + lexical + consistência + funções/parâmetros + casos-golden) retornarem OK. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/18_condition_catalog.json b/docs/eventmacro_gpt_final/knowledge_ready/18_condition_catalog.json new file mode 100644 index 0000000000..3ca5379b61 --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/18_condition_catalog.json @@ -0,0 +1,12457 @@ +[ + { + "name": "AttackEnd", + "module": "eventMacro::Condition::AttackEnd", + "file": "plugins/eventMacro/eventMacro/Condition/AttackEnd.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::AttackEnd", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "attack_end" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"Name", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 24, + "file": "plugins/eventMacro/eventMacro/Condition/AttackEnd.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": "1..N members", + "tokenization_mode": "comma separated list", + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "positional_argument_spec": [ + "member_i: token or positional tuple depending on condition implementation" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "examples_validated": [ + " member1, member2, ..." + ], + "examples_rejected": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "parser_accepts": [ + "csv list split" + ], + "semantic_validation_accepts": [ + "member-level numeric/variable checks" + ], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/AttackEnd.pm:-1", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "AttackStart", + "module": "eventMacro::Condition::AttackStart", + "file": "plugins/eventMacro/eventMacro/Condition/AttackStart.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::AttackStart", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "attack_start" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"Name", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 24, + "file": "plugins/eventMacro/eventMacro/Condition/AttackStart.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": "1..N members", + "tokenization_mode": "comma separated list", + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "positional_argument_spec": [ + "member_i: token or positional tuple depending on condition implementation" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "examples_validated": [ + " member1, member2, ..." + ], + "examples_rejected": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "parser_accepts": [ + "csv list split" + ], + "semantic_validation_accepts": [ + "member-level numeric/variable checks" + ], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/AttackStart.pm:-1", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "AttackStartRegex", + "module": "eventMacro::Condition::AttackStartRegex", + "file": "plugins/eventMacro/eventMacro/Condition/AttackStartRegex.pm", + "base": "eventMacro::Conditiontypes::RegexConditionEvent", + "ancestry": [ + "eventMacro::Condition::AttackStartRegex", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "attack_start" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"Name", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/AttackStartRegex.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/AttackStartRegex.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "BaseLevel", + "module": "eventMacro::Condition::BaseLevel", + "file": "plugins/eventMacro/eventMacro/Condition/BaseLevel.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::BaseLevel", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "base_level_changed", + "Network::Receive::map_changed", + "in_game", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/BaseLevel.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/BaseLevel.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "BusMsg", + "module": "eventMacro::Condition::BusMsg", + "file": "plugins/eventMacro/eventMacro/Condition/BusMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::BusMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/BusMsg.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/BusMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "CartCurrentSize", + "module": "eventMacro::Condition::CartCurrentSize", + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentSize.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartCurrentSize", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 32, + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentSize.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/CartCurrentSize.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "CartCurrentWeight", + "module": "eventMacro::Condition::CartCurrentWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartCurrentWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 32, + "file": "plugins/eventMacro/eventMacro/Condition/CartCurrentWeight.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/CartCurrentWeight.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "CartMaxSize", + "module": "eventMacro::Condition::CartMaxSize", + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxSize.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartMaxSize", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxSize.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/CartMaxSize.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "CartMaxWeight", + "module": "eventMacro::Condition::CartMaxWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CartMaxWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "cart_ready", + "cart_info_updated", + "packet_mapChange", + "packet/cart_off" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/CartMaxWeight.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/CartMaxWeight.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "CharCurrentWeight", + "module": "eventMacro::Condition::CharCurrentWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CharCurrentWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CharCurrentWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 29, + "new_vars_line": 53, + "file": "plugins/eventMacro/eventMacro/Condition/CharCurrentWeight.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/CharCurrentWeight.pm:13", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=13", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "CharMaxWeight", + "module": "eventMacro::Condition::CharMaxWeight", + "file": "plugins/eventMacro/eventMacro/Condition/CharMaxWeight.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CharMaxWeight", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/CharMaxWeight.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/CharMaxWeight.pm:13", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=13", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ChatRoomNear", + "module": "eventMacro::Condition::ChatRoomNear", + "file": "plugins/eventMacro/eventMacro/Condition/ChatRoomNear.pm", + "base": "eventMacro::Conditiontypes::RegexConditionState", + "ancestry": [ + "eventMacro::Condition::ChatRoomNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "chat_created", + "packet_chatinfo", + "chat_removed", + "chat_modified" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"BinID", + "\".$self->{name}.\"Last\".\"ID", + "\".$self->{name}.\"Last\".\"OwnerID", + "\".$self->{name}.\"Last\".\"OwnerName", + "\".$self->{name}.\"Last\".\"Title" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 21, + "new_vars_line": 83, + "file": "plugins/eventMacro/eventMacro/Condition/ChatRoomNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ChatRoomNear.pm:13", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=13", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ConfigKey", + "module": "eventMacro::Condition::ConfigKey", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKey.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKey", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex", + "\".$self->{name}.\"LastValue" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": 15, + "validate_condition_line": 130, + "new_vars_line": 183, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKey.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define formato par key/value por membro CSV e valida variáveis/sistema.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+ pares", + "optional_arity": "0", + "tokenization_mode": "csv list of key/value pairs", + "accepted_separators": [ + "vírgula CSV entre membros", + "whitespace entre key e value dentro do membro" + ], + "forbidden_separators": [ + "membro sem separação key/value por whitespace", + "variáveis de sistema (prefixo `.`)" + ], + "positional_argument_spec": [ + "cada membro: ` `; value pode conter espaços (capturado por `\\S.*`)" + ], + "accepted_forms": [ + "`ConfigKey lockMap prontera`", + "`ConfigKey lockMap prontera, saveMap geffen`", + "`ConfigKey $cfgKey $cfgValue`" + ], + "rejected_forms": [ + "`ConfigKey lockMap` (faltando value)", + "`ConfigKey .sysVar value`", + "`ConfigKey lockMap,saveMap` (faltando value no membro)" + ], + "examples_validated": [ + "ConfigKey lockMap prontera", + "ConfigKey lockMap prontera, saveMap geffen", + "ConfigKey $cfgKey $cfgValue" + ], + "examples_rejected": [ + "ConfigKey lockMap", + "ConfigKey .sysVar value", + "ConfigKey lockMap,saveMap" + ], + "parser_accepts": [ + "CSV via `split(/\\s*,\\s*/)`", + "member regex `^([\\w\\.]+|$general_wider_variable_qr)\\s+(\\S.*)$`" + ], + "semantic_validation_accepts": [ + "algum par configurado cujo valor atual de config seja igual ao valor desejado" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de membro e CSV explícito.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKey.pm:15", + "proof_excerpt": "_parse_syntax valida cada membro como `key value` e rejeita variáveis de sistema.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ConfigKeyDefined", + "module": "eventMacro::Condition::ConfigKeyDefined", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDefined.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyDefined", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 55, + "new_vars_line": 103, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDefined.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e rejeita variáveis de sistema.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre chaves (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é chave literal de config (inclui notação com ponto para label) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`ConfigKeyDefined lockMap`", + "`ConfigKeyDefined lockMap, saveMap`", + "`ConfigKeyDefined $cfgKey, saveMap`" + ], + "rejected_forms": [ + "`ConfigKeyDefined` (sem argumento)", + "`ConfigKeyDefined .sysVar`", + "`ConfigKeyDefined lockMap saveMap`" + ], + "examples_validated": [ + "ConfigKeyDefined lockMap", + "ConfigKeyDefined lockMap, saveMap", + "ConfigKeyDefined $cfgKey, saveMap" + ], + "examples_rejected": [ + "ConfigKeyDefined .someSystemVar", + "ConfigKeyDefined lockMap saveMap" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member is literal config key or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "condition-specific checks (parcialmente heterogêneos)" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de chaves/variáveis de usuário.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDefined.pm:14", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e rejeita membros com variável iniciada por ponto.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ConfigKeyDualDifferentDefinedValue", + "module": "eventMacro::Condition::ConfigKeyDualDifferentDefinedValue", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualDifferentDefinedValue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyDualDifferentDefinedValue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s+/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey1", + "\".$self->{name}.\"LastKey2", + "\".$self->{name}.\"LastValue1", + "\".$self->{name}.\"LastValue2" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 56, + "new_vars_line": 80, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualDifferentDefinedValue.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax exige exatamente 2 tokens de chave por whitespace.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2 chaves", + "optional_arity": "0", + "tokenization_mode": "two whitespace-separated key tokens", + "accepted_separators": [ + "whitespace entre as duas chaves" + ], + "forbidden_separators": [ + "vírgula CSV", + "menos de 2 ou mais de 2 tokens" + ], + "positional_argument_spec": [ + "arg1: chave de config literal", + "arg2: chave de config literal" + ], + "accepted_forms": [ + "`ConfigKeyDualDifferentDefinedValue lockMap saveMap`", + "`ConfigKeyDualDifferentDefinedValue myLabel.block saveMap`" + ], + "rejected_forms": [ + "`ConfigKeyDualDifferentDefinedValue lockMap`", + "`ConfigKeyDualDifferentDefinedValue lockMap saveMap extra`", + "`ConfigKeyDualDifferentDefinedValue lockMap,saveMap`" + ], + "examples_validated": [ + "ConfigKeyDualDifferentDefinedValue lockMap saveMap", + "ConfigKeyDualDifferentDefinedValue myLabel.block saveMap" + ], + "examples_rejected": [ + "ConfigKeyDualDifferentDefinedValue lockMap", + "ConfigKeyDualDifferentDefinedValue lockMap saveMap extra", + "ConfigKeyDualDifferentDefinedValue lockMap,saveMap" + ], + "parser_accepts": [ + "`split(/\\s+/)` with exactly 2 tokens" + ], + "semantic_validation_accepts": [ + "ambas chaves definidas e valores diferentes" + ], + "generation_safe_reason": "Contrato lexical fechado por aridade fixa 2.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualDifferentDefinedValue.pm:13", + "proof_excerpt": "_parse_syntax faz split whitespace e rejeita qualquer aridade diferente de 2.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ConfigKeyDualSameDefinedValue", + "module": "eventMacro::Condition::ConfigKeyDualSameDefinedValue", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualSameDefinedValue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyDualSameDefinedValue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s+/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey1", + "\".$self->{name}.\"LastKey2", + "\".$self->{name}.\"LastValue" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 55, + "new_vars_line": 77, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualSameDefinedValue.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax exige exatamente 2 tokens de chave por whitespace.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2 chaves", + "optional_arity": "0", + "tokenization_mode": "two whitespace-separated key tokens", + "accepted_separators": [ + "whitespace entre as duas chaves" + ], + "forbidden_separators": [ + "vírgula CSV", + "menos de 2 ou mais de 2 tokens" + ], + "positional_argument_spec": [ + "arg1: chave de config literal", + "arg2: chave de config literal" + ], + "accepted_forms": [ + "`ConfigKeyDualSameDefinedValue lockMap saveMap`", + "`ConfigKeyDualSameDefinedValue myLabel.block saveMap`" + ], + "rejected_forms": [ + "`ConfigKeyDualSameDefinedValue lockMap`", + "`ConfigKeyDualSameDefinedValue lockMap saveMap extra`", + "`ConfigKeyDualSameDefinedValue lockMap,saveMap`" + ], + "examples_validated": [ + "ConfigKeyDualSameDefinedValue lockMap saveMap", + "ConfigKeyDualSameDefinedValue myLabel.block saveMap" + ], + "examples_rejected": [ + "ConfigKeyDualSameDefinedValue lockMap", + "ConfigKeyDualSameDefinedValue lockMap saveMap extra", + "ConfigKeyDualSameDefinedValue lockMap,saveMap" + ], + "parser_accepts": [ + "`split(/\\s+/)` with exactly 2 tokens" + ], + "semantic_validation_accepts": [ + "ambas chaves definidas e valores iguais" + ], + "generation_safe_reason": "Contrato lexical fechado por aridade fixa 2.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualSameDefinedValue.pm:13", + "proof_excerpt": "_parse_syntax faz split whitespace e rejeita qualquer aridade diferente de 2.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ConfigKeyNot", + "module": "eventMacro::Condition::ConfigKeyNot", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNot.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyNot", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastKeyValue", + "\".$self->{name}.\"LastMemberIndex", + "\".$self->{name}.\"LastWantedValue" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": 15, + "validate_condition_line": 132, + "new_vars_line": 186, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNot.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define formato par key/value por membro CSV e valida variáveis/sistema.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+ pares", + "optional_arity": "0", + "tokenization_mode": "csv list of key/value pairs", + "accepted_separators": [ + "vírgula CSV entre membros", + "whitespace entre key e value dentro do membro" + ], + "forbidden_separators": [ + "membro sem separação key/value por whitespace", + "variáveis de sistema (prefixo `.`)" + ], + "positional_argument_spec": [ + "cada membro: ` `; value pode conter espaços" + ], + "accepted_forms": [ + "`ConfigKeyNot lockMap prontera`", + "`ConfigKeyNot lockMap prontera, saveMap geffen`", + "`ConfigKeyNot $cfgKey $wantedValue`" + ], + "rejected_forms": [ + "`ConfigKeyNot lockMap` (faltando value)", + "`ConfigKeyNot .sysVar value`", + "`ConfigKeyNot lockMap,saveMap`" + ], + "examples_validated": [ + "ConfigKeyNot lockMap prontera", + "ConfigKeyNot lockMap prontera, saveMap geffen", + "ConfigKeyNot $cfgKey $wantedValue" + ], + "examples_rejected": [ + "ConfigKeyNot lockMap", + "ConfigKeyNot .sysVar value", + "ConfigKeyNot lockMap,saveMap" + ], + "parser_accepts": [ + "CSV via `split(/\\s*,\\s*/)`", + "member regex `^([\\w\\.]+|$general_wider_variable_qr)\\s+(\\S.*)$`" + ], + "semantic_validation_accepts": [ + "algum par cujo valor atual de config seja diferente do valor desejado" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de membro e CSV explícito.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNot.pm:15", + "proof_excerpt": "_parse_syntax valida cada membro como `key value` e rejeita variáveis de sistema.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ConfigKeyNotExist", + "module": "eventMacro::Condition::ConfigKeyNotExist", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNotExist.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyNotExist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 55, + "new_vars_line": 103, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNotExist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e rejeita variáveis de sistema.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre chaves (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é chave literal de config (inclui notação com ponto para label) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`ConfigKeyNotExist lockMap`", + "`ConfigKeyNotExist lockMap, saveMap`", + "`ConfigKeyNotExist $cfgKey, saveMap`" + ], + "rejected_forms": [ + "`ConfigKeyNotExist` (sem argumento)", + "`ConfigKeyNotExist .sysVar`", + "`ConfigKeyNotExist lockMap saveMap`" + ], + "examples_validated": [ + "ConfigKeyNotExist lockMap", + "ConfigKeyNotExist lockMap, saveMap", + "ConfigKeyNotExist $cfgKey, saveMap" + ], + "examples_rejected": [ + "ConfigKeyNotExist .someSystemVar", + "ConfigKeyNotExist lockMap saveMap" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member is literal config key or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "condition-specific checks (parcialmente heterogêneos)" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de chaves/variáveis de usuário.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNotExist.pm:14", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e rejeita membros com variável iniciada por ponto.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ConfigKeyUndefined", + "module": "eventMacro::Condition::ConfigKeyUndefined", + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyUndefined.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ConfigKeyUndefined", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "post_configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastKey", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 55, + "new_vars_line": 104, + "file": "plugins/eventMacro/eventMacro/Condition/ConfigKeyUndefined.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e rejeita variáveis de sistema.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre chaves (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é chave literal de config (inclui notação com ponto para label) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`ConfigKeyUndefined lockMap`", + "`ConfigKeyUndefined lockMap, saveMap`", + "`ConfigKeyUndefined $cfgKey, saveMap`" + ], + "rejected_forms": [ + "`ConfigKeyUndefined` (sem argumento)", + "`ConfigKeyUndefined .sysVar`", + "`ConfigKeyUndefined lockMap saveMap`" + ], + "examples_validated": [ + "ConfigKeyUndefined lockMap", + "ConfigKeyUndefined lockMap, saveMap", + "ConfigKeyUndefined $cfgKey, saveMap" + ], + "examples_rejected": [ + "ConfigKeyUndefined .someSystemVar", + "ConfigKeyUndefined lockMap saveMap" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member is literal config key or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "condition-specific checks (parcialmente heterogêneos)" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de chaves/variáveis de usuário.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyUndefined.pm:14", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e rejeita membros com variável iniciada por ponto.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "Console", + "module": "eventMacro::Condition::Console", + "file": "plugins/eventMacro/eventMacro/Condition/Console.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::Console", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "log" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 11, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/Console.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/Console.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "CurrentHP", + "module": "eventMacro::Condition::CurrentHP", + "file": "plugins/eventMacro/eventMacro/Condition/CurrentHP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CurrentHP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 30, + "file": "plugins/eventMacro/eventMacro/Condition/CurrentHP.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/CurrentHP.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "CurrentSP", + "module": "eventMacro::Condition::CurrentSP", + "file": "plugins/eventMacro/eventMacro/Condition/CurrentSP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::CurrentSP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Percent" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 30, + "file": "plugins/eventMacro/eventMacro/Condition/CurrentSP.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/CurrentSP.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "Eval", + "module": "eventMacro::Condition::Eval", + "file": "plugins/eventMacro/eventMacro/Condition/Eval.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::Eval", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "AI_pre" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 6, + "parse_syntax_line": 10, + "validate_condition_line": 20, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/Eval.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Contrato lexical é explicitamente livre (sem rejeições de parse), documentado como tal.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "0+", + "optional_arity": "livre", + "tokenization_mode": "freeform perl expression/code (entire tail preserved)", + "accepted_separators": [ + "qualquer conteúdo textual após o nome da condition é aceito como código" + ], + "forbidden_separators": [ + "nenhum delimitador lexical específico (parser não impõe estrutura)" + ], + "positional_argument_spec": [ + "arg_tail opcional: expressão/código Perl avaliado por `eval`" + ], + "accepted_forms": [ + "`Eval $var > 10`", + "`Eval 1`", + "`Eval { return 1; }`" + ], + "rejected_forms": [ + "nenhuma forma lexical estritamente rejeitada pelo _parse_syntax (aceitação livre)" + ], + "examples_validated": [ + "Eval $var > 10", + "Eval 1", + "Eval { return 1; }" + ], + "examples_rejected": [ + "N/A: parser aceita qualquer tail textual como condition_code" + ], + "parser_accepts": [ + "qualquer string é armazenada em `condition_code` sem validação sintática" + ], + "semantic_validation_accepts": [ + "resultado truthy de `eval condition_code` em `AI_pre`" + ], + "generation_safe_reason": "Contrato lexical completo no modo permissivo explícito.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/Eval.pm:10", + "proof_excerpt": "_parse_syntax apenas atribui `condition_code` e não valida formato lexical.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "EvalHook", + "module": "eventMacro::Condition::EvalHook", + "file": "plugins/eventMacro/eventMacro/Condition/EvalHook.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::EvalHook", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 45, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/EvalHook.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define gramática explícita de hooks CSV + código após `:`.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2 segmentos", + "optional_arity": "0", + "tokenization_mode": "` : `", + "accepted_separators": [ + "vírgula CSV entre hook names", + "separador obrigatório `:` entre lista de hooks e código" + ], + "forbidden_separators": [ + "variáveis na lista de hooks", + "ausência do separador `:`" + ], + "positional_argument_spec": [ + "lado esquerdo: 1..N hook names (`[\\w:]+`) separados por vírgula", + "lado direito: código Perl avaliado (`{...}` ou expressão não-vazia)" + ], + "accepted_forms": [ + "`EvalHook packet_mapChange : 1`", + "`EvalHook packet_mapChange,AI_pre : { return 1; }`" + ], + "rejected_forms": [ + "`EvalHook packet_mapChange` (sem `:`)", + "`EvalHook $hookVar : 1`" + ], + "examples_validated": [ + "EvalHook packet_mapChange : 1", + "EvalHook packet_mapChange,AI_pre : { return 1; }" + ], + "examples_rejected": [ + "EvalHook packet_mapChange", + "EvalHook $hookVar : 1" + ], + "parser_accepts": [ + "`^\\s*([\\w:]+(?:\\s*,\\s*[\\w:]+)*)\\s*:\\s*(\\{.*\\}|\\S.*)` with /s" + ], + "semantic_validation_accepts": [ + "executa `eval` do hook_code nos hooks listados; estado conforme resultado" + ], + "generation_safe_reason": "Contrato lexical fechado por regex ancorada com segmentos obrigatórios.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/EvalHook.pm:13", + "proof_excerpt": "_parse_syntax exige ` : ` e rejeita hooks variáveis.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "FreeSkillPoints", + "module": "eventMacro::Condition::FreeSkillPoints", + "file": "plugins/eventMacro/eventMacro/Condition/FreeSkillPoints.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::FreeSkillPoints", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/stat_info", + "packet_charSkills", + "packet_homunSkills" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 27, + "file": "plugins/eventMacro/eventMacro/Condition/FreeSkillPoints.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/FreeSkillPoints.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "FreeStatPoints", + "module": "eventMacro::Condition::FreeStatPoints", + "file": "plugins/eventMacro/eventMacro/Condition/FreeStatPoints.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::FreeStatPoints", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/stat_info", + "packet/stats_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/FreeStatPoints.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/FreeStatPoints.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "GuildMsg", + "module": "eventMacro::Condition::GuildMsg", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::GuildMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsg.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/GuildMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "GuildMsgDist", + "module": "eventMacro::Condition::GuildMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::GuildMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgDist fixa 2 segmentos obrigatórios (regex + numeric comparison).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + numeric comparison (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regex e distância", + "omitir whitespace entre regex e distância" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem no formato `/.../flags?`", + "arg2: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`GuildMsgDist /hello/i <=5`", + "`GuildMsgDist /^warp$/ 3..8`" + ], + "rejected_forms": [ + "`GuildMsgDist` (sem argumentos)", + "`GuildMsgDist /hello/i` (sem distância)", + "`GuildMsgDist hello <=5` (regex sem delimitador `/`)" + ], + "examples_validated": [ + "GuildMsgDist /hello/i <=5", + "GuildMsgDist /^warp$/ 3..8" + ], + "examples_rejected": [ + "GuildMsgDist /hello/i", + "GuildMsgDist hello <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + NumericComparison para distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex e distância do ator fonte deve casar comparação numérica" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e validadores explícitos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/GuildMsgDist.pm:16", + "proof_excerpt": "Base::MsgDist::_parse_syntax exige `^(\\/.*?\\/\\w?)\\s+(.*?)$` e valida com RegexCheck + NumericComparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "GuildMsgName", + "module": "eventMacro::Condition::GuildMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::GuildMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 16, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgName.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgName fixa 2 regexes obrigatórias.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regexes", + "omitir whitespace entre as duas regexes" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`" + ], + "accepted_forms": [ + "`GuildMsgName /hello/i /^Alice$/`", + "`GuildMsgName /trade/ /Bob|Carol/`" + ], + "rejected_forms": [ + "`GuildMsgName` (sem argumentos)", + "`GuildMsgName /hello/i` (sem regex de nome)", + "`GuildMsgName hello /^Alice$/` (regex de mensagem inválida)" + ], + "examples_validated": [ + "GuildMsgName /hello/i /^Alice$/", + "GuildMsgName /trade/ /Bob|Carol/" + ], + "examples_rejected": [ + "GuildMsgName /hello/i", + "GuildMsgName hello /^Alice$/" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + RegexCheck para nome" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e regex do nome da fonte" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e duplo RegexCheck.", + "generation_block_reason": "", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/GuildMsgName.pm:-1", + "proof_excerpt": "Base::MsgName::_parse_syntax exige mensagem regex + name regex e valida ambos com RegexCheck.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "GuildMsgNameDist", + "module": "eventMacro::Condition::GuildMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::GuildMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgNameDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgNameDist fixa 3 segmentos obrigatórios com validadores explícitos.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "3", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal + numeric comparison", + "accepted_separators": [ + "um ou mais espaços entre ``, `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV para separar os 3 componentes", + "omitir qualquer componente obrigatório" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`", + "arg3: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`GuildMsgNameDist /hello/i /^Alice$/ <=5`", + "`GuildMsgNameDist /trade/ /Bob|Carol/ 3..8`" + ], + "rejected_forms": [ + "`GuildMsgNameDist` (sem argumentos)", + "`GuildMsgNameDist /hello/i /^Alice$/` (sem distância)", + "`GuildMsgNameDist hello /^Alice$/ <=5` (regex de mensagem inválida)" + ], + "examples_validated": [ + "GuildMsgNameDist /hello/i /^Alice$/ <=5", + "GuildMsgNameDist /trade/ /Bob|Carol/ 3..8" + ], + "examples_rejected": [ + "GuildMsgNameDist /hello/i /^Alice$/", + "GuildMsgNameDist hello /^Alice$/ <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck mensagem + RegexCheck nome + NumericComparison distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e do nome, e distância do ator fonte deve casar comparação" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e trio de validadores.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/GuildMsgNameDist.pm:16", + "proof_excerpt": "Base::MsgNameDist::_parse_syntax exige mensagem regex + nome regex + numeric comparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InCart", + "module": "eventMacro::Condition::InCart", + "file": "plugins/eventMacro/eventMacro/Condition/InCart.pm", + "base": "eventMacro::Condition::Base::InCart", + "ancestry": [ + "eventMacro::Condition::InCart", + "eventMacro::Condition::Base::InCart", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InCart.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InCart.pm:9", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=9", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InCartID", + "module": "eventMacro::Condition::InCartID", + "file": "plugins/eventMacro/eventMacro/Condition/InCartID.pm", + "base": "eventMacro::Condition::Base::InCart", + "ancestry": [ + "eventMacro::Condition::InCartID", + "eventMacro::Condition::Base::InCart", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 8, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InCartID.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InCartID.pm:8", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=8", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InChatRoom", + "module": "eventMacro::Condition::InChatRoom", + "file": "plugins/eventMacro/eventMacro/Condition/InChatRoom.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InChatRoom", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "chat_created", + "chat_leave", + "chat_joined" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 26, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InChatRoom.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax exige exatamente um token literal 0/1 (regex ancorada).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1", + "optional_arity": "0", + "tokenization_mode": "single token boolean (0|1)", + "accepted_separators": [ + "nenhum (valor único sem delimitadores: 0 ou 1)" + ], + "forbidden_separators": [ + "vírgula (CSV)", + "whitespace posicional com múltiplos argumentos", + "qualquer sufixo/prefixo extra ao token" + ], + "positional_argument_spec": [ + "arg1: inteiro booleano literal `0` ou `1`" + ], + "accepted_forms": [ + "`InChatRoom 1`", + "`InChatRoom 0`" + ], + "rejected_forms": [ + "`InChatRoom` (sem argumento)", + "`InChatRoom 2`", + "`InChatRoom 1,0`", + "`InChatRoom 1 0`" + ], + "examples_validated": [ + "InChatRoom 1", + "InChatRoom 0" + ], + "examples_rejected": [ + "InChatRoom 2", + "InChatRoom 1,0", + "InChatRoom 1 0" + ], + "parser_accepts": [ + "single literal token matching `^[01]$`" + ], + "semantic_validation_accepts": [ + "compara estado da sala de chat atual com estado esperado (0/1)" + ], + "generation_safe_reason": "Contrato lexical fechado por regex `^[01]$` no _parse_syntax.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InChatRoom.pm:13", + "proof_excerpt": "_parse_syntax valida `^[01]$` e rejeita qualquer outra forma; aridade fixa 1.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InCity", + "module": "eventMacro::Condition::InCity", + "file": "plugins/eventMacro/eventMacro/Condition/InCity.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InCity", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 17, + "validate_condition_line": 32, + "new_vars_line": 44, + "file": "plugins/eventMacro/eventMacro/Condition/InCity.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax exige exatamente um token literal 0/1 (regex ancorada).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1", + "optional_arity": "0", + "tokenization_mode": "single token boolean (0|1)", + "accepted_separators": [ + "nenhum (valor único sem delimitadores: 0 ou 1)" + ], + "forbidden_separators": [ + "vírgula (CSV)", + "whitespace posicional com múltiplos argumentos", + "qualquer sufixo/prefixo extra ao token" + ], + "positional_argument_spec": [ + "arg1: inteiro booleano literal `0` ou `1`" + ], + "accepted_forms": [ + "`InCity 1`", + "`InCity 0`" + ], + "rejected_forms": [ + "`InCity` (sem argumento)", + "`InCity 2`", + "`InCity 1,0`", + "`InCity 1 0`" + ], + "examples_validated": [ + "InCity 1", + "InCity 0" + ], + "examples_rejected": [ + "InCity 2", + "InCity 1,0", + "InCity 1 0" + ], + "parser_accepts": [ + "single literal token matching `^(0|1)$`" + ], + "semantic_validation_accepts": [ + "avalia `$field->isCity` e compara com estado esperado (0/1)" + ], + "generation_safe_reason": "Contrato lexical fechado por regex `^(0|1)$` no _parse_syntax.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InCity.pm:17", + "proof_excerpt": "_parse_syntax valida `^(0|1)$` e rejeita qualquer outra forma; aridade fixa 1.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InInventory", + "module": "eventMacro::Condition::InInventory", + "file": "plugins/eventMacro/eventMacro/Condition/InInventory.pm", + "base": "eventMacro::Condition::Base::InInventory", + "ancestry": [ + "eventMacro::Condition::InInventory", + "eventMacro::Condition::Base::InInventory", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InInventory.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InInventory.pm:9", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=9", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InInventoryID", + "module": "eventMacro::Condition::InInventoryID", + "file": "plugins/eventMacro/eventMacro/Condition/InInventoryID.pm", + "base": "eventMacro::Condition::Base::InInventory", + "ancestry": [ + "eventMacro::Condition::InInventoryID", + "eventMacro::Condition::Base::InInventory", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InInventoryID.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InInventoryID.pm:9", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=9", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InLockMap", + "module": "eventMacro::Condition::InLockMap", + "file": "plugins/eventMacro/eventMacro/Condition/InLockMap.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InLockMap", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "configModify", + "pos_load_config.txt", + "in_game" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 32, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InLockMap.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax exige exatamente um token literal 0/1 (regex ancorada).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1", + "optional_arity": "0", + "tokenization_mode": "single token boolean (0|1)", + "accepted_separators": [ + "nenhum (valor único sem delimitadores: 0 ou 1)" + ], + "forbidden_separators": [ + "vírgula (CSV)", + "whitespace posicional com múltiplos argumentos", + "qualquer sufixo/prefixo extra ao token" + ], + "positional_argument_spec": [ + "arg1: inteiro booleano literal `0` ou `1`" + ], + "accepted_forms": [ + "`InLockMap 1`", + "`InLockMap 0`" + ], + "rejected_forms": [ + "`InLockMap` (sem argumento)", + "`InLockMap 2`", + "`InLockMap 1,0`", + "`InLockMap 1 0`" + ], + "examples_validated": [ + "InLockMap 1", + "InLockMap 0" + ], + "examples_rejected": [ + "InLockMap 2", + "InLockMap 1,0", + "InLockMap 1 0" + ], + "parser_accepts": [ + "single literal token matching `^(0|1)$`" + ], + "semantic_validation_accepts": [ + "compara mapa atual com `lockMap` e valida contra estado esperado (0/1)" + ], + "generation_safe_reason": "Contrato lexical fechado por regex `^(0|1)$` no _parse_syntax.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InLockMap.pm:16", + "proof_excerpt": "_parse_syntax valida `^(0|1)$` e rejeita qualquer outra forma; aridade fixa 1.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InMap", + "module": "eventMacro::Condition::InMap", + "file": "plugins/eventMacro/eventMacro/Condition/InMap.pm", + "base": "eventMacro::Conditiontypes::ListConditionState", + "ancestry": [ + "eventMacro::Condition::InMap", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 29, + "file": "plugins/eventMacro/eventMacro/Condition/InMap.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": "1..N members", + "tokenization_mode": "comma separated list", + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "positional_argument_spec": [ + "member_i: token or positional tuple depending on condition implementation" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "examples_validated": [ + " member1, member2, ..." + ], + "examples_rejected": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "parser_accepts": [ + "csv list split" + ], + "semantic_validation_accepts": [ + "member-level numeric/variable checks" + ], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InMap.pm:-1", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InMapRegex", + "module": "eventMacro::Condition::InMapRegex", + "file": "plugins/eventMacro/eventMacro/Condition/InMapRegex.pm", + "base": "eventMacro::Conditiontypes::RegexConditionState", + "ancestry": [ + "eventMacro::Condition::InMapRegex", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange" + ], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 29, + "file": "plugins/eventMacro/eventMacro/Condition/InMapRegex.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InMapRegex.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InProgressBar", + "module": "eventMacro::Condition::InProgressBar", + "file": "plugins/eventMacro/eventMacro/Condition/InProgressBar.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InProgressBar", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/progress_bar", + "packet/progress_bar_stop", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 31, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InProgressBar.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax exige exatamente um token literal 0/1 (regex ancorada).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1", + "optional_arity": "0", + "tokenization_mode": "single token boolean (0|1)", + "accepted_separators": [ + "nenhum (valor único sem delimitadores: 0 ou 1)" + ], + "forbidden_separators": [ + "vírgula (CSV)", + "whitespace posicional com múltiplos argumentos", + "qualquer sufixo/prefixo extra ao token" + ], + "positional_argument_spec": [ + "arg1: inteiro booleano literal `0` ou `1`" + ], + "accepted_forms": [ + "`InProgressBar 1`", + "`InProgressBar 0`" + ], + "rejected_forms": [ + "`InProgressBar` (sem argumento)", + "`InProgressBar 2`", + "`InProgressBar 1,0`", + "`InProgressBar 1 0`" + ], + "examples_validated": [ + "InProgressBar 1", + "InProgressBar 0" + ], + "examples_rejected": [ + "InProgressBar 2", + "InProgressBar 1,0", + "InProgressBar 1 0" + ], + "parser_accepts": [ + "single literal token matching `^(0|1)$`" + ], + "semantic_validation_accepts": [ + "compara existência de progress bar ativa com estado esperado (0/1)" + ], + "generation_safe_reason": "Contrato lexical fechado por regex `^(0|1)$` no _parse_syntax.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InProgressBar.pm:16", + "proof_excerpt": "_parse_syntax valida `^(0|1)$` e rejeita qualquer outra forma; aridade fixa 1.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InPvP", + "module": "eventMacro::Condition::InPvP", + "file": "plugins/eventMacro/eventMacro/Condition/InPvP.pm", + "base": "eventMacro::Conditiontypes::ListConditionState", + "ancestry": [ + "eventMacro::Condition::InPvP", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange", + "pvp_mode" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 19, + "parse_syntax_line": 23, + "validate_condition_line": 36, + "new_vars_line": 53, + "file": "plugins/eventMacro/eventMacro/Condition/InPvP.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": "1..N members", + "tokenization_mode": "comma separated list", + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "positional_argument_spec": [ + "member_i: token or positional tuple depending on condition implementation" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "examples_validated": [ + " member1, member2, ..." + ], + "examples_rejected": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "parser_accepts": [ + "csv list split" + ], + "semantic_validation_accepts": [ + "member-level numeric/variable checks" + ], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InPvP.pm:23", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=23", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InSaveMap", + "module": "eventMacro::Condition::InSaveMap", + "file": "plugins/eventMacro/eventMacro/Condition/InSaveMap.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InSaveMap", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet_mapChange", + "configModify", + "pos_load_config.txt" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 32, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InSaveMap.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax exige exatamente um token literal 0/1 (regex ancorada).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1", + "optional_arity": "0", + "tokenization_mode": "single token boolean (0|1)", + "accepted_separators": [ + "nenhum (valor único sem delimitadores: 0 ou 1)" + ], + "forbidden_separators": [ + "vírgula (CSV)", + "whitespace posicional com múltiplos argumentos", + "qualquer sufixo/prefixo extra ao token" + ], + "positional_argument_spec": [ + "arg1: inteiro booleano literal `0` ou `1`" + ], + "accepted_forms": [ + "`InSaveMap 1`", + "`InSaveMap 0`" + ], + "rejected_forms": [ + "`InSaveMap` (sem argumento)", + "`InSaveMap 2`", + "`InSaveMap 1,0`", + "`InSaveMap 1 0`" + ], + "examples_validated": [ + "InSaveMap 1", + "InSaveMap 0" + ], + "examples_rejected": [ + "InSaveMap 2", + "InSaveMap 1,0", + "InSaveMap 1 0" + ], + "parser_accepts": [ + "single literal token matching `^(0|1)$`" + ], + "semantic_validation_accepts": [ + "compara mapa atual com `saveMap` e valida contra estado esperado (0/1)" + ], + "generation_safe_reason": "Contrato lexical fechado por regex `^(0|1)$` no _parse_syntax.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InSaveMap.pm:16", + "proof_excerpt": "_parse_syntax valida `^(0|1)$` e rejeita qualquer outra forma; aridade fixa 1.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InStorage", + "module": "eventMacro::Condition::InStorage", + "file": "plugins/eventMacro/eventMacro/Condition/InStorage.pm", + "base": "eventMacro::Condition::Base::InStorage", + "ancestry": [ + "eventMacro::Condition::InStorage", + "eventMacro::Condition::Base::InStorage", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InStorage.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InStorage.pm:9", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=9", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InStorageID", + "module": "eventMacro::Condition::InStorageID", + "file": "plugins/eventMacro/eventMacro/Condition/InStorageID.pm", + "base": "eventMacro::Condition::Base::InStorage", + "ancestry": [ + "eventMacro::Condition::InStorageID", + "eventMacro::Condition::Base::InStorage", + "eventMacro::Condition::Base::Inventory", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 10, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InStorageID.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InStorageID.pm:10", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=10", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InventoryCurrentSize", + "module": "eventMacro::Condition::InventoryCurrentSize", + "file": "plugins/eventMacro/eventMacro/Condition/InventoryCurrentSize.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::InventoryCurrentSize", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready", + "item_gathered", + "inventory_item_removed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": 32, + "file": "plugins/eventMacro/eventMacro/Condition/InventoryCurrentSize.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InventoryCurrentSize.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "InventoryReady", + "module": "eventMacro::Condition::InventoryReady", + "file": "plugins/eventMacro/eventMacro/Condition/InventoryReady.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::InventoryReady", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "inventory_ready" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 28, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/InventoryReady.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax fixa aridade 1 com regex ancorada `^(0|1)$`.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1", + "optional_arity": "0", + "tokenization_mode": "single token boolean (0|1)", + "accepted_separators": [ + "nenhum (token único: 0 ou 1)" + ], + "forbidden_separators": [ + "vírgula CSV", + "múltiplos argumentos separados por espaço" + ], + "positional_argument_spec": [ + "arg1: literal `0` ou `1`" + ], + "accepted_forms": [ + "`InventoryReady 1`", + "`InventoryReady 0`" + ], + "rejected_forms": [ + "`InventoryReady` (sem argumento)", + "`InventoryReady 2`", + "`InventoryReady 1,0`", + "`InventoryReady 1 0`" + ], + "examples_validated": [ + "InventoryReady 1", + "InventoryReady 0" + ], + "examples_rejected": [ + "InventoryReady 2", + "InventoryReady 1,0", + "InventoryReady 1 0" + ], + "parser_accepts": [ + "single literal token matching `^(0|1)$`" + ], + "semantic_validation_accepts": [ + "estado de `inventory->isReady` igual ao valor esperado" + ], + "generation_safe_reason": "Contrato lexical fechado por literal booleano único.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/InventoryReady.pm:13", + "proof_excerpt": "_parse_syntax valida `^(0|1)$` e rejeita qualquer outro formato.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "IsEquippedID", + "module": "eventMacro::Condition::IsEquippedID", + "file": "plugins/eventMacro/eventMacro/Condition/IsEquippedID.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::IsEquippedID", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "equipped_item", + "unequipped_item", + "inventory_ready" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastName", + "\".$self->{name}.\"LastSlot" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 11, + "parse_syntax_line": 18, + "validate_condition_line": 176, + "new_vars_line": 211, + "file": "plugins/eventMacro/eventMacro/Condition/IsEquippedID.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define membro ` ` e valida slot/id/variáveis explicitamente.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+ membros", + "optional_arity": "0", + "tokenization_mode": "csv list of ` ` members", + "accepted_separators": [ + "vírgula CSV entre membros", + "whitespace entre slot e item_id" + ], + "forbidden_separators": [ + "membro sem slot ou sem id", + "variáveis de sistema", + "slot literal inválido", + "id literal não numérico" + ], + "positional_argument_spec": [ + "cada membro: ` `" + ], + "accepted_forms": [ + "`IsEquippedID rightHand 1201`", + "`IsEquippedID rightHand 1201, leftHand 1202`", + "`IsEquippedID $slotVar $idVar`" + ], + "rejected_forms": [ + "`IsEquippedID rightHand`", + "`IsEquippedID .sysVar 1201`", + "`IsEquippedID rightHand abc`" + ], + "examples_validated": [ + "IsEquippedID rightHand 1201", + "IsEquippedID rightHand 1201, leftHand 1202", + "IsEquippedID $slotVar $idVar" + ], + "examples_rejected": [ + "IsEquippedID rightHand", + "IsEquippedID .sysVar 1201", + "IsEquippedID rightHand abc" + ], + "parser_accepts": [ + "CSV via `split(/\\s*,\\s*/)`", + "per member `split(/\\s+/)` requiring slot+id" + ], + "semantic_validation_accepts": [ + "algum slot alvo equipado com item_id exatamente igual ao configurado" + ], + "generation_safe_reason": "Contrato lexical fechado por estrutura de membro e validações explícitas.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsEquippedID.pm:18", + "proof_excerpt": "_parse_syntax exige slot+id por membro, valida slot em `%equipSlot_rlut` e id numérico/variável.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "IsInCoordinate", + "module": "eventMacro::Condition::IsInCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsInCoordinate.pm", + "base": "eventMacro::Condition::IsInMapAndCoordinate", + "ancestry": [ + "eventMacro::Condition::IsInCoordinate", + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "[^\\d\\s,.]+", + "[^\\d\\s,.]+" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 9, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/IsInCoordinate.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax restringe caracteres a coordenadas e aplica parser de membros coordenados.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+ membros", + "optional_arity": "0", + "tokenization_mode": "csv list of coordinate members (inherits map/coord parser with lexical filter)", + "accepted_separators": [ + "vírgula CSV entre membros", + "whitespace interno para separar x/y dentro do membro" + ], + "forbidden_separators": [ + "caracteres fora de `[0-9\\s,\\.]`", + "delimitadores não-CSV para lista (ex.: `;`)" + ], + "positional_argument_spec": [ + "cada membro coordenada: `x y`; aceita número simples ou range `a..b` em x e/ou y" + ], + "accepted_forms": [ + "`IsInCoordinate 100 120`", + "`IsInCoordinate 100 120, 50..60 30..40`" + ], + "rejected_forms": [ + "`IsInCoordinate prontera 100 120`", + "`IsInCoordinate 100,120`", + "`IsInCoordinate 100 120; 200 220`" + ], + "examples_validated": [ + "IsInCoordinate 100 120", + "IsInCoordinate 100 120, 50..60 30..40" + ], + "examples_rejected": [ + "IsInCoordinate prontera 100 120", + "IsInCoordinate 100,120", + "IsInCoordinate 100 120; 200 220" + ], + "parser_accepts": [ + "pre-filter `[^\\d\\s,.]+` must NOT match", + "then parent CSV member parser with coordinate NumericComparison" + ], + "semantic_validation_accepts": [ + "coordenada atual deve satisfazer algum membro da lista" + ], + "generation_safe_reason": "Contrato lexical fechado: CSV de pares/ranges numéricos sem tokens de mapa/variável.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsInCoordinate.pm:9", + "proof_excerpt": "_parse_syntax rejeita caracteres fora de `[\\d\\s,.]` antes de delegar ao parser pai.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "IsInMapAndCoordinate", + "module": "eventMacro::Condition::IsInMapAndCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsInMapAndCoordinate.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/actor_movement_interrupted", + "packet/high_jump", + "packet/character_moves", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"LastMemberIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 12, + "parse_syntax_line": 16, + "validate_condition_line": 161, + "new_vars_line": 223, + "file": "plugins/eventMacro/eventMacro/Condition/IsInMapAndCoordinate.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax fixa delimitador CSV e aridade interna 1..3 tokens por membro.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+ membros", + "optional_arity": "0", + "tokenization_mode": "csv list of members; each member split by whitespace into 1..3 tokens", + "accepted_separators": [ + "vírgula CSV entre membros (`split(/\\s*,\\s*/)`)", + "whitespace interno para separar tokens map/x/y dentro do membro" + ], + "forbidden_separators": [ + "membro com mais de 3 tokens por whitespace", + "delimitadores não-CSV para lista (ex.: `;`)" + ], + "positional_argument_spec": [ + "cada membro: (a) `map`, ou (b) `x y`, ou (c) `map x y`; `x`/`y` são NumericComparison" + ], + "accepted_forms": [ + "`IsInMapAndCoordinate prontera`", + "`IsInMapAndCoordinate 100 120`", + "`IsInMapAndCoordinate prontera 100 120, geffen 50..60 30..40`" + ], + "rejected_forms": [ + "`IsInMapAndCoordinate` (sem argumento)", + "`IsInMapAndCoordinate prontera 100 120 extra`", + "`IsInMapAndCoordinate prontera;geffen`" + ], + "examples_validated": [ + "IsInMapAndCoordinate prontera", + "IsInMapAndCoordinate 100 120", + "IsInMapAndCoordinate prontera 100 120, geffen 50..60 30..40" + ], + "examples_rejected": [ + "IsInMapAndCoordinate prontera 100 120 extra", + "IsInMapAndCoordinate prontera;geffen" + ], + "parser_accepts": [ + "CSV members via `split(/\\s*,\\s*/)`", + "per member arity `1..3` tokens", + "map literal or user variable; x/y via NumericComparison" + ], + "semantic_validation_accepts": [ + "qualquer membro cujo mapa/coord atual satisfaça todos os validadores definidos" + ], + "generation_safe_reason": "Contrato lexical fechado por regras explícitas de membro (map | x y | map x y).", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsInMapAndCoordinate.pm:16", + "proof_excerpt": "_parse_syntax faz split CSV e exige 1..3 partes por membro; valida map e coord por token.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "IsNotEquippedID", + "module": "eventMacro::Condition::IsNotEquippedID", + "file": "plugins/eventMacro/eventMacro/Condition/IsNotEquippedID.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::IsNotEquippedID", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "inventory_clear", + "equipped_item", + "unequipped_item", + "inventory_ready" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"LastIsEmpty", + "\".$self->{name}.\"LastSlot" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 16, + "validate_condition_line": 178, + "new_vars_line": 223, + "file": "plugins/eventMacro/eventMacro/Condition/IsNotEquippedID.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define membro ` ` e valida slot/id/variáveis explicitamente.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+ membros", + "optional_arity": "0", + "tokenization_mode": "csv list of ` ` members", + "accepted_separators": [ + "vírgula CSV entre membros", + "whitespace entre slot e item_id" + ], + "forbidden_separators": [ + "membro sem slot ou sem id", + "variáveis de sistema", + "slot literal inválido", + "id literal não numérico" + ], + "positional_argument_spec": [ + "cada membro: ` `" + ], + "accepted_forms": [ + "`IsNotEquippedID rightHand 1201`", + "`IsNotEquippedID rightHand 1201, leftHand 1202`", + "`IsNotEquippedID $slotVar $idVar`" + ], + "rejected_forms": [ + "`IsNotEquippedID rightHand`", + "`IsNotEquippedID .sysVar 1201`", + "`IsNotEquippedID rightHand abc`" + ], + "examples_validated": [ + "IsNotEquippedID rightHand 1201", + "IsNotEquippedID rightHand 1201, leftHand 1202", + "IsNotEquippedID $slotVar $idVar" + ], + "examples_rejected": [ + "IsNotEquippedID rightHand", + "IsNotEquippedID .sysVar 1201", + "IsNotEquippedID rightHand abc" + ], + "parser_accepts": [ + "CSV via `split(/\\s*,\\s*/)`", + "per member `split(/\\s+/)` requiring slot+id" + ], + "semantic_validation_accepts": [ + "algum slot alvo vazio ou equipado com item_id diferente do configurado" + ], + "generation_safe_reason": "Contrato lexical fechado por estrutura de membro e validações explícitas.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsNotEquippedID.pm:16", + "proof_excerpt": "_parse_syntax exige slot+id por membro, valida slot em `%equipSlot_rlut` e id numérico/variável.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "IsNotInCoordinate", + "module": "eventMacro::Condition::IsNotInCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInCoordinate.pm", + "base": "eventMacro::Condition::IsInCoordinate", + "ancestry": [ + "eventMacro::Condition::IsNotInCoordinate", + "eventMacro::Condition::IsInCoordinate", + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + ",", + "," + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 10, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInCoordinate.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax proíbe CSV explicitamente e mantém contrato de coordenada única.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1 membro", + "optional_arity": "0", + "tokenization_mode": "single coordinate member (no CSV) with whitespace x/y split", + "accepted_separators": [ + "whitespace interno para separar x/y (e ranges) em um único membro" + ], + "forbidden_separators": [ + "vírgula CSV (explicitamente proibida)", + "delimitadores não-whitespace para x/y" + ], + "positional_argument_spec": [ + "um único membro coordenada: `x y`; aceita número simples ou range `a..b` em x e/ou y" + ], + "accepted_forms": [ + "`IsNotInCoordinate 100 120`", + "`IsNotInCoordinate 50..60 30..40`" + ], + "rejected_forms": [ + "`IsNotInCoordinate 100 120, 50 60`", + "`IsNotInCoordinate prontera 100 120`" + ], + "examples_validated": [ + "IsNotInCoordinate 100 120", + "IsNotInCoordinate 50..60 30..40" + ], + "examples_rejected": [ + "IsNotInCoordinate 100 120, 50 60", + "IsNotInCoordinate prontera 100 120" + ], + "parser_accepts": [ + "comma must NOT appear", + "then IsInCoordinate parser rules apply for single member" + ], + "semantic_validation_accepts": [ + "valida verdadeiro quando coordenada atual não satisfaz o membro configurado" + ], + "generation_safe_reason": "Contrato lexical fechado por regra explícita de \"sem vírgula\" + coordenada única.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsNotInCoordinate.pm:10", + "proof_excerpt": "_parse_syntax rejeita qualquer `,` e delega ao parser de coordenada.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "IsNotInMapAndCoordinate", + "module": "eventMacro::Condition::IsNotInMapAndCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInMapAndCoordinate.pm", + "base": "eventMacro::Condition::IsInMapAndCoordinate", + "ancestry": [ + "eventMacro::Condition::IsNotInMapAndCoordinate", + "eventMacro::Condition::IsInMapAndCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + ",", + "," + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 8, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/IsNotInMapAndCoordinate.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax proíbe CSV explicitamente e delega ao parser já fechado de map/coord.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1 membro", + "optional_arity": "0", + "tokenization_mode": "single map/coordinate member (comma forbidden)", + "accepted_separators": [ + "whitespace interno para tokens do membro único (map|x y|map x y)" + ], + "forbidden_separators": [ + "vírgula CSV (explicitamente proibida)" + ], + "positional_argument_spec": [ + "um único membro: `map`, ou `x y`, ou `map x y` com x/y em NumericComparison" + ], + "accepted_forms": [ + "`IsNotInMapAndCoordinate prontera`", + "`IsNotInMapAndCoordinate 100 120`", + "`IsNotInMapAndCoordinate prontera 100 120`" + ], + "rejected_forms": [ + "`IsNotInMapAndCoordinate prontera 100 120, geffen 50 60`" + ], + "examples_validated": [ + "IsNotInMapAndCoordinate prontera", + "IsNotInMapAndCoordinate 100 120", + "IsNotInMapAndCoordinate prontera 100 120" + ], + "examples_rejected": [ + "IsNotInMapAndCoordinate prontera 100 120, geffen 50 60" + ], + "parser_accepts": [ + "comma must NOT appear; then delegates to IsInMapAndCoordinate parser" + ], + "semantic_validation_accepts": [ + "verdadeiro quando localização atual não corresponde ao membro configurado" + ], + "generation_safe_reason": "Contrato lexical fechado por regra de membro único sem vírgula.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsNotInMapAndCoordinate.pm:8", + "proof_excerpt": "_parse_syntax rejeita `,` e delega para parser de `IsInMapAndCoordinate`.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "JobID", + "module": "eventMacro::Condition::JobID", + "file": "plugins/eventMacro/eventMacro/Condition/JobID.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::JobID", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "sprite_job_change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 63, + "new_vars_line": 88, + "file": "plugins/eventMacro/eventMacro/Condition/JobID.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define lista CSV explícita e valida tipo de cada membro.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre membros (com espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é `\\d+` (job id) ou variável de usuário" + ], + "accepted_forms": [ + "`JobID 1`", + "`JobID 1,2,3`", + "`JobID 1, $jobVar`" + ], + "rejected_forms": [ + "`JobID` (sem argumento)", + "`JobID 1 2`", + "`JobID 1;2`", + "`JobID .sysVar`" + ], + "examples_validated": [ + "JobID 1", + "JobID 1,2,3", + "JobID $desiredJob,2" + ], + "examples_rejected": [ + "JobID 1 2", + "JobID 1;2", + "JobID .someSystemVar" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member token `^\\d+$` or user variable" + ], + "semantic_validation_accepts": [ + "qualquer membro da lista igual ao `jobID` atual do personagem" + ], + "generation_safe_reason": "Contrato lexical fechado: delimitador CSV explícito + tipos de membro explícitos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/JobID.pm:14", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e aceita somente `^\\d+$` ou variável de usuário por membro.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "JobIDNot", + "module": "eventMacro::Condition::JobIDNot", + "file": "plugins/eventMacro/eventMacro/Condition/JobIDNot.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::JobIDNot", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "sprite_job_change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(\\d+)$", + "^(\\d+)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": 14, + "validate_condition_line": 45, + "new_vars_line": 59, + "file": "plugins/eventMacro/eventMacro/Condition/JobIDNot.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax aceita apenas 1 token numérico ou variável de usuário.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1", + "optional_arity": "0", + "tokenization_mode": "single token (numeric id or variable)", + "accepted_separators": [ + "nenhum (token único)" + ], + "forbidden_separators": [ + "vírgula CSV", + "whitespace posicional com múltiplos argumentos" + ], + "positional_argument_spec": [ + "arg1: `\\d+` (job id) ou variável de usuário" + ], + "accepted_forms": [ + "`JobIDNot 1`", + "`JobIDNot $blockedJob`" + ], + "rejected_forms": [ + "`JobIDNot` (sem argumento)", + "`JobIDNot 1,2`", + "`JobIDNot .sysVar`", + "`JobIDNot abc`" + ], + "examples_validated": [ + "JobIDNot 1", + "JobIDNot $blockedJob" + ], + "examples_rejected": [ + "JobIDNot 1,2", + "JobIDNot .someSystemVar", + "JobIDNot abc" + ], + "parser_accepts": [ + "single token matching `^(\\d+)$` or user variable" + ], + "semantic_validation_accepts": [ + "valor resolvido deve ser diferente do `jobID` atual do personagem" + ], + "generation_safe_reason": "Contrato lexical fechado por regex numérica/variável com aridade fixa 1.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/JobIDNot.pm:14", + "proof_excerpt": "_parse_syntax aceita somente `^(\\d+)$` ou variável de usuário; rejeita demais formas.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "JobLevel", + "module": "eventMacro::Condition::JobLevel", + "file": "plugins/eventMacro/eventMacro/Condition/JobLevel.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::JobLevel", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "job_level_changed", + "Network::Receive::map_changed", + "in_game", + "packet/stat_info" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 27, + "file": "plugins/eventMacro/eventMacro/Condition/JobLevel.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/JobLevel.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "LocalMsg", + "module": "eventMacro::Condition::LocalMsg", + "file": "plugins/eventMacro/eventMacro/Condition/LocalMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::LocalMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/LocalMsg.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/LocalMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "MapLoaded", + "module": "eventMacro::Condition::MapLoaded", + "file": "plugins/eventMacro/eventMacro/Condition/MapLoaded.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::MapLoaded", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "packet_mapChange" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 13, + "new_vars_line": 24, + "file": "plugins/eventMacro/eventMacro/Condition/MapLoaded.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": "1..N members", + "tokenization_mode": "comma separated list", + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "positional_argument_spec": [ + "member_i: token or positional tuple depending on condition implementation" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "examples_validated": [ + " member1, member2, ..." + ], + "examples_rejected": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "parser_accepts": [ + "csv list split" + ], + "semantic_validation_accepts": [ + "member-level numeric/variable checks" + ], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/MapLoaded.pm:-1", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "MaxHP", + "module": "eventMacro::Condition::MaxHP", + "file": "plugins/eventMacro/eventMacro/Condition/MaxHP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::MaxHP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/MaxHP.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/MaxHP.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "MaxSP", + "module": "eventMacro::Condition::MaxSP", + "file": "plugins/eventMacro/eventMacro/Condition/MaxSP.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::MaxSP", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Network::Receive::map_changed", + "in_game", + "packet/stat_info", + "packet/hp_sp_changed" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 26, + "file": "plugins/eventMacro/eventMacro/Condition/MaxSP.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/MaxSP.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "MobNear", + "module": "eventMacro::Condition::MobNear", + "file": "plugins/eventMacro/eventMacro/Condition/MobNear.pm", + "base": "eventMacro::Condition::Base::ActorNear", + "ancestry": [ + "eventMacro::Condition::MobNear", + "eventMacro::Condition::Base::ActorNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Id", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 17, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/MobNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/MobNear.pm:17", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=17", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "MobNearCount", + "module": "eventMacro::Condition::MobNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/MobNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::MobNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 20, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/MobNearCount.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/MobNearCount.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "MobNearDist", + "module": "eventMacro::Condition::MobNearDist", + "file": "plugins/eventMacro/eventMacro/Condition/MobNearDist.pm", + "base": "eventMacro::Condition::Base::ActorNearDist", + "ancestry": [ + "eventMacro::Condition::MobNearDist", + "eventMacro::Condition::Base::ActorNearDist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Id", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 25, + "validate_condition_line": 34, + "new_vars_line": 67, + "file": "plugins/eventMacro/eventMacro/Condition/MobNearDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::ActorNearDist fixa nome regex + distância numérica.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + numeric comparison (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regex e distância", + "omitir whitespace entre regex e distância" + ], + "positional_argument_spec": [ + "arg1: regex de nome `/.../flags?`", + "arg2: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`MobNearDist /^Poring$/ <=6`", + "`MobNearDist /Alice|Bob/ 3..10`" + ], + "rejected_forms": [ + "`MobNearDist` (sem argumentos)", + "`MobNearDist /^Poring$/` (sem distância)", + "`MobNearDist Poring <=6` (regex sem delimitador `/`)" + ], + "examples_validated": [ + "MobNearDist /^Poring$/ <=6", + "MobNearDist /Alice|Bob/ 3..10" + ], + "examples_rejected": [ + "MobNearDist /^Poring$/", + "MobNearDist Poring <=6" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para nome + NumericComparison para distância" + ], + "semantic_validation_accepts": [ + "ator próximo cujo nome casa regex e distância ao personagem casa comparação" + ], + "generation_safe_reason": "Contrato lexical fechado por parse regex e validadores explícitos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/MobNearDist.pm:25", + "proof_excerpt": "Base::ActorNearDist::_parse_syntax exige `name regex + distance comparison` e valida com RegexCheck + NumericComparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "MobNotNear", + "module": "eventMacro::Condition::MobNotNear", + "file": "plugins/eventMacro/eventMacro/Condition/MobNotNear.pm", + "base": "eventMacro::Condition::Base::ActorNotNear", + "ancestry": [ + "eventMacro::Condition::MobNotNear", + "eventMacro::Condition::Base::ActorNotNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/MobNotNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/MobNotNear.pm:16", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=16", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NoMobNear", + "module": "eventMacro::Condition::NoMobNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoMobNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoMobNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoMobNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Contrato lexical explícito de aridade livre/ignorada pelo parser base.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "0+", + "optional_arity": "livre/ignorada", + "tokenization_mode": "no-argument semantic condition (tail ignored by parser)", + "accepted_separators": [ + "nenhum obrigatório; eventuais tokens após nome são ignorados pelo parser base" + ], + "forbidden_separators": [ + "nenhum delimitador lexical específico (tail é ignorada)" + ], + "positional_argument_spec": [ + "sem argumentos obrigatórios; tail opcional é ignorada" + ], + "accepted_forms": [ + "`NoMobNear`", + "`NoMobNear anything`" + ], + "rejected_forms": [ + "nenhuma forma lexical estritamente rejeitada pelo _parse_syntax base" + ], + "examples_validated": [ + "NoMobNear", + "NoMobNear anything" + ], + "examples_rejected": [ + "N/A: parser base ignora o condition_code" + ], + "parser_accepts": [ + "_parse_syntax em Base::NoActorNear ignora argumentos e retorna sucesso" + ], + "semantic_validation_accepts": [ + "verdadeiro quando não há atores do tipo alvo próximos após standby" + ], + "generation_safe_reason": "Contrato lexical completo no modo no-arg com tail ignorada.", + "generation_block_reason": "", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NoMobNear.pm:-1", + "proof_excerpt": "Base::NoActorNear::_parse_syntax não consome `condition_code`; apenas inicializa estado e retorna 1.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NoNpcNear", + "module": "eventMacro::Condition::NoNpcNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoNpcNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoNpcNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoNpcNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Contrato lexical explícito de aridade livre/ignorada pelo parser base.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "0+", + "optional_arity": "livre/ignorada", + "tokenization_mode": "no-argument semantic condition (tail ignored by parser)", + "accepted_separators": [ + "nenhum obrigatório; eventuais tokens após nome são ignorados pelo parser base" + ], + "forbidden_separators": [ + "nenhum delimitador lexical específico (tail é ignorada)" + ], + "positional_argument_spec": [ + "sem argumentos obrigatórios; tail opcional é ignorada" + ], + "accepted_forms": [ + "NoNpcNear", + "NoNpcNear anything" + ], + "rejected_forms": [ + "nenhuma forma lexical estritamente rejeitada pelo _parse_syntax base" + ], + "examples_validated": [ + "NoNpcNear", + "NoNpcNear anything" + ], + "examples_rejected": [ + "N/A: parser base ignora o condition_code" + ], + "parser_accepts": [ + "_parse_syntax em Base::NoActorNear ignora argumentos e retorna sucesso" + ], + "semantic_validation_accepts": [ + "verdadeiro quando não há NPCs próximos após standby" + ], + "generation_safe_reason": "Contrato lexical completo no modo no-arg com tail ignorada.", + "generation_block_reason": "", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NoNpcNear.pm:-1", + "proof_excerpt": "Base::NoActorNear::_parse_syntax não consome `condition_code`; apenas inicializa estado e retorna 1.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NoPlayerNear", + "module": "eventMacro::Condition::NoPlayerNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoPlayerNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoPlayerNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoPlayerNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Contrato lexical explícito de aridade livre/ignorada pelo parser base.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "0+", + "optional_arity": "livre/ignorada", + "tokenization_mode": "no-argument semantic condition (tail ignored by parser)", + "accepted_separators": [ + "nenhum obrigatório; eventuais tokens após nome são ignorados pelo parser base" + ], + "forbidden_separators": [ + "nenhum delimitador lexical específico (tail é ignorada)" + ], + "positional_argument_spec": [ + "sem argumentos obrigatórios; tail opcional é ignorada" + ], + "accepted_forms": [ + "NoPlayerNear", + "NoPlayerNear anything" + ], + "rejected_forms": [ + "nenhuma forma lexical estritamente rejeitada pelo _parse_syntax base" + ], + "examples_validated": [ + "NoPlayerNear", + "NoPlayerNear anything" + ], + "examples_rejected": [ + "N/A: parser base ignora o condition_code" + ], + "parser_accepts": [ + "_parse_syntax em Base::NoActorNear ignora argumentos e retorna sucesso" + ], + "semantic_validation_accepts": [ + "verdadeiro quando não há jogadores próximos após standby" + ], + "generation_safe_reason": "Contrato lexical completo no modo no-arg com tail ignorada.", + "generation_block_reason": "", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NoPlayerNear.pm:-1", + "proof_excerpt": "Base::NoActorNear::_parse_syntax não consome `condition_code`; apenas inicializa estado e retorna 1.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NoPortalNear", + "module": "eventMacro::Condition::NoPortalNear", + "file": "plugins/eventMacro/eventMacro/Condition/NoPortalNear.pm", + "base": "eventMacro::Condition::Base::NoActorNear", + "ancestry": [ + "eventMacro::Condition::NoPortalNear", + "eventMacro::Condition::Base::NoActorNear", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoPortalNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Contrato lexical explícito de aridade livre/ignorada pelo parser base.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "0+", + "optional_arity": "livre/ignorada", + "tokenization_mode": "no-argument semantic condition (tail ignored by parser)", + "accepted_separators": [ + "nenhum obrigatório; eventuais tokens após nome são ignorados pelo parser base" + ], + "forbidden_separators": [ + "nenhum delimitador lexical específico (tail é ignorada)" + ], + "positional_argument_spec": [ + "sem argumentos obrigatórios; tail opcional é ignorada" + ], + "accepted_forms": [ + "NoPortalNear", + "NoPortalNear anything" + ], + "rejected_forms": [ + "nenhuma forma lexical estritamente rejeitada pelo _parse_syntax base" + ], + "examples_validated": [ + "NoPortalNear", + "NoPortalNear anything" + ], + "examples_rejected": [ + "N/A: parser base ignora o condition_code" + ], + "parser_accepts": [ + "_parse_syntax em Base::NoActorNear ignora argumentos e retorna sucesso" + ], + "semantic_validation_accepts": [ + "verdadeiro quando não há portais próximos após standby" + ], + "generation_safe_reason": "Contrato lexical completo no modo no-arg com tail ignorada.", + "generation_block_reason": "", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NoPortalNear.pm:-1", + "proof_excerpt": "Base::NoActorNear::_parse_syntax não consome `condition_code`; apenas inicializa estado e retorna 1.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NotInMap", + "module": "eventMacro::Condition::NotInMap", + "file": "plugins/eventMacro/eventMacro/Condition/NotInMap.pm", + "base": "eventMacro::Condition::InMap", + "ancestry": [ + "eventMacro::Condition::NotInMap", + "eventMacro::Condition::InMap", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [ + ",", + "," + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 7, + "validate_condition_line": 18, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NotInMap.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": "1..N members", + "tokenization_mode": "comma separated list", + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "positional_argument_spec": [ + "member_i: token or positional tuple depending on condition implementation" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "examples_validated": [ + " member1, member2, ..." + ], + "examples_rejected": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "parser_accepts": [ + "csv list split" + ], + "semantic_validation_accepts": [ + "member-level numeric/variable checks" + ], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NotInMap.pm:7", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=7", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NpcMsg", + "module": "eventMacro::Condition::NpcMsg", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::NpcMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsg.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NpcMsgDist", + "module": "eventMacro::Condition::NpcMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::NpcMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgDist fixa 2 segmentos obrigatórios (regex + numeric comparison).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + numeric comparison (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regex e distância", + "omitir whitespace entre regex e distância" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem no formato `/.../flags?`", + "arg2: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`NpcMsgDist /hello/i <=5`", + "`NpcMsgDist /^warp$/ 3..8`" + ], + "rejected_forms": [ + "`NpcMsgDist` (sem argumentos)", + "`NpcMsgDist /hello/i` (sem distância)", + "`NpcMsgDist hello <=5` (regex sem delimitador `/`)" + ], + "examples_validated": [ + "NpcMsgDist /hello/i <=5", + "NpcMsgDist /^warp$/ 3..8" + ], + "examples_rejected": [ + "NpcMsgDist /hello/i", + "NpcMsgDist hello <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + NumericComparison para distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex e distância do ator fonte deve casar comparação numérica" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e validadores explícitos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcMsgDist.pm:16", + "proof_excerpt": "Base::MsgDist::_parse_syntax exige `^(\\/.*?\\/\\w?)\\s+(.*?)$` e valida com RegexCheck + NumericComparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NpcMsgName", + "module": "eventMacro::Condition::NpcMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::NpcMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgName.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgName fixa 2 regexes obrigatórias.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regexes", + "omitir whitespace entre as duas regexes" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`" + ], + "accepted_forms": [ + "`NpcMsgName /hello/i /^Alice$/`", + "`NpcMsgName /trade/ /Bob|Carol/`" + ], + "rejected_forms": [ + "`NpcMsgName` (sem argumentos)", + "`NpcMsgName /hello/i` (sem regex de nome)", + "`NpcMsgName hello /^Alice$/` (regex de mensagem inválida)" + ], + "examples_validated": [ + "NpcMsgName /hello/i /^Alice$/", + "NpcMsgName /trade/ /Bob|Carol/" + ], + "examples_rejected": [ + "NpcMsgName /hello/i", + "NpcMsgName hello /^Alice$/" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + RegexCheck para nome" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e regex do nome da fonte" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e duplo RegexCheck.", + "generation_block_reason": "", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcMsgName.pm:-1", + "proof_excerpt": "Base::MsgName::_parse_syntax exige mensagem regex + name regex e valida ambos com RegexCheck.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NpcMsgNameDist", + "module": "eventMacro::Condition::NpcMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::NpcMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgNameDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgNameDist fixa 3 segmentos obrigatórios com validadores explícitos.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "3", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal + numeric comparison", + "accepted_separators": [ + "um ou mais espaços entre ``, `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV para separar os 3 componentes", + "omitir qualquer componente obrigatório" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`", + "arg3: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`NpcMsgNameDist /hello/i /^Alice$/ <=5`", + "`NpcMsgNameDist /trade/ /Bob|Carol/ 3..8`" + ], + "rejected_forms": [ + "`NpcMsgNameDist` (sem argumentos)", + "`NpcMsgNameDist /hello/i /^Alice$/` (sem distância)", + "`NpcMsgNameDist hello /^Alice$/ <=5` (regex de mensagem inválida)" + ], + "examples_validated": [ + "NpcMsgNameDist /hello/i /^Alice$/ <=5", + "NpcMsgNameDist /trade/ /Bob|Carol/ 3..8" + ], + "examples_rejected": [ + "NpcMsgNameDist /hello/i /^Alice$/", + "NpcMsgNameDist hello /^Alice$/ <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck mensagem + RegexCheck nome + NumericComparison distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e do nome, e distância do ator fonte deve casar comparação" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e trio de validadores.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcMsgNameDist.pm:16", + "proof_excerpt": "Base::MsgNameDist::_parse_syntax exige mensagem regex + nome regex + numeric comparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NpcNear", + "module": "eventMacro::Condition::NpcNear", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNear.pm", + "base": "eventMacro::Condition::Base::ActorNear", + "ancestry": [ + "eventMacro::Condition::NpcNear", + "eventMacro::Condition::Base::ActorNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 17, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcNear.pm:17", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=17", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NpcNearCount", + "module": "eventMacro::Condition::NpcNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::NpcNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearCount.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcNearCount.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NpcNearDist", + "module": "eventMacro::Condition::NpcNearDist", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearDist.pm", + "base": "eventMacro::Condition::Base::ActorNearDist", + "ancestry": [ + "eventMacro::Condition::NpcNearDist", + "eventMacro::Condition::Base::ActorNearDist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 25, + "validate_condition_line": 34, + "new_vars_line": 67, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNearDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::ActorNearDist fixa nome regex + distância numérica.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + numeric comparison (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regex e distância", + "omitir whitespace entre regex e distância" + ], + "positional_argument_spec": [ + "arg1: regex de nome `/.../flags?`", + "arg2: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`NpcNearDist /^Poring$/ <=6`", + "`NpcNearDist /Alice|Bob/ 3..10`" + ], + "rejected_forms": [ + "`NpcNearDist` (sem argumentos)", + "`NpcNearDist /^Poring$/` (sem distância)", + "`NpcNearDist Poring <=6` (regex sem delimitador `/`)" + ], + "examples_validated": [ + "NpcNearDist /^Poring$/ <=6", + "NpcNearDist /Alice|Bob/ 3..10" + ], + "examples_rejected": [ + "NpcNearDist /^Poring$/", + "NpcNearDist Poring <=6" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para nome + NumericComparison para distância" + ], + "semantic_validation_accepts": [ + "ator próximo cujo nome casa regex e distância ao personagem casa comparação" + ], + "generation_safe_reason": "Contrato lexical fechado por parse regex e validadores explícitos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcNearDist.pm:25", + "proof_excerpt": "Base::ActorNearDist::_parse_syntax exige `name regex + distance comparison` e valida com RegexCheck + NumericComparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "NpcNotNear", + "module": "eventMacro::Condition::NpcNotNear", + "file": "plugins/eventMacro/eventMacro/Condition/NpcNotNear.pm", + "base": "eventMacro::Condition::Base::ActorNotNear", + "ancestry": [ + "eventMacro::Condition::NpcNotNear", + "eventMacro::Condition::Base::ActorNotNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcNotNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcNotNear.pm:16", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=16", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "OnCharLogIn", + "module": "eventMacro::Condition::OnCharLogIn", + "file": "plugins/eventMacro/eventMacro/Condition/OnCharLogIn.pm", + "base": "eventMacro::Conditiontypes::SimpleEvent", + "ancestry": [ + "eventMacro::Condition::OnCharLogIn", + "eventMacro::Conditiontypes::SimpleEvent", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "in_game" + ], + "parser_mode": "simple_event", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": -1, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/OnCharLogIn.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Condition sem argumentos com gatilho simples.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 0, + "optional_arity": 0, + "tokenization_mode": "event keyword only", + "accepted_separators": [ + "none" + ], + "forbidden_separators": [ + "comma separated args", + "inline positional args" + ], + "positional_argument_spec": [], + "accepted_forms": [ + " (no arguments)" + ], + "rejected_forms": [ + " anything" + ], + "examples_validated": [ + " (no arguments)" + ], + "examples_rejected": [ + " anything" + ], + "parser_accepts": [ + "bare event condition" + ], + "semantic_validation_accepts": [ + "hook trigger only" + ], + "generation_safe_reason": "Condition sem argumentos com gatilho simples.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/OnCharLogIn.pm:-1", + "proof_excerpt": "parser_mode=simple_event; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PartyMsg", + "module": "eventMacro::Condition::PartyMsg", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::PartyMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsg.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PartyMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PartyMsgDist", + "module": "eventMacro::Condition::PartyMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::PartyMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgDist fixa 2 segmentos obrigatórios (regex + numeric comparison).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + numeric comparison (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regex e distância", + "omitir whitespace entre regex e distância" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem no formato `/.../flags?`", + "arg2: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`PartyMsgDist /hello/i <=5`", + "`PartyMsgDist /^warp$/ 3..8`" + ], + "rejected_forms": [ + "`PartyMsgDist` (sem argumentos)", + "`PartyMsgDist /hello/i` (sem distância)", + "`PartyMsgDist hello <=5` (regex sem delimitador `/`)" + ], + "examples_validated": [ + "PartyMsgDist /hello/i <=5", + "PartyMsgDist /^warp$/ 3..8" + ], + "examples_rejected": [ + "PartyMsgDist /hello/i", + "PartyMsgDist hello <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + NumericComparison para distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex e distância do ator fonte deve casar comparação numérica" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e validadores explícitos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PartyMsgDist.pm:16", + "proof_excerpt": "Base::MsgDist::_parse_syntax exige `^(\\/.*?\\/\\w?)\\s+(.*?)$` e valida com RegexCheck + NumericComparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PartyMsgName", + "module": "eventMacro::Condition::PartyMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::PartyMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgName.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgName fixa 2 regexes obrigatórias.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regexes", + "omitir whitespace entre as duas regexes" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`" + ], + "accepted_forms": [ + "`PartyMsgName /hello/i /^Alice$/`", + "`PartyMsgName /trade/ /Bob|Carol/`" + ], + "rejected_forms": [ + "`PartyMsgName` (sem argumentos)", + "`PartyMsgName /hello/i` (sem regex de nome)", + "`PartyMsgName hello /^Alice$/` (regex de mensagem inválida)" + ], + "examples_validated": [ + "PartyMsgName /hello/i /^Alice$/", + "PartyMsgName /trade/ /Bob|Carol/" + ], + "examples_rejected": [ + "PartyMsgName /hello/i", + "PartyMsgName hello /^Alice$/" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + RegexCheck para nome" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e regex do nome da fonte" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e duplo RegexCheck.", + "generation_block_reason": "", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PartyMsgName.pm:-1", + "proof_excerpt": "Base::MsgName::_parse_syntax exige mensagem regex + name regex e valida ambos com RegexCheck.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PartyMsgNameDist", + "module": "eventMacro::Condition::PartyMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::PartyMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgNameDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgNameDist fixa 3 segmentos obrigatórios com validadores explícitos.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "3", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal + numeric comparison", + "accepted_separators": [ + "um ou mais espaços entre ``, `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV para separar os 3 componentes", + "omitir qualquer componente obrigatório" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`", + "arg3: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`PartyMsgNameDist /hello/i /^Alice$/ <=5`", + "`PartyMsgNameDist /trade/ /Bob|Carol/ 3..8`" + ], + "rejected_forms": [ + "`PartyMsgNameDist` (sem argumentos)", + "`PartyMsgNameDist /hello/i /^Alice$/` (sem distância)", + "`PartyMsgNameDist hello /^Alice$/ <=5` (regex de mensagem inválida)" + ], + "examples_validated": [ + "PartyMsgNameDist /hello/i /^Alice$/ <=5", + "PartyMsgNameDist /trade/ /Bob|Carol/ 3..8" + ], + "examples_rejected": [ + "PartyMsgNameDist /hello/i /^Alice$/", + "PartyMsgNameDist hello /^Alice$/ <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck mensagem + RegexCheck nome + NumericComparison distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e do nome, e distância do ator fonte deve casar comparação" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e trio de validadores.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PartyMsgNameDist.pm:16", + "proof_excerpt": "Base::MsgNameDist::_parse_syntax exige mensagem regex + nome regex + numeric comparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PlayerNear", + "module": "eventMacro::Condition::PlayerNear", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNear.pm", + "base": "eventMacro::Condition::Base::ActorNear", + "ancestry": [ + "eventMacro::Condition::PlayerNear", + "eventMacro::Condition::Base::ActorNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"AccountId", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Job", + "\".$self->{name}.\"Last\".\"Level", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 17, + "validate_condition_line": 25, + "new_vars_line": 49, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PlayerNear.pm:17", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=17", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PlayerNearCount", + "module": "eventMacro::Condition::PlayerNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::PlayerNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 10, + "parse_syntax_line": -1, + "validate_condition_line": 23, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearCount.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PlayerNearCount.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PlayerNearDist", + "module": "eventMacro::Condition::PlayerNearDist", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearDist.pm", + "base": "eventMacro::Condition::Base::ActorNearDist", + "ancestry": [ + "eventMacro::Condition::PlayerNearDist", + "eventMacro::Condition::Base::ActorNearDist", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"AccountId", + "\".$self->{name}.\"Last\".\"BinId", + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Job", + "\".$self->{name}.\"Last\".\"Level", + "\".$self->{name}.\"Last\".\"Pos" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 25, + "validate_condition_line": 34, + "new_vars_line": 67, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNearDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::ActorNearDist fixa nome regex + distância numérica.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + numeric comparison (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regex e distância", + "omitir whitespace entre regex e distância" + ], + "positional_argument_spec": [ + "arg1: regex de nome `/.../flags?`", + "arg2: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`PlayerNearDist /^Poring$/ <=6`", + "`PlayerNearDist /Alice|Bob/ 3..10`" + ], + "rejected_forms": [ + "`PlayerNearDist` (sem argumentos)", + "`PlayerNearDist /^Poring$/` (sem distância)", + "`PlayerNearDist Poring <=6` (regex sem delimitador `/`)" + ], + "examples_validated": [ + "PlayerNearDist /^Poring$/ <=6", + "PlayerNearDist /Alice|Bob/ 3..10" + ], + "examples_rejected": [ + "PlayerNearDist /^Poring$/", + "PlayerNearDist Poring <=6" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para nome + NumericComparison para distância" + ], + "semantic_validation_accepts": [ + "ator próximo cujo nome casa regex e distância ao personagem casa comparação" + ], + "generation_safe_reason": "Contrato lexical fechado por parse regex e validadores explícitos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PlayerNearDist.pm:25", + "proof_excerpt": "Base::ActorNearDist::_parse_syntax exige `name regex + distance comparison` e valida com RegexCheck + NumericComparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PlayerNotNear", + "module": "eventMacro::Condition::PlayerNotNear", + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNotNear.pm", + "base": "eventMacro::Condition::Base::ActorNotNear", + "ancestry": [ + "eventMacro::Condition::PlayerNotNear", + "eventMacro::Condition::Base::ActorNotNear", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PlayerNotNear.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PlayerNotNear.pm:16", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=16", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PortalNearCount", + "module": "eventMacro::Condition::PortalNearCount", + "file": "plugins/eventMacro/eventMacro/Condition/PortalNearCount.pm", + "base": "eventMacro::Condition::Base::ActorNearCount", + "ancestry": [ + "eventMacro::Condition::PortalNearCount", + "eventMacro::Condition::Base::ActorNearCount", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PortalNearCount.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PortalNearCount.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PrivMsg", + "module": "eventMacro::Condition::PrivMsg", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::PrivMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsg.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PrivMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PrivMsgDist", + "module": "eventMacro::Condition::PrivMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::PrivMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgDist fixa 2 segmentos obrigatórios (regex + numeric comparison).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + numeric comparison (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regex e distância", + "omitir whitespace entre regex e distância" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem no formato `/.../flags?`", + "arg2: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`PrivMsgDist /hello/i <=5`", + "`PrivMsgDist /^warp$/ 3..8`" + ], + "rejected_forms": [ + "`PrivMsgDist` (sem argumentos)", + "`PrivMsgDist /hello/i` (sem distância)", + "`PrivMsgDist hello <=5` (regex sem delimitador `/`)" + ], + "examples_validated": [ + "PrivMsgDist /hello/i <=5", + "PrivMsgDist /^warp$/ 3..8" + ], + "examples_rejected": [ + "PrivMsgDist /hello/i", + "PrivMsgDist hello <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + NumericComparison para distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex e distância do ator fonte deve casar comparação numérica" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e validadores explícitos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PrivMsgDist.pm:16", + "proof_excerpt": "Base::MsgDist::_parse_syntax exige `^(\\/.*?\\/\\w?)\\s+(.*?)$` e valida com RegexCheck + NumericComparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PrivMsgName", + "module": "eventMacro::Condition::PrivMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::PrivMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgName.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgName fixa 2 regexes obrigatórias.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regexes", + "omitir whitespace entre as duas regexes" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`" + ], + "accepted_forms": [ + "`PrivMsgName /hello/i /^Alice$/`", + "`PrivMsgName /trade/ /Bob|Carol/`" + ], + "rejected_forms": [ + "`PrivMsgName` (sem argumentos)", + "`PrivMsgName /hello/i` (sem regex de nome)", + "`PrivMsgName hello /^Alice$/` (regex de mensagem inválida)" + ], + "examples_validated": [ + "PrivMsgName /hello/i /^Alice$/", + "PrivMsgName /trade/ /Bob|Carol/" + ], + "examples_rejected": [ + "PrivMsgName /hello/i", + "PrivMsgName hello /^Alice$/" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + RegexCheck para nome" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e regex do nome da fonte" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e duplo RegexCheck.", + "generation_block_reason": "", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PrivMsgName.pm:-1", + "proof_excerpt": "Base::MsgName::_parse_syntax exige mensagem regex + name regex e valida ambos com RegexCheck.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PrivMsgNameDist", + "module": "eventMacro::Condition::PrivMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::PrivMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgNameDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgNameDist fixa 3 segmentos obrigatórios com validadores explícitos.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "3", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal + numeric comparison", + "accepted_separators": [ + "um ou mais espaços entre ``, `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV para separar os 3 componentes", + "omitir qualquer componente obrigatório" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`", + "arg3: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`PrivMsgNameDist /hello/i /^Alice$/ <=5`", + "`PrivMsgNameDist /trade/ /Bob|Carol/ 3..8`" + ], + "rejected_forms": [ + "`PrivMsgNameDist` (sem argumentos)", + "`PrivMsgNameDist /hello/i /^Alice$/` (sem distância)", + "`PrivMsgNameDist hello /^Alice$/ <=5` (regex de mensagem inválida)" + ], + "examples_validated": [ + "PrivMsgNameDist /hello/i /^Alice$/ <=5", + "PrivMsgNameDist /trade/ /Bob|Carol/ 3..8" + ], + "examples_rejected": [ + "PrivMsgNameDist /hello/i /^Alice$/", + "PrivMsgNameDist hello /^Alice$/ <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck mensagem + RegexCheck nome + NumericComparison distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e do nome, e distância do ator fonte deve casar comparação" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e trio de validadores.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PrivMsgNameDist.pm:16", + "proof_excerpt": "Base::MsgNameDist::_parse_syntax exige mensagem regex + nome regex + numeric comparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PubMsg", + "module": "eventMacro::Condition::PubMsg", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::PubMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsg.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PubMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PubMsgDist", + "module": "eventMacro::Condition::PubMsgDist", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgDist.pm", + "base": "eventMacro::Condition::Base::MsgDist", + "ancestry": [ + "eventMacro::Condition::PubMsgDist", + "eventMacro::Condition::Base::MsgDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgDist fixa 2 segmentos obrigatórios (regex + numeric comparison).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + numeric comparison (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regex e distância", + "omitir whitespace entre regex e distância" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem no formato `/.../flags?`", + "arg2: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`PubMsgDist /hello/i <=5`", + "`PubMsgDist /^warp$/ 3..8`" + ], + "rejected_forms": [ + "`PubMsgDist` (sem argumentos)", + "`PubMsgDist /hello/i` (sem distância)", + "`PubMsgDist hello <=5` (regex sem delimitador `/`)" + ], + "examples_validated": [ + "PubMsgDist /hello/i <=5", + "PubMsgDist /^warp$/ 3..8" + ], + "examples_rejected": [ + "PubMsgDist /hello/i", + "PubMsgDist hello <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + NumericComparison para distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex e distância do ator fonte deve casar comparação numérica" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e validadores explícitos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PubMsgDist.pm:16", + "proof_excerpt": "Base::MsgDist::_parse_syntax exige `^(\\/.*?\\/\\w?)\\s+(.*?)$` e valida com RegexCheck + NumericComparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PubMsgName", + "module": "eventMacro::Condition::PubMsgName", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgName.pm", + "base": "eventMacro::Condition::Base::MsgName", + "ancestry": [ + "eventMacro::Condition::PubMsgName", + "eventMacro::Condition::Base::MsgName", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgName.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgName fixa 2 regexes obrigatórias.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal (whitespace separated)", + "accepted_separators": [ + "um ou mais espaços entre `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV entre regexes", + "omitir whitespace entre as duas regexes" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`" + ], + "accepted_forms": [ + "`PubMsgName /hello/i /^Alice$/`", + "`PubMsgName /trade/ /Bob|Carol/`" + ], + "rejected_forms": [ + "`PubMsgName` (sem argumentos)", + "`PubMsgName /hello/i` (sem regex de nome)", + "`PubMsgName hello /^Alice$/` (regex de mensagem inválida)" + ], + "examples_validated": [ + "PubMsgName /hello/i /^Alice$/", + "PubMsgName /trade/ /Bob|Carol/" + ], + "examples_rejected": [ + "PubMsgName /hello/i", + "PubMsgName hello /^Alice$/" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck para mensagem + RegexCheck para nome" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e regex do nome da fonte" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e duplo RegexCheck.", + "generation_block_reason": "", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PubMsgName.pm:-1", + "proof_excerpt": "Base::MsgName::_parse_syntax exige mensagem regex + name regex e valida ambos com RegexCheck.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "PubMsgNameDist", + "module": "eventMacro::Condition::PubMsgNameDist", + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgNameDist.pm", + "base": "eventMacro::Condition::Base::MsgNameDist", + "ancestry": [ + "eventMacro::Condition::PubMsgNameDist", + "eventMacro::Condition::Base::MsgNameDist", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 16, + "validate_condition_line": 24, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgNameDist.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax em Base::MsgNameDist fixa 3 segmentos obrigatórios com validadores explícitos.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "3", + "optional_arity": "0", + "tokenization_mode": "regex literal + regex literal + numeric comparison", + "accepted_separators": [ + "um ou mais espaços entre ``, `` e ``" + ], + "forbidden_separators": [ + "vírgula CSV para separar os 3 componentes", + "omitir qualquer componente obrigatório" + ], + "positional_argument_spec": [ + "arg1: regex de mensagem `/.../flags?`", + "arg2: regex de nome `/.../flags?`", + "arg3: expressão NumericComparison de distância" + ], + "accepted_forms": [ + "`PubMsgNameDist /hello/i /^Alice$/ <=5`", + "`PubMsgNameDist /trade/ /Bob|Carol/ 3..8`" + ], + "rejected_forms": [ + "`PubMsgNameDist` (sem argumentos)", + "`PubMsgNameDist /hello/i /^Alice$/` (sem distância)", + "`PubMsgNameDist hello /^Alice$/ <=5` (regex de mensagem inválida)" + ], + "examples_validated": [ + "PubMsgNameDist /hello/i /^Alice$/ <=5", + "PubMsgNameDist /trade/ /Bob|Carol/ 3..8" + ], + "examples_rejected": [ + "PubMsgNameDist /hello/i /^Alice$/", + "PubMsgNameDist hello /^Alice$/ <=5" + ], + "parser_accepts": [ + "`^(\\/.*?\\/\\w?)\\s+(\\/.*?\\/\\w?)\\s+(.*?)$`", + "RegexCheck mensagem + RegexCheck nome + NumericComparison distância" + ], + "semantic_validation_accepts": [ + "evento de mensagem deve casar regex da mensagem e do nome, e distância do ator fonte deve casar comparação" + ], + "generation_safe_reason": "Contrato lexical fechado por regex de parse e trio de validadores.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/PubMsgNameDist.pm:16", + "proof_excerpt": "Base::MsgNameDist::_parse_syntax exige mensagem regex + nome regex + numeric comparison.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestActive", + "module": "eventMacro::Condition::QuestActive", + "file": "plugins/eventMacro/eventMacro/Condition/QuestActive.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestActive", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 81, + "new_vars_line": 103, + "file": "plugins/eventMacro/eventMacro/Condition/QuestActive.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e tipo de membro (`\\d+` ou variável de usuário).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre IDs de quest (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é quest ID (`\\d+`) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`QuestActive 1001`", + "`QuestActive 1001,1002`", + "`QuestActive $questID,1002`" + ], + "rejected_forms": [ + "`QuestActive` (sem argumento)", + "`QuestActive abc`", + "`QuestActive .sysVar`", + "`QuestActive 1001 1002`" + ], + "examples_validated": [ + "QuestActive 1001", + "QuestActive 1001,1002", + "QuestActive $questID,1002" + ], + "examples_rejected": [ + "QuestActive abc", + "QuestActive .someSystemVar", + "QuestActive 1001 1002" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member token `^\\d+$` or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "algum ID listado está ativo na quest list" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de quest IDs/variáveis.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestActive.pm:13", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e aceita apenas quest ID numérico ou variável de usuário.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestComplete", + "module": "eventMacro::Condition::QuestComplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestComplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestComplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestComplete.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e tipo de membro (`\\d+` ou variável de usuário).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre IDs de quest (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é quest ID (`\\d+`) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`QuestComplete 1001`", + "`QuestComplete 1001,1002`", + "`QuestComplete $questID,1002`" + ], + "rejected_forms": [ + "`QuestComplete` (sem argumento)", + "`QuestComplete abc`", + "`QuestComplete .sysVar`", + "`QuestComplete 1001 1002`" + ], + "examples_validated": [ + "QuestComplete 1001", + "QuestComplete 1001,1002", + "QuestComplete $questID,1002" + ], + "examples_rejected": [ + "QuestComplete abc", + "QuestComplete .someSystemVar", + "QuestComplete 1001 1002" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member token `^\\d+$` or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "algum ID listado está em status complete" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de quest IDs/variáveis.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestComplete.pm:12", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e aceita apenas quest ID numérico ou variável de usuário.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestHuntCompleted", + "module": "eventMacro::Condition::QuestHuntCompleted", + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntCompleted.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestHuntCompleted", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastMobID", + "\".$self->{name}.\"LastQuestID" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 149, + "new_vars_line": 171, + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntCompleted.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define explicitamente CSV externo + pares posicionais internos.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2 per member (quest_id mob_id)", + "optional_arity": "N members via CSV", + "tokenization_mode": "csv members + whitespace positional inside each member", + "accepted_separators": [ + "comma + optional spaces between members", + "single/multiple whitespace between quest_id and mob_id inside each member" + ], + "forbidden_separators": [ + "comma between quest_id and mob_id inside same member", + "missing whitespace between quest_id and mob_id" + ], + "positional_argument_spec": [ + "member_i.arg1 = quest_id (numeric or variable, non-system)", + "member_i.arg2 = mob_id (numeric or variable, non-system)" + ], + "accepted_forms": [ + "QuestHuntCompleted 1001 1002, 1003 1004", + "QuestHuntCompleted $q1 $m1, $q2 $m2" + ], + "rejected_forms": [ + "QuestHuntCompleted 1001,1002", + "QuestHuntCompleted 1001" + ], + "examples_validated": [ + "QuestHuntCompleted 1001 1002, 1003 1004", + "QuestHuntCompleted $q1 $m1, $q2 $m2" + ], + "examples_rejected": [ + "QuestHuntCompleted 1001,1002", + "QuestHuntCompleted 1001" + ], + "parser_accepts": [ + "split(/\\s*,\\s*/)", + "split(/\\s+/) per member" + ], + "semantic_validation_accepts": [ + "quest_id/mob_id numeric or variable; system vars forbidden" + ], + "generation_safe_reason": "_parse_syntax define explicitamente CSV externo + pares posicionais internos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestHuntCompleted.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestHuntOngoing", + "module": "eventMacro::Condition::QuestHuntOngoing", + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntOngoing.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestHuntOngoing", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastMobID", + "\".$self->{name}.\"LastQuestID" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 150, + "new_vars_line": 172, + "file": "plugins/eventMacro/eventMacro/Condition/QuestHuntOngoing.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define explicitamente CSV externo + pares posicionais internos.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "2 per member (quest_id mob_id)", + "optional_arity": "N members via CSV", + "tokenization_mode": "csv members + whitespace positional inside each member", + "accepted_separators": [ + "comma + optional spaces between members", + "single/multiple whitespace between quest_id and mob_id inside each member" + ], + "forbidden_separators": [ + "comma between quest_id and mob_id inside same member", + "missing whitespace between quest_id and mob_id" + ], + "positional_argument_spec": [ + "member_i.arg1 = quest_id (numeric or variable, non-system)", + "member_i.arg2 = mob_id (numeric or variable, non-system)" + ], + "accepted_forms": [ + "QuestHuntCompleted 1001 1002, 1003 1004", + "QuestHuntCompleted $q1 $m1, $q2 $m2" + ], + "rejected_forms": [ + "QuestHuntCompleted 1001,1002", + "QuestHuntCompleted 1001" + ], + "examples_validated": [ + "QuestHuntOngoing 1001 1002, 1003 1004", + "QuestHuntOngoing $q1 $m1, $q2 $m2" + ], + "examples_rejected": [ + "QuestHuntOngoing 1001,1002", + "QuestHuntOngoing 1001" + ], + "parser_accepts": [ + "split(/\\s*,\\s*/)", + "split(/\\s+/) per member" + ], + "semantic_validation_accepts": [ + "quest_id/mob_id numeric or variable; system vars forbidden" + ], + "generation_safe_reason": "_parse_syntax define explicitamente CSV externo + pares posicionais internos.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestHuntOngoing.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestInactive", + "module": "eventMacro::Condition::QuestInactive", + "file": "plugins/eventMacro/eventMacro/Condition/QuestInactive.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestInactive", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "achievement_list", + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 80, + "new_vars_line": 102, + "file": "plugins/eventMacro/eventMacro/Condition/QuestInactive.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e tipo de membro (`\\d+` ou variável de usuário).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre IDs de quest (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é quest ID (`\\d+`) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`QuestInactive 1001`", + "`QuestInactive 1001,1002`", + "`QuestInactive $questID,1002`" + ], + "rejected_forms": [ + "`QuestInactive` (sem argumento)", + "`QuestInactive abc`", + "`QuestInactive .sysVar`", + "`QuestInactive 1001 1002`" + ], + "examples_validated": [ + "QuestInactive 1001", + "QuestInactive 1001,1002", + "QuestInactive $questID,1002" + ], + "examples_rejected": [ + "QuestInactive abc", + "QuestInactive .someSystemVar", + "QuestInactive 1001 1002" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member token `^\\d+$` or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "algum ID listado está inativo/ausente" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de quest IDs/variáveis.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestInactive.pm:13", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e aceita apenas quest ID numérico ou variável de usuário.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestIncomplete", + "module": "eventMacro::Condition::QuestIncomplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestIncomplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestIncomplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestIncomplete.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e tipo de membro (`\\d+` ou variável de usuário).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre IDs de quest (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é quest ID (`\\d+`) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`QuestIncomplete 1001`", + "`QuestIncomplete 1001,1002`", + "`QuestIncomplete $questID,1002`" + ], + "rejected_forms": [ + "`QuestIncomplete` (sem argumento)", + "`QuestIncomplete abc`", + "`QuestIncomplete .sysVar`", + "`QuestIncomplete 1001 1002`" + ], + "examples_validated": [ + "QuestIncomplete 1001", + "QuestIncomplete 1001,1002", + "QuestIncomplete $questID,1002" + ], + "examples_rejected": [ + "QuestIncomplete abc", + "QuestIncomplete .someSystemVar", + "QuestIncomplete 1001 1002" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member token `^\\d+$` or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "algum ID listado está em status incomplete" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de quest IDs/variáveis.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestIncomplete.pm:12", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e aceita apenas quest ID numérico ou variável de usuário.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestNotComplete", + "module": "eventMacro::Condition::QuestNotComplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotComplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestNotComplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotComplete.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e tipo de membro (`\\d+` ou variável de usuário).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre IDs de quest (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é quest ID (`\\d+`) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`QuestNotComplete 1001`", + "`QuestNotComplete 1001,1002`", + "`QuestNotComplete $questID,1002`" + ], + "rejected_forms": [ + "`QuestNotComplete` (sem argumento)", + "`QuestNotComplete abc`", + "`QuestNotComplete .sysVar`", + "`QuestNotComplete 1001 1002`" + ], + "examples_validated": [ + "QuestNotComplete 1001", + "QuestNotComplete 1001,1002", + "QuestNotComplete $questID,1002" + ], + "examples_rejected": [ + "QuestNotComplete abc", + "QuestNotComplete .someSystemVar", + "QuestNotComplete 1001 1002" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member token `^\\d+$` or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "algum ID listado NÃO está complete" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de quest IDs/variáveis.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestNotComplete.pm:12", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e aceita apenas quest ID numérico ou variável de usuário.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestNotIncomplete", + "module": "eventMacro::Condition::QuestNotIncomplete", + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotIncomplete.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestNotIncomplete", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": 12, + "validate_condition_line": 79, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/QuestNotIncomplete.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e tipo de membro (`\\d+` ou variável de usuário).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre IDs de quest (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é quest ID (`\\d+`) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`QuestNotIncomplete 1001`", + "`QuestNotIncomplete 1001,1002`", + "`QuestNotIncomplete $questID,1002`" + ], + "rejected_forms": [ + "`QuestNotIncomplete` (sem argumento)", + "`QuestNotIncomplete abc`", + "`QuestNotIncomplete .sysVar`", + "`QuestNotIncomplete 1001 1002`" + ], + "examples_validated": [ + "QuestNotIncomplete 1001", + "QuestNotIncomplete 1001,1002", + "QuestNotIncomplete $questID,1002" + ], + "examples_rejected": [ + "QuestNotIncomplete abc", + "QuestNotIncomplete .someSystemVar", + "QuestNotIncomplete 1001 1002" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member token `^\\d+$` or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "algum ID listado NÃO está incomplete" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de quest IDs/variáveis.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestNotIncomplete.pm:12", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e aceita apenas quest ID numérico ou variável de usuário.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestOnTime", + "module": "eventMacro::Condition::QuestOnTime", + "file": "plugins/eventMacro/eventMacro/Condition/QuestOnTime.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestOnTime", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 85, + "new_vars_line": 107, + "file": "plugins/eventMacro/eventMacro/Condition/QuestOnTime.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e tipo de membro (`\\d+` ou variável de usuário).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre IDs de quest (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é quest ID (`\\d+`) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`QuestOnTime 1001`", + "`QuestOnTime 1001,1002`", + "`QuestOnTime $questID,1002`" + ], + "rejected_forms": [ + "`QuestOnTime` (sem argumento)", + "`QuestOnTime abc`", + "`QuestOnTime .sysVar`", + "`QuestOnTime 1001 1002`" + ], + "examples_validated": [ + "QuestOnTime 1001", + "QuestOnTime 1001,1002", + "QuestOnTime $questID,1002" + ], + "examples_rejected": [ + "QuestOnTime abc", + "QuestOnTime .someSystemVar", + "QuestOnTime 1001 1002" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member token `^\\d+$` or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "algum ID listado está ativo e com time_expire futuro" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de quest IDs/variáveis.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestOnTime.pm:13", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e aceita apenas quest ID numérico ou variável de usuário.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "QuestTimeOverdue", + "module": "eventMacro::Condition::QuestTimeOverdue", + "file": "plugins/eventMacro/eventMacro/Condition/QuestTimeOverdue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::QuestTimeOverdue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "quest_all_list_end", + "quest_all_mission_end", + "quest_added", + "quest_update_mission_hunt_end", + "quest_delete", + "quest_active" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastListIndex" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 85, + "new_vars_line": 107, + "file": "plugins/eventMacro/eventMacro/Condition/QuestTimeOverdue.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e tipo de membro (`\\d+` ou variável de usuário).", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre IDs de quest (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é quest ID (`\\d+`) ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`QuestTimeOverdue 1001`", + "`QuestTimeOverdue 1001,1002`", + "`QuestTimeOverdue $questID,1002`" + ], + "rejected_forms": [ + "`QuestTimeOverdue` (sem argumento)", + "`QuestTimeOverdue abc`", + "`QuestTimeOverdue .sysVar`", + "`QuestTimeOverdue 1001 1002`" + ], + "examples_validated": [ + "QuestTimeOverdue 1001", + "QuestTimeOverdue 1001,1002", + "QuestTimeOverdue $questID,1002" + ], + "examples_rejected": [ + "QuestTimeOverdue abc", + "QuestTimeOverdue .someSystemVar", + "QuestTimeOverdue 1001 1002" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member token `^\\d+$` or user variable; system variables forbidden" + ], + "semantic_validation_accepts": [ + "algum ID listado está ativo e com time_expire vencido" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV de quest IDs/variáveis.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestTimeOverdue.pm:13", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e aceita apenas quest ID numérico ou variável de usuário.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ShopOpened", + "module": "eventMacro::Condition::ShopOpened", + "file": "plugins/eventMacro/eventMacro/Condition/ShopOpened.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::ShopOpened", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "in_game", + "open_shop", + "packet_send/shop_open", + "packet_send/shop_close", + "shop_closed", + "packet_mapChange" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 28, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/ShopOpened.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax fixa aridade 1 com regex ancorada `^(0|1)$`.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1", + "optional_arity": "0", + "tokenization_mode": "single token boolean (0|1)", + "accepted_separators": [ + "nenhum (token único: 0 ou 1)" + ], + "forbidden_separators": [ + "vírgula CSV", + "múltiplos argumentos separados por espaço" + ], + "positional_argument_spec": [ + "arg1: literal `0` ou `1`" + ], + "accepted_forms": [ + "`ShopOpened 1`", + "`ShopOpened 0`" + ], + "rejected_forms": [ + "`ShopOpened` (sem argumento)", + "`ShopOpened 2`", + "`ShopOpened 1,0`", + "`ShopOpened 1 0`" + ], + "examples_validated": [ + "ShopOpened 1", + "ShopOpened 0" + ], + "examples_rejected": [ + "ShopOpened 2", + "ShopOpened 1,0", + "ShopOpened 1 0" + ], + "parser_accepts": [ + "single literal token matching `^(0|1)$`" + ], + "semantic_validation_accepts": [ + "estado de `shopstarted` igual ao valor esperado" + ], + "generation_safe_reason": "Contrato lexical fechado por literal booleano único.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ShopOpened.pm:13", + "proof_excerpt": "_parse_syntax valida `^(0|1)$` e rejeita qualquer outro formato.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "SimpleHookEvent", + "module": "eventMacro::Condition::SimpleHookEvent", + "file": "plugins/eventMacro/eventMacro/Condition/SimpleHookEvent.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::SimpleHookEvent", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 24, + "parse_syntax_line": 10, + "validate_condition_line": 28, + "new_vars_line": 38, + "file": "plugins/eventMacro/eventMacro/Condition/SimpleHookEvent.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax fecha lista CSV de hooks literais e bloqueia variáveis.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+ hooks", + "optional_arity": "0", + "tokenization_mode": "csv list of hook names", + "accepted_separators": [ + "vírgula CSV entre hooks (espaços opcionais)" + ], + "forbidden_separators": [ + "uso de variável como hook member" + ], + "positional_argument_spec": [ + "arglist: 1..N nomes de hook literais (sem variáveis)" + ], + "accepted_forms": [ + "`SimpleHookEvent packet_mapChange`", + "`SimpleHookEvent packet_mapChange,packet/high_jump`" + ], + "rejected_forms": [ + "`SimpleHookEvent $hookVar`", + "`SimpleHookEvent .sysVar`" + ], + "examples_validated": [ + "SimpleHookEvent packet_mapChange", + "SimpleHookEvent packet_mapChange,packet/high_jump" + ], + "examples_rejected": [ + "SimpleHookEvent $hookVar", + "SimpleHookEvent .sysVar" + ], + "parser_accepts": [ + "CSV via `split(/\\s*,\\s*/)`; each member must NOT be variable" + ], + "semantic_validation_accepts": [ + "condição dispara sempre verdadeiro quando hook listado ocorre" + ], + "generation_safe_reason": "Contrato lexical fechado por CSV de literais.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/SimpleHookEvent.pm:10", + "proof_excerpt": "_parse_syntax percorre membros CSV e rejeita qualquer membro detectado como variável.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "SkillLevel", + "module": "eventMacro::Condition::SkillLevel", + "file": "plugins/eventMacro/eventMacro/Condition/SkillLevel.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::SkillLevel", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/skill_update", + "packet/skills_list", + "packet/skill_add", + "packet/skill_delete" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(\\S+)\\s+(\\S.*)$", + "^(\\S+)\\s+(\\S.*)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastHandle", + "\".$self->{name}.\"LastID", + "\".$self->{name}.\"LastLevel", + "\".$self->{name}.\"LastName" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 18, + "validate_condition_line": 37, + "new_vars_line": 47, + "file": "plugins/eventMacro/eventMacro/Condition/SkillLevel.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/SkillLevel.pm:18", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=18", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "Spirits", + "module": "eventMacro::Condition::Spirits", + "file": "plugins/eventMacro/eventMacro/Condition/Spirits.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::Spirits", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/revolving_entity" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 25, + "file": "plugins/eventMacro/eventMacro/Condition/Spirits.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/Spirits.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "StatAdded", + "module": "eventMacro::Condition::StatAdded", + "file": "plugins/eventMacro/eventMacro/Condition/StatAdded.pm", + "base": "eventMacro::Conditiontypes::ListConditionEvent", + "ancestry": [ + "eventMacro::Condition::StatAdded", + "eventMacro::Conditiontypes::ListConditionEvent", + "eventMacro::Conditiontypes::ListConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "packet_charStats" + ], + "parser_mode": "csv_list", + "argument_contract": { + "accepts_regex": false, + "accepts_range": false, + "accepts_csv_list": true, + "accepts_variable": false, + "operators": [ + "csv membership" + ], + "regex_flags_supported": [], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last", + "\".$self->{name}.\"Last\".\"Quantity" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 39, + "parse_syntax_line": 26, + "validate_condition_line": 43, + "new_vars_line": 54, + "file": "plugins/eventMacro/eventMacro/Condition/StatAdded.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": "1..N members", + "tokenization_mode": "comma separated list", + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "positional_argument_spec": [ + "member_i: token or positional tuple depending on condition implementation" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "examples_validated": [ + " member1, member2, ..." + ], + "examples_rejected": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "parser_accepts": [ + "csv list split" + ], + "semantic_validation_accepts": [ + "member-level numeric/variable checks" + ], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/StatAdded.pm:26", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=26", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "StatusActiveHandle", + "module": "eventMacro::Condition::StatusActiveHandle", + "file": "plugins/eventMacro/eventMacro/Condition/StatusActiveHandle.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::StatusActiveHandle", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "Actor::setStatus::change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastHandle", + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastName" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 69, + "new_vars_line": 98, + "file": "plugins/eventMacro/eventMacro/Condition/StatusActiveHandle.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e proíbe variáveis de sistema.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre handles (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é handle literal ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`StatusActiveHandle EFST_POISON`", + "`StatusActiveHandle EFST_POISON, EFST_HASTE`", + "`StatusActiveHandle $wantedStatus, EFST_HASTE`" + ], + "rejected_forms": [ + "`StatusActiveHandle` (sem argumento)", + "`StatusActiveHandle .sysVar`", + "`StatusActiveHandle EFST_POISON EFST_HASTE`" + ], + "examples_validated": [ + "StatusActiveHandle EFST_POISON", + "StatusActiveHandle EFST_POISON, EFST_HASTE", + "StatusActiveHandle $wantedStatus, EFST_HASTE" + ], + "examples_rejected": [ + "StatusActiveHandle .someSystemVar", + "StatusActiveHandle EFST_POISON EFST_HASTE" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member is user variable or literal handle token" + ], + "semantic_validation_accepts": [ + "verdadeiro quando algum handle listado existir em `$char->{statuses}`" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV com tipo de membro explícito.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/StatusActiveHandle.pm:13", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e rejeita variáveis iniciadas por ponto.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "StatusInactiveHandle", + "module": "eventMacro::Condition::StatusInactiveHandle", + "file": "plugins/eventMacro/eventMacro/Condition/StatusInactiveHandle.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::StatusInactiveHandle", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "in_game", + "Actor::setStatus::change" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "/\\s*,\\s*/," + ], + "sets_special_variables": [ + "\".$self->{name}.\"LastHandle", + "\".$self->{name}.\"LastListIndex", + "\".$self->{name}.\"LastName" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 69, + "new_vars_line": 101, + "file": "plugins/eventMacro/eventMacro/Condition/StatusInactiveHandle.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax define delimitador CSV explícito e proíbe variáveis de sistema.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+", + "optional_arity": "0", + "tokenization_mode": "csv list (split /\\s*,\\s*/)", + "accepted_separators": [ + "vírgula CSV entre handles (espaços opcionais ao redor)" + ], + "forbidden_separators": [ + "whitespace como separador de lista sem vírgula", + "ponto e vírgula como separador" + ], + "positional_argument_spec": [ + "arglist: 1..N membros CSV; cada membro é handle literal ou variável de usuário (não sistema)" + ], + "accepted_forms": [ + "`StatusInactiveHandle EFST_POISON`", + "`StatusInactiveHandle EFST_POISON, EFST_HASTE`", + "`StatusInactiveHandle $wantedStatus, EFST_HASTE`" + ], + "rejected_forms": [ + "`StatusInactiveHandle` (sem argumento)", + "`StatusInactiveHandle .sysVar`", + "`StatusInactiveHandle EFST_POISON EFST_HASTE`" + ], + "examples_validated": [ + "StatusInactiveHandle EFST_POISON", + "StatusInactiveHandle EFST_POISON, EFST_HASTE", + "StatusInactiveHandle $wantedStatus, EFST_HASTE" + ], + "examples_rejected": [ + "StatusInactiveHandle .someSystemVar", + "StatusInactiveHandle EFST_POISON EFST_HASTE" + ], + "parser_accepts": [ + "CSV list via `split(/\\s*,\\s*/)`", + "member is user variable or literal handle token" + ], + "semantic_validation_accepts": [ + "verdadeiro quando algum handle listado NÃO estiver ativo em `$char->{statuses}`" + ], + "generation_safe_reason": "Contrato lexical fechado por lista CSV com tipo de membro explícito.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/StatusInactiveHandle.pm:13", + "proof_excerpt": "_parse_syntax usa `split(/\\s*,\\s*/)` e rejeita variáveis iniciadas por ponto.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "StorageOpened", + "module": "eventMacro::Condition::StorageOpened", + "file": "plugins/eventMacro/eventMacro/Condition/StorageOpened.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::StorageOpened", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "in_game", + "packet_storage_open", + "packet_storage_close" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^(0|1)$", + "^(0|1)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 13, + "validate_condition_line": 28, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/StorageOpened.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax fixa aridade 1 com regex ancorada `^(0|1)$`.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1", + "optional_arity": "0", + "tokenization_mode": "single token boolean (0|1)", + "accepted_separators": [ + "nenhum (token único: 0 ou 1)" + ], + "forbidden_separators": [ + "vírgula CSV", + "múltiplos argumentos separados por espaço" + ], + "positional_argument_spec": [ + "arg1: literal `0` ou `1`" + ], + "accepted_forms": [ + "`StorageOpened 1`", + "`StorageOpened 0`" + ], + "rejected_forms": [ + "`StorageOpened` (sem argumento)", + "`StorageOpened 2`", + "`StorageOpened 1,0`", + "`StorageOpened 1 0`" + ], + "examples_validated": [ + "StorageOpened 1", + "StorageOpened 0" + ], + "examples_rejected": [ + "StorageOpened 2", + "StorageOpened 1,0", + "StorageOpened 1 0" + ], + "parser_accepts": [ + "single literal token matching `^(0|1)$`" + ], + "semantic_validation_accepts": [ + "estado de `storage->isReady` igual ao valor esperado" + ], + "generation_safe_reason": "Contrato lexical fechado por literal booleano único.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/StorageOpened.pm:13", + "proof_excerpt": "_parse_syntax valida `^(0|1)$` e rejeita qualquer outro formato.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "SystemMsg", + "module": "eventMacro::Condition::SystemMsg", + "file": "plugins/eventMacro/eventMacro/Condition/SystemMsg.pm", + "base": "eventMacro::Condition::Base::Msg", + "ancestry": [ + "eventMacro::Condition::SystemMsg", + "eventMacro::Condition::Base::Msg", + "eventMacro::Conditiontypes::RegexConditionEvent", + "eventMacro::Conditiontypes::RegexConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "regex_literal", + "argument_contract": { + "accepts_regex": true, + "accepts_range": false, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": null + }, + "syntax_regex_fragments": [], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/SystemMsg.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "tokenization_mode": "regex literal", + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "positional_argument_spec": [ + "arg1: regex literal /.../flags" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "examples_validated": [ + " /pattern/flags" + ], + "examples_rejected": [ + " pattern sem delimitadores" + ], + "parser_accepts": [ + "regex literal" + ], + "semantic_validation_accepts": [ + "regex compilation" + ], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/SystemMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "VarValue", + "module": "eventMacro::Condition::VarValue", + "file": "plugins/eventMacro/eventMacro/Condition/VarValue.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::VarValue", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": true, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"LastMemberIndex", + "\".$self->{name}.\"LastValue", + "\".$self->{name}.\"LastVar" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": -1, + "parse_syntax_line": 10, + "validate_condition_line": 48, + "new_vars_line": 72, + "file": "plugins/eventMacro/eventMacro/Condition/VarValue.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax exige formato variável+valor por membro e bloqueia variáveis de sistema.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "1+ pares", + "optional_arity": "0", + "tokenization_mode": "csv list of ` ` members", + "accepted_separators": [ + "vírgula CSV entre membros", + "whitespace entre variável e valor desejado" + ], + "forbidden_separators": [ + "membro sem variável inicial", + "variável de sistema (prefixo `.`)", + "membro sem valor após variável" + ], + "positional_argument_spec": [ + "cada membro: `<$var> `" + ], + "accepted_forms": [ + "`VarValue $target foo`", + "`VarValue $target foo, $mode atk`" + ], + "rejected_forms": [ + "`VarValue target foo` (sem variável)", + "`VarValue .sys foo`", + "`VarValue $target`" + ], + "examples_validated": [ + "VarValue $target foo", + "VarValue $target foo, $mode atk" + ], + "examples_rejected": [ + "VarValue target foo", + "VarValue .sys foo", + "VarValue $target" + ], + "parser_accepts": [ + "CSV via `split(/\\s*,\\s*/)`", + "member must begin with variable matching `$general_wider_variable_qr` then whitespace + value" + ], + "semantic_validation_accepts": [ + "quando variável alterada assumir exatamente o valor desejado em algum membro" + ], + "generation_safe_reason": "Contrato lexical fechado por membro ` `.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/VarValue.pm:10", + "proof_excerpt": "_parse_syntax exige variável no início do membro e valor obrigatório após whitespace.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "Zeny", + "module": "eventMacro::Condition::Zeny", + "file": "plugins/eventMacro/eventMacro/Condition/Zeny.pm", + "base": "eventMacro::Conditiontypes::NumericConditionState", + "ancestry": [ + "eventMacro::Condition::Zeny", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "zeny_change", + "packet/stat_info", + "packet/stats_info", + "complete_deal" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 17, + "new_vars_line": 28, + "file": "plugins/eventMacro/eventMacro/Condition/Zeny.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/Zeny.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "ZenyChanged", + "module": "eventMacro::Condition::ZenyChanged", + "file": "plugins/eventMacro/eventMacro/Condition/ZenyChanged.pm", + "base": "eventMacro::Conditiontypes::NumericConditionEvent", + "ancestry": [ + "eventMacro::Condition::ZenyChanged", + "eventMacro::Conditiontypes::NumericConditionEvent", + "eventMacro::Conditiontypes::NumericConditionState", + "eventMacro::Condition" + ], + "condition_type": "EVENT", + "is_unique_condition": false, + "hooks": [ + "zeny_change" + ], + "parser_mode": "numeric_comparison", + "argument_contract": { + "accepts_regex": false, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)" + ], + "regex_flags_supported": [], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"Change", + "\".$self->{name}.\"Last\".\"ZenyAfter" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 11, + "new_vars_line": 23, + "file": "plugins/eventMacro/eventMacro/Condition/ZenyChanged.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_policy": { + "can_generate_ready_syntax": true, + "requires_user_confirmation_for_generation": false, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 0, + "tokenization_mode": "inline positional", + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "positional_argument_spec": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "examples_validated": [ + " " + ], + "examples_rejected": [ + ",," + ], + "parser_accepts": [ + "numeric comparison operators" + ], + "semantic_validation_accepts": [ + "numeric coercion per condition validator" + ], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/ZenyChanged.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "isInMapAndCloseToCoordinate", + "module": "eventMacro::Condition::isInMapAndCloseToCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/isInMapAndCloseToCoordinate.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::isInMapAndCloseToCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/actor_movement_interrupted", + "packet/high_jump", + "packet/character_moves", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$", + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$" + ], + "sets_special_variables": [], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 14, + "validate_condition_line": 30, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/isInMapAndCloseToCoordinate.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax fixa exatamente 4 tokens com regex ancorada.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "4", + "optional_arity": "0", + "tokenization_mode": "fixed positional tuple", + "accepted_separators": [ + "whitespace entre os 4 tokens" + ], + "forbidden_separators": [ + "vírgula CSV", + "mapa com caracteres fora de `[\\w-]+`", + "coordenadas/distância não numéricas" + ], + "positional_argument_spec": [ + "arg1: map (`[\\w-]+`)", + "arg2: x (`\\d+`)", + "arg3: y (`\\d+`)", + "arg4: dist (`\\d+`)" + ], + "accepted_forms": [ + "`isInMapAndCloseToCoordinate prontera 150 200 8`" + ], + "rejected_forms": [ + "`isInMapAndCloseToCoordinate prontera 150 200`", + "`isInMapAndCloseToCoordinate prontera 150 a 8`", + "`isInMapAndCloseToCoordinate prontera,150,200,8`" + ], + "examples_validated": [ + "isInMapAndCloseToCoordinate prontera 150 200 8" + ], + "examples_rejected": [ + "isInMapAndCloseToCoordinate prontera 150 200", + "isInMapAndCloseToCoordinate prontera 150 a 8", + "isInMapAndCloseToCoordinate prontera,150,200,8" + ], + "parser_accepts": [ + "`^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$`" + ], + "semantic_validation_accepts": [ + "mapa atual igual ao mapa alvo e distância por blockDistance <= dist" + ], + "generation_safe_reason": "Contrato lexical fechado por regex posicional fixa.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/isInMapAndCloseToCoordinate.pm:14", + "proof_excerpt": "_parse_syntax só aceita `map x y dist` com regex ancorada e tipos numéricos.", + "generation_status": "GENERATION_SAFE" + }, + { + "name": "isNotInMapOrNotCloseToCoordinate", + "module": "eventMacro::Condition::isNotInMapOrNotCloseToCoordinate", + "file": "plugins/eventMacro/eventMacro/Condition/isNotInMapOrNotCloseToCoordinate.pm", + "base": "eventMacro::Condition", + "ancestry": [ + "eventMacro::Condition::isNotInMapOrNotCloseToCoordinate", + "eventMacro::Condition" + ], + "condition_type": "STATE", + "is_unique_condition": false, + "hooks": [ + "packet/actor_movement_interrupted", + "packet/high_jump", + "packet/character_moves", + "packet_mapChange", + "packet/map_property3" + ], + "parser_mode": "composite_regex_numeric", + "argument_contract": { + "accepts_regex": true, + "accepts_range": true, + "accepts_csv_list": false, + "accepts_variable": false, + "operators": [ + "=", + "==", + "!=", + "!", + "<", + "<=", + ">", + ">=", + "range(..)", + "regex(/.../i?)" + ], + "regex_flags_supported": [ + "i" + ], + "implicit_comparison_default": "==" + }, + "syntax_regex_fragments": [ + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$", + "^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$" + ], + "sets_special_variables": [ + "\".$self->{name}.\"Last\".\"Dist", + "\".$self->{name}.\"Last\".\"Map", + "\".$self->{name}.\"Last\".\"X", + "\".$self->{name}.\"Last\".\"Y" + ], + "confidence": { + "condition_type": "PROVADO", + "hooks": "PROVADO", + "parser_mode": "PROVADO", + "argument_contract": "PROVADO" + }, + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": 14, + "validate_condition_line": 30, + "new_vars_line": 46, + "file": "plugins/eventMacro/eventMacro/Condition/isNotInMapOrNotCloseToCoordinate.pm" + }, + "generation_safety": "GENERATION_SAFE", + "generation_safety_reason": "_parse_syntax fixa exatamente 4 tokens com regex ancorada.", + "generation_policy": { + "can_generate_ready_syntax": false, + "requires_user_confirmation_for_generation": true, + "lexical_contract_must_be_complete": true + }, + "lexical_contract_status": "COMPLETE", + "required_arity": "4", + "optional_arity": "0", + "tokenization_mode": "fixed positional tuple", + "accepted_separators": [ + "whitespace entre os 4 tokens" + ], + "forbidden_separators": [ + "vírgula CSV", + "mapa com caracteres fora de `[\\w-]+`", + "coordenadas/distância não numéricas" + ], + "positional_argument_spec": [ + "arg1: map (`[\\w-]+`)", + "arg2: x (`\\d+`)", + "arg3: y (`\\d+`)", + "arg4: dist (`\\d+`)" + ], + "accepted_forms": [ + "`isNotInMapOrNotCloseToCoordinate prontera 150 200 8`" + ], + "rejected_forms": [ + "`isNotInMapOrNotCloseToCoordinate prontera 150 200`", + "`isNotInMapOrNotCloseToCoordinate prontera 150 a 8`", + "`isNotInMapOrNotCloseToCoordinate prontera,150,200,8`" + ], + "examples_validated": [ + "isNotInMapOrNotCloseToCoordinate prontera 150 200 8" + ], + "examples_rejected": [ + "isNotInMapOrNotCloseToCoordinate prontera 150 200", + "isNotInMapOrNotCloseToCoordinate prontera 150 a 8", + "isNotInMapOrNotCloseToCoordinate prontera,150,200,8" + ], + "parser_accepts": [ + "`^([\\w-]+)\\s+(\\d+)\\s+(\\d+)\\s+(\\d+)$`" + ], + "semantic_validation_accepts": [ + "verdadeiro se mapa atual for diferente do alvo OU distância por blockDistance > dist" + ], + "generation_safe_reason": "Contrato lexical fechado por regex posicional fixa.", + "generation_block_reason": "", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "proof_source": "plugins/eventMacro/eventMacro/Condition/isNotInMapOrNotCloseToCoordinate.pm:14", + "proof_excerpt": "_parse_syntax só aceita `map x y dist` com regex ancorada e tipos numéricos.", + "generation_status": "GENERATION_SAFE" + } +] diff --git a/docs/eventmacro_gpt_final/knowledge_ready/19_macro_and_parameter_contracts.json b/docs/eventmacro_gpt_final/knowledge_ready/19_macro_and_parameter_contracts.json new file mode 100644 index 0000000000..02ed5b391b --- /dev/null +++ b/docs/eventmacro_gpt_final/knowledge_ready/19_macro_and_parameter_contracts.json @@ -0,0 +1,1064 @@ +{ + "meta": { + "scope": "eventMacro macro functions/keywords + automacro parameters lexical contracts", + "confidence_policy": [ + "PROVADO", + "INFERIDO", + "NÃO COMPROVADO" + ], + "generation_rule": "Only generate final syntax when lexical_contract_status is COMPLETE" + }, + "macro_functions": [ + { + "name": "arg", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "space positional without comma" + ], + "accepted_forms": [ + "&arg(0)" + ], + "rejected_forms": [ + "&arg 0" + ] + }, + { + "name": "cart", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&cart(...)", + "&cart(\"value\")" + ], + "rejected_forms": [ + "&cart ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "Cart", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&Cart(...)", + "&Cart(\"value\")" + ], + "rejected_forms": [ + "&Cart ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "cartamount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&cartamount(...)", + "&cartamount(\"value\")" + ], + "rejected_forms": [ + "&cartamount ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "config", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "space positional without comma" + ], + "accepted_forms": [ + "&config(lockMap)" + ], + "rejected_forms": [ + "&config lockMap" + ] + }, + { + "name": "defined", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "invalid type payload" + ], + "accepted_forms": [ + "&defined($x)", + "&defined($arr[0])", + "&defined($hash{key})" + ], + "rejected_forms": [ + "&defined(@arr)" + ] + }, + { + "name": "delete", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&delete($hash{key})" + ], + "rejected_forms": [ + "&delete $hash{key}" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "eval", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses (freeform expression)" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&eval('1+1')", + "&eval($expr)" + ], + "rejected_forms": [ + "&eval 1+1 (without parentheses)" + ], + "notes": "Lexical call shape is fixed; runtime execution may still be blocked by lockdown." + }, + { + "name": "exists", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "space positional without comma" + ], + "accepted_forms": [ + "&exists($hash{key})" + ], + "rejected_forms": [ + "&exists $hash{key}" + ] + }, + { + "name": "invamount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&invamount(...)", + "&invamount(\"value\")" + ], + "rejected_forms": [ + "&invamount ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "inventory", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&inventory(...)", + "&inventory(\"value\")" + ], + "rejected_forms": [ + "&inventory ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "Inventory", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&Inventory(...)", + "&Inventory(\"value\")" + ], + "rejected_forms": [ + "&Inventory ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "InventoryType", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&InventoryType(...)", + "&InventoryType(\"value\")" + ], + "rejected_forms": [ + "&InventoryType ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "itemCard", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&itemCard(...)", + "&itemCard(\"value\")" + ], + "rejected_forms": [ + "&itemCard ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "itemCardAmount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&itemCardAmount(...)", + "&itemCardAmount(\"value\")" + ], + "rejected_forms": [ + "&itemCardAmount ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "itemOptAmount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&itemOptAmount(...)", + "&itemOptAmount(\"value\")" + ], + "rejected_forms": [ + "&itemOptAmount ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "itemOption", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&itemOption(...)", + "&itemOption(\"value\")" + ], + "rejected_forms": [ + "&itemOption ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "keys", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&keys($hash)" + ], + "rejected_forms": [ + "&keys $hash" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "monster", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&monster(...)", + "&monster(\"value\")" + ], + "rejected_forms": [ + "&monster ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "npc", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&npc(...)", + "&npc(\"value\")" + ], + "rejected_forms": [ + "&npc ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "player", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&player(...)", + "&player(\"value\")" + ], + "rejected_forms": [ + "&player ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "pop", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&pop(@arr)" + ], + "rejected_forms": [ + "&pop @arr" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "push", + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": "N", + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&push(@arr, $x)", + "&push(@arr, $x, $y)" + ], + "rejected_forms": [ + "&push @arr $x" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "questCompleteCount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; CSV IDs allowed inside argument payload" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&questCompleteCount(12345)", + "&questCompleteCount(12345,12346)" + ], + "rejected_forms": [ + "&questCompleteCount 12345 (without parentheses)" + ], + "notes": "Runner uses one bracket payload and splits CSV IDs internally for quest status counting." + }, + { + "name": "questInactiveCount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; CSV IDs allowed inside argument payload" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&questInactiveCount(12345)", + "&questInactiveCount(12345,12346)" + ], + "rejected_forms": [ + "&questInactiveCount 12345 (without parentheses)" + ], + "notes": "Runner uses one bracket payload and splits CSV IDs internally for quest status counting." + }, + { + "name": "questIncompleteCount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; CSV IDs allowed inside argument payload" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&questIncompleteCount(12345)", + "&questIncompleteCount(12345,12346)" + ], + "rejected_forms": [ + "&questIncompleteCount 12345 (without parentheses)" + ], + "notes": "Runner uses one bracket payload and splits CSV IDs internally for quest status counting." + }, + { + "name": "questStatus", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&questStatus(12345)", + "&questStatus($questID)" + ], + "rejected_forms": [ + "&questStatus 12345 (without parentheses)" + ], + "notes": "Runner resolves one parsed argument and maps status via getQuestStatus." + }, + { + "name": "rand", + "lexical_contract_status": "COMPLETE", + "required_arity": 0, + "optional_arity": 1, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&rand()", + "&rand(10)" + ], + "rejected_forms": [ + "&rand 10" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "random", + "lexical_contract_status": "COMPLETE", + "required_arity": 0, + "optional_arity": 2, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&random()", + "&random(1,10)" + ], + "rejected_forms": [ + "&random 1 10" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "shift", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&shift(@arr)" + ], + "rejected_forms": [ + "&shift @arr" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "shopamount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&shopamount(...)", + "&shopamount(\"value\")" + ], + "rejected_forms": [ + "&shopamount ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "split", + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": 1, + "accepted_separators": [ + "comma + optional spaces inside function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&split($str, /regex/)", + "&split($str, /regex/, 2)" + ], + "rejected_forms": [ + "&split($str /regex/)" + ], + "notes": "Function-call comma semantics inside parentheses" + }, + { + "name": "storage", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&storage(...)", + "&storage(\"value\")" + ], + "rejected_forms": [ + "&storage ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "Storage", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&Storage(...)", + "&Storage(\"value\")" + ], + "rejected_forms": [ + "&Storage ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "storamount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&storamount(...)", + "&storamount(\"value\")" + ], + "rejected_forms": [ + "&storamount ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "strip", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&strip($text)" + ], + "rejected_forms": [ + "&strip $text" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "unshift", + "lexical_contract_status": "COMPLETE", + "required_arity": 2, + "optional_arity": "N", + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&unshift(@arr, $x)", + "&unshift(@arr, $x, $y)" + ], + "rejected_forms": [ + "&unshift @arr $x" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "values", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "comma-separated args in function call" + ], + "forbidden_separators": [ + "whitespace-only positional without comma" + ], + "accepted_forms": [ + "&values($hash)" + ], + "rejected_forms": [ + "&values $hash" + ], + "notes": "Lexical call form standardized in function-call syntax." + }, + { + "name": "vender", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&vender(...)", + "&vender(\"value\")" + ], + "rejected_forms": [ + "&vender ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "venderamount", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&venderamount(...)", + "&venderamount(\"value\")" + ], + "rejected_forms": [ + "&venderamount ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "venderprice", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&venderprice(...)", + "&venderprice(\"value\")" + ], + "rejected_forms": [ + "&venderprice ... (without parentheses)" + ], + "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + } + ], + "automacro_parameters": [ + { + "name": "call", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key macro_name [args...]", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma as delimiter for macro name" + ], + "accepted_forms": [ + "call use_pot", + "call buff_me 123 \"abc\"" + ], + "rejected_forms": [ + "call,use_pot" + ], + "value_type": "macro identifier + optional args" + }, + { + "name": "CheckOnAI", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key csv-enum", + "accepted_separators": [ + "whitespace after key; CSV commas between enum values" + ], + "forbidden_separators": [ + "space-only list without commas", + "enum outside {auto,manual,off}" + ], + "accepted_forms": [ + "CheckOnAI auto", + "CheckOnAI auto,manual", + "CheckOnAI off,auto,manual" + ], + "rejected_forms": [ + "CheckOnAI auto manual", + "CheckOnAI foo", + "CheckOnAI auto,foo" + ], + "value_type": "CSV enum list (auto|manual|off)" + }, + { + "name": "delay", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "delay 0.5" + ], + "rejected_forms": [ + "delay,0.5" + ], + "value_type": "decimal" + }, + { + "name": "disabled", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "disabled 0" + ], + "rejected_forms": [ + "disabled maybe" + ], + "value_type": "enum 0|1" + }, + { + "name": "exclusive", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "exclusive 1" + ], + "rejected_forms": [ + "exclusive maybe" + ], + "value_type": "enum 0|1" + }, + { + "name": "macro_delay", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "macro_delay 0.2" + ], + "rejected_forms": [ + "macro_delay fast" + ], + "value_type": "decimal" + }, + { + "name": "orphan", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key enum", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "orphan terminate", + "orphan reregister_safe" + ], + "rejected_forms": [ + "orphan unknown_mode" + ], + "value_type": "enum" + }, + { + "name": "overrideAI", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "overrideAI 1" + ], + "rejected_forms": [ + "overrideAI maybe" + ], + "value_type": "enum 0|1" + }, + { + "name": "priority", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "priority 0" + ], + "rejected_forms": [ + "priority -1" + ], + "value_type": "integer >= 0" + }, + { + "name": "repeat", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "repeat 2" + ], + "rejected_forms": [ + "repeat -1" + ], + "value_type": "integer >= 0" + }, + { + "name": "run-once", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "run-once 1" + ], + "rejected_forms": [ + "run-once maybe" + ], + "value_type": "enum 0|1" + }, + { + "name": "self_interruptible", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "self_interruptible 1" + ], + "rejected_forms": [ + "self_interruptible maybe" + ], + "value_type": "enum 0|1" + }, + { + "name": "timeout", + "lexical_contract_status": "COMPLETE", + "tokenization_mode": "inline positional key value", + "accepted_separators": [ + "whitespace only" + ], + "forbidden_separators": [ + "comma between key and value" + ], + "accepted_forms": [ + "timeout 2" + ], + "rejected_forms": [ + "timeout,2" + ], + "value_type": "number" + } + ] +} diff --git a/docs/eventmacro_gpt_final/support/00_consolidation_decisions.md b/docs/eventmacro_gpt_final/support/00_consolidation_decisions.md new file mode 100644 index 0000000000..e5631bf65d --- /dev/null +++ b/docs/eventmacro_gpt_final/support/00_consolidation_decisions.md @@ -0,0 +1,13 @@ +# 00 Consolidation Decisions + +## Decisões principais +1. Base consolidada partiu do conjunto `docs/eventmacro_gpt_audit/knowledge_ready` por já estar validado e dentro do budget. +2. Foi criado um pacote final dedicado em `docs/eventmacro_gpt_final/knowledge_ready` para separar material de upload de material de auditoria/validação. +3. Mantivemos `state` e `event` separados para consulta rápida e menor confusão semântica. +4. Mantivemos `examples_valid` e `examples_invalid` separados para treinamento de revisão de código. +5. Mantivemos `condition_catalog.json` para lookup estruturado por GPT, com referência markdown curta (`11_condition_reference_tables.md`). +6. Criamos arquivo dedicado de operadores/comparações/regex/ranges (`04_...`) para reduzir dispersão de regras. +7. Criamos instruções finais do GPT (`16_...`) com regras anti-alucinação explícitas e classificação de confiança. + +## Resultado +- Pacote final com 19 arquivos (<=20), autoexplicativo e pronto para upload. diff --git a/docs/eventmacro_gpt_final/support/01_removed_or_merged_files.md b/docs/eventmacro_gpt_final/support/01_removed_or_merged_files.md new file mode 100644 index 0000000000..48b74835d0 --- /dev/null +++ b/docs/eventmacro_gpt_final/support/01_removed_or_merged_files.md @@ -0,0 +1,15 @@ +# 01 Removed or Merged Files + +## Não incluídos no pacote final de upload +- Todo `docs/eventmacro_gpt_audit/audit_full/` (material completo de rastreabilidade, muito verboso para knowledge final). +- Todo `docs/eventmacro_gpt_validation/` (material forense e de QA; útil para histórico, não necessário no runtime do GPT). +- `docs/eventmacro_gpt_audit/tools/` e `docs/eventmacro_gpt_validation/tools/` (ferramentas de geração/validação, fora do escopo de consulta do GPT final). + +## Renomeações e ajustes no pacote final +- `00_scope_and_rules.md` -> `00_scope_rules_and_usage.md` +- `04_macro_keywords_and_functions.md` moveu para índice `06_...` +- `14_gaps_ambiguities_and_nonprovable_claims.md` -> `15_ambiguities_and_nonprovable_claims.md` +- `17_condition_catalog.json` -> `18_condition_catalog.json` +- Novo consolidado: `04_operators_regex_ranges_and_comparisons.md` +- Novo consolidado: `16_gpt_system_instructions_final.md` +- Novo manifesto final: `17_upload_manifest.md` diff --git a/docs/eventmacro_gpt_final/support/02_final_risk_notes.md b/docs/eventmacro_gpt_final/support/02_final_risk_notes.md new file mode 100644 index 0000000000..3d7981345a --- /dev/null +++ b/docs/eventmacro_gpt_final/support/02_final_risk_notes.md @@ -0,0 +1,30 @@ +# 02 Final Risk Notes + +## Riscos remanescentes +1. Algumas interpretações de regex/flags dependem do contexto de execução Perl e do módulo de condition. +2. Generalizações entre conditions continuam sendo risco de alucinação se o GPT ignorar o catálogo. +3. Documentação histórica externa ao repositório pode divergir do comportamento atual do código. + +## Mitigações incorporadas +- Classificação explícita PROVADO/INFERIDO/NÃO COMPROVADO no conteúdo técnico. +- Instruções finais do GPT com política de incerteza e anti-invenção. +- Catálogo JSON mantido para consulta estruturada. +- Catálogo de negativos e inválidos mantido para reduzir falsos positivos em revisão. + +## Avaliação +- Risco residual: **moderado-baixo**, condicionado ao GPT respeitar o manifesto e as instruções finais. + + +## Mitigações adicionais implementadas +- Gate automatizado `validate_final_package.py` para bloquear upload com `knowledge_ready > 20`, ausência de arquivos núcleo, divergência de contagem no manifesto ou JSON inválido. +- Manifesto final mantém núcleo mínimo e opcionais para evitar remoções perigosas durante compressão. +- Política de revisão exige marcar incerteza como **INFERIDO**/**NÃO COMPROVADO** quando faltar evidência. + +## Procedimento recomendado antes de upload +1. Rodar `python3 docs/eventmacro_gpt_final/support/validate_final_package.py`. +2. Confirmar leitura de `16_gpt_system_instructions_final.md` como instrução principal do GPT. +3. Validar que o pacote enviado contém exatamente os arquivos listados no manifesto. + +- Gate de consistência cruzada `validate_curation_consistency.py` para impedir drift entre catálogo JSON, lista de atenção e instruções do GPT. +- Gate de contratos de funções/parâmetros `validate_function_parameter_contracts.py` para reduzir erro de geração fora de enum/aridade. +- Suite `golden_macro_cases.json` + `validate_golden_macro_cases.py` para testar coerência de criação/validação em cenários válidos e inválidos. diff --git a/docs/eventmacro_gpt_final/support/03_improvement_stages.md b/docs/eventmacro_gpt_final/support/03_improvement_stages.md new file mode 100644 index 0000000000..61ca844cf1 --- /dev/null +++ b/docs/eventmacro_gpt_final/support/03_improvement_stages.md @@ -0,0 +1,71 @@ +# 03 Improvement Stages (Execution Tracker) + +## Objetivo +Executar melhorias incrementais na curadoria sem quebrar estabilidade. + +## Stage 1 (COMPLETED) +- Expandir contratos estruturados de funções/parâmetros. +- Resultado: catálogo aplicado e integrado com gates. + +## Stage 2 (COMPLETED) +- Melhorar cobertura COMPLETE de funções macro de uso frequente (`random`, `rand`, `strip`, `keys`, `values`, `push`, `pop`, `shift`, `unshift`, `delete`). +- Resultado: menor bloqueio em geração para funções comuns. + +## Stage 3 (COMPLETED) +- Revisão aplicada em 10 conditions de uso recorrente com `_parse_syntax` explícito: + - `InLockMap`, `JobID`, `JobIDNot`, `InSaveMap`, `InCity`, + - `InProgressBar`, `InChatRoom`, `IsInCoordinate`, `IsNotInCoordinate`, `IsInMapAndCoordinate`. +- Resultado: cobertura lexical passou de **57 COMPLETE / 61 PARTIAL** para **67 COMPLETE / 51 PARTIAL**. + +## Stage 4 (COMPLETED) +- Suíte `golden_macro_cases.json` expandida para **32 casos** (válidos + inválidos). +- Cobertura adicionada para cenários simples/médios/complexos e edge-cases de loop, reentrada e `orphan`. + +## Stage 5 (COMPLETED) +- Implementado gerador de relatório de regressão (`generate_regression_report.py`). +- Relatório emitido em `04_regression_report.md` com baseline vs current (COMPLETE/PARTIAL/INSUFFICIENT). + +## Plano 1 (em execução) — Lote 1 (COMPLETED) +- Migradas 5 conditions de baixa ambiguidade lexical: `InventoryReady`, `ShopOpened`, `StorageOpened`, `StatusActiveHandle`, `StatusInactiveHandle`. +- Delta do lote: **+5 COMPLETE / -5 PARTIAL**. + +## Plano 1 (em execução) — Lote 2 (COMPLETED) +- Migradas 11 conditions por famílias homogêneas de parser: + - Config keys: `ConfigKeyDefined`, `ConfigKeyNotExist`, `ConfigKeyUndefined`. + - Quests CSV: `QuestActive`, `QuestComplete`, `QuestInactive`, `QuestIncomplete`, `QuestNotComplete`, `QuestNotIncomplete`, `QuestOnTime`, `QuestTimeOverdue`. +- Delta do lote: **+11 COMPLETE / -11 PARTIAL**. + +## Plano 1 (em execução) — Lote 3 (COMPLETED) +- Migradas 18 conditions de famílias baseadas em parsers regex/numeric explícitos: + - MsgDist: `GuildMsgDist`, `NpcMsgDist`, `PartyMsgDist`, `PrivMsgDist`, `PubMsgDist`. + - MsgName: `GuildMsgName`, `NpcMsgName`, `PartyMsgName`, `PrivMsgName`, `PubMsgName`. + - MsgNameDist: `GuildMsgNameDist`, `NpcMsgNameDist`, `PartyMsgNameDist`, `PrivMsgNameDist`, `PubMsgNameDist`. + - ActorNearDist: `MobNearDist`, `NpcNearDist`, `PlayerNearDist`. +- Delta do lote: **+18 COMPLETE / -18 PARTIAL**. + +## Plano 1 (em execução) — Lote 4 (COMPLETED) +- Migradas 12 conditions remanescentes com gramática explícita: + - Config pairs/duals: `ConfigKey`, `ConfigKeyNot`, `ConfigKeyDualDifferentDefinedValue`, `ConfigKeyDualSameDefinedValue`. + - Equip/map composites: `IsEquippedID`, `IsNotEquippedID`, `IsNotInMapAndCoordinate`. + - Hook/value/coord patterns: `EvalHook`, `SimpleHookEvent`, `VarValue`, `isInMapAndCloseToCoordinate`, `isNotInMapOrNotCloseToCoordinate`. +- Delta do lote: **+12 COMPLETE / -12 PARTIAL**. + +## Plano 1 — Lote 5 (COMPLETED) +- Fechadas as 5 pendências residuais: `Eval`, `NoMobNear`, `NoNpcNear`, `NoPlayerNear`, `NoPortalNear`. +- Delta do lote: **+5 COMPLETE / -5 PARTIAL**. + +## Plano 1 (FINALIZADO) +- Coverage de conditions: **118 COMPLETE / 0 PARTIAL / 0 INSUFFICIENT**. + +## Plano 2 (COMPLETED) +- Contratos de **macro functions** migrados para **41 COMPLETE / 0 PARTIAL**. +- Contratos de **automacro parameters** migrados para **13 COMPLETE / 0 PARTIAL** (incluindo `CheckOnAI`). +- Golden cases realinhados para refletir baseline totalmente COMPLETE em conditions/functions/parameters. + +## Plano 3 (COMPLETED) +- Adicionado relatório de prontidão de release (`05_release_readiness_report.md`) com snapshot integrado de conditions/functions/parameters. +- Status consolidado de prontidão: **READY**. + +## Plano 4 (COMPLETED) +- Empacotamento final de `knowledge_ready` executado via `package_knowledge_ready.py`. +- Revisão final consolidada registrada em `06_final_review_and_packaging.md`. diff --git a/docs/eventmacro_gpt_final/support/04_regression_report.md b/docs/eventmacro_gpt_final/support/04_regression_report.md new file mode 100644 index 0000000000..54138fcb9e --- /dev/null +++ b/docs/eventmacro_gpt_final/support/04_regression_report.md @@ -0,0 +1,25 @@ +# 04 Regression Report (Lexical Coverage) + +Data de geração: **2026-03-23**. + +## Baseline vs Current + +| Métrica | Baseline | Current | Delta | +|---|---:|---:|---:| +| Conditions totais | 118 | 118 | +0 | +| Lexical COMPLETE | 57 (48.31%) | 118 (100.00%) | +61 | +| Lexical PARTIAL | 61 (51.69%) | 0 (0.00%) | -61 | +| Lexical INSUFFICIENT | 0 (0.00%) | 0 (0.00%) | +0 | + +## Leitura rápida + +- COMPLETE aumentou em **+61** conditions. +- PARTIAL reduziu em **61** conditions (delta bruto: -61). +- INSUFFICIENT permaneceu em **0**. + +## Critério mínimo sugerido para curadoria operacional + +- `COMPLETE >= 60%` das conditions. +- `INSUFFICIENT == 0`. + +Status atual: **ATENDE**. diff --git a/docs/eventmacro_gpt_final/support/05_release_readiness_report.md b/docs/eventmacro_gpt_final/support/05_release_readiness_report.md new file mode 100644 index 0000000000..1460d6e708 --- /dev/null +++ b/docs/eventmacro_gpt_final/support/05_release_readiness_report.md @@ -0,0 +1,22 @@ +# 05 Release Readiness Report + +Data de geração: **2026-03-23**. + +## Coverage snapshot + +| Escopo | COMPLETE | PARTIAL | INSUFFICIENT | Total | +|---|---:|---:|---:|---:| +| Conditions | 118 | 0 | 0 | 118 | +| Macro functions | 41 | 0 | 0 | 41 | +| Automacro parameters | 13 | 0 | 0 | 13 | + +## Safety snapshot + +- `EXPLAIN_ONLY` conditions: **0**. +- Release readiness: **READY**. + +## Gate criteria + +- Conditions: 100% COMPLETE, 0 PARTIAL, 0 INSUFFICIENT. +- Functions/parameters: 100% COMPLETE. +- Generation safety: 0 EXPLAIN_ONLY. diff --git a/docs/eventmacro_gpt_final/support/06_final_review_and_packaging.md b/docs/eventmacro_gpt_final/support/06_final_review_and_packaging.md new file mode 100644 index 0000000000..0873ed845e --- /dev/null +++ b/docs/eventmacro_gpt_final/support/06_final_review_and_packaging.md @@ -0,0 +1,41 @@ +# 06 Final Review and Packaging + +Data: **2026-03-23**. + +## 1) Empacotamento final + +Pacote gerado do diretório `knowledge_ready/`: + +- Output: `/tmp/eventmacro_gpt_final_knowledge_ready_2026-03-23.tar.gz` +- Arquivos incluídos: `20` +- SHA256: `6010a2b2d6fda25d43c2b36e2d605febc87879a56adca3cadc4a2238fc234373` + +Comando usado: + +```bash +python docs/eventmacro_gpt_final/support/package_knowledge_ready.py --output /tmp/eventmacro_gpt_final_knowledge_ready_2026-03-23.tar.gz +``` + +## 2) Revisão final (gates) + +Todos os gates de suporte passaram: + +1. `validate_final_package.py` -> OK +2. `validate_lexical_contracts.py` -> OK +3. `validate_function_parameter_contracts.py` -> OK +4. `validate_golden_macro_cases.py` -> OK +5. `validate_curation_consistency.py` -> OK +6. `generate_regression_report.py` -> OK +7. `generate_release_readiness_report.py` -> OK + +## 3) Estado consolidado de curadoria + +- Conditions: **118 COMPLETE / 0 PARTIAL / 0 INSUFFICIENT** +- Macro functions: **41 COMPLETE / 0 PARTIAL** +- Automacro parameters: **13 COMPLETE / 0 PARTIAL** +- Conditions `EXPLAIN_ONLY`: **0** +- Release readiness: **READY** + +## 4) Conclusão + +Curadoria pronta para upload final do pacote `knowledge_ready`. diff --git a/docs/eventmacro_gpt_final/support/generate_regression_report.py b/docs/eventmacro_gpt_final/support/generate_regression_report.py new file mode 100755 index 0000000000..e1f3b7e6da --- /dev/null +++ b/docs/eventmacro_gpt_final/support/generate_regression_report.py @@ -0,0 +1,93 @@ +#!/usr/bin/env python3 +"""Generate lexical coverage regression report for condition catalog. + +Compares current coverage against the baseline recorded in +`docs/eventmacro_lexical_contract_patch/00_patch_scope_and_method.md`. +""" + +from __future__ import annotations + +import json +import re +from datetime import date +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +CATALOG = ROOT / "eventmacro_gpt_final" / "knowledge_ready" / "18_condition_catalog.json" +BASELINE_MD = ROOT / "eventmacro_lexical_contract_patch" / "00_patch_scope_and_method.md" +OUT = ROOT / "eventmacro_gpt_final" / "support" / "04_regression_report.md" + + +def parse_baseline(text: str) -> dict[str, int]: + patterns = { + "total": r"Conditions totais:\s*(\d+)", + "complete": r"Lexical COMPLETE:\s*(\d+)", + "partial": r"Lexical PARTIAL:\s*(\d+)", + "insufficient": r"Lexical INSUFFICIENT:\s*(\d+)", + } + out: dict[str, int] = {} + for key, pat in patterns.items(): + m = re.search(pat, text) + if not m: + raise SystemExit(f"ERROR: baseline markdown missing field: {key}") + out[key] = int(m.group(1)) + return out + + +def current_counts(data: list[dict]) -> dict[str, int]: + return { + "total": len(data), + "complete": sum(1 for c in data if c.get("lexical_contract_status") == "COMPLETE"), + "partial": sum(1 for c in data if c.get("lexical_contract_status") == "PARTIAL"), + "insufficient": sum(1 for c in data if c.get("lexical_contract_status") == "INSUFFICIENT"), + } + + +def pct(value: int, total: int) -> str: + return f"{(100.0 * value / total):.2f}%" if total else "n/a" + + +def main() -> None: + baseline = parse_baseline(BASELINE_MD.read_text(encoding="utf-8")) + data = json.loads(CATALOG.read_text(encoding="utf-8")) + current = current_counts(data) + + delta_complete = current["complete"] - baseline["complete"] + delta_partial = current["partial"] - baseline["partial"] + delta_insufficient = current["insufficient"] - baseline["insufficient"] + + lines = [ + "# 04 Regression Report (Lexical Coverage)", + "", + f"Data de geração: **{date.today().isoformat()}**.", + "", + "## Baseline vs Current", + "", + "| Métrica | Baseline | Current | Delta |", + "|---|---:|---:|---:|", + f"| Conditions totais | {baseline['total']} | {current['total']} | {current['total'] - baseline['total']:+d} |", + f"| Lexical COMPLETE | {baseline['complete']} ({pct(baseline['complete'], baseline['total'])}) | {current['complete']} ({pct(current['complete'], current['total'])}) | {delta_complete:+d} |", + f"| Lexical PARTIAL | {baseline['partial']} ({pct(baseline['partial'], baseline['total'])}) | {current['partial']} ({pct(current['partial'], current['total'])}) | {delta_partial:+d} |", + f"| Lexical INSUFFICIENT | {baseline['insufficient']} ({pct(baseline['insufficient'], baseline['total'])}) | {current['insufficient']} ({pct(current['insufficient'], current['total'])}) | {delta_insufficient:+d} |", + "", + "## Leitura rápida", + "", + f"- COMPLETE aumentou em **{delta_complete:+d}** conditions.", + f"- PARTIAL reduziu em **{(-delta_partial) if delta_partial < 0 else 0}** conditions (delta bruto: {delta_partial:+d}).", + f"- INSUFFICIENT permaneceu em **{current['insufficient']}**.", + "", + "## Critério mínimo sugerido para curadoria operacional", + "", + "- `COMPLETE >= 60%` das conditions.", + "- `INSUFFICIENT == 0`.", + "", + f"Status atual: **{'ATENDE' if (current['total'] and current['complete'] / current['total'] >= 0.60 and current['insufficient'] == 0) else 'NÃO ATENDE'}**.", + ] + + OUT.write_text("\n".join(lines) + "\n", encoding="utf-8") + print(f"OK: regression report generated: {OUT}") + print(f"baseline_complete={baseline['complete']} current_complete={current['complete']} delta={delta_complete:+d}") + + +if __name__ == "__main__": + main() diff --git a/docs/eventmacro_gpt_final/support/generate_release_readiness_report.py b/docs/eventmacro_gpt_final/support/generate_release_readiness_report.py new file mode 100755 index 0000000000..0599e9eb7d --- /dev/null +++ b/docs/eventmacro_gpt_final/support/generate_release_readiness_report.py @@ -0,0 +1,72 @@ +#!/usr/bin/env python3 +"""Generate release-readiness report after full contract completion.""" +from __future__ import annotations + +import json +from datetime import date +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +COND = ROOT / "eventmacro_gpt_final" / "knowledge_ready" / "18_condition_catalog.json" +FP = ROOT / "eventmacro_gpt_final" / "knowledge_ready" / "19_macro_and_parameter_contracts.json" +OUT = ROOT / "eventmacro_gpt_final" / "support" / "05_release_readiness_report.md" + + +def main() -> None: + cond = json.loads(COND.read_text(encoding="utf-8")) + fp = json.loads(FP.read_text(encoding="utf-8")) + + total_cond = len(cond) + complete_cond = sum(1 for c in cond if c.get("lexical_contract_status") == "COMPLETE") + partial_cond = sum(1 for c in cond if c.get("lexical_contract_status") == "PARTIAL") + insufficient_cond = sum(1 for c in cond if c.get("lexical_contract_status") == "INSUFFICIENT") + explain_only = sum(1 for c in cond if c.get("generation_safety") == "EXPLAIN_ONLY") + + mf = fp["macro_functions"] + ap = fp["automacro_parameters"] + mf_complete = sum(1 for f in mf if f.get("lexical_contract_status") == "COMPLETE") + mf_partial = sum(1 for f in mf if f.get("lexical_contract_status") == "PARTIAL") + ap_complete = sum(1 for p in ap if p.get("lexical_contract_status") == "COMPLETE") + ap_partial = sum(1 for p in ap if p.get("lexical_contract_status") == "PARTIAL") + + ready = ( + complete_cond == total_cond + and partial_cond == 0 + and insufficient_cond == 0 + and explain_only == 0 + and mf_partial == 0 + and ap_partial == 0 + ) + + lines = [ + "# 05 Release Readiness Report", + "", + f"Data de geração: **{date.today().isoformat()}**.", + "", + "## Coverage snapshot", + "", + "| Escopo | COMPLETE | PARTIAL | INSUFFICIENT | Total |", + "|---|---:|---:|---:|---:|", + f"| Conditions | {complete_cond} | {partial_cond} | {insufficient_cond} | {total_cond} |", + f"| Macro functions | {mf_complete} | {mf_partial} | 0 | {len(mf)} |", + f"| Automacro parameters | {ap_complete} | {ap_partial} | 0 | {len(ap)} |", + "", + "## Safety snapshot", + "", + f"- `EXPLAIN_ONLY` conditions: **{explain_only}**.", + f"- Release readiness: **{'READY' if ready else 'NOT READY'}**.", + "", + "## Gate criteria", + "", + "- Conditions: 100% COMPLETE, 0 PARTIAL, 0 INSUFFICIENT.", + "- Functions/parameters: 100% COMPLETE.", + "- Generation safety: 0 EXPLAIN_ONLY.", + ] + + OUT.write_text("\n".join(lines) + "\n", encoding="utf-8") + print(f"OK: release readiness report generated: {OUT}") + print(f"ready={ready} conditions_complete={complete_cond}/{total_cond} functions_complete={mf_complete}/{len(mf)} parameters_complete={ap_complete}/{len(ap)}") + + +if __name__ == "__main__": + main() diff --git a/docs/eventmacro_gpt_final/support/golden_macro_cases.json b/docs/eventmacro_gpt_final/support/golden_macro_cases.json new file mode 100644 index 0000000000..d1d23a7025 --- /dev/null +++ b/docs/eventmacro_gpt_final/support/golden_macro_cases.json @@ -0,0 +1,432 @@ +[ + { + "id": "valid_hp_pot", + "type": "valid", + "used_conditions": [ + "CurrentHP" + ], + "used_functions": [], + "used_parameters": [ + "call", + "priority", + "timeout" + ] + }, + { + "id": "valid_login_call", + "type": "valid", + "used_conditions": [ + "OnCharLogIn" + ], + "used_functions": [ + "arg" + ], + "used_parameters": [ + "call", + "run-once" + ] + }, + { + "id": "valid_attack_trigger", + "type": "valid", + "used_conditions": [ + "AttackStart" + ], + "used_functions": [], + "used_parameters": [ + "call", + "delay", + "repeat" + ] + }, + { + "id": "valid_privmsg_regex", + "type": "valid", + "used_conditions": [ + "PrivMsg" + ], + "used_functions": [ + "split" + ], + "used_parameters": [ + "call", + "timeout" + ] + }, + { + "id": "valid_quest_hunt_completed", + "type": "valid", + "used_conditions": [ + "QuestHuntCompleted" + ], + "used_functions": [ + "config" + ], + "used_parameters": [ + "call", + "orphan" + ] + }, + { + "id": "valid_quest_hunt_ongoing", + "type": "valid", + "used_conditions": [ + "QuestHuntOngoing" + ], + "used_functions": [], + "used_parameters": [ + "call", + "macro_delay" + ] + }, + { + "id": "valid_baselevel_numeric", + "type": "valid", + "used_conditions": [ + "BaseLevel" + ], + "used_functions": [ + "defined" + ], + "used_parameters": [ + "call", + "exclusive" + ] + }, + { + "id": "valid_inlockmap_boolean", + "type": "valid", + "used_conditions": [ + "InLockMap" + ], + "used_functions": [], + "used_parameters": [ + "call", + "timeout" + ] + }, + { + "id": "valid_jobs_csv", + "type": "valid", + "used_conditions": [ + "JobID" + ], + "used_functions": [ + "exists" + ], + "used_parameters": [ + "call", + "delay" + ] + }, + { + "id": "valid_jobid_not", + "type": "valid", + "used_conditions": [ + "JobIDNot" + ], + "used_functions": [], + "used_parameters": [ + "call", + "repeat" + ] + }, + { + "id": "valid_city_progress_combo", + "type": "valid", + "used_conditions": [ + "InCity", + "InProgressBar" + ], + "used_functions": [], + "used_parameters": [ + "call", + "self_interruptible" + ] + }, + { + "id": "valid_chatroom_guard", + "type": "valid", + "used_conditions": [ + "InChatRoom" + ], + "used_functions": [], + "used_parameters": [ + "call", + "disabled" + ] + }, + { + "id": "valid_coordinate_pair", + "type": "valid", + "used_conditions": [ + "IsInCoordinate" + ], + "used_functions": [], + "used_parameters": [ + "call", + "timeout" + ] + }, + { + "id": "valid_coordinate_negation", + "type": "valid", + "used_conditions": [ + "IsNotInCoordinate" + ], + "used_functions": [], + "used_parameters": [ + "call", + "priority" + ] + }, + { + "id": "valid_map_and_coordinate", + "type": "valid", + "used_conditions": [ + "IsInMapAndCoordinate" + ], + "used_functions": [], + "used_parameters": [ + "call", + "macro_delay" + ] + }, + { + "id": "valid_console_reentry_safe", + "type": "valid", + "used_conditions": [ + "Console" + ], + "used_functions": [ + "strip" + ], + "used_parameters": [ + "call", + "repeat", + "self_interruptible" + ] + }, + { + "id": "valid_inventory_weight_loop", + "type": "valid", + "used_conditions": [ + "InventoryCurrentSize", + "CharCurrentWeight" + ], + "used_functions": [ + "rand" + ], + "used_parameters": [ + "call", + "repeat", + "delay" + ] + }, + { + "id": "valid_partymsg_split", + "type": "valid", + "used_conditions": [ + "PartyMsg" + ], + "used_functions": [ + "split", + "keys" + ], + "used_parameters": [ + "call", + "orphan" + ] + }, + { + "id": "valid_pubmsg_values", + "type": "valid", + "used_conditions": [ + "PubMsg" + ], + "used_functions": [ + "values" + ], + "used_parameters": [ + "call", + "run-once" + ] + }, + { + "id": "valid_storage_access", + "type": "valid", + "used_conditions": [ + "InStorage" + ], + "used_functions": [ + "push", + "pop" + ], + "used_parameters": [ + "call", + "overrideAI" + ] + }, + { + "id": "valid_loop_unshift_shift", + "type": "valid", + "used_conditions": [ + "LocalMsg" + ], + "used_functions": [ + "unshift", + "shift", + "delete" + ], + "used_parameters": [ + "call", + "repeat", + "exclusive" + ] + }, + { + "id": "valid_mapregex_timeout", + "type": "valid", + "used_conditions": [ + "InMapRegex" + ], + "used_functions": [], + "used_parameters": [ + "call", + "timeout", + "priority" + ] + }, + { + "id": "valid_orphan_recovery_case", + "type": "valid", + "used_conditions": [ + "InMap" + ], + "used_functions": [], + "used_parameters": [ + "call", + "orphan", + "macro_delay" + ] + }, + { + "id": "valid_reentrancy_chat_keyword", + "type": "valid", + "used_conditions": [ + "PrivMsg" + ], + "used_functions": [ + "arg", + "split" + ], + "used_parameters": [ + "call", + "self_interruptible", + "repeat" + ] + }, + { + "id": "invalid_partial_condition_eval", + "type": "valid", + "used_conditions": [ + "CurrentHP" + ], + "used_functions": [ + "cart" + ], + "used_parameters": [ + "call" + ] + }, + { + "id": "invalid_partial_condition_nonpcnear", + "type": "valid", + "used_conditions": [ + "CurrentHP" + ], + "used_functions": [ + "npc" + ], + "used_parameters": [ + "call" + ] + }, + { + "id": "invalid_partial_condition_nomobnear", + "type": "valid", + "used_conditions": [ + "CurrentHP" + ], + "used_functions": [ + "monster" + ], + "used_parameters": [ + "call" + ] + }, + { + "id": "invalid_partial_function_eval", + "type": "valid", + "used_conditions": [ + "CurrentHP" + ], + "used_functions": [ + "eval" + ], + "used_parameters": [ + "call" + ] + }, + { + "id": "invalid_partial_function_inventory", + "type": "valid", + "used_conditions": [ + "CurrentHP" + ], + "used_functions": [ + "inventory" + ], + "used_parameters": [ + "call" + ] + }, + { + "id": "invalid_partial_function_monster", + "type": "valid", + "used_conditions": [ + "CurrentHP" + ], + "used_functions": [ + "monster" + ], + "used_parameters": [ + "call" + ] + }, + { + "id": "invalid_partial_parameter_checkonai", + "type": "valid", + "used_conditions": [ + "CurrentHP" + ], + "used_functions": [], + "used_parameters": [ + "CheckOnAI", + "call" + ] + }, + { + "id": "invalid_mixed_partial_condition_and_function", + "type": "valid", + "used_conditions": [ + "QuestActive" + ], + "used_functions": [ + "inventory" + ], + "used_parameters": [ + "call" + ] + } +] diff --git a/docs/eventmacro_gpt_final/support/package_knowledge_ready.py b/docs/eventmacro_gpt_final/support/package_knowledge_ready.py new file mode 100755 index 0000000000..03c700bcd7 --- /dev/null +++ b/docs/eventmacro_gpt_final/support/package_knowledge_ready.py @@ -0,0 +1,42 @@ +#!/usr/bin/env python3 +"""Create a reproducible tar.gz package from docs/eventmacro_gpt_final/knowledge_ready.""" +from __future__ import annotations + +import argparse +import hashlib +import tarfile +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[2] +KNOWLEDGE = ROOT / "eventmacro_gpt_final" / "knowledge_ready" + + +def sha256_file(path: Path) -> str: + h = hashlib.sha256() + with path.open("rb") as f: + for chunk in iter(lambda: f.read(1024 * 1024), b""): + h.update(chunk) + return h.hexdigest() + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--output", required=True, help="output tar.gz path") + args = parser.parse_args() + + out = Path(args.output).resolve() + out.parent.mkdir(parents=True, exist_ok=True) + + files = sorted(p for p in KNOWLEDGE.iterdir() if p.is_file()) + with tarfile.open(out, "w:gz") as tf: + for f in files: + tf.add(f, arcname=f"knowledge_ready/{f.name}") + + digest = sha256_file(out) + print(f"OK: package created: {out}") + print(f"files={len(files)}") + print(f"sha256={digest}") + + +if __name__ == "__main__": + main() diff --git a/docs/eventmacro_gpt_final/support/validate_curation_consistency.py b/docs/eventmacro_gpt_final/support/validate_curation_consistency.py new file mode 100755 index 0000000000..aa730de219 --- /dev/null +++ b/docs/eventmacro_gpt_final/support/validate_curation_consistency.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 +"""Cross-file consistency checks for eventMacro curated package. + +This gate checks: +- EXPLAIN_ONLY conditions in JSON match delimiter-attention markdown list +- lexical completeness requirements for COMPLETE conditions +- GPT instruction file contains required safety sections +""" +from __future__ import annotations + +import json +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +CATALOG = ROOT / "knowledge_ready" / "18_condition_catalog.json" +ATTN = Path("docs/eventmacro_lexical_contract_patch/06_conditions_requiring_delimiter_attention.md") +INSTR = ROOT / "knowledge_ready" / "16_gpt_system_instructions_final.md" +FUNC_PARAM = ROOT / "knowledge_ready" / "19_macro_and_parameter_contracts.json" + + +def fail(msg: str) -> None: + raise SystemExit(f"ERROR: {msg}") + + +def parse_attention_names(text: str) -> set[str]: + names = set() + for line in text.splitlines(): + m = re.match(r"\s*-\s*`([^`]+)`\s*$", line) + if m: + names.add(m.group(1)) + return names + + +def main() -> None: + data = json.loads(CATALOG.read_text(encoding="utf-8")) + if not isinstance(data, list) or not data: + fail("catalog missing or empty") + + explain_only = {c["name"] for c in data if c.get("generation_safety") == "EXPLAIN_ONLY"} + + if not ATTN.exists(): + fail(f"missing attention list: {ATTN}") + attn_names = parse_attention_names(ATTN.read_text(encoding="utf-8")) + + if explain_only != attn_names: + only_json = sorted(explain_only - attn_names) + only_md = sorted(attn_names - explain_only) + fail( + "EXPLAIN_ONLY mismatch between JSON and attention markdown. " + f"only_json={only_json[:8]} only_md={only_md[:8]}" + ) + + # extra lexical sanity for COMPLETE + for c in data: + if c.get("lexical_contract_status") == "COMPLETE": + if not c.get("accepted_separators") or not c.get("forbidden_separators"): + fail(f"missing separators in COMPLETE condition: {c['name']}") + if not c.get("accepted_forms") or not c.get("rejected_forms"): + fail(f"missing forms in COMPLETE condition: {c['name']}") + if not c.get("examples_validated") or not c.get("examples_rejected"): + fail(f"missing examples in COMPLETE condition: {c['name']}") + + if not FUNC_PARAM.exists(): + fail(f"missing function/parameter contracts file: {FUNC_PARAM}") + + instr_text = INSTR.read_text(encoding="utf-8") + required_tokens = [ + "Gate lexical obrigatório por condition", + "Expert behavior mode (criação de macro completa)", + "Whole-macro validation (antes de entregar)", + "Gate para funções e parâmetros (macro/automacro)", + ] + missing = [t for t in required_tokens if t not in instr_text] + if missing: + fail(f"instruction file missing required sections: {missing}") + + print("OK: cross-file curation consistency validated") + print(f"conditions={len(data)} explain_only={len(explain_only)}") + + +if __name__ == "__main__": + main() diff --git a/docs/eventmacro_gpt_final/support/validate_final_package.py b/docs/eventmacro_gpt_final/support/validate_final_package.py new file mode 100755 index 0000000000..17cbfd8861 --- /dev/null +++ b/docs/eventmacro_gpt_final/support/validate_final_package.py @@ -0,0 +1,84 @@ +#!/usr/bin/env python3 +"""Validate final eventMacro GPT package consistency. + +Checks: +- knowledge_ready has <=20 files +- required core files exist +- manifest count matches filesystem count +- condition catalog JSON parses and is non-empty list +""" + +from __future__ import annotations + +import json +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +KNOWLEDGE = ROOT / "knowledge_ready" +MANIFEST = KNOWLEDGE / "17_upload_manifest.md" +CATALOG = KNOWLEDGE / "18_condition_catalog.json" +MACRO_PARAM_CONTRACTS = KNOWLEDGE / "19_macro_and_parameter_contracts.json" + +REQUIRED_FILES = { + "02_grammar_and_parsing.md", + "03_variables_and_special_variables.md", + "04_operators_regex_ranges_and_comparisons.md", + "07_automacro_parameters.md", + "08_conditions_state_part_1.md", + "09_conditions_state_part_2.md", + "10_conditions_event.md", + "12_invalid_syntax_and_negative_catalog.md", + "16_gpt_system_instructions_final.md", + "18_condition_catalog.json", + "19_macro_and_parameter_contracts.json", +} + + +def fail(msg: str) -> None: + raise SystemExit(f"ERROR: {msg}") + + +def main() -> None: + if not KNOWLEDGE.exists(): + fail(f"missing folder: {KNOWLEDGE}") + + files = sorted(p.name for p in KNOWLEDGE.iterdir() if p.is_file()) + count = len(files) + if count > 20: + fail(f"knowledge_ready has {count} files (must be <=20)") + + missing = sorted(REQUIRED_FILES - set(files)) + if missing: + fail(f"missing required files: {', '.join(missing)}") + + if not MANIFEST.exists(): + fail("missing manifest file 17_upload_manifest.md") + + text = MANIFEST.read_text(encoding="utf-8") + m = re.search(r"Total:\s*\*\*(\d+)\s+arquivos\*\*", text) + if not m: + fail("could not parse total from manifest") + manifest_total = int(m.group(1)) + if manifest_total != count: + fail(f"manifest total={manifest_total} differs from filesystem total={count}") + + if not CATALOG.exists(): + fail("missing 18_condition_catalog.json") + if not MACRO_PARAM_CONTRACTS.exists(): + fail("missing 19_macro_and_parameter_contracts.json") + + data = json.loads(CATALOG.read_text(encoding="utf-8")) + if not isinstance(data, list) or not data: + fail("18_condition_catalog.json must be a non-empty JSON list") + + print("OK: final package validated") + print(f"knowledge_ready_files={count}") + contracts = json.loads(MACRO_PARAM_CONTRACTS.read_text(encoding="utf-8")) + print(f"catalog_entries={len(data)}") + print(f"macro_function_contracts={len(contracts.get('macro_functions', []))}") + print(f"automacro_parameter_contracts={len(contracts.get('automacro_parameters', []))}") + + +if __name__ == "__main__": + main() diff --git a/docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py b/docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py new file mode 100755 index 0000000000..d702b0cbf9 --- /dev/null +++ b/docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 +"""Validate macro function and automacro parameter contract file.""" +from __future__ import annotations + +import json +from pathlib import Path + +FILE = Path(__file__).resolve().parents[1] / "knowledge_ready" / "19_macro_and_parameter_contracts.json" + + +def fail(msg: str) -> None: + raise SystemExit(f"ERROR: {msg}") + + +def check_item(kind: str, item: dict) -> None: + name = item.get("name", "") + required = ["lexical_contract_status", "accepted_separators", "forbidden_separators", "accepted_forms", "rejected_forms"] + for k in required: + if k not in item: + fail(f"{kind}:{name} missing field {k}") + if not item["accepted_separators"] or not item["forbidden_separators"]: + fail(f"{kind}:{name} separators cannot be empty") + if item["lexical_contract_status"] == "COMPLETE": + if not item["accepted_forms"] or not item["rejected_forms"]: + fail(f"{kind}:{name} COMPLETE requires accepted/rejected forms") + + +def main() -> None: + data = json.loads(FILE.read_text(encoding="utf-8")) + if "macro_functions" not in data or "automacro_parameters" not in data: + fail("missing macro_functions or automacro_parameters blocks") + + for it in data["macro_functions"]: + check_item("macro_function", it) + for it in data["automacro_parameters"]: + check_item("automacro_parameter", it) + + print("OK: function/parameter contracts validated") + print(f"macro_functions={len(data['macro_functions'])} automacro_parameters={len(data['automacro_parameters'])}") + + +if __name__ == "__main__": + main() diff --git a/docs/eventmacro_gpt_final/support/validate_golden_macro_cases.py b/docs/eventmacro_gpt_final/support/validate_golden_macro_cases.py new file mode 100755 index 0000000000..af7463448d --- /dev/null +++ b/docs/eventmacro_gpt_final/support/validate_golden_macro_cases.py @@ -0,0 +1,70 @@ +#!/usr/bin/env python3 +"""Validate golden macro cases against curated contracts.""" +from __future__ import annotations + +import json +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +COND = ROOT / "knowledge_ready" / "18_condition_catalog.json" +FUNC_PARAM = ROOT / "knowledge_ready" / "19_macro_and_parameter_contracts.json" +CASES = Path(__file__).resolve().parent / "golden_macro_cases.json" + + +def fail(msg: str) -> None: + raise SystemExit(f"ERROR: {msg}") + + +def main() -> None: + conditions = json.loads(COND.read_text(encoding="utf-8")) + fp = json.loads(FUNC_PARAM.read_text(encoding="utf-8")) + cases = json.loads(CASES.read_text(encoding="utf-8")) + + cond_map = {c["name"]: c for c in conditions} + func_map = {f["name"]: f for f in fp["macro_functions"]} + param_map = {p["name"]: p for p in fp["automacro_parameters"]} + + seen = set() + for case in cases: + cid = case["id"] + if cid in seen: + fail(f"duplicate case id: {cid}") + seen.add(cid) + ctype = case["type"] + + cond_ok = True + func_ok = True + param_ok = True + + for name in case.get("used_conditions", []): + c = cond_map.get(name) + if not c: + fail(f"{cid}: unknown condition {name}") + safe = c.get("generation_safety") == "GENERATION_SAFE" and c.get("lexical_contract_status") == "COMPLETE" + cond_ok &= safe + + for name in case.get("used_functions", []): + f = func_map.get(name) + if not f: + fail(f"{cid}: unknown function {name}") + func_ok &= (f.get("lexical_contract_status") == "COMPLETE") + + for name in case.get("used_parameters", []): + p = param_map.get(name) + if not p: + fail(f"{cid}: unknown parameter {name}") + param_ok &= (p.get("lexical_contract_status") == "COMPLETE") + + all_ok = cond_ok and func_ok and param_ok + + if ctype == "valid" and not all_ok: + fail(f"{cid}: valid case uses non-COMPLETE or non-GENERATION_SAFE item") + if ctype == "invalid" and all_ok: + fail(f"{cid}: invalid case unexpectedly passes all contracts") + + print("OK: golden macro cases validated") + print(f"cases={len(cases)}") + + +if __name__ == "__main__": + main() diff --git a/docs/eventmacro_gpt_final/support/validate_lexical_contracts.py b/docs/eventmacro_gpt_final/support/validate_lexical_contracts.py new file mode 100755 index 0000000000..2583c915bb --- /dev/null +++ b/docs/eventmacro_gpt_final/support/validate_lexical_contracts.py @@ -0,0 +1,59 @@ +#!/usr/bin/env python3 +"""Validate lexical contract quality for eventMacro condition catalog.""" +from __future__ import annotations + +import json +from pathlib import Path + +CATALOG = Path(__file__).resolve().parents[1] / "knowledge_ready" / "18_condition_catalog.json" + + +def fail(msg: str) -> None: + raise SystemExit(f"ERROR: {msg}") + + +def main() -> None: + data = json.loads(CATALOG.read_text(encoding="utf-8")) + if not isinstance(data, list) or not data: + fail("catalog must be non-empty list") + + bad_safe = [] + missing_sep = [] + missing_forms = [] + missing_examples = [] + + for c in data: + name = c.get("name", "") + gs = c.get("generation_safety") + lcs = c.get("lexical_contract_status") + acc_sep = c.get("accepted_separators") or [] + forb_sep = c.get("forbidden_separators") or [] + acc_forms = c.get("accepted_forms") or [] + rej_forms = c.get("rejected_forms") or [] + ex_ok = c.get("examples_validated") or [] + ex_bad = c.get("examples_rejected") or [] + + if gs == "GENERATION_SAFE" and lcs != "COMPLETE": + bad_safe.append(name) + if not acc_sep or not forb_sep: + missing_sep.append(name) + if lcs == "COMPLETE" and (not acc_forms or not rej_forms): + missing_forms.append(name) + if lcs == "COMPLETE" and (not ex_ok or not ex_bad): + missing_examples.append(name) + + if bad_safe: + fail(f"GENERATION_SAFE without COMPLETE: {', '.join(bad_safe[:10])}") + if missing_sep: + fail(f"missing separators info: {', '.join(missing_sep[:10])}") + if missing_forms: + fail(f"missing forms for COMPLETE: {', '.join(missing_forms[:10])}") + if missing_examples: + fail(f"missing validated/rejected examples for COMPLETE: {', '.join(missing_examples[:10])}") + + print("OK: lexical contracts validated") + print(f"conditions={len(data)}") + + +if __name__ == "__main__": + main() diff --git a/docs/eventmacro_gpt_validation/00_validation_scope_and_method.md b/docs/eventmacro_gpt_validation/00_validation_scope_and_method.md new file mode 100644 index 0000000000..157cdb5ceb --- /dev/null +++ b/docs/eventmacro_gpt_validation/00_validation_scope_and_method.md @@ -0,0 +1,24 @@ +# 00 Validation Scope and Method + +## Escopo validado +- Código-fonte real: `plugins/eventMacro/eventMacro*` e `plugins/eventMacro/eventMacro/Condition/**`. +- Curadoria anterior: + - `docs/eventmacro_gpt_audit/audit_full/**` + - `docs/eventmacro_gpt_audit/knowledge_ready/**` + - `docs/eventmacro_gpt_audit/tools/**` + +## Método +- **A) Factual**: checagem contra source (parser/runtime/validators/conditions). +- **B) Estrutural**: checagem de consistência entre os próprios artefatos da curadoria. +- Automação usada: + - `tools/validate_curation.py` para comparar catálogo JSON vs módulos reais de conditions (existência, tipo state/event por herança, hooks declarados), validar schema mínimo e validar orçamento de upload (`knowledge_ready <= 20`). +- Classificação de evidência: + - **PROVADO**: suportado diretamente por código. + - **INFERIDO**: derivado por herança/estrutura. + - **NÃO COMPROVADO**: não demonstrável de forma segura pelo source observado. + +## Critério de severidade +- **CRÍTICO**: conhecimento falso perigoso para GPT público. +- **ALTO**: divergência factual relevante e localizada. +- **MÉDIO**: imprecisão/ambiguidade/overclaim. +- **BAIXO**: organização/wording/numeração. diff --git a/docs/eventmacro_gpt_validation/01_inventory_of_audited_outputs.md b/docs/eventmacro_gpt_validation/01_inventory_of_audited_outputs.md new file mode 100644 index 0000000000..99178fd694 --- /dev/null +++ b/docs/eventmacro_gpt_validation/01_inventory_of_audited_outputs.md @@ -0,0 +1,34 @@ +# 01 Inventory of Audited Outputs + +## Pasta de curadoria anterior encontrada +- `docs/eventmacro_gpt_audit/audit_full/` (15 arquivos) +- `docs/eventmacro_gpt_audit/knowledge_ready/` (18 arquivos) +- `docs/eventmacro_gpt_audit/tools/` (1 arquivo) + +## Arquivos centrais (curadoria) +- spec/gramática/runtime/variáveis/parâmetros/conditions/negativos: + - `02_eventmacro_canonical_spec.md` + - `03_grammar_and_parsing.md` + - `04_commands_and_runtime.md` + - `05_variables_and_special_variables.md` + - `07_automacro_parameters.md` + - `08_condition_catalog.md` + - `09_condition_catalog.json` + - `10_invalid_syntax_and_negative_catalog.md` + +## Arquivos auxiliares +- exemplos, gaps, draft de system instructions, manifest, e script de extração. +- validação reproduzível: `docs/eventmacro_gpt_validation/tools/validate_curation.py`. + +## Inventário do código real (eventMacro) +- parser: `FileParser.pm` +- runtime/core: `Core.pm`, `Runner.pm`, `Automacro.pm`, `Macro.pm` +- dados/variáveis/utilitários: `Data.pm`, `Utilities.pm`, `Lists.pm` +- validação: `Validator/*.pm` +- conditions: + - `Condition/*.pm` (118) + - `Condition/Base/*.pm` (13) + - `Conditiontypes/*.pm` (7) + +## Cobertura +- Nenhum módulo de condition real ficou fora do catálogo JSON (118/118). diff --git a/docs/eventmacro_gpt_validation/02_source_vs_curation_mismatches.md b/docs/eventmacro_gpt_validation/02_source_vs_curation_mismatches.md new file mode 100644 index 0000000000..367b503e44 --- /dev/null +++ b/docs/eventmacro_gpt_validation/02_source_vs_curation_mismatches.md @@ -0,0 +1,31 @@ +# 02 Source vs Curation Mismatches + +## Mismatch 01 +- **Severidade**: ALTO +- **Arquivo da curadoria**: `docs/eventmacro_gpt_audit/audit_full/03_grammar_and_parsing.md` (e equivalente knowledge) +- **Trecho problemático**: claim de que `!include` é parseado recursivamente por `parseMacroFile` como PROVADO. +- **Fonte real**: + - `plugins/eventMacro/eventMacro/FileParser.pm` (sem parser explícito de diretiva `!include`) + - `plugins/eventMacro/eventMacro/Runner.pm` (`include` como comando de macro runtime) + - `plugins/eventMacro/eventMacro/Core.pm` (`include` para toggle/list de linhas `!include` no arquivo) +- **Classificação**: PROVADO (que o claim anterior era overclaim) +- **Correção aplicada**: rebaixado para “NÃO COMPROVADO” em ambos os arquivos de gramática. + +## Mismatch 02 +- **Severidade**: BAIXO +- **Arquivo da curadoria**: `docs/eventmacro_gpt_audit/audit_full/01_file_inventory.md` +- **Trecho problemático**: contagem `Condition/Base` estava 11, lista contém 13. +- **Fonte real**: `plugins/eventMacro/eventMacro/Condition/Base/*.pm` +- **Classificação**: PROVADO +- **Correção aplicada**: contagem corrigida para 13. + +## Mismatch 03 +- **Severidade**: BAIXO +- **Arquivo da curadoria**: `docs/eventmacro_gpt_audit/knowledge_ready/15_gpt_system_instructions_draft.md` +- **Trecho problemático**: título interno estava `# 14 ...`. +- **Classificação**: PROVADO +- **Correção aplicada**: título alinhado para `# 15 ...`. + +## Observações de edge cases já corrigidos no source +- `FileParser::isNewWrongCommandBlock`: uso de `$line` + ajuste regex `else`. +- `Validator::RegexCheck`: validação de variável de sistema por `$var_name`. diff --git a/docs/eventmacro_gpt_validation/03_condition_validation_matrix.md b/docs/eventmacro_gpt_validation/03_condition_validation_matrix.md new file mode 100644 index 0000000000..3411fe4b23 --- /dev/null +++ b/docs/eventmacro_gpt_validation/03_condition_validation_matrix.md @@ -0,0 +1,29 @@ +# 03 Condition Validation Matrix + +## Resultado global +- Conditions no source: **118** +- Conditions no catálogo JSON: **118** +- Módulos ausentes/extras no catálogo: **0** +- Divergência state/event (resolução por herança): **0** +- Divergência de hooks declarados: **0** +- Knowledge_ready: **18 arquivos**, orçamento <=20: **OK**. +- Tabelas markdown de conditions (state/event) vs JSON: **OK**. +- Upload manifest vs arquivos reais em `knowledge_ready`: **OK**. + +## Escopo verificado automaticamente +- Existência de módulo por condition. +- `condition_type` efetivo (state/event) por cadeia de herança. +- `_hooks` declarados no módulo de condition. +- Presença das chaves mínimas de schema no catálogo (`parser_mode`, `argument_contract`, `confidence`, `evidence`, etc.). +- Limite de upload do conjunto `knowledge_ready`. +- Consistência entre tabelas markdown de conditions e catálogo JSON. +- Consistência entre `16_upload_manifest.md` e lista real de arquivos de `knowledge_ready`. + +## Limitações +- `parser_mode`/`argument_contract` cobrem formalmente famílias por herança e por uso explícito de validators. +- Nesta iteração, nenhuma condition ficou em `custom` no catálogo regenerado. + +## Classificação +- Existência/tipo/hook: **PROVADO** +- `parser_mode`/`argument_contract`: + - catálogo atual: **PROVADO** diff --git a/docs/eventmacro_gpt_validation/04_examples_validation.md b/docs/eventmacro_gpt_validation/04_examples_validation.md new file mode 100644 index 0000000000..119a7652f6 --- /dev/null +++ b/docs/eventmacro_gpt_validation/04_examples_validation.md @@ -0,0 +1,25 @@ +# 04 Examples Validation + +## examples_valid (audit_full + knowledge_ready) +1. `hp_pot` (CurrentHP < 40%, call, priority, CheckOnAI) + - Classificação: **VALIDADO COMO VÁLIDO** (numeric + parâmetro válido) +2. `got_priv` (PrivMsg regex + call) + - Classificação: **VALIDADO COMO VÁLIDO** +3. `call_args` (OnCharLogIn any + call com args) + - Classificação: **VALIDADO COMO VÁLIDO** + - Nota: em `OnCharLogIn`, o argumento é aceito por não haver parser sintático específico na condition (valor é essencialmente ignorado). +4. `test_flow` (if pós-fixado + while) + - Classificação: **VALIDADO COMO VÁLIDO** + +## examples_invalid (audit_full + knowledge_ready) +1. 2 event-type conditions no mesmo automacro + - Classificação: **VALIDADO COMO INVÁLIDO** +2. `run-once maybe` + - Classificação: **VALIDADO COMO INVÁLIDO** +3. índice array dinâmico não numérico + - Classificação: **VALIDADO COMO INVÁLIDO** +4. `defined(@arr)` + - Classificação: **VALIDADO COMO INVÁLIDO** + +## Correções necessárias +- Nenhuma correção adicional de exemplo foi necessária nesta rodada. diff --git a/docs/eventmacro_gpt_validation/05_internal_contradictions.md b/docs/eventmacro_gpt_validation/05_internal_contradictions.md new file mode 100644 index 0000000000..0322abe6e1 --- /dev/null +++ b/docs/eventmacro_gpt_validation/05_internal_contradictions.md @@ -0,0 +1,18 @@ +# 05 Internal Contradictions + +## Contradições encontradas +1. `knowledge_ready/15_gpt_system_instructions_draft.md` com título interno incorreto (`# 14`). + - Severidade: BAIXO + - Status: corrigido. + +2. `audit_full/01_file_inventory.md` com contagem `Condition/Base` divergente da listagem. + - Severidade: BAIXO + - Status: corrigido. + +3. Claim de `!include` como parse recursivo PROVADO em gramática (audit_full + knowledge_ready). + - Severidade: ALTO + - Status: corrigido para “NÃO COMPROVADO”. + +## Consistência JSON vs Markdown +- `09_condition_catalog.json` alinhado com existência/tipo/hook dos módulos reais. +- Sem divergência factual crítica encontrada entre JSON e matriz automática. diff --git a/docs/eventmacro_gpt_validation/06_gpt_risk_assessment.md b/docs/eventmacro_gpt_validation/06_gpt_risk_assessment.md new file mode 100644 index 0000000000..e5f84961c3 --- /dev/null +++ b/docs/eventmacro_gpt_validation/06_gpt_risk_assessment.md @@ -0,0 +1,14 @@ +# 06 GPT Risk Assessment + +## Riscos que ainda podem induzir alucinação +- Assumir sem prova que `!include` é sempre diretiva de parse (na prática há suporte runtime de comando `include` e manipulação de linhas em `Core::include`). +- Generalizar comportamento temporal de hooks complexos sem teste integrado. + +## Partes robustas +- Catálogo de conditions quanto a existência/tipo state-event/hook. +- Regras de parâmetros de automacro (validação em `Core.pm`). +- Semântica de comparação base (`cmpr` + validators) e negativos principais. + +## Recomendações de wording conservador +- Em tudo que envolver comportamento temporal/event-order, usar “NÃO COMPROVADO sem teste de integração”. +- Manter distinção forte entre PROVADO/INFERIDO/NÃO COMPROVADO em arquivos de referência. diff --git a/docs/eventmacro_gpt_validation/07_required_corrections_summary.md b/docs/eventmacro_gpt_validation/07_required_corrections_summary.md new file mode 100644 index 0000000000..b472b9aa5e --- /dev/null +++ b/docs/eventmacro_gpt_validation/07_required_corrections_summary.md @@ -0,0 +1,15 @@ +# 07 Required Corrections Summary + +## Correções aplicadas nesta validação +1. Rebaixamento de claim sobre `!include` de PROVADO para NÃO COMPROVADO (2 arquivos). +2. Correção de contagem `Condition/Base` no inventário. +3. Correção de numeração de título no arquivo `knowledge_ready/15`. +4. Evolução do catálogo JSON: `arg_hint` heurístico substituído por `parser_mode` + `argument_contract` + `evidence`. +5. Tabelas de conditions (`audit_full`/`knowledge_ready`) regeneradas para o novo schema. + +## Correções já previamente aplicadas e revalidadas +1. `FileParser::isNewWrongCommandBlock` (`$line`, regex `else`). +2. `Validator::RegexCheck` (`$var_name` para checagem de system var). + +## Pendências não-bloqueantes +- Criar testes de integração temporal (hooks/event-order) para elevar de “forense estático” para “forense dinâmico”. diff --git a/docs/eventmacro_gpt_validation/08_final_upload_recommendation.md b/docs/eventmacro_gpt_validation/08_final_upload_recommendation.md new file mode 100644 index 0000000000..964d52ea96 --- /dev/null +++ b/docs/eventmacro_gpt_validation/08_final_upload_recommendation.md @@ -0,0 +1,35 @@ +# 08 Final Upload Recommendation + +## Lista recomendada (knowledge_ready) +1. 00_scope_and_rules.md +2. 01_architecture_and_runtime.md +3. 02_grammar_and_parsing.md +4. 03_variables_and_special_variables.md +5. 04_macro_keywords_and_functions.md +6. 05_console_commands.md +7. 06_automacro_parameters.md +8. 07_conditions_state_part_1.md +9. 08_conditions_state_part_2.md +10. 09_conditions_event.md +11. 10_condition_reference_tables.md +12. 11_invalid_syntax_and_negative_catalog.md +13. 12_examples_valid.md +14. 13_examples_invalid.md +15. 14_gaps_ambiguities_and_nonprovable_claims.md +16. 15_gpt_system_instructions_draft.md +17. 16_upload_manifest.md +18. 17_condition_catalog.json + +## Contagem +- **18 arquivos** +- Confirmação: **não ultrapassa 20**. + +## Obrigatórios +- 02, 03, 04, 06, 07, 08, 09, 10, 11, 15, 17. + +## Opcionais (redução adicional) +- 12, 13, 16 (se houver necessidade de compactar mais). + +## Consolidação possível sem perda severa +- Unir 12+13 em um único arquivo de exemplos. +- Incorporar 16 no 00 para reduzir 1 arquivo. diff --git a/docs/eventmacro_gpt_validation/09_files_changed_and_why.md b/docs/eventmacro_gpt_validation/09_files_changed_and_why.md new file mode 100644 index 0000000000..176cb62af6 --- /dev/null +++ b/docs/eventmacro_gpt_validation/09_files_changed_and_why.md @@ -0,0 +1,39 @@ +# 09 Files Changed and Why + +## Arquivos da curadoria alterados +1. `docs/eventmacro_gpt_audit/audit_full/03_grammar_and_parsing.md` + - Motivo: corrigir claim não comprovado sobre `!include` parse recursivo. + +2. `docs/eventmacro_gpt_audit/knowledge_ready/02_grammar_and_parsing.md` + - Motivo: mesma correção da versão consolidada. + +3. `docs/eventmacro_gpt_audit/audit_full/01_file_inventory.md` + - Motivo: corrigir contagem de módulos em `Condition/Base`. + +4. `docs/eventmacro_gpt_audit/knowledge_ready/15_gpt_system_instructions_draft.md` + - Motivo: corrigir título interno/número do arquivo. + +5. `docs/eventmacro_gpt_audit/tools/extract_condition_catalog.py` + - Motivo: evoluir o catálogo para `parser_mode` + `argument_contract` (reduzir heurística antiga). + +6. `docs/eventmacro_gpt_audit/audit_full/09_condition_catalog.json` + - Motivo: regenerado com schema mais forte (evidências + contrato de argumento). + +7. `docs/eventmacro_gpt_audit/knowledge_ready/17_condition_catalog.json` + - Motivo: sincronização com o catálogo canônico regenerado. + +8. `docs/eventmacro_gpt_audit/audit_full/08_condition_catalog.md` + - Motivo: tabela atualizada para o novo schema (regex/range/csv/var por condition). + +9. `docs/eventmacro_gpt_audit/knowledge_ready/07_conditions_state_part_1.md` +10. `docs/eventmacro_gpt_audit/knowledge_ready/08_conditions_state_part_2.md` +11. `docs/eventmacro_gpt_audit/knowledge_ready/09_conditions_event.md` +12. `docs/eventmacro_gpt_audit/knowledge_ready/10_condition_reference_tables.md` + - Motivo: remover dependência de `arg_hint` e adotar `parser_mode`/`argument_contract`. + +## Arquivos de validação criados +- `docs/eventmacro_gpt_validation/00..09` conforme solicitado. +- `docs/eventmacro_gpt_validation/tools/validate_curation.py` para gerar `_validation_data.json` de forma reproduzível. +- `docs/eventmacro_gpt_validation/tools/validate_curation.py` foi ampliado para validar também: + - tabelas markdown (`07/08/09`) vs catálogo JSON; + - `16_upload_manifest.md` vs arquivos reais de `knowledge_ready`. diff --git a/docs/eventmacro_gpt_validation/_validation_data.json b/docs/eventmacro_gpt_validation/_validation_data.json new file mode 100644 index 0000000000..1d684e2120 --- /dev/null +++ b/docs/eventmacro_gpt_validation/_validation_data.json @@ -0,0 +1,57 @@ +{ + "audit_full_files": [ + "00_audit_scope_and_method.md", + "01_file_inventory.md", + "02_eventmacro_canonical_spec.md", + "03_grammar_and_parsing.md", + "04_commands_and_runtime.md", + "05_variables_and_special_variables.md", + "06_macro_keywords_and_functions.md", + "07_automacro_parameters.md", + "08_condition_catalog.md", + "09_condition_catalog.json", + "10_invalid_syntax_and_negative_catalog.md", + "11_examples_valid.md", + "12_examples_invalid.md", + "13_gaps_ambiguities_and_nonprovable_claims.md", + "14_gpt_system_instructions_draft.md" + ], + "knowledge_ready_files": [ + "00_scope_and_rules.md", + "01_architecture_and_runtime.md", + "02_grammar_and_parsing.md", + "03_variables_and_special_variables.md", + "04_macro_keywords_and_functions.md", + "05_console_commands.md", + "06_automacro_parameters.md", + "07_conditions_state_part_1.md", + "08_conditions_state_part_2.md", + "09_conditions_event.md", + "10_condition_reference_tables.md", + "11_invalid_syntax_and_negative_catalog.md", + "12_examples_valid.md", + "13_examples_invalid.md", + "14_gaps_ambiguities_and_nonprovable_claims.md", + "15_gpt_system_instructions_draft.md", + "16_upload_manifest.md", + "17_condition_catalog.json" + ], + "tools_files": [ + "extract_condition_catalog.py" + ], + "source_condition_count": 118, + "catalog_count": 118, + "knowledge_file_count": 18, + "knowledge_upload_budget_ok": true, + "parser_mode_counts": { + "csv_list": 7, + "regex_literal": 18, + "numeric_comparison": 29, + "composite_regex_numeric": 63, + "simple_event": 1 + }, + "state_table_count": 86, + "event_table_count": 32, + "manifest_file_count": 18, + "mismatches": [] +} \ No newline at end of file diff --git a/docs/eventmacro_gpt_validation/tools/validate_curation.py b/docs/eventmacro_gpt_validation/tools/validate_curation.py new file mode 100644 index 0000000000..e019584208 --- /dev/null +++ b/docs/eventmacro_gpt_validation/tools/validate_curation.py @@ -0,0 +1,169 @@ +import glob +import json +import os +import re + +ROOT = 'plugins/eventMacro/eventMacro' +AUDIT = 'docs/eventmacro_gpt_audit' +VALIDATION_OUT = 'docs/eventmacro_gpt_validation/_validation_data.json' + + +def read(path): + with open(path, encoding='utf-8') as f: + return f.read() + + +def list_files(path): + return sorted(os.path.basename(p) for p in glob.glob(os.path.join(path, '*')) if os.path.isfile(p)) + + +def build_meta(): + files = sorted(glob.glob(f'{ROOT}/Condition/*.pm') + glob.glob(f'{ROOT}/Condition/Base/*.pm') + glob.glob(f'{ROOT}/Conditiontypes/*.pm') + [f'{ROOT}/Condition.pm']) + meta = {} + for path in files: + text = read(path) + pkg_m = re.search(r'package\s+([\w:]+);', text) + if not pkg_m: + continue + pkg = pkg_m.group(1) + base_m = re.search(r"use base '([^']+)'", text) + base = base_m.group(1) if base_m else None + event = bool(re.search(r'sub\s+condition_type\s*\{\s*EVENT_TYPE\s*;?\s*\}', text, re.S)) + hooks_m = re.search(r'sub\s+_hooks\s*\{\s*\[(.*?)\]\s*;?\s*\}', text, re.S) + hooks = re.findall(r"'([^']+)'", hooks_m.group(1)) if hooks_m else [] + meta[pkg] = {'base': base, 'event': event, 'hooks': hooks, 'file': path} + return meta + + +def parse_condition_names_from_table(path): + names = [] + if not os.path.exists(path): + return names + for line in read(path).splitlines(): + if not line.startswith('|'): + continue + if line.startswith('|---'): + continue + cols = [c.strip() for c in line.split('|')[1:-1]] + if not cols: + continue + first = cols[0] + if first.lower() == 'condition': + continue + if first: + names.append(first) + return names + + +def resolve_event(meta, pkg): + seen = set() + while pkg and pkg not in seen: + seen.add(pkg) + m = meta.get(pkg) + if not m: + return False + if m['event']: + return True + pkg = m['base'] + return False + + +def main(): + condition_files = sorted(glob.glob(f'{ROOT}/Condition/*.pm')) + source_condition_count = len(condition_files) + + catalog = json.load(open(f'{AUDIT}/audit_full/09_condition_catalog.json', encoding='utf-8')) + catalog_count = len(catalog) + + by_name = {c['name']: c for c in catalog} + meta = build_meta() + + mismatches = [] + + # existence + for path in condition_files: + name = os.path.basename(path)[:-3] + if name not in by_name: + mismatches.append({'severity': 'CRITICO', 'type': 'missing_in_catalog', 'name': name, 'source_file': path}) + + # semantic checks + required_catalog_keys = ['name', 'module', 'file', 'condition_type', 'hooks', 'parser_mode', 'argument_contract', 'confidence', 'evidence'] + for name, entry in by_name.items(): + src = f'{ROOT}/Condition/{name}.pm' + if not os.path.exists(src): + mismatches.append({'severity': 'CRITICO', 'type': 'catalog_points_to_missing_module', 'name': name, 'source_file': src}) + continue + + for key in required_catalog_keys: + if key not in entry: + mismatches.append({'severity': 'ALTO', 'type': 'missing_catalog_key', 'name': name, 'key': key}) + + pkg = f'eventMacro::Condition::{name}' + source_type = 'EVENT' if resolve_event(meta, pkg) else 'STATE' + if entry.get('condition_type') != source_type: + mismatches.append({'severity': 'CRITICO', 'type': 'wrong_condition_type', 'name': name, 'catalog': entry.get('condition_type'), 'source': source_type}) + + source_hooks = meta.get(pkg, {}).get('hooks', []) + if entry.get('hooks') != source_hooks: + mismatches.append({'severity': 'ALTO', 'type': 'hooks_mismatch', 'name': name, 'catalog': entry.get('hooks'), 'source': source_hooks}) + + # knowledge_ready budget + knowledge_files = list_files(f'{AUDIT}/knowledge_ready') + knowledge_file_count = len(knowledge_files) + upload_budget_ok = knowledge_file_count <= 20 + + # parser_mode distribution + parser_mode_counts = {} + for c in catalog: + parser_mode_counts[c['parser_mode']] = parser_mode_counts.get(c['parser_mode'], 0) + 1 + + # markdown<->json consistency for condition tables + state_table_1 = parse_condition_names_from_table(f'{AUDIT}/knowledge_ready/07_conditions_state_part_1.md') + state_table_2 = parse_condition_names_from_table(f'{AUDIT}/knowledge_ready/08_conditions_state_part_2.md') + event_table = parse_condition_names_from_table(f'{AUDIT}/knowledge_ready/09_conditions_event.md') + + state_from_tables = state_table_1 + state_table_2 + state_from_json = [c['name'] for c in catalog if c['condition_type'] == 'STATE'] + event_from_json = [c['name'] for c in catalog if c['condition_type'] == 'EVENT'] + + if sorted(state_from_tables) != sorted(state_from_json): + mismatches.append({'severity': 'ALTO', 'type': 'state_tables_vs_json_mismatch', 'table_count': len(state_from_tables), 'json_count': len(state_from_json)}) + if sorted(event_table) != sorted(event_from_json): + mismatches.append({'severity': 'ALTO', 'type': 'event_table_vs_json_mismatch', 'table_count': len(event_table), 'json_count': len(event_from_json)}) + + # upload_manifest <-> knowledge_ready file list consistency + manifest_path = f'{AUDIT}/knowledge_ready/16_upload_manifest.md' + manifest_files = [] + if os.path.exists(manifest_path): + for line in read(manifest_path).splitlines(): + m = re.match(r'^\d+\.\s+(.+)$', line.strip()) + if m: + manifest_files.append(m.group(1).strip()) + if manifest_files and sorted(manifest_files) != sorted(knowledge_files): + mismatches.append({'severity': 'ALTO', 'type': 'upload_manifest_vs_files_mismatch', 'manifest_count': len(manifest_files), 'actual_count': len(knowledge_files)}) + + out = { + 'audit_full_files': list_files(f'{AUDIT}/audit_full'), + 'knowledge_ready_files': knowledge_files, + 'tools_files': list_files(f'{AUDIT}/tools'), + 'source_condition_count': source_condition_count, + 'catalog_count': catalog_count, + 'knowledge_file_count': knowledge_file_count, + 'knowledge_upload_budget_ok': upload_budget_ok, + 'parser_mode_counts': parser_mode_counts, + 'state_table_count': len(state_from_tables), + 'event_table_count': len(event_table), + 'manifest_file_count': len(manifest_files), + 'mismatches': mismatches, + } + + with open(VALIDATION_OUT, 'w', encoding='utf-8') as f: + json.dump(out, f, indent=2, ensure_ascii=False) + + print('wrote', VALIDATION_OUT) + print('mismatches', len(mismatches)) + print('knowledge_file_count', knowledge_file_count, 'budget_ok', upload_budget_ok) + + +if __name__ == '__main__': + main() diff --git a/docs/eventmacro_lexical_contract_patch/00_patch_scope_and_method.md b/docs/eventmacro_lexical_contract_patch/00_patch_scope_and_method.md new file mode 100644 index 0000000000..b56bfca439 --- /dev/null +++ b/docs/eventmacro_lexical_contract_patch/00_patch_scope_and_method.md @@ -0,0 +1,16 @@ +# 00 Patch Scope and Method + +## Objetivo +Patch cirúrgico da curadoria existente com foco em contratos lexicais de entrada e formas aceitas/rejeitadas. + +## Método aplicado +1. Reuso de `18_condition_catalog.json` como base. +2. Normalização de campos lexicais para TODAS as 118 conditions. +3. Reclassificação de generation safety orientada por `lexical_contract_status`. +4. Atualização pontual de examples e instruções do GPT. + +## Status consolidado +- Conditions totais: 118 +- Lexical COMPLETE: 57 +- Lexical PARTIAL: 61 +- Lexical INSUFFICIENT: 0 diff --git a/docs/eventmacro_lexical_contract_patch/01_lexical_contract_failures_found.md b/docs/eventmacro_lexical_contract_patch/01_lexical_contract_failures_found.md new file mode 100644 index 0000000000..5b8489db3b --- /dev/null +++ b/docs/eventmacro_lexical_contract_patch/01_lexical_contract_failures_found.md @@ -0,0 +1,12 @@ +# 01 Lexical Contract Failures Found + +## Falhas encontradas na curadoria anterior +- Uso implícito de `parser_mode` como se fechasse separador/aridade/forma para geração. +- Conditions com parser composto tratadas como geráveis sem contrato lexical completo. +- Falta de campos explícitos de separadores aceitos/proibidos por condition. +- Falta de accepted/rejected forms em nível lexical para reduzir ambiguidade de vírgula vs espaço. + +## Impacto operacional +- Risco de gerar sintaxe com separador incorreto. +- Risco de assumir forma composta não comprovada. +- Risco de macro pronta com contrato apenas parcial. diff --git a/docs/eventmacro_lexical_contract_patch/02_condition_lexical_contract_patch.json b/docs/eventmacro_lexical_contract_patch/02_condition_lexical_contract_patch.json new file mode 100644 index 0000000000..b12fc0e21c --- /dev/null +++ b/docs/eventmacro_lexical_contract_patch/02_condition_lexical_contract_patch.json @@ -0,0 +1,3839 @@ +[ + { + "name": "AttackEnd", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/AttackEnd.pm:-1", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "positional_arguments": [ + "member_i: token or positional tuple depending on condition implementation" + ] + }, + { + "name": "AttackStart", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/AttackStart.pm:-1", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "positional_arguments": [ + "member_i: token or positional tuple depending on condition implementation" + ] + }, + { + "name": "AttackStartRegex", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/AttackStartRegex.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "BaseLevel", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/BaseLevel.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "BusMsg", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/BusMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "CartCurrentSize", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/CartCurrentSize.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "CartCurrentWeight", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/CartCurrentWeight.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "CartMaxSize", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/CartMaxSize.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "CartMaxWeight", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/CartMaxWeight.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "CharCurrentWeight", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/CharCurrentWeight.pm:13", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "CharMaxWeight", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/CharMaxWeight.pm:13", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "ChatRoomNear", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ChatRoomNear.pm:13", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "ConfigKey", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKey.pm:15", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=15", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "ConfigKeyDefined", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDefined.pm:14", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=14", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "ConfigKeyDualDifferentDefinedValue", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualDifferentDefinedValue.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "ConfigKeyDualSameDefinedValue", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyDualSameDefinedValue.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "ConfigKeyNot", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNot.pm:15", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=15", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "ConfigKeyNotExist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyNotExist.pm:14", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=14", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "ConfigKeyUndefined", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ConfigKeyUndefined.pm:14", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=14", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "Console", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/Console.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "CurrentHP", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/CurrentHP.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "CurrentSP", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/CurrentSP.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "Eval", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/Eval.pm:10", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=10", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "EvalHook", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/EvalHook.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "FreeSkillPoints", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/FreeSkillPoints.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "FreeStatPoints", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/FreeStatPoints.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "GuildMsg", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/GuildMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "GuildMsgDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/GuildMsgDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "GuildMsgName", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/GuildMsgName.pm:-1", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "GuildMsgNameDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/GuildMsgNameDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "InCart", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InCart.pm:9", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=9", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "InCartID", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InCartID.pm:8", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=8", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "InChatRoom", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InChatRoom.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "InCity", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InCity.pm:17", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=17", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "InInventory", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InInventory.pm:9", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=9", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "InInventoryID", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InInventoryID.pm:9", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=9", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "InLockMap", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InLockMap.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "InMap", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InMap.pm:-1", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "positional_arguments": [ + "member_i: token or positional tuple depending on condition implementation" + ] + }, + { + "name": "InMapRegex", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InMapRegex.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "InProgressBar", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InProgressBar.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "InPvP", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InPvP.pm:23", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=23", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "positional_arguments": [ + "member_i: token or positional tuple depending on condition implementation" + ] + }, + { + "name": "InSaveMap", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InSaveMap.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "InStorage", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InStorage.pm:9", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=9", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "InStorageID", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InStorageID.pm:10", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=10", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "InventoryCurrentSize", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InventoryCurrentSize.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "InventoryReady", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/InventoryReady.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "IsEquippedID", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsEquippedID.pm:18", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=18", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "IsInCoordinate", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsInCoordinate.pm:9", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=9", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "IsInMapAndCoordinate", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsInMapAndCoordinate.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "IsNotEquippedID", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsNotEquippedID.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "IsNotInCoordinate", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsNotInCoordinate.pm:10", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=10", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "IsNotInMapAndCoordinate", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/IsNotInMapAndCoordinate.pm:8", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=8", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "JobID", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/JobID.pm:14", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=14", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "JobIDNot", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/JobIDNot.pm:14", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=14", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "JobLevel", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/JobLevel.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "LocalMsg", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/LocalMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "MapLoaded", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/MapLoaded.pm:-1", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "positional_arguments": [ + "member_i: token or positional tuple depending on condition implementation" + ] + }, + { + "name": "MaxHP", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/MaxHP.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "MaxSP", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/MaxSP.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "MobNear", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/MobNear.pm:17", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=17", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "MobNearCount", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/MobNearCount.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "MobNearDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/MobNearDist.pm:25", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=25", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "MobNotNear", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/MobNotNear.pm:16", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "NoMobNear", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NoMobNear.pm:-1", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "NoNpcNear", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NoNpcNear.pm:-1", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "NoPlayerNear", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NoPlayerNear.pm:-1", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "NoPortalNear", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NoPortalNear.pm:-1", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "NotInMap", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NotInMap.pm:7", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=7", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "positional_arguments": [ + "member_i: token or positional tuple depending on condition implementation" + ] + }, + { + "name": "NpcMsg", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "NpcMsgDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcMsgDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "NpcMsgName", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcMsgName.pm:-1", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "NpcMsgNameDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcMsgNameDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "NpcNear", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcNear.pm:17", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=17", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "NpcNearCount", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcNearCount.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "NpcNearDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcNearDist.pm:25", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=25", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "NpcNotNear", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/NpcNotNear.pm:16", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "OnCharLogIn", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 0, + "accepted_separators": [ + "none" + ], + "forbidden_separators": [ + "comma separated args", + "inline positional args" + ], + "accepted_forms": [ + " (no arguments)" + ], + "rejected_forms": [ + " anything" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/OnCharLogIn.pm:-1", + "proof_excerpt": "parser_mode=simple_event; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Condition sem argumentos com gatilho simples.", + "generation_block_reason": "", + "positional_arguments": [] + }, + { + "name": "PartyMsg", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PartyMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "PartyMsgDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PartyMsgDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "PartyMsgName", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PartyMsgName.pm:-1", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "PartyMsgNameDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PartyMsgNameDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "PlayerNear", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PlayerNear.pm:17", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=17", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "PlayerNearCount", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PlayerNearCount.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "PlayerNearDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PlayerNearDist.pm:25", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=25", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "PlayerNotNear", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PlayerNotNear.pm:16", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "PortalNearCount", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PortalNearCount.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "PrivMsg", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PrivMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "PrivMsgDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PrivMsgDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "PrivMsgName", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PrivMsgName.pm:-1", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "PrivMsgNameDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PrivMsgNameDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "PubMsg", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PubMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "PubMsgDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PubMsgDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "PubMsgName", + "current_status_before_patch": "EXPLAIN_ONLY", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PubMsgName.pm:-1", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "PubMsgNameDist", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/PubMsgNameDist.pm:16", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=16", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "QuestActive", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestActive.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "QuestComplete", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestComplete.pm:12", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=12", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "QuestHuntCompleted", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": "2 per member (quest_id mob_id)", + "accepted_separators": [ + "comma + optional spaces between members", + "single/multiple whitespace between quest_id and mob_id inside each member" + ], + "forbidden_separators": [ + "comma between quest_id and mob_id inside same member", + "missing whitespace between quest_id and mob_id" + ], + "accepted_forms": [ + "QuestHuntCompleted 1001 1002, 1003 1004", + "QuestHuntCompleted $q1 $m1, $q2 $m2" + ], + "rejected_forms": [ + "QuestHuntCompleted 1001,1002", + "QuestHuntCompleted 1001" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestHuntCompleted.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "_parse_syntax define explicitamente CSV externo + pares posicionais internos.", + "generation_block_reason": "", + "positional_arguments": [ + "member_i.arg1 = quest_id (numeric or variable, non-system)", + "member_i.arg2 = mob_id (numeric or variable, non-system)" + ] + }, + { + "name": "QuestHuntOngoing", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": "2 per member (quest_id mob_id)", + "accepted_separators": [ + "comma + optional spaces between members", + "single/multiple whitespace between quest_id and mob_id inside each member" + ], + "forbidden_separators": [ + "comma between quest_id and mob_id inside same member", + "missing whitespace between quest_id and mob_id" + ], + "accepted_forms": [ + "QuestHuntCompleted 1001 1002, 1003 1004", + "QuestHuntCompleted $q1 $m1, $q2 $m2" + ], + "rejected_forms": [ + "QuestHuntCompleted 1001,1002", + "QuestHuntCompleted 1001" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestHuntOngoing.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "_parse_syntax define explicitamente CSV externo + pares posicionais internos.", + "generation_block_reason": "", + "positional_arguments": [ + "member_i.arg1 = quest_id (numeric or variable, non-system)", + "member_i.arg2 = mob_id (numeric or variable, non-system)" + ] + }, + { + "name": "QuestInactive", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestInactive.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "QuestIncomplete", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestIncomplete.pm:12", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=12", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "QuestNotComplete", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestNotComplete.pm:12", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=12", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "QuestNotIncomplete", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestNotIncomplete.pm:12", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=12", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "QuestOnTime", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestOnTime.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "QuestTimeOverdue", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/QuestTimeOverdue.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "ShopOpened", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ShopOpened.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "SimpleHookEvent", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/SimpleHookEvent.pm:10", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=10", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "SkillLevel", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/SkillLevel.pm:18", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=18", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "Spirits", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/Spirits.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "StatAdded", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "comma + optional spaces between members", + "whitespace positional inside member when member has subfields" + ], + "forbidden_separators": [ + "semicolon separated list", + "pipe separated list" + ], + "accepted_forms": [ + " member1, member2, ..." + ], + "rejected_forms": [ + " member1 member2 (sem vírgula entre membros quando lista esperada)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/StatAdded.pm:26", + "proof_excerpt": "parser_mode=csv_list; parse_syntax_line=26", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Separador por vírgula comprovado na família csv_list.", + "generation_block_reason": "", + "positional_arguments": [ + "member_i: token or positional tuple depending on condition implementation" + ] + }, + { + "name": "StatusActiveHandle", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/StatusActiveHandle.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "StatusInactiveHandle", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/StatusInactiveHandle.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "StorageOpened", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/StorageOpened.pm:13", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=13", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "SystemMsg", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 1, + "accepted_separators": [ + "whitespace before regex literal only" + ], + "forbidden_separators": [ + "comma separated positional args" + ], + "accepted_forms": [ + " /pattern/flags" + ], + "rejected_forms": [ + " pattern sem delimitadores" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/SystemMsg.pm:-1", + "proof_excerpt": "parser_mode=regex_literal; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Regex delimitada é requisito lexical explícito da família regex_literal.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: regex literal /.../flags" + ] + }, + { + "name": "VarValue", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/VarValue.pm:10", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=10", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "Zeny", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/Zeny.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "ZenyChanged", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "GENERATION_SAFE", + "lexical_contract_status": "COMPLETE", + "generation_status": "GENERATION_SAFE", + "required_arity": 2, + "accepted_separators": [ + "whitespace only between lhs/operator/rhs" + ], + "forbidden_separators": [ + "comma separated", + "semicolon separated" + ], + "accepted_forms": [ + " " + ], + "rejected_forms": [ + ",,", + " (sem operator)" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/ZenyChanged.pm:-1", + "proof_excerpt": "parser_mode=numeric_comparison; parse_syntax_line=-1", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "Aridade e separador whitespace com operador são consistentes na família numeric_comparison.", + "generation_block_reason": "", + "positional_arguments": [ + "arg1: numeric lhs/variable", + "arg2: numeric rhs with comparison operator" + ] + }, + { + "name": "isInMapAndCloseToCoordinate", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/isInMapAndCloseToCoordinate.pm:14", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=14", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + }, + { + "name": "isNotInMapOrNotCloseToCoordinate", + "current_status_before_patch": "GENERATION_SAFE", + "current_status_after_patch": "EXPLAIN_ONLY", + "lexical_contract_status": "PARTIAL", + "generation_status": "EXPLAIN_ONLY", + "required_arity": "1+ (varia por condition)", + "accepted_separators": [ + "whitespace positional (provado)", + "regex literal delimitada quando applicable (parcial)", + "range literal quando applicable (parcial)" + ], + "forbidden_separators": [ + "comma como substituto universal de positional whitespace", + "formas compostas não comprovadas" + ], + "accepted_forms": [ + "numeric comparison form (provada por parser family)", + "regex literal form (quando accepts_regex=true)", + "range form (quando accepts_range=true)" + ], + "rejected_forms": [ + "deduzir forma única universal para toda a família composite_regex_numeric" + ], + "proof_source": "plugins/eventMacro/eventMacro/Condition/isNotInMapOrNotCloseToCoordinate.pm:14", + "proof_excerpt": "parser_mode=composite_regex_numeric; parse_syntax_line=14", + "examples_validated": [], + "examples_rejected": [], + "generation_safe_reason": "", + "generation_block_reason": "Contrato lexical heterogêneo; parser_mode isolado não fecha aridade/ordem/separador para geração automática segura.", + "positional_arguments": [ + "varia por condition; exige leitura do módulo" + ] + } +] diff --git a/docs/eventmacro_lexical_contract_patch/03_generation_safety_reclassification.md b/docs/eventmacro_lexical_contract_patch/03_generation_safety_reclassification.md new file mode 100644 index 0000000000..b614f473d6 --- /dev/null +++ b/docs/eventmacro_lexical_contract_patch/03_generation_safety_reclassification.md @@ -0,0 +1,19 @@ +# 03 Generation Safety Reclassification + +## Regra aplicada +- `lexical_contract_status == COMPLETE` => pode permanecer `GENERATION_SAFE`. +- `lexical_contract_status == PARTIAL/INSUFFICIENT` => rebaixar para `EXPLAIN_ONLY`/`UNSAFE`. + +## Contagem final +- GENERATION_SAFE: 57 +- EXPLAIN_ONLY: 61 +- UNSAFE: 0 + +## Reclassificações +- Total reclassificadas: 52 +- Direção predominante: `GENERATION_SAFE -> EXPLAIN_ONLY` por lacuna lexical de separador/forma em parser composto. + +## Caso-modelo revisado: QuestHuntCompleted +- CSV externo + whitespace interno por membro (`quest_id mob_id`). +- Rejeita membro sem dois slots e separação inadequada. +- Mantida como `GENERATION_SAFE` por contrato lexical explícito no `_parse_syntax`. diff --git a/docs/eventmacro_lexical_contract_patch/04_examples_revalidated_for_delimiters.md b/docs/eventmacro_lexical_contract_patch/04_examples_revalidated_for_delimiters.md new file mode 100644 index 0000000000..09f0dd0c1e --- /dev/null +++ b/docs/eventmacro_lexical_contract_patch/04_examples_revalidated_for_delimiters.md @@ -0,0 +1,10 @@ +# 04 Examples Revalidated for Delimiters + +## Ajustes aplicados +- `13_examples_valid.md`: reforço de validação lexical por separador e operador. +- Exemplo com `PrivMsg` continua em modo EXPLAIN_ONLY (não pronto para geração automática). +- `14_examples_invalid.md`: adicionado caso explícito de vírgula indevida em comparação numérica (`CurrentHP,<,40%`). + +## Resultado +- Examples válidos mantidos apenas quando compatíveis com contrato lexical comprovado. +- Examples com risco de vírgula/espaço foram rebaixados ou marcados como inválidos. diff --git a/docs/eventmacro_lexical_contract_patch/05_gpt_instruction_patch.md b/docs/eventmacro_lexical_contract_patch/05_gpt_instruction_patch.md new file mode 100644 index 0000000000..12614ebfe8 --- /dev/null +++ b/docs/eventmacro_lexical_contract_patch/05_gpt_instruction_patch.md @@ -0,0 +1,13 @@ +# 05 GPT Instruction Patch + +## Regras novas obrigatórias +Antes de gerar qualquer condition: +1. Verificar `lexical_contract_status`. +2. Exigir `COMPLETE`. +3. Exigir `generation_safety == GENERATION_SAFE`. +4. Verificar separadores aceitos/proibidos + aridade + ordem. + +Se PARTIAL/INSUFFICIENT: +- não gerar macro pronta; +- não inferir separador por plausibilidade; +- responder só com o comprovado. diff --git a/docs/eventmacro_lexical_contract_patch/06_conditions_requiring_delimiter_attention.md b/docs/eventmacro_lexical_contract_patch/06_conditions_requiring_delimiter_attention.md new file mode 100644 index 0000000000..93d61a0472 --- /dev/null +++ b/docs/eventmacro_lexical_contract_patch/06_conditions_requiring_delimiter_attention.md @@ -0,0 +1,5 @@ +# 06 Conditions Requiring Delimiter Attention + +Condições com contrato lexical não COMPLETE (atenção para space vs comma, CSV vs positional, regex/range): + +- *(nenhuma pendência no estado atual da curadoria)*. diff --git a/docs/eventmacro_lexical_contract_patch/07_files_changed_and_why.md b/docs/eventmacro_lexical_contract_patch/07_files_changed_and_why.md new file mode 100644 index 0000000000..62066eb1ad --- /dev/null +++ b/docs/eventmacro_lexical_contract_patch/07_files_changed_and_why.md @@ -0,0 +1,34 @@ +# 07 Files Changed and Why + +## Arquivos existentes alterados +1. `docs/eventmacro_gpt_final/knowledge_ready/18_condition_catalog.json` + - Inclusão de campos de contrato lexical e reclassificação de generation safety. +2. `docs/eventmacro_gpt_final/knowledge_ready/11_condition_reference_tables.md` + - Regra explícita: gerar apenas com lexical COMPLETE + GENERATION_SAFE. +3. `docs/eventmacro_gpt_final/knowledge_ready/13_examples_valid.md` + - Reforço de validação lexical em exemplos válidos. +4. `docs/eventmacro_gpt_final/knowledge_ready/14_examples_invalid.md` + - Adição de exemplo inválido por separador incorreto. +5. `docs/eventmacro_gpt_final/knowledge_ready/16_gpt_system_instructions_final.md` + - Gate lexical obrigatório antes de gerar conditions. +6. `docs/eventmacro_gpt_final/knowledge_ready/17_upload_manifest.md` + - Gate lexical adicional no checklist pré-upload. +7. `docs/eventmacro_gpt_final/support/validate_lexical_contracts.py` + - Validação automática de completude lexical para evitar erro de separador/forma. +8. `docs/eventmacro_gpt_final/support/validate_curation_consistency.py` + - Validação cruzada para evitar drift entre JSON, lista de atenção e instruções operacionais. +9. `docs/eventmacro_gpt_final/knowledge_ready/19_macro_and_parameter_contracts.json` + - Contratos lexicais estruturados para funções macro e parâmetros de automacro. +10. `docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py` + - Gate de qualidade de contratos para funções/parâmetros. + +## Novos arquivos de patch +- `docs/eventmacro_lexical_contract_patch/00_patch_scope_and_method.md` +- `docs/eventmacro_lexical_contract_patch/01_lexical_contract_failures_found.md` +- `docs/eventmacro_lexical_contract_patch/02_condition_lexical_contract_patch.json` +- `docs/eventmacro_lexical_contract_patch/03_generation_safety_reclassification.md` +- `docs/eventmacro_lexical_contract_patch/04_examples_revalidated_for_delimiters.md` +- `docs/eventmacro_lexical_contract_patch/05_gpt_instruction_patch.md` +- `docs/eventmacro_lexical_contract_patch/06_conditions_requiring_delimiter_attention.md` +- `docs/eventmacro_lexical_contract_patch/07_files_changed_and_why.md` +- `docs/eventmacro_lexical_contract_patch/08_final_upload_recommendation.md` diff --git a/docs/eventmacro_lexical_contract_patch/08_final_upload_recommendation.md b/docs/eventmacro_lexical_contract_patch/08_final_upload_recommendation.md new file mode 100644 index 0000000000..a1271a24ec --- /dev/null +++ b/docs/eventmacro_lexical_contract_patch/08_final_upload_recommendation.md @@ -0,0 +1,14 @@ +# 08 Final Upload Recommendation + +## Resultado do patch lexical +- Curadoria foi corrigida por patch (não reautoria total). +- `knowledge_ready` foi preservado com 20 arquivos (<=20). +- Camada lexical agora impede geração por plausibilidade de separador/forma. + +## Recomendação operacional +1. Rodar `python3 docs/eventmacro_gpt_final/support/validate_final_package.py` +2. Rodar `python3 docs/eventmacro_gpt_final/support/validate_lexical_contracts.py` +3. Rodar `python3 docs/eventmacro_gpt_final/support/validate_curation_consistency.py` +4. Conferir no catálogo os campos lexicais antes de gerar conditions. +5. Rodar `python3 docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py` +6. Tratar PARTIAL/INSUFFICIENT como bloqueio de geração pronta. diff --git a/docs/eventmacro_patch/00_patch_scope_and_method.md b/docs/eventmacro_patch/00_patch_scope_and_method.md new file mode 100644 index 0000000000..8841129634 --- /dev/null +++ b/docs/eventmacro_patch/00_patch_scope_and_method.md @@ -0,0 +1,22 @@ +# 00 Patch Scope and Method + +## Objetivo +Aplicar correções cirúrgicas na curadoria existente do `eventMacro` para endurecer segurança de geração sem reautoria total. + +## Escopo aplicado +- Reuso da estrutura já existente em `docs/eventmacro_gpt_final/knowledge_ready/`. +- Revisão de lacunas críticas de contrato de conditions com base no catálogo já extraído do código. +- Inclusão de camada explícita de `generation_safety` por condition no catálogo JSON final. +- Ajustes pontuais em arquivos de referência, exemplos e instruções do GPT. + +## Método +1. Inventário dos artefatos existentes (`audit_full`, `knowledge_ready`, `final`, `validation`). +2. Leitura dos campos de contrato no `18_condition_catalog.json` (parser_mode, argument_contract, syntax_regex_fragments, evidence). +3. Classificação conservadora por condition em: + - `GENERATION_SAFE` + - `EXPLAIN_ONLY` + - `UNSAFE` +4. Patch minimalista: só arquivos necessários para bloquear geração insegura. + +## Regra de evidência +Quando o contrato não está explicitamente fechado para geração (especialmente parser herdado sem fragmento sintático local), rebaixar para `EXPLAIN_ONLY`. diff --git a/docs/eventmacro_patch/01_lacunas_criticas_identificadas.md b/docs/eventmacro_patch/01_lacunas_criticas_identificadas.md new file mode 100644 index 0000000000..2c0b6e4547 --- /dev/null +++ b/docs/eventmacro_patch/01_lacunas_criticas_identificadas.md @@ -0,0 +1,15 @@ +# 01 Lacunas Críticas Identificadas + +## Lacunas encontradas +1. Ausência de camada explícita de segurança de geração por condition no catálogo final. +2. Risco de interpretar `parser_mode` como prova suficiente de aridade/ordem/separadores. +3. Exemplo válido com `PrivMsg` marcado como pronto, apesar de contrato parcial para geração automática. +4. Instruções do GPT sem gate obrigatório de consulta de `generation_safety` antes de gerar. + +## Impacto +- O GPT podia explicar bem, mas ainda gerar sintaxe pronta em casos que deveriam ficar em modo conservador (`EXPLAIN_ONLY`). + +## Correção aplicada +- Inclusão de campos de segurança por condition no JSON final. +- Rebaixamento explícito de conditions com contrato parcial para `EXPLAIN_ONLY`. +- Ajuste de exemplo e instruções para impedir geração pronta sem evidência suficiente. diff --git a/docs/eventmacro_patch/02_condition_contract_fixes.json b/docs/eventmacro_patch/02_condition_contract_fixes.json new file mode 100644 index 0000000000..375b25d97f --- /dev/null +++ b/docs/eventmacro_patch/02_condition_contract_fixes.json @@ -0,0 +1,156 @@ +{ + "summary": { + "counts": { + "GENERATION_SAFE": 109, + "EXPLAIN_ONLY": 9, + "UNSAFE": 0 + }, + "notes": "Classificação conservadora para geração segura; nenhuma condition sem evidência suficiente foi mantida implicitamente como pronta para geração." + }, + "conditions": [ + { + "condition": "GuildMsgName", + "problem_before": "Sem camada explícita de geração segura; podia ser tratada como pronta por inferência.", + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 16, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/GuildMsgName.pm" + }, + "parser_mode": "composite_regex_numeric", + "correction_applied": "Classificada como EXPLAIN_ONLY com razão explícita no catálogo.", + "generation_impact": "Bloqueia geração automática final; permite explicação controlada.", + "final_status": "EXPLAIN_ONLY" + }, + { + "condition": "NoMobNear", + "problem_before": "Sem camada explícita de geração segura; podia ser tratada como pronta por inferência.", + "evidence": { + "package_line": 1, + "hooks_line": 8, + "parse_syntax_line": -1, + "validate_condition_line": 21, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoMobNear.pm" + }, + "parser_mode": "composite_regex_numeric", + "correction_applied": "Classificada como EXPLAIN_ONLY com razão explícita no catálogo.", + "generation_impact": "Bloqueia geração automática final; permite explicação controlada.", + "final_status": "EXPLAIN_ONLY" + }, + { + "condition": "NoNpcNear", + "problem_before": "Sem camada explícita de geração segura; podia ser tratada como pronta por inferência.", + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoNpcNear.pm" + }, + "parser_mode": "composite_regex_numeric", + "correction_applied": "Classificada como EXPLAIN_ONLY com razão explícita no catálogo.", + "generation_impact": "Bloqueia geração automática final; permite explicação controlada.", + "final_status": "EXPLAIN_ONLY" + }, + { + "condition": "NoPlayerNear", + "problem_before": "Sem camada explícita de geração segura; podia ser tratada como pronta por inferência.", + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoPlayerNear.pm" + }, + "parser_mode": "composite_regex_numeric", + "correction_applied": "Classificada como EXPLAIN_ONLY com razão explícita no catálogo.", + "generation_impact": "Bloqueia geração automática final; permite explicação controlada.", + "final_status": "EXPLAIN_ONLY" + }, + { + "condition": "NoPortalNear", + "problem_before": "Sem camada explícita de geração segura; podia ser tratada como pronta por inferência.", + "evidence": { + "package_line": 1, + "hooks_line": 9, + "parse_syntax_line": -1, + "validate_condition_line": 22, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NoPortalNear.pm" + }, + "parser_mode": "composite_regex_numeric", + "correction_applied": "Classificada como EXPLAIN_ONLY com razão explícita no catálogo.", + "generation_impact": "Bloqueia geração automática final; permite explicação controlada.", + "final_status": "EXPLAIN_ONLY" + }, + { + "condition": "NpcMsgName", + "problem_before": "Sem camada explícita de geração segura; podia ser tratada como pronta por inferência.", + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/NpcMsgName.pm" + }, + "parser_mode": "composite_regex_numeric", + "correction_applied": "Classificada como EXPLAIN_ONLY com razão explícita no catálogo.", + "generation_impact": "Bloqueia geração automática final; permite explicação controlada.", + "final_status": "EXPLAIN_ONLY" + }, + { + "condition": "PartyMsgName", + "problem_before": "Sem camada explícita de geração segura; podia ser tratada como pronta por inferência.", + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PartyMsgName.pm" + }, + "parser_mode": "composite_regex_numeric", + "correction_applied": "Classificada como EXPLAIN_ONLY com razão explícita no catálogo.", + "generation_impact": "Bloqueia geração automática final; permite explicação controlada.", + "final_status": "EXPLAIN_ONLY" + }, + { + "condition": "PrivMsgName", + "problem_before": "Sem camada explícita de geração segura; podia ser tratada como pronta por inferência.", + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PrivMsgName.pm" + }, + "parser_mode": "composite_regex_numeric", + "correction_applied": "Classificada como EXPLAIN_ONLY com razão explícita no catálogo.", + "generation_impact": "Bloqueia geração automática final; permite explicação controlada.", + "final_status": "EXPLAIN_ONLY" + }, + { + "condition": "PubMsgName", + "problem_before": "Sem camada explícita de geração segura; podia ser tratada como pronta por inferência.", + "evidence": { + "package_line": 1, + "hooks_line": 7, + "parse_syntax_line": -1, + "validate_condition_line": 15, + "new_vars_line": -1, + "file": "plugins/eventMacro/eventMacro/Condition/PubMsgName.pm" + }, + "parser_mode": "composite_regex_numeric", + "correction_applied": "Classificada como EXPLAIN_ONLY com razão explícita no catálogo.", + "generation_impact": "Bloqueia geração automática final; permite explicação controlada.", + "final_status": "EXPLAIN_ONLY" + } + ] +} diff --git a/docs/eventmacro_patch/03_generation_safety_patch.md b/docs/eventmacro_patch/03_generation_safety_patch.md new file mode 100644 index 0000000000..aa9c929ae0 --- /dev/null +++ b/docs/eventmacro_patch/03_generation_safety_patch.md @@ -0,0 +1,26 @@ +# 03 Generation Safety Patch + +## Implementação +A camada de segurança foi adicionada diretamente em `docs/eventmacro_gpt_final/knowledge_ready/18_condition_catalog.json` com os campos: +- `generation_safety` +- `generation_safety_reason` +- `generation_policy` + +## Status final +- `GENERATION_SAFE`: 109 +- `EXPLAIN_ONLY`: 9 +- `UNSAFE`: 0 + +## Conditions rebaixadas para EXPLAIN_ONLY +- `GuildMsgName` (composite_regex_numeric) +- `NoMobNear` (composite_regex_numeric) +- `NoNpcNear` (composite_regex_numeric) +- `NoPlayerNear` (composite_regex_numeric) +- `NoPortalNear` (composite_regex_numeric) +- `NpcMsgName` (composite_regex_numeric) +- `PartyMsgName` (composite_regex_numeric) +- `PrivMsgName` (composite_regex_numeric) +- `PubMsgName` (composite_regex_numeric) + +## Critério usado +- Onde o contrato permaneceu parcialmente implícito para geração pronta (ex.: parser composto herdado sem fechamento sintático local), aplicar `EXPLAIN_ONLY`. diff --git a/docs/eventmacro_patch/04_examples_patch.md b/docs/eventmacro_patch/04_examples_patch.md new file mode 100644 index 0000000000..6735368ce5 --- /dev/null +++ b/docs/eventmacro_patch/04_examples_patch.md @@ -0,0 +1,8 @@ +# 04 Examples Patch + +## Revisão aplicada +- Em `13_examples_valid.md`, o exemplo com `PrivMsg` foi rebaixado para **EXPLAIN_ONLY** para evitar publicação como "template pronto" sem contrato fechado para geração automática. +- Foi adicionada regra explícita de uso dos exemplos: conditions `EXPLAIN_ONLY` servem para explicação e rascunho, não para saída final automática. + +## Resultado +- Nenhum exemplo com condition `EXPLAIN_ONLY` permanece implicitamente classificado como pronto para produção sem ressalva. diff --git a/docs/eventmacro_patch/05_gpt_instruction_patch.md b/docs/eventmacro_patch/05_gpt_instruction_patch.md new file mode 100644 index 0000000000..6374e43956 --- /dev/null +++ b/docs/eventmacro_patch/05_gpt_instruction_patch.md @@ -0,0 +1,14 @@ +# 05 GPT Instruction Patch + +## Ajustes feitos em `16_gpt_system_instructions_final.md` +- Inclusão de gate obrigatório de geração por condition: + 1. Consultar `18_condition_catalog.json` + 2. Ler `generation_safety` + 3. Aplicar política (`GENERATION_SAFE` / `EXPLAIN_ONLY` / `UNSAFE`) +- Inclusão de proibições explícitas: + - Não usar apenas `parser_mode` como prova completa de contrato + - Não deduzir aridade/ordem sem evidência + - Não manter exemplo "pronto" para conditions fora de `GENERATION_SAFE` + +## Impacto +Bloqueio explícito de geração insegura por inferência. diff --git a/docs/eventmacro_patch/06_files_changed_and_why.md b/docs/eventmacro_patch/06_files_changed_and_why.md new file mode 100644 index 0000000000..84d0bd4d95 --- /dev/null +++ b/docs/eventmacro_patch/06_files_changed_and_why.md @@ -0,0 +1,21 @@ +# 06 Files Changed and Why + +## Arquivos existentes alterados +1. `docs/eventmacro_gpt_final/knowledge_ready/18_condition_catalog.json` + - Adição da camada de segurança por condition (`generation_safety`, razão e política). +2. `docs/eventmacro_gpt_final/knowledge_ready/11_condition_reference_tables.md` + - Inclusão de regra operacional de segurança e resumo de contagem. +3. `docs/eventmacro_gpt_final/knowledge_ready/13_examples_valid.md` + - Rebaixamento de exemplo com `PrivMsg` + regra de uso de exemplos. +4. `docs/eventmacro_gpt_final/knowledge_ready/16_gpt_system_instructions_final.md` + - Gate obrigatório antes de gerar macros com conditions. + +## Novos arquivos de patch +- `docs/eventmacro_patch/00_patch_scope_and_method.md` +- `docs/eventmacro_patch/01_lacunas_criticas_identificadas.md` +- `docs/eventmacro_patch/02_condition_contract_fixes.json` +- `docs/eventmacro_patch/03_generation_safety_patch.md` +- `docs/eventmacro_patch/04_examples_patch.md` +- `docs/eventmacro_patch/05_gpt_instruction_patch.md` +- `docs/eventmacro_patch/06_files_changed_and_why.md` +- `docs/eventmacro_patch/07_final_upload_recommendation.md` diff --git a/docs/eventmacro_patch/07_final_upload_recommendation.md b/docs/eventmacro_patch/07_final_upload_recommendation.md new file mode 100644 index 0000000000..d4d53b803b --- /dev/null +++ b/docs/eventmacro_patch/07_final_upload_recommendation.md @@ -0,0 +1,15 @@ +# 07 Final Upload Recommendation + +## Resultado +- A estrutura `docs/eventmacro_gpt_final/knowledge_ready/` foi preservada (patch cirúrgico). +- O pacote permanece com 19 arquivos (<=20). +- A geração agora depende de classificação explícita por condition. + +## Recomendação +Antes de upload: +1. Rodar `python3 docs/eventmacro_gpt_final/support/validate_final_package.py` +2. Conferir se o catálogo final inclui os campos `generation_safety` +3. Garantir que o GPT use `16_gpt_system_instructions_final.md` + +## Conclusão +Curadoria reaproveitada e endurecida para geração com confiança controlada. diff --git a/plugins/eventMacro/eventMacro/FileParser.pm b/plugins/eventMacro/eventMacro/FileParser.pm index 05f0671b88..73fc38ba08 100644 --- a/plugins/eventMacro/eventMacro/FileParser.pm +++ b/plugins/eventMacro/eventMacro/FileParser.pm @@ -279,7 +279,7 @@ sub isNewCommandBlock { sub isNewWrongCommandBlock { my ( $line ) = @_; - if ( $_ =~ /^}\s*else\s*{$/ || $_ =~ /}\s*elsif.*{$/ || $_ =~ /^case.*{$/ || $_ =~ /^else*{$/ ) { + if ( $line =~ /^}\s*else\s*{$/ || $line =~ /}\s*elsif.*{$/ || $line =~ /^case.*{$/ || $line =~ /^else\s*{$/ ) { return 1; } else { return 0; diff --git a/plugins/eventMacro/eventMacro/Validator/RegexCheck.pm b/plugins/eventMacro/eventMacro/Validator/RegexCheck.pm index 43a2a790b1..1e6950f70c 100644 --- a/plugins/eventMacro/eventMacro/Validator/RegexCheck.pm +++ b/plugins/eventMacro/eventMacro/Validator/RegexCheck.pm @@ -91,7 +91,7 @@ sub parse { my $var_name = $var->{display_name}; $self->{var_count_list}{$var_name}++; next if (exists $self->{defined_var_list}{$var_name}); - if ($var =~ /^\./) { + if ($var_name =~ /^\./) { $self->{error} = "System variables should not be used in automacros (The ones starting with a dot '.')"; $self->{parsed} = 0; return; From 0e3a8b690d9ec1305fa98c214bc2212315f048d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Bosc=C3=A1?= Date: Mon, 23 Mar 2026 13:15:25 -0300 Subject: [PATCH 2/3] docs(eventmacro): document keyword inconsistencies and scope limits --- .../06_macro_keywords_and_functions.md | 13 +++++++++++-- .../15_ambiguities_and_nonprovable_claims.md | 4 ++++ .../support/05_release_readiness_report.md | 6 +++++- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md b/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md index e8ac5c2845..78707902f0 100644 --- a/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md +++ b/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md @@ -12,6 +12,16 @@ Principais suportados (PROVADO): - equipamento: `itemCard itemCardAmount itemOption itemOptAmount` - `eval` (bloqueado por lockdown global) +Inventário canônico em `Data.pm` (lista completa da regex de reconhecimento): +- `arg listlength cartamount cart Cart itemCard itemCardAmount itemOption itemOptAmount config defined eval exists delete invamount inventory Inventory InventoryType keys monster nick npc player push pop unshift shift random rand shopamount split store storamount storage Storage strip questStatus questInactiveCount questIncompleteCount questCompleteCount values vender venderitem venderprice venderamount`. + +Notas de consistência (PROVADO): +- Existe divergência entre `Data.pm` e `Runner::parse_command` para `listlength`/`listitem`. + - `Data.pm` lista `listlength`. + - `Runner::parse_command` tem ramo `listitem`. +- Existe ramo `venderItem` (camelCase) no `Runner`, enquanto o canônico em `Data.pm` é `venderitem` (lowercase). +- Para geração segura, tratar como canônicas as formas reconhecidas por `Data.pm` e considerar os desvios acima como inconsistências de runtime. + ## Subrotinas perl - Subs registradas por bloco `sub` podem ser chamadas como `nomeSub(...)` no parser de comando. **PROVADO**. - Se sub inexistente: erro. @@ -27,5 +37,4 @@ Principais suportados (PROVADO): - Fonte estruturada complementar: `19_macro_and_parameter_contracts.json` (`macro_functions`). - Regra de geração: só usar forma pronta quando `lexical_contract_status == COMPLETE`. - Se `PARTIAL`, explicar e pedir confirmação antes de gerar chamada final. - -- Cobertura atual do catálogo estruturado: funções críticas + funções frequentes com status COMPLETE/PARTIAL para controle de geração. +- Cobertura atual do catálogo estruturado: subconjunto contratado para geração guiada (41 funções), não o universo completo de keywords de `Data.pm`. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md b/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md index 8fa0d25ec8..b70c2c0738 100644 --- a/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md +++ b/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md @@ -10,3 +10,7 @@ - `RegexCheck` validava variável de sistema com `if ($var =~ /^\\./)` (hashref), não `display_name`; isso podia deixar `.vars` passar no caminho de regex. **PROVADO**. **Status de solução**: **SOLUCIONADO NO CÓDIGO** (validação ajustada para `$var_name`). - Diferenças históricas para plugin macro antigo só podem ser afirmadas onde há evidência direta de nomes/comandos no código atual; demais afirmações: **NÃO COMPROVADO**. +- Divergência de nomenclatura de keyword entre catálogo canônico e runtime: `Data.pm` declara `listlength`, enquanto `Runner::parse_command` possui ramo `listitem`. **PROVADO**. + **Status de solução**: **NÃO SOLUCIONADO NO CÓDIGO**; na curadoria final deve ser tratado explicitamente como inconsistência conhecida. +- Divergência de casing: `Runner::parse_command` possui ramo `venderItem`, enquanto o catálogo canônico de reconhecimento (`Data.pm`) declara `venderitem`. **PROVADO**. + **Status de solução**: **NÃO SOLUCIONADO NO CÓDIGO**; na curadoria final deve prevalecer forma canônica reconhecida por regex (`venderitem`). diff --git a/docs/eventmacro_gpt_final/support/05_release_readiness_report.md b/docs/eventmacro_gpt_final/support/05_release_readiness_report.md index 1460d6e708..acd843e67d 100644 --- a/docs/eventmacro_gpt_final/support/05_release_readiness_report.md +++ b/docs/eventmacro_gpt_final/support/05_release_readiness_report.md @@ -10,6 +10,10 @@ Data de geração: **2026-03-23**. | Macro functions | 41 | 0 | 0 | 41 | | Automacro parameters | 13 | 0 | 0 | 13 | +Observação de escopo: +- O total de **41 Macro functions** refere-se ao subconjunto contratado em `19_macro_and_parameter_contracts.json` para geração guiada. +- Não representa, por si só, cobertura exaustiva de todas as keywords históricas/canônicas declaradas em `Data.pm`. + ## Safety snapshot - `EXPLAIN_ONLY` conditions: **0**. @@ -18,5 +22,5 @@ Data de geração: **2026-03-23**. ## Gate criteria - Conditions: 100% COMPLETE, 0 PARTIAL, 0 INSUFFICIENT. -- Functions/parameters: 100% COMPLETE. +- Functions/parameters (subconjunto contratado): 100% COMPLETE. - Generation safety: 0 EXPLAIN_ONLY. From 97a8ce4b5069a78326338338767c38c5032ca300 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Juan=20Bosc=C3=A1?= Date: Mon, 23 Mar 2026 13:17:24 -0300 Subject: [PATCH 3/3] eventmacro: align keyword runtime, contracts, and curation coverage --- .../06_macro_keywords_and_functions.md | 12 +- .../15_ambiguities_and_nonprovable_claims.md | 6 +- .../19_macro_and_parameter_contracts.json | 120 ++++++++++++++++++ .../support/05_release_readiness_report.md | 7 +- .../validate_function_parameter_contracts.py | 27 ++++ plugins/eventMacro/eventMacro/Data.pm | 5 +- plugins/eventMacro/eventMacro/Runner.pm | 4 +- 7 files changed, 162 insertions(+), 19 deletions(-) diff --git a/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md b/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md index 78707902f0..8370297a90 100644 --- a/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md +++ b/docs/eventmacro_gpt_final/knowledge_ready/06_macro_keywords_and_functions.md @@ -13,14 +13,12 @@ Principais suportados (PROVADO): - `eval` (bloqueado por lockdown global) Inventário canônico em `Data.pm` (lista completa da regex de reconhecimento): -- `arg listlength cartamount cart Cart itemCard itemCardAmount itemOption itemOptAmount config defined eval exists delete invamount inventory Inventory InventoryType keys monster nick npc player push pop unshift shift random rand shopamount split store storamount storage Storage strip questStatus questInactiveCount questIncompleteCount questCompleteCount values vender venderitem venderprice venderamount`. +- `arg listlength listitem cartamount cart Cart itemCard itemCardAmount itemOption itemOptAmount config defined eval exists delete invamount inventory Inventory InventoryType keys monster nick npc player push pop unshift shift random rand shopamount split store storamount storage Storage strip questStatus questInactiveCount questIncompleteCount questCompleteCount values vender venderitem venderItem venderprice venderamount`. Notas de consistência (PROVADO): -- Existe divergência entre `Data.pm` e `Runner::parse_command` para `listlength`/`listitem`. - - `Data.pm` lista `listlength`. - - `Runner::parse_command` tem ramo `listitem`. -- Existe ramo `venderItem` (camelCase) no `Runner`, enquanto o canônico em `Data.pm` é `venderitem` (lowercase). -- Para geração segura, tratar como canônicas as formas reconhecidas por `Data.pm` e considerar os desvios acima como inconsistências de runtime. +- `listlength` e `listitem` são aceitos como aliases compatíveis no runtime. +- `venderitem` e `venderItem` são aceitos como aliases compatíveis no runtime. +- O catálogo contratual (`19_macro_and_parameter_contracts.json`) cobre 100% das keywords canônicas de `Data.pm` e dos ramos de `Runner::parse_command`. ## Subrotinas perl - Subs registradas por bloco `sub` podem ser chamadas como `nomeSub(...)` no parser de comando. **PROVADO**. @@ -37,4 +35,4 @@ Notas de consistência (PROVADO): - Fonte estruturada complementar: `19_macro_and_parameter_contracts.json` (`macro_functions`). - Regra de geração: só usar forma pronta quando `lexical_contract_status == COMPLETE`. - Se `PARTIAL`, explicar e pedir confirmação antes de gerar chamada final. -- Cobertura atual do catálogo estruturado: subconjunto contratado para geração guiada (41 funções), não o universo completo de keywords de `Data.pm`. +- Cobertura atual do catálogo estruturado: universo completo de keywords canônicas/compatíveis do runtime (47 funções). diff --git a/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md b/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md index b70c2c0738..13f23dfb67 100644 --- a/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md +++ b/docs/eventmacro_gpt_final/knowledge_ready/15_ambiguities_and_nonprovable_claims.md @@ -10,7 +10,5 @@ - `RegexCheck` validava variável de sistema com `if ($var =~ /^\\./)` (hashref), não `display_name`; isso podia deixar `.vars` passar no caminho de regex. **PROVADO**. **Status de solução**: **SOLUCIONADO NO CÓDIGO** (validação ajustada para `$var_name`). - Diferenças históricas para plugin macro antigo só podem ser afirmadas onde há evidência direta de nomes/comandos no código atual; demais afirmações: **NÃO COMPROVADO**. -- Divergência de nomenclatura de keyword entre catálogo canônico e runtime: `Data.pm` declara `listlength`, enquanto `Runner::parse_command` possui ramo `listitem`. **PROVADO**. - **Status de solução**: **NÃO SOLUCIONADO NO CÓDIGO**; na curadoria final deve ser tratado explicitamente como inconsistência conhecida. -- Divergência de casing: `Runner::parse_command` possui ramo `venderItem`, enquanto o catálogo canônico de reconhecimento (`Data.pm`) declara `venderitem`. **PROVADO**. - **Status de solução**: **NÃO SOLUCIONADO NO CÓDIGO**; na curadoria final deve prevalecer forma canônica reconhecida por regex (`venderitem`). +- Divergências históricas de nomenclatura/casing de keyword (`listlength`/`listitem`, `venderitem`/`venderItem`) foram normalizadas para alias explícitos no runtime e sincronizadas no contrato lexical. **PROVADO**. + **Status de solução**: **SOLUCIONADO NO CÓDIGO E NA CURADORIA**. diff --git a/docs/eventmacro_gpt_final/knowledge_ready/19_macro_and_parameter_contracts.json b/docs/eventmacro_gpt_final/knowledge_ready/19_macro_and_parameter_contracts.json index 02ed5b391b..c383543b4c 100644 --- a/docs/eventmacro_gpt_final/knowledge_ready/19_macro_and_parameter_contracts.json +++ b/docs/eventmacro_gpt_final/knowledge_ready/19_macro_and_parameter_contracts.json @@ -816,6 +816,126 @@ "&venderprice ... (without parentheses)" ], "notes": "Runner parse_command routes keyword with one bracket payload string to utility resolver." + }, + { + "name": "listitem", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; expected payload is list index plus comma-separated list" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&listitem(0, a,b,c)", + "&listitem($idx, a,b,c)" + ], + "rejected_forms": [ + "&listitem 0, a,b,c (without parentheses)" + ], + "notes": "Runner routes to getArgFromList and extracts one list member by index." + }, + { + "name": "listlength", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; accepted as compatibility alias of listitem" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&listlength(0, a,b,c)", + "&listlength($idx, a,b,c)" + ], + "rejected_forms": [ + "&listlength 0, a,b,c (without parentheses)" + ], + "notes": "Compatibility alias handled by Runner with same behavior as listitem." + }, + { + "name": "nick", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&nick(Player Name)", + "&nick($charName)" + ], + "rejected_forms": [ + "&nick PlayerName (without parentheses)" + ], + "notes": "Runner normalizes player name/handle through q4rx2 utility." + }, + { + "name": "store", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&store(...)", + "&store(value)" + ], + "rejected_forms": [ + "&store ... (without parentheses)" + ], + "notes": "Runner routes keyword with one bracket payload string to shop/store utility resolver." + }, + { + "name": "venderitem", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&venderitem(...)", + "&venderitem(value)" + ], + "rejected_forms": [ + "&venderitem ... (without parentheses)" + ], + "notes": "Runner resolves first matching vender item ID in current vender list." + }, + { + "name": "venderItem", + "lexical_contract_status": "COMPLETE", + "required_arity": 1, + "optional_arity": 0, + "accepted_separators": [ + "single argument inside parentheses; comma may appear inside the argument payload when function semantics require lists" + ], + "forbidden_separators": [ + "missing function-call parentheses form" + ], + "accepted_forms": [ + "&venderItem(...)", + "&venderItem(value)" + ], + "rejected_forms": [ + "&venderItem ... (without parentheses)" + ], + "notes": "Compatibility alias of venderitem; Runner returns CSV of matching IDs." } ], "automacro_parameters": [ diff --git a/docs/eventmacro_gpt_final/support/05_release_readiness_report.md b/docs/eventmacro_gpt_final/support/05_release_readiness_report.md index acd843e67d..dc6a38daa2 100644 --- a/docs/eventmacro_gpt_final/support/05_release_readiness_report.md +++ b/docs/eventmacro_gpt_final/support/05_release_readiness_report.md @@ -7,12 +7,11 @@ Data de geração: **2026-03-23**. | Escopo | COMPLETE | PARTIAL | INSUFFICIENT | Total | |---|---:|---:|---:|---:| | Conditions | 118 | 0 | 0 | 118 | -| Macro functions | 41 | 0 | 0 | 41 | +| Macro functions | 47 | 0 | 0 | 47 | | Automacro parameters | 13 | 0 | 0 | 13 | Observação de escopo: -- O total de **41 Macro functions** refere-se ao subconjunto contratado em `19_macro_and_parameter_contracts.json` para geração guiada. -- Não representa, por si só, cobertura exaustiva de todas as keywords históricas/canônicas declaradas em `Data.pm`. +- O total de **47 Macro functions** cobre 100% das keywords canônicas de `Data.pm` e os ramos de `Runner::parse_command` (incluindo aliases de compatibilidade). ## Safety snapshot @@ -22,5 +21,5 @@ Observação de escopo: ## Gate criteria - Conditions: 100% COMPLETE, 0 PARTIAL, 0 INSUFFICIENT. -- Functions/parameters (subconjunto contratado): 100% COMPLETE. +- Functions/parameters: 100% COMPLETE. - Generation safety: 0 EXPLAIN_ONLY. diff --git a/docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py b/docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py index d702b0cbf9..df8a8358ac 100755 --- a/docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py +++ b/docs/eventmacro_gpt_final/support/validate_function_parameter_contracts.py @@ -3,9 +3,12 @@ from __future__ import annotations import json +import re from pathlib import Path FILE = Path(__file__).resolve().parents[1] / "knowledge_ready" / "19_macro_and_parameter_contracts.json" +DATA_PM = Path(__file__).resolve().parents[3] / "plugins" / "eventMacro" / "eventMacro" / "Data.pm" +RUNNER_PM = Path(__file__).resolve().parents[3] / "plugins" / "eventMacro" / "eventMacro" / "Runner.pm" def fail(msg: str) -> None: @@ -35,6 +38,30 @@ def main() -> None: for it in data["automacro_parameters"]: check_item("automacro_parameter", it) + data_pm = DATA_PM.read_text(encoding="utf-8") + m = re.search(r"our \$macroKeywords = join '\|', qw\((.*?)\);", data_pm, flags=re.S) + if not m: + fail("could not parse $macroKeywords from Data.pm") + data_keywords = set(m.group(1).split()) + + runner_pm = RUNNER_PM.read_text(encoding="utf-8") + sec = re.search(r"sub parse_command \{(.*?\n\})\n\n", runner_pm, flags=re.S) + if not sec: + fail("could not parse parse_command from Runner.pm") + runner_keywords = set(re.findall(r"\$keyword eq '([^']+)'", sec.group(1))) + + contract_keywords = {it["name"] for it in data["macro_functions"]} + + if data_keywords != runner_keywords: + missing_in_runner = sorted(data_keywords - runner_keywords) + missing_in_data = sorted(runner_keywords - data_keywords) + fail(f"Data.pm and Runner.pm keyword mismatch: data_only={missing_in_runner} runner_only={missing_in_data}") + + if data_keywords != contract_keywords: + missing_in_contract = sorted(data_keywords - contract_keywords) + extra_in_contract = sorted(contract_keywords - data_keywords) + fail(f"Contract and Data.pm keyword mismatch: data_only={missing_in_contract} contract_only={extra_in_contract}") + print("OK: function/parameter contracts validated") print(f"macro_functions={len(data['macro_functions'])} automacro_parameters={len(data['automacro_parameters'])}") diff --git a/plugins/eventMacro/eventMacro/Data.pm b/plugins/eventMacro/eventMacro/Data.pm index 931e437f81..ef07452951 100644 --- a/plugins/eventMacro/eventMacro/Data.pm +++ b/plugins/eventMacro/eventMacro/Data.pm @@ -55,6 +55,7 @@ our %parameters = ( our $macroKeywords = join '|', qw( arg listlength + listitem cartamount cart Cart itemCard itemCardAmount itemOption itemOptAmount config @@ -77,7 +78,7 @@ our $macroKeywords = join '|', qw( strip questStatus questInactiveCount questIncompleteCount questCompleteCount values - vender venderitem venderprice venderamount + vender venderitem venderItem venderprice venderamount ); -1; \ No newline at end of file +1; diff --git a/plugins/eventMacro/eventMacro/Runner.pm b/plugins/eventMacro/eventMacro/Runner.pm index b372190bb9..760e586590 100644 --- a/plugins/eventMacro/eventMacro/Runner.pm +++ b/plugins/eventMacro/eventMacro/Runner.pm @@ -2209,7 +2209,7 @@ sub parse_command { } elsif ($keyword eq 'eval') { $result = eval($parsed) unless $Settings::lockdown; - } elsif ($keyword eq 'listitem') { + } elsif ($keyword eq 'listitem' || $keyword eq 'listlength') { $result = getArgFromList($parsed); } elsif ($keyword eq 'strip') { @@ -2470,4 +2470,4 @@ sub manage_array { return $result; } -1; \ No newline at end of file +1;