{
  "schemaVersion": 1,
  "revision": "2026-10-05-five-roadmaps",
  "updated": "2026-10-05",
  "evidenceBaseline": "b3a719dca",
  "method": {
    "pt": "Cada barra tem seu próprio total de 100%. Os pesos são uma divisão editorial das entregas, não horas nem quantidade de conteúdo jogável. Etapas verificadas recebem seu peso; parciais só recebem uma fração quando há uma lista contada de partes. A pesquisa preparatória aparece nas notas e não rende pontos sozinha. Não somamos as cinco barras em um percentual global.",
    "en": "Each bar has its own 100% total. Weights are an editorial allocation of deliverables, not hours or playable content. Verified steps earn their weight; partial steps earn a fraction only when there is a counted list of parts. Preparatory research appears in notes and does not earn points on its own. We do not add the five bars into a global percentage."
  },
  "weightRationale": {
    "pt": "X2 parte da mesma distribuição de áreas de X1. X3 reserva oito pontos do seu plano para Zero e redistribui as demais áreas explicitamente. O motor próprio divide seus pontos entre a base do motor, os três jogos (pelo tamanho da lista de objetos de cada cartucho) e o que junta os três; os detalhes estão nos dados para baixar. Nos Extras ficam os modos novos e o conteúdo inédito; o arsenal entre jogos e as opções visuais passaram para o motor próprio, e os pontos deles formam o novo item de conteúdo inédito.",
    "en": "X2 starts from the same area allocation as X1. X3 reserves eight points of its plan for Zero and explicitly allocates the remaining areas. Our own engine splits its points between the engine foundations, the three games (by the size of each cartridge's object list) and what joins the three; the details are in the downloadable data. Extras hold the new modes and truly new content; the cross-game arsenal and the visual options moved to our own engine, and their points form the new original-content item."
  },
  "plans": [
    "docs/plans/2026-09-30-native-engine-design.md",
    "docs/plans/2026-10-04-zero-x1-drive-plan.md",
    "docs/plans/2026-10-03-pc10-vile-native-plan.md",
    "docs/plans/2026-10-04-stabilize-zero-and-storage.md",
    "docs/goal/ENGINE-COMPLETION.json"
  ],
  "scopes": [
    {
      "id": "x2",
      "title": {
        "pt": "Mega Man X2",
        "en": "Mega Man X2"
      },
      "color": "#ad9bff",
      "totalWeightBp": 10000,
      "description": {
        "pt": "Uma campanha própria, com suas armas, chefes e mecânicas.",
        "en": "A campaign of its own, with its weapons, bosses and mechanics."
      },
      "context": {
        "pt": "Há pesquisa e um protótipo de referência, mas as comparações completas ainda divergem. Nenhuma entrega desta campanha foi aceita nesta escala.",
        "en": "Research and a reference prototype exist, but complete comparisons still diverge. No deliverable for this campaign has been accepted on this scale."
      },
      "totals": {
        "verifiedBp": 0,
        "partialBp": 0,
        "sumBp": 0
      },
      "features": [
        {
          "id": "x2-player",
          "weightBp": 1200,
          "title": {
            "pt": "X: controles e sobrevivência",
            "en": "X: controls and survival"
          },
          "description": {
            "pt": "Movimento, terreno, dano, morte e melhorias próprios desta campanha.",
            "en": "Movement, terrain, damage, death and upgrades specific to this campaign."
          },
          "steps": [
            {
              "id": "x2-player-inventory",
              "weightBp": 240,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar os estados próprios de X neste jogo e integrar um percurso curto de movimento, comparado com o original.",
                "en": "List X's states specific to this game and integrate a short movement sequence, compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x2-player-validation",
              "weightBp": 960,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Movimento, terreno, dano, morte e melhorias próprios desta campanha.",
                "en": "Movement, terrain, damage, death and upgrades specific to this campaign."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x2-weapons",
          "weightBp": 1000,
          "title": {
            "pt": "Armas e habilidades",
            "en": "Weapons and abilities"
          },
          "description": {
            "pt": "Armas normais e carregadas, energia, dano e interações conferidas.",
            "en": "Normal and charged weapons, energy, damage and interactions checked."
          },
          "steps": [
            {
              "id": "x2-weapons-inventory",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar armas, energia e melhorias deste jogo e integrar uma arma completa em uma cena de teste comparada com o original.",
                "en": "List this game's weapons, energy and upgrades, and integrate one complete weapon in a test scene compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x2-weapons-validation",
              "weightBp": 800,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Armas normais e carregadas, energia, dano e interações conferidas.",
                "en": "Normal and charged weapons, energy, damage and interactions checked."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x2-enemies",
          "weightBp": 1500,
          "title": {
            "pt": "Inimigos e objetos de combate",
            "en": "Enemies and combat objects"
          },
          "description": {
            "pt": "Inventariar e conferir comportamentos, projéteis e interações dos inimigos.",
            "en": "Inventory and check enemy behaviors, projectiles and interactions."
          },
          "steps": [
            {
              "id": "x2-enemies-inventory",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar as famílias de inimigos deste jogo e integrar uma família, incluindo ativação, ataques e derrota, em uma cena comparada com o original.",
                "en": "List this game's enemy families and integrate one family, including activation, attacks and defeat, in a scene compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x2-enemies-validation",
              "weightBp": 1200,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Inventariar e conferir comportamentos, projéteis e interações dos inimigos.",
                "en": "Inventory and check enemy behaviors, projectiles and interactions."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x2-bosses",
          "weightBp": 1800,
          "title": {
            "pt": "Chefes e subchefes",
            "en": "Bosses and minibosses"
          },
          "description": {
            "pt": "Conferir entradas, ataques, dano, derrotas e recompensas de todos os encontros.",
            "en": "Check entrances, attacks, damage, defeats and rewards for every encounter."
          },
          "steps": [
            {
              "id": "x2-bosses-inventory",
              "weightBp": 360,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar chefes e subchefes deste jogo e integrar um encontro completo, da entrada à recompensa, comparado com o original.",
                "en": "List this game's bosses and minibosses and integrate one complete encounter, from entry to reward, compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x2-bosses-validation",
              "weightBp": 1440,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Conferir entradas, ataques, dano, derrotas e recompensas de todos os encontros.",
                "en": "Check entrances, attacks, damage, defeats and rewards for every encounter."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x2-stages",
          "weightBp": 2600,
          "title": {
            "pt": "Fases, terreno e apresentação",
            "en": "Stages, terrain and presentation"
          },
          "description": {
            "pt": "Validar cada fase, seus objetos, câmera, cores, perigos e pontos de retorno.",
            "en": "Validate every stage, its objects, camera, colors, hazards and checkpoints."
          },
          "steps": [
            {
              "id": "x2-stages-inventory",
              "weightBp": 520,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar fases e seus mecanismos próprios e integrar um trecho contínuo, com terreno, câmera e objetos comparados com o original.",
                "en": "List stages and their specific mechanisms and integrate a continuous section, with terrain, camera and objects compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x2-stages-validation",
              "weightBp": 2080,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Validar cada fase, seus objetos, câmera, cores, perigos e pontos de retorno.",
                "en": "Validate every stage, its objects, camera, colors, hazards and checkpoints."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x2-objects",
          "weightBp": 700,
          "title": {
            "pt": "Melhorias e mecânicas exclusivas",
            "en": "Upgrades and game-specific mechanics"
          },
          "description": {
            "pt": "Conferir itens, melhorias, veículos e mecanismos próprios do jogo.",
            "en": "Check items, upgrades, vehicles and mechanics specific to the game."
          },
          "steps": [
            {
              "id": "x2-objects-inventory",
              "weightBp": 140,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar itens e mecanismos deste jogo e integrar um exemplar de cada grupo escolhido para o primeiro trecho, com seus efeitos conferidos.",
                "en": "List this game's items and mechanisms and integrate an example from each group chosen for the first section, with their effects checked."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x2-objects-validation",
              "weightBp": 560,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Conferir itens, melhorias, veículos e mecanismos próprios do jogo.",
                "en": "Check items, upgrades, vehicles and mechanics specific to the game."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x2-campaign",
          "weightBp": 800,
          "title": {
            "pt": "Campanha, menus e som",
            "en": "Campaign, menus and sound"
          },
          "description": {
            "pt": "Completar progressão, opções, cenas, salvamento, áudio e caminho até os créditos.",
            "en": "Complete progression, options, scenes, saving, audio and the route to the credits."
          },
          "steps": [
            {
              "id": "x2-campaign-inventory",
              "weightBp": 160,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Mapear a ordem e as condições de progressão e integrar o ciclo de seleção, entrada de fase e retorno, com estado preservado e comparado.",
                "en": "Map progression order and conditions and integrate the selection, stage entry and return cycle, with state preserved and compared."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x2-campaign-validation",
              "weightBp": 640,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Completar progressão, opções, cenas, salvamento, áudio e caminho até os créditos.",
                "en": "Complete progression, options, scenes, saving, audio and the route to the credits."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x2-delivery",
          "weightBp": 400,
          "title": {
            "pt": "Distribuição e aceitação final",
            "en": "Distribution and final acceptance"
          },
          "description": {
            "pt": "Preparar instalação, regressões, partida completa e aprovação do jogador.",
            "en": "Prepare installation, regressions, a complete run and player approval."
          },
          "steps": [
            {
              "id": "x2-delivery-inventory",
              "weightBp": 80,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Gerar uma versão instalável deste jogo e conferir a abertura e uma cena curta em máquina limpa, preservando os avisos de conteúdo ainda não validado.",
                "en": "Build an installable version of this game and check startup and a short scene on a clean machine, retaining notices for content that is not yet validated."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x2-delivery-validation",
              "weightBp": 320,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Preparar instalação, regressões, partida completa e aprovação do jogador.",
                "en": "Prepare installation, regressions, a complete run and player approval."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        }
      ]
    },
    {
      "id": "x3",
      "title": {
        "pt": "Mega Man X3",
        "en": "Mega Man X3"
      },
      "color": "#ffb267",
      "totalWeightBp": 10000,
      "description": {
        "pt": "A terceira campanha, incluindo o comportamento original de Zero.",
        "en": "The third campaign, including Zero’s original behavior."
      },
      "context": {
        "pt": "O trabalho verificado do Zero já conta aqui. Fases, chefes, progressão e apresentação completa de X3 continuam pendentes.",
        "en": "Verified Zero work already counts here. X3 stages, bosses, progression and complete presentation remain pending."
      },
      "totals": {
        "verifiedBp": 400,
        "partialBp": 0,
        "sumBp": 400
      },
      "features": [
        {
          "id": "x3-player",
          "weightBp": 1000,
          "title": {
            "pt": "X: controles e sobrevivência",
            "en": "X: controls and survival"
          },
          "description": {
            "pt": "Movimento, terreno, dano, morte e melhorias próprios desta campanha.",
            "en": "Movement, terrain, damage, death and upgrades specific to this campaign."
          },
          "steps": [
            {
              "id": "x3-player-inventory",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar os estados próprios de X neste jogo e integrar um percurso curto de movimento, comparado com o original.",
                "en": "List X's states specific to this game and integrate a short movement sequence, compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x3-player-validation",
              "weightBp": 800,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Movimento, terreno, dano, morte e melhorias próprios desta campanha.",
                "en": "Movement, terrain, damage, death and upgrades specific to this campaign."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x3-zero",
          "weightBp": 800,
          "title": {
            "pt": "Zero: comportamento original",
            "en": "Zero: original behavior"
          },
          "description": {
            "pt": "O código do personagem já foi trazido e comparado em situações específicas. Isso ainda não conclui sua participação na campanha de X3.",
            "en": "The character code has been brought over and compared in specific situations. This does not yet complete his role in the X3 campaign."
          },
          "steps": [
            {
              "id": "x3-zero-movement",
              "weightBp": 100,
              "status": "verified",
              "title": {
                "pt": "Movimento nas situações capturadas",
                "en": "Movement in captured situations"
              },
              "acceptance": {
                "pt": "Andar, pular, dash, parede e escada reproduzem as chamadas de referência retidas.",
                "en": "Walking, jumping, dashing, walls and ladders reproduce the retained reference calls."
              },
              "evidence": [
                "docs/tasks/done/PC5H-x3-zero-state-pairs-capture.md",
                "tests/native/x3_zero_stand_oracle_test.cpp",
                "tests/native/x3_zero_air_oracle_test.cpp",
                "tests/native/x3_zero_dash_wall_oracle_test.cpp",
                "tests/native/x3_zero_ladder_oracle_test.cpp"
              ],
              "note": {
                "pt": "11 tratadores, 40 pares por tratador; casos não capturados não recebem aceitação.",
                "en": "11 handlers, 40 pairs per handler; uncaptured cases do not receive acceptance."
              }
            },
            {
              "id": "x3-zero-attacks",
              "weightBp": 100,
              "status": "verified",
              "title": {
                "pt": "Sabre e tiros nas situações capturadas",
                "en": "Saber and shots in captured situations"
              },
              "acceptance": {
                "pt": "Reproduzir as chamadas retidas dos ataques e dos projéteis.",
                "en": "Reproduce the retained attack and projectile calls."
              },
              "evidence": [
                "docs/tasks/done/PC7B2-x3-zero-frame-pairs.md",
                "docs/plans/2026-10-04-zero-x1-drive-plan.md"
              ],
              "note": {
                "pt": "1730/1730 chamadas de projéteis; as saídas aéreas não estão neste critério.",
                "en": "1730/1730 projectile calls; airborne exits are outside this criterion."
              }
            },
            {
              "id": "x3-zero-frame",
              "weightBp": 100,
              "status": "verified",
              "title": {
                "pt": "Atualização e colisão nas chamadas verificadas",
                "en": "Update and collision in verified calls"
              },
              "acceptance": {
                "pt": "Comparar os campos e efeitos definidos da atualização e da colisão.",
                "en": "Compare the specified update and collision fields and side effects."
              },
              "evidence": [
                "docs/plans/2026-10-04-zero-x1-drive-plan.md",
                "tests/native/x3_zero_frame_oracle_test.cpp"
              ],
              "note": {
                "pt": "900/900 chamadas de quadro e 300/300 de colisão. Diagnósticos antigos 1827/3370 e 1832/3370 continuam parciais.",
                "en": "900/900 frame calls and 300/300 collision calls. Older diagnostics 1827/3370 and 1832/3370 remain partial."
              }
            },
            {
              "id": "x3-zero-hurt",
              "weightBp": 100,
              "status": "verified",
              "title": {
                "pt": "Dano e morte nas chamadas verificadas",
                "en": "Damage and death in verified calls"
              },
              "acceptance": {
                "pt": "Reproduzir as reações capturadas e o cálculo das cores, incluindo o fade de morte.",
                "en": "Reproduce captured reactions and palette calculation, including the death fade."
              },
              "evidence": [
                "docs/plans/2026-10-04-zero-x1-drive-plan.md",
                "docs/tasks/done/PC7B2-x3-zero-frame-pairs.md"
              ],
              "note": {
                "pt": "Igualdade de cálculo, incluindo 512 bytes de paleta; aplicação visual e campanha ainda pendentes.",
                "en": "Calculation equality, including 512 palette bytes; visual application and campaign still pending."
              }
            },
            {
              "id": "x3-zero-exits",
              "weightBp": 100,
              "status": "pending",
              "title": {
                "pt": "Demais saídas de movimento e ataque",
                "en": "Remaining movement and attack exits"
              },
              "acceptance": {
                "pt": "Cobrir as saídas aéreas e os caminhos ainda não implementados ou não capturados.",
                "en": "Cover airborne exits and paths still unimplemented or uncaptured."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "x3-zero-render",
              "weightBp": 100,
              "status": "pending",
              "title": {
                "pt": "Animações, cores, efeitos e sons completos",
                "en": "Complete animation, colors, effects and sound"
              },
              "acceptance": {
                "pt": "Aplicar a apresentação original do personagem em jogo, com todos os efeitos e sons.",
                "en": "Apply the original character presentation in game, with all effects and sounds."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "x3-zero-campaign",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Zero integrado à campanha de X3",
                "en": "Zero integrated into the X3 campaign"
              },
              "acceptance": {
                "pt": "Validar troca de personagem, disponibilidade, encontros e regras próprias da campanha.",
                "en": "Validate character switching, availability, encounters and campaign-specific rules."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x3-weapons",
          "weightBp": 1000,
          "title": {
            "pt": "Armas e habilidades",
            "en": "Weapons and abilities"
          },
          "description": {
            "pt": "Armas normais e carregadas, energia, dano e interações conferidas.",
            "en": "Normal and charged weapons, energy, damage and interactions checked."
          },
          "steps": [
            {
              "id": "x3-weapons-inventory",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar armas, energia e melhorias deste jogo e integrar uma arma completa em uma cena de teste comparada com o original.",
                "en": "List this game's weapons, energy and upgrades, and integrate one complete weapon in a test scene compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x3-weapons-validation",
              "weightBp": 800,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Armas normais e carregadas, energia, dano e interações conferidas.",
                "en": "Normal and charged weapons, energy, damage and interactions checked."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x3-enemies",
          "weightBp": 1200,
          "title": {
            "pt": "Inimigos e objetos de combate",
            "en": "Enemies and combat objects"
          },
          "description": {
            "pt": "Inventariar e conferir comportamentos, projéteis e interações dos inimigos.",
            "en": "Inventory and check enemy behaviors, projectiles and interactions."
          },
          "steps": [
            {
              "id": "x3-enemies-inventory",
              "weightBp": 240,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar as famílias de inimigos deste jogo e integrar uma família, incluindo ativação, ataques e derrota, em uma cena comparada com o original.",
                "en": "List this game's enemy families and integrate one family, including activation, attacks and defeat, in a scene compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x3-enemies-validation",
              "weightBp": 960,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Inventariar e conferir comportamentos, projéteis e interações dos inimigos.",
                "en": "Inventory and check enemy behaviors, projectiles and interactions."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x3-bosses",
          "weightBp": 1600,
          "title": {
            "pt": "Chefes e subchefes",
            "en": "Bosses and minibosses"
          },
          "description": {
            "pt": "Conferir entradas, ataques, dano, derrotas e recompensas de todos os encontros.",
            "en": "Check entrances, attacks, damage, defeats and rewards for every encounter."
          },
          "steps": [
            {
              "id": "x3-bosses-inventory",
              "weightBp": 320,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar chefes e subchefes deste jogo e integrar um encontro completo, da entrada à recompensa, comparado com o original.",
                "en": "List this game's bosses and minibosses and integrate one complete encounter, from entry to reward, compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x3-bosses-validation",
              "weightBp": 1280,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Conferir entradas, ataques, dano, derrotas e recompensas de todos os encontros.",
                "en": "Check entrances, attacks, damage, defeats and rewards for every encounter."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x3-stages",
          "weightBp": 1800,
          "title": {
            "pt": "Fases, terreno e apresentação",
            "en": "Stages, terrain and presentation"
          },
          "description": {
            "pt": "Validar cada fase, seus objetos, câmera, cores, perigos e pontos de retorno.",
            "en": "Validate every stage, its objects, camera, colors, hazards and checkpoints."
          },
          "steps": [
            {
              "id": "x3-stages-inventory",
              "weightBp": 360,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar fases e seus mecanismos próprios e integrar um trecho contínuo, com terreno, câmera e objetos comparados com o original.",
                "en": "List stages and their specific mechanisms and integrate a continuous section, with terrain, camera and objects compared with the original."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x3-stages-validation",
              "weightBp": 1440,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Validar cada fase, seus objetos, câmera, cores, perigos e pontos de retorno.",
                "en": "Validate every stage, its objects, camera, colors, hazards and checkpoints."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x3-objects",
          "weightBp": 800,
          "title": {
            "pt": "Melhorias e mecânicas exclusivas",
            "en": "Upgrades and game-specific mechanics"
          },
          "description": {
            "pt": "Conferir itens, melhorias, veículos e mecanismos próprios do jogo.",
            "en": "Check items, upgrades, vehicles and mechanics specific to the game."
          },
          "steps": [
            {
              "id": "x3-objects-inventory",
              "weightBp": 160,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Listar itens e mecanismos deste jogo e integrar um exemplar de cada grupo escolhido para o primeiro trecho, com seus efeitos conferidos.",
                "en": "List this game's items and mechanisms and integrate an example from each group chosen for the first section, with their effects checked."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x3-objects-validation",
              "weightBp": 640,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Conferir itens, melhorias, veículos e mecanismos próprios do jogo.",
                "en": "Check items, upgrades, vehicles and mechanics specific to the game."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x3-campaign",
          "weightBp": 1000,
          "title": {
            "pt": "Campanha, menus e som",
            "en": "Campaign, menus and sound"
          },
          "description": {
            "pt": "Completar progressão, opções, cenas, salvamento, áudio e caminho até os créditos.",
            "en": "Complete progression, options, scenes, saving, audio and the route to the credits."
          },
          "steps": [
            {
              "id": "x3-campaign-inventory",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Mapear a ordem e as condições de progressão e integrar o ciclo de seleção, entrada de fase e retorno, com estado preservado e comparado.",
                "en": "Map progression order and conditions and integrate the selection, stage entry and return cycle, with state preserved and compared."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x3-campaign-validation",
              "weightBp": 800,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Completar progressão, opções, cenas, salvamento, áudio e caminho até os créditos.",
                "en": "Complete progression, options, scenes, saving, audio and the route to the credits."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "x3-delivery",
          "weightBp": 800,
          "title": {
            "pt": "Distribuição e aceitação final",
            "en": "Distribution and final acceptance"
          },
          "description": {
            "pt": "Preparar instalação, regressões, partida completa e aprovação do jogador.",
            "en": "Prepare installation, regressions, a complete run and player approval."
          },
          "steps": [
            {
              "id": "x3-delivery-inventory",
              "weightBp": 160,
              "status": "pending",
              "title": {
                "pt": "Inventário e integração próprios",
                "en": "Game-specific inventory and integration"
              },
              "acceptance": {
                "pt": "Gerar uma versão instalável deste jogo e conferir a abertura e uma cena curta em máquina limpa, preservando os avisos de conteúdo ainda não validado.",
                "en": "Build an installable version of this game and check startup and a short scene on a clean machine, retaining notices for content that is not yet validated."
              },
              "evidence": [],
              "note": {
                "pt": "A lista sozinha não pontua: este primeiro marco exige também a integração e a comparação descritas. Ainda não há aceitação registrada. A etapa seguinte encerra toda a área e seus casos restantes.",
                "en": "The list alone earns no credit: this first milestone also requires the stated integration and comparison. No acceptance is recorded yet. The next step closes the whole area and its remaining cases."
              }
            },
            {
              "id": "x3-delivery-validation",
              "weightBp": 640,
              "status": "pending",
              "title": {
                "pt": "Implementação e verificação completas",
                "en": "Complete implementation and verification"
              },
              "acceptance": {
                "pt": "Preparar instalação, regressões, partida completa e aprovação do jogador.",
                "en": "Prepare installation, regressions, a complete run and player approval."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        }
      ]
    },
    {
      "id": "engine",
      "title": {
        "pt": "Motor próprio",
        "en": "Our own engine"
      },
      "color": "#60dfcc",
      "totalWeightBp": 10000,
      "description": {
        "pt": "Um só programa com X1, X2 e X3, refeito em código próprio e comparado com os originais.",
        "en": "One program with X1, X2 and X3, rebuilt in our own code and compared with the originals."
      },
      "context": {
        "pt": "Partes do motor próprio já são iguais ao original em testes: o personagem X, 53 tipos de inimigo (doze de Chill Penguin), o chefe Chill Penguin, o som e a carga das fases. Elas ainda não formam um jogo jogável sozinhas: hoje o jogo roda o código do cartucho original, traduzido para C++.",
        "en": "Parts of our own engine already equal the original in tests: X, 53 enemy types (twelve from Chill Penguin's stage), the Chill Penguin boss, the sound and stage loading. They do not yet make a playable game on their own: today the game runs the original cartridge's code, translated to C++."
      },
      "groups": [
        {
          "id": "foundations",
          "title": {
            "pt": "Base do motor",
            "en": "Engine foundations"
          },
          "weightBp": 1000
        },
        {
          "id": "x1",
          "title": {
            "pt": "Mega Man X no motor próprio",
            "en": "Mega Man X on our own engine"
          },
          "weightBp": 2634
        },
        {
          "id": "x2",
          "title": {
            "pt": "Mega Man X2 no motor próprio",
            "en": "Mega Man X2 on our own engine"
          },
          "weightBp": 2683
        },
        {
          "id": "x3",
          "title": {
            "pt": "Mega Man X3 no motor próprio",
            "en": "Mega Man X3 on our own engine"
          },
          "weightBp": 2683
        },
        {
          "id": "integration",
          "title": {
            "pt": "Os três jogos juntos",
            "en": "The three games together"
          },
          "weightBp": 1000
        }
      ],
      "totals": {
        "verifiedBp": 1323,
        "partialBp": 396,
        "sumBp": 1719
      },
      "features": [
        {
          "id": "foundations.core",
          "weightBp": 125,
          "group": "foundations",
          "title": {
            "pt": "Números e controle",
            "en": "Numbers and controls"
          },
          "description": {
            "pt": "Base comum aos três jogos (seção 2 do design).",
            "en": "Base shared by the three games (design section 2)."
          },
          "steps": [
            {
              "id": "foundations.core.numbers",
              "title": {
                "pt": "Números de ponto fixo e quadro de controle",
                "en": "Fixed-point numbers and controller frame"
              },
              "weightBp": 63,
              "status": "verified",
              "acceptance": {
                "pt": "As contas de posição e velocidade dão os mesmos resultados do original nos testes da base.",
                "en": "Position and speed arithmetic gives the same results as the original in the base tests."
              },
              "evidence": [
                "tests/native/core_test.cpp",
                "src/native/core/fixed_point.h"
              ],
              "note": {
                "pt": "src/native/core (fixed_point, pad_frame); os testes da base rodam no rótulo native-unit, 58/58 na N2 sessão 24 (commit 49e4291d0).",
                "en": "src/native/core (fixed_point, pad_frame); the base tests run under the native-unit label, 58/58 in N2 session 24 (commit 49e4291d0)."
              }
            },
            {
              "id": "foundations.core.game-ids",
              "title": {
                "pt": "Identidade de X1, X2 e X3 em todo o motor",
                "en": "X1, X2 and X3 identity across the engine"
              },
              "weightBp": 62,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "src/native/game/game_id.h"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. game_id.h existe; nenhum teste de X2 ainda.",
                "en": "No acceptance recorded yet. game_id.h exists; no X2 test yet."
              }
            }
          ]
        },
        {
          "id": "foundations.world",
          "weightBp": 125,
          "group": "foundations",
          "title": {
            "pt": "Mundo e objetos",
            "en": "World and objects"
          },
          "description": {
            "pt": "Base comum aos três jogos (seção 2 do design).",
            "en": "Base shared by the three games (design section 2)."
          },
          "steps": [
            {
              "id": "foundations.world.pools",
              "title": {
                "pt": "Objetos processados na ordem original",
                "en": "Objects processed in the original order"
              },
              "weightBp": 32,
              "status": "verified",
              "acceptance": {
                "pt": "Os objetos ativos são processados na mesma ordem e nas mesmas posições da lista que no original.",
                "en": "Active objects are processed in the same order and list positions as in the original."
              },
              "evidence": [
                "docs/tasks/done/N9-enemy-host-slice.md"
              ],
              "note": {
                "pt": "N9 sessão 1 (commit f663023b4): hospedeiro de inimigos, 15 posições, despacho 80:D530, registro; ordem de despacho 536 de 536 quadros (T2, 993 chamadas), 543 de 543 (T1). É a lista do X1, ainda não um mundo comum a X2/X3.",
                "en": "N9 session 1 (commit f663023b4): enemy host, 15 slots, 80:D530 dispatch, registry; dispatch order 536 of 536 frames (T2, 993 calls), 543 of 543 (T1). It is the X1 pool, not yet a world shared with X2/X3."
              }
            },
            {
              "id": "foundations.world.terrain",
              "title": {
                "pt": "Colisão com o cenário",
                "en": "Collision with the scenery"
              },
              "weightBp": 31,
              "status": "verified",
              "acceptance": {
                "pt": "As sondas de chão, parede e teto respondem como no original nas chamadas gravadas.",
                "en": "Floor, wall and ceiling probes answer as in the original on the recorded calls."
              },
              "evidence": [
                "tests/native/terrain_oracle_test.cpp",
                "docs/tasks/done/N10b-enemy-host-terrain-and-fixes.md"
              ],
              "note": {
                "pt": "Testes de oráculo de terreno da N1 (chão, teto, horizontal, despacho, resposta) e N10b (commit da9a1c9d9): visão de terreno 84:91BE igual em 179 de 179 chamadas gravadas e 98 de 98 forçadas. N10c (commit b71ecf1cf): o acumulador de saída também é igual, 391 de 391 chamadas de 0x15.",
                "en": "N1 terrain oracle tests (floor, ceiling, horizontal, dispatch, response) and N10b (commit da9a1c9d9): terrain view 84:91BE equal on 179 of 179 recorded calls and 98 of 98 forced calls. N10c (commit b71ecf1cf): the exit accumulator is equal too, 391 of 391 calls of 0x15."
              }
            },
            {
              "id": "foundations.world.step",
              "title": {
                "pt": "Um passo de jogo que move todos os sistemas",
                "en": "One game step that drives every system"
              },
              "weightBp": 31,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/NP8-derive-x-entry-b.md",
                "docs/tasks/done/NP6f-ride-armour-lane.md",
                "docs/tasks/done/NP7-native-oam.md",
                "docs/plans/2026-10-10-native-playable-plan.md",
                "src/native/world/x1_frame.cpp"
              ],
              "note": {
                "pt": "O passo de quadro nativo do X1 (src/native/world/x1_frame.cpp) roda um quadro inteiro do jogo com o nosso código: o X e seus serviços, os inimigos, os efeitos, as pistas de objetos, a Ride Armor, os carregadores da fase e o desenho dos sprites, sem nenhuma chamada ao código original e sem outra entrada além do controle. Igual ao original em 598 de 598 quadros nos dois trechos de teste do Chill Penguin (T1 e T2). Cartas NP1 a NP8. É o passo do X1; X2 e X3 usarão o mesmo formato.",
                "en": "X1's native frame step (src/native/world/x1_frame.cpp) runs a whole game frame with our own code: X and his services, the enemies, the effects, the object lanes, the ride armour, the stage loaders and the sprite drawing, with no call into the original code and no input but the pad. Equal to the original on 598 of 598 frames on both Chill Penguin test stretches (T1 and T2). Cards NP1 to NP8. It is X1's step; X2 and X3 will use the same shape."
              }
            },
            {
              "id": "foundations.world.registries",
              "title": {
                "pt": "Registros por jogo e tipo de objeto",
                "en": "Registries by game and object kind"
              },
              "weightBp": 31,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. A N9 tem um registro de inimigos do X1; registros por (jogo, tipo) para X2/X3 não existem.",
                "en": "No acceptance recorded yet. N9 has an X1 enemy registry; registries by (game, kind) for X2/X3 do not exist."
              }
            }
          ]
        },
        {
          "id": "foundations.common",
          "weightBp": 125,
          "group": "foundations",
          "title": {
            "pt": "Regras comuns aos três jogos",
            "en": "Rules shared by the three games"
          },
          "description": {
            "pt": "Base comum aos três jogos (seção 2 do design).",
            "en": "Base shared by the three games (design section 2)."
          },
          "steps": [
            {
              "id": "foundations.common.weapons",
              "title": {
                "pt": "Definição de armas comum aos três jogos",
                "en": "Weapon definition shared by the three games"
              },
              "weightBp": 63,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. WeaponDef (disparo, carga, energia, projétil) da seção 2; os tiros do X1 estão em game/x1 (N2).",
                "en": "No acceptance recorded yet. WeaponDef (fire, charge, energy, projectile) of section 2; X1 shots live in game/x1 (N2)."
              }
            },
            {
              "id": "foundations.common.hitboxes",
              "title": {
                "pt": "Caixas de acerto e animação comuns",
                "en": "Shared hit boxes and animation"
              },
              "weightBp": 62,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. Os ajudantes de inimigo do X1 estão em game/x1/enemy_host (N9, N10).",
                "en": "No acceptance recorded yet. The X1 enemy helpers live in game/x1/enemy_host (N9, N10)."
              }
            }
          ]
        },
        {
          "id": "foundations.render",
          "weightBp": 125,
          "group": "foundations",
          "title": {
            "pt": "Desenho da imagem",
            "en": "Drawing the picture"
          },
          "description": {
            "pt": "Base comum aos três jogos (seção 2 do design).",
            "en": "Base shared by the three games (design section 2)."
          },
          "steps": [
            {
              "id": "foundations.render.reference",
              "title": {
                "pt": "Desenho de referência igual ao original",
                "en": "Reference drawing equal to the original"
              },
              "weightBp": 32,
              "status": "verified",
              "acceptance": {
                "pt": "Cada imagem de 256x224 do desenho de referência é igual, ponto a ponto, à do jogo original nos trechos gravados.",
                "en": "Every 256x224 picture of the reference drawing equals the original's, pixel for pixel, on the recorded stretches."
              },
              "evidence": [
                "docs/tasks/done/N6-native-reference-renderer.md"
              ],
              "note": {
                "pt": "N6 (escopo de passagem do núcleo; compositor commit d077ff82f): T1 600/600, T2 600/600, 1.200/1.200 imagens exatas; alimentado pelo estado de imagem do original.",
                "en": "N6 (core pass-through scope; compositor commit d077ff82f): T1 600/600, T2 600/600, 1,200/1,200 exact pictures; fed by the original's picture state."
              }
            },
            {
              "id": "enhanced-1",
              "title": {
                "pt": "Troca entre original e ampliado",
                "en": "Original and enhanced switching"
              },
              "weightBp": 31,
              "status": "pending",
              "acceptance": {
                "pt": "Trocar o modo visual preservando o estado da partida.",
                "en": "Switch visual modes while preserving game state."
              },
              "evidence": [],
              "note": {
                "pt": "Veio dos Extras (\"Opções visuais do motor\"). Ainda sem aceite registrado.",
                "en": "Moved from Extras (\"Engine visual options\"). No acceptance recorded yet."
              }
            },
            {
              "id": "enhanced-2",
              "title": {
                "pt": "Tela ampla e movimento suave",
                "en": "Widescreen and smooth movement"
              },
              "weightBp": 31,
              "status": "pending",
              "acceptance": {
                "pt": "Conferir enquadramento e suavidade sem alterar a lógica original por acidente.",
                "en": "Check framing and smoothness without accidentally changing original logic."
              },
              "evidence": [],
              "note": {
                "pt": "Veio dos Extras (\"Opções visuais do motor\"). Ainda sem aceite registrado.",
                "en": "Moved from Extras (\"Engine visual options\"). No acceptance recorded yet."
              }
            },
            {
              "id": "enhanced-3",
              "title": {
                "pt": "Arte alternativa e revisão visual",
                "en": "Alternative art and visual review"
              },
              "weightBp": 31,
              "status": "pending",
              "acceptance": {
                "pt": "Carregar substituições de arte e aprovar uma partida nos modos oferecidos.",
                "en": "Load art replacements and approve a run in the offered modes."
              },
              "evidence": [],
              "note": {
                "pt": "Veio dos Extras (\"Opções visuais do motor\"). Ainda sem aceite registrado.",
                "en": "Moved from Extras (\"Engine visual options\"). No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "foundations.audio",
          "weightBp": 125,
          "group": "foundations",
          "title": {
            "pt": "Servidor de som",
            "en": "Sound server"
          },
          "description": {
            "pt": "Base comum aos três jogos (seção 2 do design).",
            "en": "Base shared by the three games (design section 2)."
          },
          "steps": [
            {
              "id": "foundations.audio.decoder",
              "title": {
                "pt": "Leitura dos arquivos de som e mistura",
                "en": "Reading sound files and mixing"
              },
              "weightBp": 63,
              "status": "verified",
              "acceptance": {
                "pt": "Cada arquivo de som extraído é lido sem erro e as voltas das músicas batem com o esperado.",
                "en": "Every extracted sound file reads back without error and the music loops match the expected ones."
              },
              "evidence": [
                "docs/tasks/done/N20-audio-pack-decoder-mixer.md"
              ],
              "note": {
                "pt": "N20 (commit 2b3f67aef): decodificador FLAC próprio (RFC 9639) e mixer; decode 462/462, loops 29/29. Fora da conferência: Mixer::stop e o limite com várias vozes.",
                "en": "N20 (commit 2b3f67aef): own FLAC decoder (RFC 9639) and mixer; decode 462/462, loops 29/29. Not covered: Mixer::stop and multi-voice clamping."
              }
            },
            {
              "id": "foundations.audio.channels",
              "title": {
                "pt": "Canais de som como no original",
                "en": "Sound channels as in the original"
              },
              "weightBp": 62,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N30-sound-channel-model.md",
                "docs/tasks/done/N24-sfx-channel-stop.md",
                "knowledge_base/mmx1/rom/sfx_hold_2026-10-05.json"
              ],
              "note": {
                "pt": "N30 (commit ec10f1a41): o servidor de som decide os canais com a própria regra do driver original (armar, cortar ao rearmar, recusar, segurar); canal 117/117, parada 8/8, solo 11/11, repetição 2/2 no trecho de Chill Penguin. Substitui a N24 (107/117). Fora da conferência (card N30): posição dentro do quadro, pan aplicado à voz, comandos $F0+ e cargas que liberam canais; a audição está na fila de revisão.",
                "en": "N30 (commit ec10f1a41): the sound server decides channels with the original driver's own rule (arm, cut on re-arm, refuse, hold); channel 117/117, stop 8/8, solo 11/11, repeat 2/2 on the Chill Penguin window. Supersedes N24 (107/117). Not covered (card N30): sub-frame placement, pan applied to the voice, $F0+ commands and uploads that release channels; listening is in the review queue."
              }
            }
          ]
        },
        {
          "id": "foundations.pack",
          "weightBp": 125,
          "group": "foundations",
          "title": {
            "pt": "Montador de pacote",
            "en": "Pack builder"
          },
          "description": {
            "pt": "Base comum aos três jogos (seção 2 do design).",
            "en": "Base shared by the three games (design section 2)."
          },
          "steps": [
            {
              "id": "foundations.pack.builder",
              "title": {
                "pt": "Montador de pacote a partir do cartucho do jogador",
                "en": "Pack builder from the player's cartridge"
              },
              "weightBp": 63,
              "status": "verified",
              "acceptance": {
                "pt": "Confere a identidade do cartucho antes de extrair e grava um índice completo do que extraiu.",
                "en": "Checks the cartridge identity before extracting and writes a complete index of what it extracted."
              },
              "evidence": [
                "docs/tasks/done/N5-pack-builder-graphics.md"
              ],
              "note": {
                "pt": "N5 (commit af75661cc): mmx_pack em C++17, recusa por SHA-256 antes de gravar, manifest 401/401; repetido pela N22 idêntico.",
                "en": "N5 (commit af75661cc): standalone C++17 mmx_pack, SHA-256 rejection before output, manifest 401/401; re-run identical by N22."
              }
            },
            {
              "id": "foundations.pack.first-run",
              "title": {
                "pt": "O executável roda do pacote extraído, sem a ROM",
                "en": "The exe runs from the extracted pack, without the ROM"
              },
              "weightBp": 62,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/NP20-exe-native-all.md",
                "docs/tasks/done/NP25-exe-without-rom.md"
              ],
              "note": {
                "pt": "NP25 (commit ce53dbbf5; decisão do David em 13/10: o motor não usa a ROM): o pacote extraído (796 arquivos, manifest 796/796) inclui as tabelas de dados que os portes leem (214 trechos, 287.770 bytes); com `--native all --pack` o executável nunca abre a ROM e a reprodução do Chill Penguin chega ao mesmo ponto (2835 de 15211 quadros iguais). NP20 (1ad96aee7) fez o montador de pacote rodar a partir do executável. tests/native/test_native_all.py.",
                "en": "NP25 (commit ce53dbbf5; David's decision of 13/10: the engine does not use the ROM): the extracted pack (796 assets, manifest 796/796) holds the data tables the ports read (214 ranges, 287,770 bytes); with `--native all --pack` the exe never opens the ROM and the Chill Penguin replay reaches the same point (2835 of 15211 frames equal). NP20 (1ad96aee7) first ran the pack builder from the exe. tests/native/test_native_all.py."
              }
            }
          ]
        },
        {
          "id": "foundations.modes",
          "weightBp": 125,
          "group": "foundations",
          "title": {
            "pt": "Camada de modos",
            "en": "Mode layer"
          },
          "description": {
            "pt": "Base comum aos três jogos (seção 2 do design).",
            "en": "Base shared by the three games (design section 2)."
          },
          "steps": [
            {
              "id": "foundations.modes.scripts",
              "title": {
                "pt": "Modos escolhem fases e regras por roteiro",
                "en": "Modes choose stages and rules by script"
              },
              "weightBp": 63,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. src/native/modes ainda não existe. Treino, Boss Rush, Bloody Palace e Roguelike contam no plano Extras; aqui só a camada comum.",
                "en": "No acceptance recorded yet. src/native/modes does not exist yet. Training, Boss Rush, Bloody Palace and Roguelike count in the Extras roadmap; here only the shared layer."
              }
            },
            {
              "id": "foundations.modes.campaign",
              "title": {
                "pt": "A campanha usa a mesma camada de modos",
                "en": "The campaign uses the same mode layer"
              },
              "weightBp": 62,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "foundations.bridge",
          "weightBp": 125,
          "group": "foundations",
          "title": {
            "pt": "Ponte com o original e jogo sem ele",
            "en": "Bridge to the original and the game without it"
          },
          "description": {
            "pt": "Base comum aos três jogos (seção 2 do design).",
            "en": "Base shared by the three games (design section 2)."
          },
          "steps": [
            {
              "id": "foundations.bridge.shadow",
              "title": {
                "pt": "Motor próprio comparado ao original durante o jogo",
                "en": "Our engine compared with the original while playing"
              },
              "weightBp": 63,
              "status": "verified",
              "acceptance": {
                "pt": "Com o jogo rodando, o motor próprio calcula ao lado do original e cada quadro é comparado.",
                "en": "While the game runs, our engine computes beside the original and each frame is compared."
              },
              "evidence": [
                "docs/tasks/done/N1-native-x-slice.md",
                "docs/tasks/open/N2-native-x-complete.md"
              ],
              "note": {
                "pt": "N1 passo 6: sombra no executável igual em 1063 de 1063 (take H17); native.x1-shadow-rules 65.536 de 65.536; repetido na N2 sessão 24 (commit 49e4291d0).",
                "en": "N1 step 6: exe shadow equal 1063 of 1063 (H17 take); native.x1-shadow-rules 65,536 of 65,536; repeated in N2 session 24 (commit 49e4291d0)."
              }
            },
            {
              "id": "foundations.bridge.core-free",
              "title": {
                "pt": "O jogo sem o programa original traduzido",
                "en": "The game without the translated original program"
              },
              "weightBp": 62,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. Marco M9: executável e montador de pacote, sem código gerado e sem emulador na hora de jogar.",
                "en": "No acceptance recorded yet. Milestone M9: exe and pack builder, no generated code and no emulator at play time."
              }
            }
          ]
        },
        {
          "id": "x1.player",
          "weightBp": 288,
          "group": "x1",
          "title": {
            "pt": "X1 · X: movimento e sobrevivência",
            "en": "X1 · X: movement and survival"
          },
          "description": {
            "pt": "Movimentos, dano, morte e melhorias do personagem, conferidos com o jogo original.",
            "en": "The character's moves, damage, death and upgrades, checked against the original game."
          },
          "steps": [
            {
              "id": "x1.player.port-done",
              "title": {
                "pt": "Estados já traduzidos, iguais ao original",
                "en": "States translated so far, equal to the original"
              },
              "weightBp": 58,
              "status": "verified",
              "acceptance": {
                "pt": "Cada estado de X já traduzido dá o mesmo resultado do original em todas as chamadas gravadas, uma a uma e em sequência.",
                "en": "Each of X's states translated so far gives the same result as the original on every recorded call, one by one and in sequence."
              },
              "evidence": [
                "docs/tasks/open/N2-native-x-complete.md",
                "docs/tasks/done/N1-native-x-slice.md"
              ],
              "note": {
                "pt": "N2 sessão 26 (commit 96d9abb4c; estado 32, e os bytes da porta e da plataforma declarados com seus escritores): laço aberto 10.052/10.052, laço fechado 72 gravações, native-unit 58/58, sombra 1063 de 1063, caminho padrão idêntico. Roda em modo sombra (o núcleo original segue no comando); ainda não é o padrão do executável jogável.",
                "en": "N2 session 26 (commit 96d9abb4c; state 32, and the door and platform bytes declared with their writers): open loop 10,052/10,052, closed loop 72 takes, native-unit 58/58, shadow 1063 of 1063, default identical. Runs in shadow mode (the original core stays authoritative); not yet the playable exe default."
              }
            },
            {
              "id": "x1.player.port-rest",
              "title": {
                "pt": "Estados que ainda faltam traduzir",
                "en": "States still to translate"
              },
              "weightBp": 57,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/open/N2-native-x-complete.md",
                "knowledge_base/mmx1/rom/x_action_state_table_2026-10-10_n36.json"
              ],
              "note": {
                "pt": "Unidade: as 36 palavras da tabela de estados de ação de X, 81:82A6 (export bank_81.asm, linhas 377 a 412; contagem em knowledge_base/mmx1/rom/x_action_state_table_2026-10-10_n36.json). 27 já eram nativas no commit 96d9abb4c (a etapa acima); as outras 9 (1A, 28, 34, 36, 38, 3A, 3E, 40 e 44) ficaram nativas nas sessões 27 a 34 da N2 (commits 0f6fe72dc, 255ec7148, 1514b0dc1, 244c181d4, 7ee459e7e, 7c5a3985b): 9 de 9. N2 sessão 34 (commit 7c5a3985b): laço aberto 12.614/12.614, laço fechado 88 de 88, native-unit 61/61, oráculo 146/146, caminho padrão 9.850/9.850, sombra 1063 de 1063. Roda em modo sombra (o núcleo original segue no comando); ainda não é o padrão do executável jogável.",
                "en": "Unit: the 36 words of X's action-state table 81:82A6 (export bank_81.asm, lines 377 to 412; counted in knowledge_base/mmx1/rom/x_action_state_table_2026-10-10_n36.json). 27 were already native at commit 96d9abb4c (the step above); the other 9 (1A, 28, 34, 36, 38, 3A, 3E, 40 and 44) became native in N2 sessions 27 to 34 (commits 0f6fe72dc, 255ec7148, 1514b0dc1, 244c181d4, 7ee459e7e, 7c5a3985b): 9 of 9. N2 session 34 (commit 7c5a3985b): open loop 12,614/12,614, closed loop 88 of 88, native-unit 61/61, oracle 146/146, default 9,850/9,850, shadow 1063 of 1063. Runs in shadow mode (the original core stays authoritative); not yet the playable exe default."
              }
            },
            {
              "id": "x1.player.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 87,
              "status": "partial",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [
                "docs/tasks/done/N45-player-branch-counters.md",
                "docs/tasks/done/N45b-x-forced-cases.md",
                "knowledge_base/mmx1/rom/x_action_state_table_2026-10-10_n36.json"
              ],
              "note": {
                "pt": "Unidade: as 36 palavras da tabela de estados de X (81:82A6). Um estado conta quando todos os caminhos do código que ele roda foram percorridos e iguais ao original. 7 de 36 (N45, 1030 contadores; N45b, casos forçados): 18 (um RTS), 22, 34, 3C, 42, 2C e 30 (as costuras de personagem de idle_animation.cpp não são código da ROM; as guardas de entrada conferem entradas do teste, não caminhos da ROM). Os outros têm caminhos ainda não percorridos ou que param com erro de propósito.",
                "en": "Unit: the 36 words of X's state table (81:82A6). A state counts when every path of the code it runs was taken and equal to the original. 7 of 36 (N45, 1030 counters; N45b, forced cases): 18 (an RTS), 22, 34, 3C, 42, 2C and 30 (the idle_animation.cpp character seams are not ROM code; the input guards check test inputs, not ROM paths). The others still have untaken paths or paths that stop with a deliberate error."
              },
              "partial": {
                "seen": 7,
                "total": 36,
                "$source": "docs/tasks/done/N45-player-branch-counters.md and docs/tasks/done/N45b-x-forced-cases.md Results (build/N45/summary-r1.txt, build/N45b/tests-s3b.log): states 18, 2C, 30, 22, 34, 3C, 42; the 36 words in knowledge_base/mmx1/rom/x_action_state_table_2026-10-10_n36.json"
              }
            },
            {
              "id": "x1.player.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 86,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "x1.weapons",
          "weightBp": 240,
          "group": "x1",
          "title": {
            "pt": "X1 · Armas e tiros",
            "en": "X1 · Weapons and shots"
          },
          "description": {
            "pt": "Tiro normal e carregado e as armas especiais, com energia e efeitos.",
            "en": "Normal and charged shots and the special weapons, with energy and effects."
          },
          "steps": [
            {
              "id": "x1.weapons.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 96,
              "status": "partial",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/open/N2-native-x-complete.md",
                "knowledge_base/mmx1/rom/x1_shot_oids_unported_2026-10-03.json"
              ],
              "note": {
                "pt": "Unidade: cada objeto de tiro alcançável da tabela 80:F68F (30 menos 4 provados inalcançáveis = 26). 25 traduzidos e iguais (N2 sessões 1-21; inventário da sessão 22, commit 9501b0007; tiro 23, o trenó de gelo, na sessão 34b, commit 7c5a3985b: 200 de 200 chamadas, 1 de 1 cadeia, 37 tipos forçados iguais). Falta o 28, o tiro do Zero. Rodam em modo sombra, não no executável jogável.",
                "en": "Unit: each reachable shot object of table 80:F68F (30 minus 4 proven unreachable = 26). 25 ported and equal (N2 sessions 1-21; session 22 inventory, commit 9501b0007; shot 23, the ice sled, in session 34b, commit 7c5a3985b: 200 of 200 calls, 1 of 1 chain, 37 forced kinds equal). Left: 28, Zero's shot. They run in shadow mode, not in the playable exe."
              },
              "partial": {
                "seen": 25,
                "total": 26,
                "$source": "docs/tasks/open/N2-native-x-complete.md Result, session 22 inventory: 30 shot objects of table 80:F68F, 24 native, 4 unreachable by ROM read (5, 15, 24, 26), 2 parked (23, 28); session 34b (commit 7c5a3985b): 23 native, re-run by docs/tasks/done/N35-engine-credit-audit.md"
              }
            },
            {
              "id": "x1.weapons.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 72,
              "status": "partial",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [
                "docs/tasks/done/N44-shot-branch-counters.md",
                "docs/tasks/done/N44b-shot-layer-table-and-branches.md",
                "docs/tasks/done/N44c-shot-units-toward-complete.md",
                "docs/tasks/done/N44d-shot-class-b-branches.md",
                "docs/tasks/done/N44e-shot-units-last-branches.md",
                "docs/tasks/done/N44f-shot-units-homing-lemon.md",
                "docs/tasks/open/N2-native-x-complete.md"
              ],
              "note": {
                "pt": "Unidade: os 26 objetos de tiro alcançáveis (os mesmos da etapa traduzida). Um tiro conta quando todos os caminhos do código dele foram percorridos e iguais ao original, e o que ainda lança erro é só valor fora de tabela (0 chamadas) ou uma guarda provada impossível de disparar. 21 de 26 (N44 a N44f): 00, 01, 02, 04 (hadouken), 06, 07, 08, 09, 11, 13, 14, 16, 17, 19, 20, 21, 22, 23, 25, 27 e 29. Os outros têm caminhos ainda não percorridos.",
                "en": "Unit: the 26 reachable shot objects (the same as the translated step). A shot counts when every path of its code was taken and equal to the original, and what still throws is only a value outside a table (0 calls) or a guard proven unable to fire. 21 of 26 (N44 to N44f): 00, 01, 02, 04 (hadouken), 06, 07, 08, 09, 11, 13, 14, 16, 17, 19, 20, 21, 22, 23, 25, 27 and 29. The others still have untaken paths."
              },
              "partial": {
                "seen": 21,
                "total": 26,
                "$source": "docs/tasks/done/N44-shot-branch-counters.md, docs/tasks/done/N44b-shot-layer-table-and-branches.md, docs/tasks/done/N44c-shot-units-toward-complete.md and the N44d-N44f Results (build/N44/oracle-r2.log, proofs.txt, proofs-s2.txt; build/N44b/oracle-r4.log; build/N44c/oracle-r2.log; build/N44d/oracle-r2.log; build/N44e/oracle-r1.log, oracle-r2.log; build/N44f/oracle-r1.log, oracle-r3.log): shot units 00, 01, 02, 04, 06, 07, 08, 09, 11, 13, 14, 16, 17, 19, 20, 21, 22, 23, 25, 27, 29 class A (07 and 16: the sibling variant counters do not count, coordinator L215); the 26 units of x1.weapons.port"
              }
            },
            {
              "id": "x1.weapons.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 72,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "x1.enemies",
          "weightBp": 360,
          "group": "x1",
          "title": {
            "pt": "X1 · Inimigos",
            "en": "X1 · Enemies"
          },
          "description": {
            "pt": "Cada família de inimigo conta uma vez, não uma vez por fase.",
            "en": "Each enemy family counts once, not once per stage."
          },
          "steps": [
            {
              "id": "x1.enemies.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 144,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N10-cp-enemy-fanout.md",
                "docs/tasks/done/N11-enemy-fanout-2.md",
                "docs/tasks/done/N9-enemy-host-slice.md",
                "docs/goal/X1-COMPLETION.json"
              ],
              "note": {
                "pt": "Unidade: as 45 famílias de inimigo do ledger do X1; uma família conta quando todos os objetos dela traduzidos são iguais. 53 objetos, 45 famílias completas: 0x04 enemy.stretch_bird open 1337 of 1337, closed 8 of 8 chains, 16 forced kinds (ef714139f); 0x36 enemy.oid_36 open 603 of 603, closed 10 of 10 chains, 69 forced kinds (fc8b6a3b7); 0x53 enemy.mad_pecker open 402 of 402, closed 6 of 6 chains, 59 forced kinds, every branch taken at least once (35fa57790); 0x19 enemy.bat open 223 of 223, closed 2 of 2 chains, 46 forced kinds (042af58f0); 0x0B enemy.axemax open 491 of 491, closed 1 of 1 chain, 25 forced kinds; 81:D0B7 left as a throw (00d869177); 0x57 enemy.oid_57 open 276 of 276, closed 1 of 1 chain, 22 forced kinds; state 8 left as a throw (8dd26fa6d); 0x3A enemy.oid_57 open 46 of 46, closed 3 of 3 chains, 79 forced kinds (12d3bb041); 0x54 enemy.cp_snowball open 297 of 297, closed 6 of 6 chains, 36 forced kinds (b7713255c); 0x51 enemy.walker open 214 of 214, closed 2 of 2 chains, 46 forced kinds (596b5593f); 0x15 enemy.intro_spikeball open 402 of 402, closed 8 of 8 chains, 34 forced kinds (b71ecf1cf); 0x2D enemy.cp_bat open 2290 of 2290, closed 14 of 14 chains, 55 forced kinds (bb1f95de5); 0x2F enemy.oid_2f open 319 of 319, closed 1 of 1 chain, 87 forced kinds; three 0-call paths throw (03a470347); 0x56 enemy.se_eaglet open 835/835, closed 8/8 chains (835/835 steps), 39 forced k of k, all branches taken; throw 87:E2BB (state outside 0/2/4, 0 calls) (760180720); 0x68 enemy.oid_6a open 345/345, closed 1/1 (345/345), 30 forced k of k; throws 88:D8AB (state not 0/2, 0 calls) (e04658711); 0x06 enemy.oid_06 open 455/455, closed 3/3 (455/455), 42 forced k of k, all branches taken; throws 81:C24D, 81:C29A (0 calls) (d06785084); 0x1B enemy.oid_11 open 340 of 340, closed 2 of 2 chains, 10 forced k of k; throws 82:A0E7 (state outside the table, 0 calls) (e65981063); 0x50 enemy.se_turret open 442 of 442, closed 2 of 2 chains, 45 forced kinds each 407 of 407; throws 87:D3B1 (0 calls) (07e92b3d4); 0x4F enemy.oid_4f open 973 of 973, closed 2 of 2 chains, 73 forced k of k; damage index 0, kill path unreachable (0bb347f5b); 0x29 enemy.intro_robot open 287 of 287, closed 2 of 2 chains, 76 forced k of k; 82:DA6F (PLA/JML) throws (0bb347f5b); 0x1F enemy.oid_1e open 636 of 636, closed 4 of 4 chains, 34 forced k of k; throws 82:A996 (0 calls) (a2c6fd489); 0x3B enemy.oid_3b open 332 of 332, closed 3 of 3 chains, 43 forced kinds each 328 of 328; throws 87:A9E1, 87:AA22, 87:AA58, 87:AADD (0 calls) (ccd03a9ea); 0x13 enemy.oid_13 open 754 of 754, closed 3 of 3 chains, 63 forced k of k; 82:9A29 (PLA/JML) throws (7dd031fee); 0x10 enemy.oid_10 open 67 of 67, closed 1 of 1 chain, 42 forced k of k; variant states 8 and $0A throw (generator, card N11b) (fc45d1e92); 0x1E enemy.oid_1e open 581 of 581, closed 3 of 3 chains, 53 forced k of k; throws 82:A7E1 (0 calls) (cb8ab218d); 0x6A enemy.oid_6a open 736 of 736, closed 3 of 3 chains, 30 forced k of k; throws 88:D944 (0 calls) (f3b3490fd); 0x30 enemy.oid_30 open 853 of 853, closed 2 of 2 chains, 123 forced kinds each 277 of 277; boundary $0B by its own shot (8439f92ba); 0x12 enemy.oid_11 open 795 of 795, closed 3 of 3 chains, 57 forced kinds each 136 of 136; throws 81:DCE9, 81:DD4D (0 calls) (61a96458f); 0x0F enemy.intro_helicopter open 566 of 566, closed 9 of 9 chains, 52 forced k of k; throws 82:97D8, 82:9987 (0 calls) (e99b1f27c); 0x17 enemy.oid_17 open 507 of 507, closed 6 of 6 chains, 46 forced k of k; throws 87:9946, 87:9979, 87:9A05, 87:9A18 (0 calls) (3555fc52b); 0x20 enemy.oid_20 open 300 of 300, closed 3 of 3 chains, 64 forced k of k; only table-index throws (0 calls) (9471226d6); 0x27 enemy.se_strider open 413 of 413, closed 2 of 2 chains, 59 forced k of k; throws 82:D312, 82:D49F (0 calls) (775f28ec0); 0x37 enemy.oid_37 open 212 of 212, closed 4 of 4 chains, 44 forced k of k; throws 87:A461, 87:A5E8 and the out-of-mirror stores (0 calls) (361cec2e4); 0x40 enemy.oid_40 open 886 of 886, closed 6 of 6 chains, 21 forced k of k; every branch taken; throws 87:B445 (0 calls) (c846a3ffb); 0x5B enemy.oid_5b open 368 of 368, closed 2 of 2 chains, 89 forced k of k; 87:EC4A (PLA/JML) throws (df2dc3b76); 0x11 enemy.oid_11 open 795 of 795, closed 3 of 3 chains, 93 forced k of k; 81:DA12 throws (generator, N11b) (bb9153d4f); 0x44 enemy.oid_44 open 404 of 404, closed 3 of 3 chains, 47 forced k of k; 82:D85E (84:9F2F) throws (9a91ed1ed); 0x35 enemy.oid_35 open 268 of 268, closed 4 of 4 chains, 45 forced k of k; only table-index throws (0 calls) (9e2e819e8); 0x1A enemy.oid_11 open 479 of 479, closed 35 of 35 chains, 84 forced k of k; 88:96B9 and the SPC-upload step throw (643eaf5f4); 0x1D enemy.oid_1d open 525 of 525, closed 2 of 2 chains, 52 forced k of k; four terrain branches throw (0 calls) (e13a2d2e3); 0x41 enemy.se_mech open 393 of 393, closed 2 of 2 chains, 54 forced k of k; 87:B603 and three 84:8011 list cases throw (d6c697fa6); 0x3F enemy.oid_3f open 1221 of 1221, closed 6 of 6 chains, 49 forced k of k; throws 87:B218, 87:B269 (0 calls) (ca3a2fe81); 0x0D enemy.oid_0d open 315 of 315, closed 3 of 3 chains, 78 forced k of k; 88:91A8 throws (generator, N11b) (7012f7b69); 0x5A enemy.oid_59 open 541 of 541, closed 2 of 2 chains, 24 forced k of k; throws 87:EB0B and pointer guards (0 calls) (b219fef52); 0x58 enemy.oid_59 open 409 of 409, closed 1 of 1 chain, 34 forced k of k; throws 87:E549, 87:E581 (0 calls) (27dd65ea6); 0x59 enemy.oid_59 open 312 of 312, closed 1 of 1 chain, 29 forced k of k; states 6 and $10 throw (0 calls) (4a1e6b689); 0x01 enemy.oid_01 open 130 of 130, closed 2 of 2 chains, 34 forced k of k; actions 6 and 8 throw (0 calls) (8d369171d); 0x1C enemy.oid_1c open 505 of 505, closed 7 of 7 chains, 29 forced k of k; only table-index throws (0 calls) (3497dff03); 0x2A enemy.rush_roader open 424 of 424, closed 4 of 4 chains, 52 forced k of k; 87:9D8E throws (0 calls) (4b9f77dc5); 0x18 enemy.oid_18 open 125 of 125, closed 4 of 4 chains, 75 forced k of k; 83:BD33 (84:9F2F) throws (13340fda9); 0x49 enemy.se_drone open 215 of 215, closed 3 of 3 chains, 57 forced k of k; only table-index throws (0 calls) (d09932759); 0x46 enemy.oid_46 open 286 of 286, closed 1 of 1 chain (286 of 286 steps), 25 forced kinds each 285 of 285; untraced 0 (N40) (5a49288b5); 0x2E enemy.se_met open 330 of 330, closed 2 of 2 chains (330 of 330 steps), 41 forced k of k, branches 54 of 54; three terrain cases 83:C594/C598/C59C throw (no window) (d377dab4c); 0x34 enemy.oid_34 open 471 of 471, closed 1 of 1 chain (471 of 471 steps), 33 forced k of k, branches 44 of 44; boundary $0B written by its rock 83:A7CD/83:A7DC (899eb6bad). Família ainda incompleta, não conta: . A cápsula (linha 12 da N10) pertence ao marco M8. Rodam no driver de teste dos inimigos, não no executável jogável.",
                "en": "Unit: the 45 enemy families of the X1 ledger; a family counts when every object of it is ported and equal. 53 objects, 45 complete families: 0x04 enemy.stretch_bird open 1337 of 1337, closed 8 of 8 chains, 16 forced kinds (ef714139f); 0x36 enemy.oid_36 open 603 of 603, closed 10 of 10 chains, 69 forced kinds (fc8b6a3b7); 0x53 enemy.mad_pecker open 402 of 402, closed 6 of 6 chains, 59 forced kinds, every branch taken at least once (35fa57790); 0x19 enemy.bat open 223 of 223, closed 2 of 2 chains, 46 forced kinds (042af58f0); 0x0B enemy.axemax open 491 of 491, closed 1 of 1 chain, 25 forced kinds; 81:D0B7 left as a throw (00d869177); 0x57 enemy.oid_57 open 276 of 276, closed 1 of 1 chain, 22 forced kinds; state 8 left as a throw (8dd26fa6d); 0x3A enemy.oid_57 open 46 of 46, closed 3 of 3 chains, 79 forced kinds (12d3bb041); 0x54 enemy.cp_snowball open 297 of 297, closed 6 of 6 chains, 36 forced kinds (b7713255c); 0x51 enemy.walker open 214 of 214, closed 2 of 2 chains, 46 forced kinds (596b5593f); 0x15 enemy.intro_spikeball open 402 of 402, closed 8 of 8 chains, 34 forced kinds (b71ecf1cf); 0x2D enemy.cp_bat open 2290 of 2290, closed 14 of 14 chains, 55 forced kinds (bb1f95de5); 0x2F enemy.oid_2f open 319 of 319, closed 1 of 1 chain, 87 forced kinds; three 0-call paths throw (03a470347); 0x56 enemy.se_eaglet open 835/835, closed 8/8 chains (835/835 steps), 39 forced k of k, all branches taken; throw 87:E2BB (state outside 0/2/4, 0 calls) (760180720); 0x68 enemy.oid_6a open 345/345, closed 1/1 (345/345), 30 forced k of k; throws 88:D8AB (state not 0/2, 0 calls) (e04658711); 0x06 enemy.oid_06 open 455/455, closed 3/3 (455/455), 42 forced k of k, all branches taken; throws 81:C24D, 81:C29A (0 calls) (d06785084); 0x1B enemy.oid_11 open 340 of 340, closed 2 of 2 chains, 10 forced k of k; throws 82:A0E7 (state outside the table, 0 calls) (e65981063); 0x50 enemy.se_turret open 442 of 442, closed 2 of 2 chains, 45 forced kinds each 407 of 407; throws 87:D3B1 (0 calls) (07e92b3d4); 0x4F enemy.oid_4f open 973 of 973, closed 2 of 2 chains, 73 forced k of k; damage index 0, kill path unreachable (0bb347f5b); 0x29 enemy.intro_robot open 287 of 287, closed 2 of 2 chains, 76 forced k of k; 82:DA6F (PLA/JML) throws (0bb347f5b); 0x1F enemy.oid_1e open 636 of 636, closed 4 of 4 chains, 34 forced k of k; throws 82:A996 (0 calls) (a2c6fd489); 0x3B enemy.oid_3b open 332 of 332, closed 3 of 3 chains, 43 forced kinds each 328 of 328; throws 87:A9E1, 87:AA22, 87:AA58, 87:AADD (0 calls) (ccd03a9ea); 0x13 enemy.oid_13 open 754 of 754, closed 3 of 3 chains, 63 forced k of k; 82:9A29 (PLA/JML) throws (7dd031fee); 0x10 enemy.oid_10 open 67 of 67, closed 1 of 1 chain, 42 forced k of k; variant states 8 and $0A throw (generator, card N11b) (fc45d1e92); 0x1E enemy.oid_1e open 581 of 581, closed 3 of 3 chains, 53 forced k of k; throws 82:A7E1 (0 calls) (cb8ab218d); 0x6A enemy.oid_6a open 736 of 736, closed 3 of 3 chains, 30 forced k of k; throws 88:D944 (0 calls) (f3b3490fd); 0x30 enemy.oid_30 open 853 of 853, closed 2 of 2 chains, 123 forced kinds each 277 of 277; boundary $0B by its own shot (8439f92ba); 0x12 enemy.oid_11 open 795 of 795, closed 3 of 3 chains, 57 forced kinds each 136 of 136; throws 81:DCE9, 81:DD4D (0 calls) (61a96458f); 0x0F enemy.intro_helicopter open 566 of 566, closed 9 of 9 chains, 52 forced k of k; throws 82:97D8, 82:9987 (0 calls) (e99b1f27c); 0x17 enemy.oid_17 open 507 of 507, closed 6 of 6 chains, 46 forced k of k; throws 87:9946, 87:9979, 87:9A05, 87:9A18 (0 calls) (3555fc52b); 0x20 enemy.oid_20 open 300 of 300, closed 3 of 3 chains, 64 forced k of k; only table-index throws (0 calls) (9471226d6); 0x27 enemy.se_strider open 413 of 413, closed 2 of 2 chains, 59 forced k of k; throws 82:D312, 82:D49F (0 calls) (775f28ec0); 0x37 enemy.oid_37 open 212 of 212, closed 4 of 4 chains, 44 forced k of k; throws 87:A461, 87:A5E8 and the out-of-mirror stores (0 calls) (361cec2e4); 0x40 enemy.oid_40 open 886 of 886, closed 6 of 6 chains, 21 forced k of k; every branch taken; throws 87:B445 (0 calls) (c846a3ffb); 0x5B enemy.oid_5b open 368 of 368, closed 2 of 2 chains, 89 forced k of k; 87:EC4A (PLA/JML) throws (df2dc3b76); 0x11 enemy.oid_11 open 795 of 795, closed 3 of 3 chains, 93 forced k of k; 81:DA12 throws (generator, N11b) (bb9153d4f); 0x44 enemy.oid_44 open 404 of 404, closed 3 of 3 chains, 47 forced k of k; 82:D85E (84:9F2F) throws (9a91ed1ed); 0x35 enemy.oid_35 open 268 of 268, closed 4 of 4 chains, 45 forced k of k; only table-index throws (0 calls) (9e2e819e8); 0x1A enemy.oid_11 open 479 of 479, closed 35 of 35 chains, 84 forced k of k; 88:96B9 and the SPC-upload step throw (643eaf5f4); 0x1D enemy.oid_1d open 525 of 525, closed 2 of 2 chains, 52 forced k of k; four terrain branches throw (0 calls) (e13a2d2e3); 0x41 enemy.se_mech open 393 of 393, closed 2 of 2 chains, 54 forced k of k; 87:B603 and three 84:8011 list cases throw (d6c697fa6); 0x3F enemy.oid_3f open 1221 of 1221, closed 6 of 6 chains, 49 forced k of k; throws 87:B218, 87:B269 (0 calls) (ca3a2fe81); 0x0D enemy.oid_0d open 315 of 315, closed 3 of 3 chains, 78 forced k of k; 88:91A8 throws (generator, N11b) (7012f7b69); 0x5A enemy.oid_59 open 541 of 541, closed 2 of 2 chains, 24 forced k of k; throws 87:EB0B and pointer guards (0 calls) (b219fef52); 0x58 enemy.oid_59 open 409 of 409, closed 1 of 1 chain, 34 forced k of k; throws 87:E549, 87:E581 (0 calls) (27dd65ea6); 0x59 enemy.oid_59 open 312 of 312, closed 1 of 1 chain, 29 forced k of k; states 6 and $10 throw (0 calls) (4a1e6b689); 0x01 enemy.oid_01 open 130 of 130, closed 2 of 2 chains, 34 forced k of k; actions 6 and 8 throw (0 calls) (8d369171d); 0x1C enemy.oid_1c open 505 of 505, closed 7 of 7 chains, 29 forced k of k; only table-index throws (0 calls) (3497dff03); 0x2A enemy.rush_roader open 424 of 424, closed 4 of 4 chains, 52 forced k of k; 87:9D8E throws (0 calls) (4b9f77dc5); 0x18 enemy.oid_18 open 125 of 125, closed 4 of 4 chains, 75 forced k of k; 83:BD33 (84:9F2F) throws (13340fda9); 0x49 enemy.se_drone open 215 of 215, closed 3 of 3 chains, 57 forced k of k; only table-index throws (0 calls) (d09932759); 0x46 enemy.oid_46 open 286 of 286, closed 1 of 1 chain (286 of 286 steps), 25 forced kinds each 285 of 285; untraced 0 (N40) (5a49288b5); 0x2E enemy.se_met open 330 of 330, closed 2 of 2 chains (330 of 330 steps), 41 forced k of k, branches 54 of 54; three terrain cases 83:C594/C598/C59C throw (no window) (d377dab4c); 0x34 enemy.oid_34 open 471 of 471, closed 1 of 1 chain (471 of 471 steps), 33 forced k of k, branches 44 of 44; boundary $0B written by its rock 83:A7CD/83:A7DC (899eb6bad). Family still incomplete, not counted: . The capsule (N10 row 12) belongs to milestone M8. They run in the enemy test driver, not in the playable exe."
              }
            },
            {
              "id": "x1.enemies.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 108,
              "status": "partial",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [
                "docs/tasks/done/N10-cp-enemy-fanout.md",
                "docs/tasks/done/N11-enemy-fanout-2.md"
              ],
              "note": {
                "pt": "30 famílias relatam todos os caminhos percorridos e iguais, com as cadeias fechadas iguais: 0x53 enemy.mad_pecker (35fa57790: every branch taken at least once); 0x56 enemy.se_eaglet (760180720: all branches taken); 0x06 enemy.oid_06 (d06785084: all branches taken); 0x50 enemy.se_turret (07e92b3d4: the only throw is the state dispatch 87:D3B1, 0 calls); 0x1E+0x1F enemy.oid_1e (cb8ab218d, a2c6fd489: the only throws are the state dispatches 82:A7E1 and 82:A996, 0 calls); 0x6A+0x68 enemy.oid_6a (f3b3490fd, e04658711: the only throws are the state dispatches 88:D944 and 88:D8AB, 0 calls); 0x20 enemy.oid_20 (9471226d6: only table-index throws, 0 calls); 0x40 enemy.oid_40 (c846a3ffb: every branch taken; the only throw is the state dispatch 87:B445, 0 calls); 0x35 enemy.oid_35 (9e2e819e8: only table-index throws, 0 calls); 0x1C enemy.oid_1c (3497dff03: every branch taken; only table-index throws, 0 calls); 0x49 enemy.se_drone (d09932759: every branch counter reached; only table-index throws, 0 calls); 0x04 enemy.stretch_bird (5c2efb506: N39 branch counters 44 of 44 reached; only table throws, 0 calls); 0x0D enemy.oid_0d (d4adc82f3: N39 branch counters 136 of 136 reached; only table throws, 0 calls); 0x10 enemy.oid_10 (402ac5f6a: N39 branch counters 74 of 74 reached; only table throws, 0 calls); 0x13 enemy.oid_13 (7edc52de4: N39 branch counters 54 of 54 reached; only table throws, 0 calls); 0x19 enemy.bat (8ff474a3c: N39 branch counters 39 of 39 reached; only table throws, 0 calls); 0x29 enemy.intro_robot (b7bda5044: N39 branch counters 44 of 44 reached; only table throws, 0 calls); 0x30 enemy.oid_30 (148195d51: N39 branch counters 24 of 24 reached; only table throws, 0 calls); 0x36 enemy.oid_36 (8d36b569b: N39 branch counters 55 of 55 reached; only table throws, 0 calls); 0x3B enemy.oid_3b (b06a24cee: N39 branch counters 45 of 45 reached; only table throws, 0 calls); 0x44 enemy.oid_44 (292a8a9a8: N39 branch counters 24 of 24 reached; only table throws, 0 calls); 0x4F enemy.oid_4f (71f9ad8a6: N39 branch counters 60 of 60 reached; only table throws, 0 calls); 0x54 enemy.cp_snowball (3f900587d: N39 branch counters 45 of 45 reached; only table throws, 0 calls); 0x0B enemy.axemax (b68468717: N43 counters 65 of 65; the guard at oid0B.cpp:38 cannot fire (pointer from 82:8358, bound CPX #$1628)); 0x5B enemy.oid_5b (78f0851e1: N43 counters 22 of 22; 87:EC4A ported, forced s0-odd-player-right 2 of 2); 0x2A enemy.rush_roader (2d2ca39dd: N43 counters 64 of 64; 87:9D8E ported, forced s6-air-30 and s6-air-60 70 of 70 each); 0x17 enemy.oid_17 (e2cde0dad: N43 counters 45 of 45; the guard cannot fire (49 stage-list records with sub bit 7 clear; spawner 0x16 gives word $33 at most $11E8)); 0x3F enemy.oid_3f (5901c7f0f: N43 counters 65 of 65; 87:B269 cannot fire (no stage-list 0x3F; spawner 82:FE7B gives word $36 its slot base)); 0x57+0x3A enemy.oid_57 (aaa708aa3: N43 counters 30 of 30 and 82 of 82; state 8 87:E462 ported, 215 forced kinds k of k); 0x34 enemy.oid_34 (899eb6bad: N11 row 38 counters 44 of 44; only the state table throw 83:D862). O que ainda lança erro nelas é só valor de estado fora da tabela de saltos (0 chamadas) ou uma guarda provada impossível de disparar (N43). As outras têm caminhos que ainda param com erro de propósito.",
                "en": "30 families report every branch taken and equal, with their closed chains equal: 0x53 enemy.mad_pecker (35fa57790: every branch taken at least once); 0x56 enemy.se_eaglet (760180720: all branches taken); 0x06 enemy.oid_06 (d06785084: all branches taken); 0x50 enemy.se_turret (07e92b3d4: the only throw is the state dispatch 87:D3B1, 0 calls); 0x1E+0x1F enemy.oid_1e (cb8ab218d, a2c6fd489: the only throws are the state dispatches 82:A7E1 and 82:A996, 0 calls); 0x6A+0x68 enemy.oid_6a (f3b3490fd, e04658711: the only throws are the state dispatches 88:D944 and 88:D8AB, 0 calls); 0x20 enemy.oid_20 (9471226d6: only table-index throws, 0 calls); 0x40 enemy.oid_40 (c846a3ffb: every branch taken; the only throw is the state dispatch 87:B445, 0 calls); 0x35 enemy.oid_35 (9e2e819e8: only table-index throws, 0 calls); 0x1C enemy.oid_1c (3497dff03: every branch taken; only table-index throws, 0 calls); 0x49 enemy.se_drone (d09932759: every branch counter reached; only table-index throws, 0 calls); 0x04 enemy.stretch_bird (5c2efb506: N39 branch counters 44 of 44 reached; only table throws, 0 calls); 0x0D enemy.oid_0d (d4adc82f3: N39 branch counters 136 of 136 reached; only table throws, 0 calls); 0x10 enemy.oid_10 (402ac5f6a: N39 branch counters 74 of 74 reached; only table throws, 0 calls); 0x13 enemy.oid_13 (7edc52de4: N39 branch counters 54 of 54 reached; only table throws, 0 calls); 0x19 enemy.bat (8ff474a3c: N39 branch counters 39 of 39 reached; only table throws, 0 calls); 0x29 enemy.intro_robot (b7bda5044: N39 branch counters 44 of 44 reached; only table throws, 0 calls); 0x30 enemy.oid_30 (148195d51: N39 branch counters 24 of 24 reached; only table throws, 0 calls); 0x36 enemy.oid_36 (8d36b569b: N39 branch counters 55 of 55 reached; only table throws, 0 calls); 0x3B enemy.oid_3b (b06a24cee: N39 branch counters 45 of 45 reached; only table throws, 0 calls); 0x44 enemy.oid_44 (292a8a9a8: N39 branch counters 24 of 24 reached; only table throws, 0 calls); 0x4F enemy.oid_4f (71f9ad8a6: N39 branch counters 60 of 60 reached; only table throws, 0 calls); 0x54 enemy.cp_snowball (3f900587d: N39 branch counters 45 of 45 reached; only table throws, 0 calls); 0x0B enemy.axemax (b68468717: N43 counters 65 of 65; the guard at oid0B.cpp:38 cannot fire (pointer from 82:8358, bound CPX #$1628)); 0x5B enemy.oid_5b (78f0851e1: N43 counters 22 of 22; 87:EC4A ported, forced s0-odd-player-right 2 of 2); 0x2A enemy.rush_roader (2d2ca39dd: N43 counters 64 of 64; 87:9D8E ported, forced s6-air-30 and s6-air-60 70 of 70 each); 0x17 enemy.oid_17 (e2cde0dad: N43 counters 45 of 45; the guard cannot fire (49 stage-list records with sub bit 7 clear; spawner 0x16 gives word $33 at most $11E8)); 0x3F enemy.oid_3f (5901c7f0f: N43 counters 65 of 65; 87:B269 cannot fire (no stage-list 0x3F; spawner 82:FE7B gives word $36 its slot base)); 0x57+0x3A enemy.oid_57 (aaa708aa3: N43 counters 30 of 30 and 82 of 82; state 8 87:E462 ported, 215 forced kinds k of k); 0x34 enemy.oid_34 (899eb6bad: N11 row 38 counters 44 of 44; only the state table throw 83:D862). What still throws in them is only a state value outside the jump table (0 calls) or a guard proven unable to fire (N43). The others still have paths that stop with a deliberate error."
              },
              "partial": {
                "seen": 30,
                "total": 45,
                "$source": "commit 35fa57790 (N10 row 2) every branch taken at least once; docs/tasks/done/N11-enemy-fanout-2.md rows 1, 4, 5, 6, 7, 9, 19, 22, 26, 33, 39 (commits in the list): all branches taken or only state-dispatch throws; docs/tasks/done/N39-enemy-branch-counters.md (build/N39/oracle-r1.log, oracle-r2.log): 12 families, every branch counter reached, only table throws with 0 calls; docs/tasks/done/N43-enemy-branch-counters-2.md sessions 1-3: 6 families (counters reached, throw paths ported k of k or guards proven unable to fire); docs/tasks/done/N11-enemy-fanout-2.md row 38 (0x34)"
              }
            },
            {
              "id": "x1.enemies.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 108,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "x1.bosses",
          "weightBp": 431,
          "group": "x1",
          "title": {
            "pt": "X1 · Chefes e subchefes",
            "en": "X1 · Bosses and minibosses"
          },
          "description": {
            "pt": "Cada chefe e subchefe: entrada, ataques, dano, derrota e recompensa.",
            "en": "Each boss and miniboss: entrance, attacks, damage, defeat and reward."
          },
          "steps": [
            {
              "id": "x1.bosses.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 173,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N31b-boss-driver-host.md",
                "docs/tasks/done/N31c-boss-main-intro.md",
                "docs/tasks/done/N31d-boss-attacks-a.md",
                "docs/tasks/done/N31e-boss-attacks-b.md",
                "docs/tasks/done/N31f-boss-children.md",
                "docs/tasks/done/N31g-boss-death.md",
                "docs/tasks/done/N31i-effect-slot-host-cleanup.md",
                "docs/tasks/open/N32-boss-fanout.md",
                "docs/tasks/done/BOSS20-lo-midboss-port.md",
                "docs/tasks/done/BOSS21-sigma-final-port.md",
                "docs/goal/X1-COMPLETION.json"
              ],
              "note": {
                "pt": "Unidade: os 23 chefes e subchefes do ledger do X1; um chefe conta quando todo o código dele está traduzido e é igual em toda chamada gravada (a mesma regra das famílias de inimigo). Chill Penguin (objeto 0x02, com tiros, efeito de gelo, morte e explosão; N31b a N31g) é igual ao original em toda chamada gravada: 7879 de 7879, 0 sem rastro (N31e, commit fd473de5a; repetido pela N31i, commit 49b79a2b4). Laço fechado 2 de 2 cadeias, 7939 de 7939 passos (N31j, commit f53efce7f). Bospider (objeto 0x63, N32 linha 4, commit ddcca418f): todo 82:DB7D..E291 traduzido; 344 de 344 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 41 de 41 tipos de entrada forçada iguais (luta, filhos e morte), 85 de 85 desvios; só as guardas da tabela de saltos lançam erro (0 chamadas). Launch Octopus (objeto 0x07, N32 linha 6, commit de0df549e): 37 rotinas de 81:C433..CAB7 traduzidas; 443 de 443 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 72 de 72 tipos forçados iguais, 112 de 112 desvios; lançam erro (0 chamadas) 81:C7FC (84:9F2F), 81:C887 e 81:C9E1 (nível 9 ou mais). Sting Chameleon (objeto 0x0A, N32 linha 8, commit ee31ba349): 359 de 359 chamadas, 0 sem rastro, cadeia fechada 1 de 1; todos os tipos forçados iguais, 0 de 101 desvios sem passar. Spark Mandrill (objeto 0x31, N32 linha 5, commit b5164ee49): 359 de 359 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 90 de 90 tipos forçados tomam o seu desvio, 99 de 100 desvios (88:A0ED, a corrida até a parede, não alcançado). Boomer Kuwanger (objeto 0x05, N32 linha 13, commit 3425971da): todo 87:8A7E..91A6 traduzido; 320 de 320 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 104 de 104 tipos forçados iguais, 103 de 103 tomam o seu desvio (87:8C56, um tiro durante o pisca, não alcançado); lançam erro (0 chamadas) 87:908B (nível 9 ou mais) e as guardas da tabela de saltos. Velguarder (objeto 0x26, N32 linha 7, commit 1f6142567): todo 82:C83A..D1E4 traduzido; na janela longa BSFNH1923L, 1543 de 1543 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 22 de 22 tipos forçados iguais, cada um toma o seu desvio; só as guardas da tabela de saltos lançam erro. Flame Mammoth (objeto 0x0C, N32 linha 14, commits ec9ee5f5f e 526ca40cc): todo 87:91A7..9793 traduzido, com 84:8000 (registros de linha de h_848011) e o fim de nível 9 ou mais (o X de 84:A677); 457 de 457 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 69 de 69 tipos forçados iguais, cada um toma o seu desvio; lançam erro (0 chamadas) 87:9352 (acerto durante o pisca, sem chamada nem tipo) e as guardas. Thunder Slimer (objeto 0x03, N32 linha 10, commits 4e9f9616a e 526ca40cc): todo 84:AE47..B8AB traduzido, com as cinco chamadas de 84:8000 e o fim 84:B3AB..B3F9; na janela longa SSMCR4444L, 1736 de 1736 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 31 de 31 tipos forçados iguais, cada um toma o seu desvio; só as guardas da tabela de saltos lançam erro. Storm Eagle (objeto 0x52, N32 linha 3, commit 48ef2cbf9): todo 87:D85C..DE92 traduzido; na janela longa BRBCH10532L, 3058 de 3058 chamadas (80:D530 2998, 80:D53A 60), 0 sem rastro, cadeia fechada 1 de 1; 23 de 23 tipos forçados iguais, cada um toma o seu desvio; só as guardas da tabela de saltos e a guarda 87:DDED lançam erro (0 chamadas). Guardião da cápsula do Sting Chameleon, RT-55J (objeto 0x09, N32 linha 12, commit 0ac0eb38b): todo 81:CC13..D032 traduzido; nas janelas BSXBN5620 e BSXBN5620L, 4797 de 4797 chamadas, 0 sem rastro, cadeias fechadas 2 de 2; 16 de 16 tipos forçados iguais, 90 de 90 desvios; só as guardas da tabela de saltos lançam erro (0 chamadas). Armored Armadillo (objeto 0x14, N32 linha 15, commit 98452c745): todo 83:B144..B93A e 83:B9C8..BBD1 traduzido; na janela longa BDRNH843L, 2168 de 2168 chamadas (80:D530 2108, 80:D53A 60), 0 sem rastro, cadeia fechada 1 de 1; 22 de 22 tipos forçados iguais, cada um toma o seu desvio; lançam erro (0 chamadas) as guardas da tabela de saltos, a guarda 83:B915 e 83:B32E (saída cedo de 84:9B43 com o jogador morto: o BVC lê o V de quem chamou). Utuboros (objeto 0x23 com as partes 0x24 e 0x25, N32 linha 20, commit 3c23a8359): todo 82:BD6B..C839 traduzido (cabeça, seis segmentos do corpo e cauda); na janela longa BLSAC10283L, 26058 de 26058 chamadas (cabeça 3281, corpo 19497, cauda 3280), 0 sem rastro, cadeia fechada 1 de 1; 8 de 8 tipos forçados iguais, cada um toma o seu desvio; só as guardas da tabela de saltos lançam erro (0 chamadas). Submarino (objeto 0x28, N32 linha 18, commits 82e06d9de e 13b3e2354): todo 82:D520..D9EE e 82:B7A9..B7F9 traduzido (luta, crias, afundamento e destroços; o auxiliar 84:8011 agora roda a sua lista de segunda camada 84:8051); nas janelas BLSAC7227 e BLSAC7227L, 2873 de 2873 chamadas, 0 sem rastro, cadeias fechadas 2 de 2; 5 de 5 tipos forçados iguais, 35 de 35 desvios; só as guardas da tabela de saltos e 82:D85E (dentro de 82:D7D7) lançam erro (0 chamadas). Sigma humanoide (objeto 0x65, N32 linha 9, commits dc1b995c5 e b1726ce68): todo 88:C3B2..CF50 traduzido (entrada, o cão 0x26 trazido para baixo, luta, morte, troca de forma, segunda forma e fim); na janela longa SFNB1201L, 5009 de 5009 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 52 de 52 tipos forçados iguais, 46 de 46 tomam o seu desvio; só as guardas da tabela de saltos e 88:CA6C (fim de uma passada do passo 14 de 84:A677) lançam erro (0 chamadas). D-Rex (objeto 0x61 com a parte 0x62, N32 linha 11, commit 5979e31e4): todo 88:B689..C3B1 traduzido (luta, ações, tiro 0x2A, pisca do dano, derrota; a plataforma 0x62 com câmera, enchimento de vida e derrota); na janela de 600 quadros BDRCR18924, 958 de 958 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 98 de 98 tipos forçados iguais (5918 entradas), 98 de 98 tomam o seu desvio; só as guardas da tabela de saltos lançam erro (0 chamadas). Vile na armadura da estrada de abertura (objeto 0x32, N32 linha 21, commit 70fbd54de): todo 83:CF70..D85B traduzido, e as rotinas que divide com o Vile da fortaleza (83:CB05..CDEA) num só par auxiliar h_83CB05; na janela de 600 quadros BVICR10546, 530 de 530 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 67 de 67 tipos forçados iguais e tomam o seu desvio; não alcançado: o golpe de tiro do X (83:CFC9..D01B). Rangda Bangda (objetos 0x5E, 0x5D, 0x5F e 0x60, N32 linha 17, commit 3e9a6e05a): todo 88:A985..B688 traduzido (o olho que comanda, os dois olhos, o nariz e as paredes); na janela de 600 quadros BRBSA15921, 1886 de 1886 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 133 de 133 tipos forçados iguais e tomam o seu desvio; só as guardas da tabela de saltos lançam erro. Vile na fortaleza Sigma 1 (objeto 0x69 com a armadura 0x66 e o Vile montado 0x67, N32 linha 22, commits 757d217c7, 4ac12ff0b, 0f827b4f0 e 9c154c198): todo 88:D1B8..D856, 88:DADA..E36A e 83:E7E1..EF32 traduzido (entrada, luta e morte do Vile, as ações 00-0E da armadura, o Vile montado); na janela de 600 quadros VFDB16578, 237 de 237 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 228 de 228 tipos forçados iguais (26444 entradas) e tomam o seu desvio; só as guardas da tabela de saltos lançam erro. Máquinas escavadeiras da fase do Armored Armadillo (objeto 0x2C, N32 linha 2, commits 0ce070487 e c34597e1e): todo 83:BF44..C386 traduzido (espera, escavação com o mapa de blocos 7F:F200, queda, morte); na janela de 600 quadros EODH4771, 367 de 367 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 18 de 18 tipos forçados iguais (2834 entradas) e tomam o seu desvio; não alcançados: 83:C346 e 83:C08F; só a guarda da tabela de saltos lança erro. Abelha gigante da estrada de abertura (objeto 0x22, N32 linha 19, commits ce71794f0 e 260febf81): todo 82:B896..BD6A traduzido (entrada, descida, metralhadora, foguetes, bolas 0x27, queda e destroços) e o auxiliar novo 84:AB81; na janela de 600 quadros BBEH603, 479 de 479 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 28 de 28 tipos forçados iguais (2726 entradas) e tomam o seu desvio; só as guardas das tabelas de saltos lançam erro. Subchefe da fase do Launch Octopus (objeto 0x21, N32 linha 16, commit a6f5b27e0): todo 82:AE18..B85F traduzido e o auxiliar novo 84:A09C; na janela de 600 quadros BLMCH3266, 382 de 382 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 44 de 44 tipos forçados iguais (2675 entradas) e tomam o seu desvio; o byte de fronteira $29 é zerado pela lâmpada filha ao morrer (82:EB75); só as guardas da tabela de saltos e três criações com a página cheia lançam erro (0 chamadas). Sigma final, o lobo (objeto 0x6B, N32 linha 1, commits e86761864 e 049efeb03): todo 88:E546..E8A4 traduzido e o auxiliar novo 84:AB56; na janela de 600 quadros BSFNH9215, 890 de 890 chamadas, 0 sem rastro, cadeia fechada 1 de 1; 40 de 40 tipos forçados iguais e tomam o seu desvio; só as guardas da tabela de saltos lançam erro. Rodam no driver de teste, não no executável jogável.",
                "en": "Unit: the 23 bosses and minibosses of the X1 ledger; a boss counts when all its code is ported and equal on every recorded call (the enemy families' rule). Chill Penguin (object 0x02, with shots, ice effect, death and explosion; N31b to N31g) equals the original on every recorded call: 7879 of 7879, 0 untraced (N31e, commit fd473de5a; repeated by N31i, commit 49b79a2b4). Closed loop 2 of 2 chains, 7939 of 7939 steps (N31j, commit f53efce7f). Bospider (object 0x63, N32 row 4, commit ddcca418f): all of 82:DB7D..E291 ported; 344 of 344 calls, 0 untraced, closed 1 of 1 chain; 41 of 41 forced entry kinds equal (fight, children and death), 85 of 85 branches; only the jump-table guards throw (0 calls). Launch Octopus (object 0x07, N32 row 6, commit de0df549e): 37 routines of 81:C433..CAB7 ported; 443 of 443 calls, 0 untraced, closed 1 of 1 chain; 72 of 72 forced kinds equal, 112 of 112 branches; still throwing (0 calls) 81:C7FC (84:9F2F), 81:C887 and 81:C9E1 (level 9 or higher). Sting Chameleon (object 0x0A, N32 row 8, commit ee31ba349): 359 of 359 calls, 0 untraced, closed 1 of 1 chain; every forced kind equal, 0 of 101 branches missed. Spark Mandrill (object 0x31, N32 row 5, commit b5164ee49): 359 of 359 calls, 0 untraced, closed 1 of 1 chain; 90 of 90 forced kinds take their branch, 99 of 100 branches (88:A0ED, the dash into a wall, not reached). Boomer Kuwanger (object 0x05, N32 row 13, commit 3425971da): all of 87:8A7E..91A6 ported; 320 of 320 calls, 0 untraced, closed 1 of 1 chain; 104 of 104 forced kinds equal, 103 of 103 take their branch (87:8C56, a hit during the blink, not reached); still throwing (0 calls) 87:908B (level 9 or higher) and the jump-table guards. Velguarder (object 0x26, N32 row 7, commit 1f6142567): all of 82:C83A..D1E4 ported; on the long window BSFNH1923L, 1543 of 1543 calls, 0 untraced, closed 1 of 1 chain; 22 of 22 forced kinds equal, each takes its branch; only the jump-table guards throw. Flame Mammoth (object 0x0C, N32 row 14, commits ec9ee5f5f and 526ca40cc): all of 87:91A7..9793 ported, with 84:8000 (h_848011 row records) and the level 9 or higher end (the X of 84:A677); 457 of 457 calls, 0 untraced, closed 1 of 1 chain; 69 of 69 forced kinds equal, each takes its branch; still throwing (0 calls) 87:9352 (a hit during the blink, no call or kind) and the guards. Thunder Slimer (object 0x03, N32 row 10, commits 4e9f9616a and 526ca40cc): all of 84:AE47..B8AB ported, with the five 84:8000 calls and the end 84:B3AB..B3F9; on the long window SSMCR4444L, 1736 of 1736 calls, 0 untraced, closed 1 of 1 chain; 31 of 31 forced kinds equal, each takes its branch; only the jump-table guards throw. Storm Eagle (object 0x52, N32 row 3, commit 48ef2cbf9): all of 87:D85C..DE92 ported; on the long window BRBCH10532L, 3058 of 3058 calls (80:D530 2998, 80:D53A 60), 0 untraced, closed 1 of 1 chain; 23 of 23 forced kinds equal, each takes its branch; only the jump-table guards and the 87:DDED guard throw (0 calls). Chameleon capsule guardian RT-55J (object 0x09, N32 row 12, commit 0ac0eb38b): all of 81:CC13..D032 ported; on the windows BSXBN5620 and BSXBN5620L, 4797 of 4797 calls, 0 untraced, closed 2 of 2 chains; 16 of 16 forced kinds equal, 90 of 90 branches; only the jump-table guards throw (0 calls). Armored Armadillo (object 0x14, N32 row 15, commit 98452c745): all of 83:B144..B93A and 83:B9C8..BBD1 ported; on the long window BDRNH843L, 2168 of 2168 calls (80:D530 2108, 80:D53A 60), 0 untraced, closed 1 of 1 chain; 22 of 22 forced kinds equal, each takes its branch; still throwing (0 calls) the jump-table guards, the 83:B915 guard and 83:B32E (84:9B43 early exit with the player dead: BVC reads the V of the caller). Utuboros (object 0x23 with the parts 0x24 and 0x25, N32 row 20, commit 3c23a8359): all of 82:BD6B..C839 ported (head, six body segments and tail); on the long window BLSAC10283L, 26058 of 26058 calls (head 3281, body 19497, tail 3280), 0 untraced, closed 1 of 1 chain; 8 of 8 forced kinds equal, each takes its branch; only the jump-table guards throw (0 calls). Submarine (object 0x28, N32 row 18, commits 82e06d9de and 13b3e2354): all of 82:D520..D9EE and 82:B7A9..B7F9 ported (fight, spawns, sinking and wreck; the helper 84:8011 now runs its second-layer list 84:8051); on the windows BLSAC7227 and BLSAC7227L, 2873 of 2873 calls, 0 untraced, closed 2 of 2 chains; 5 of 5 forced kinds equal, 35 of 35 branches; only the jump-table guards and 82:D85E (inside 82:D7D7) throw (0 calls). Sigma humanoid (object 0x65, N32 row 9, commits dc1b995c5 and b1726ce68): all of 88:C3B2..CF50 ported (entry, the dog 0x26 carried down, fight, death, change of form, second form and end); on the long window SFNB1201L, 5009 of 5009 calls, 0 untraced, closed 1 of 1 chain; 52 of 52 forced kinds equal, 46 of 46 take their branch; only the jump-table guards and 88:CA6C (the end of an 84:A677 step 14 pass) throw (0 calls). D-Rex (object 0x61 with the part 0x62, N32 row 11, commit 5979e31e4): all of 88:B689..C3B1 ported (fight, actions, shot 0x2A, hit blink, defeat; the platform 0x62 with camera, health fill and defeat); on the 600-frame window BDRCR18924, 958 of 958 calls, 0 untraced, closed 1 of 1 chain; 98 of 98 forced kinds equal (5918 entries), 98 of 98 take their branch; only the jump-table guards throw (0 calls). Vile in the ride armour on the intro highway (object 0x32, N32 row 21, commit 70fbd54de): all of 83:CF70..D85B ported, and the routines it shares with the fortress Vile (83:CB05..CDEA) in one helper pair h_83CB05; on the 600-frame window BVICR10546, 530 of 530 calls, 0 untraced, closed 1 of 1 chain; 67 of 67 forced kinds equal and take their branch; not reached: a hit by an X shot (83:CFC9..D01B). Rangda Bangda (objects 0x5E, 0x5D, 0x5F and 0x60, N32 row 17, commit 3e9a6e05a): all of 88:A985..B688 ported (the controlling eye, the two eyes, the nose and the walls); on the 600-frame window BRBSA15921, 1886 of 1886 calls, 0 untraced, closed 1 of 1 chain; 133 of 133 forced kinds equal and take their branch; only the jump-table guards throw. Vile in Sigma fortress 1 (object 0x69 with the ride armour 0x66 and the mounted Vile 0x67, N32 row 22, commits 757d217c7, 4ac12ff0b, 0f827b4f0 and 9c154c198): all of 88:D1B8..D856, 88:DADA..E36A and 83:E7E1..EF32 ported (Vile's entry, fight and death, the armour's actions 00-0E, the mounted Vile); on the 600-frame window VFDB16578, 237 of 237 calls, 0 untraced, closed 1 of 1 chain; 228 of 228 forced kinds equal (26444 entries) and take their branch; only the jump-table guards throw. Armored Armadillo stage digging machines (object 0x2C, N32 row 2, commits 0ce070487 and c34597e1e): all of 83:BF44..C386 ported (wait, drilling with the 7F:F200 block map, fall, death); on the 600-frame window EODH4771, 367 of 367 calls, 0 untraced, closed 1 of 1 chain; 18 of 18 forced kinds equal (2834 entries) and take their branch; not reached: 83:C346 and 83:C08F; only the jump-table guard throws. Intro highway giant bee (object 0x22, N32 row 19, commits ce71794f0 and 260febf81): all of 82:B896..BD6A ported (entry, descent, gun, rockets, 0x27 balls, crash and wreck) and the new helper 84:AB81; on the 600-frame window BBEH603, 479 of 479 calls, 0 untraced, closed 1 of 1 chain; 28 of 28 forced kinds equal (2726 entries) and take their branch; only the jump-table guards throw. Launch Octopus stage miniboss (object 0x21, N32 row 16, commit a6f5b27e0): all of 82:AE18..B85F ported and the new helper 84:A09C; on the 600-frame window BLMCH3266, 382 of 382 calls, 0 untraced, closed 1 of 1 chain; 44 of 44 forced kinds equal (2675 entries) and take their branch; the boundary byte $29 is cleared by the lamp child when it dies (82:EB75); only the jump-table guards and three spawns with a full page throw (0 calls). Sigma final, the wolf (object 0x6B, N32 row 1, commits e86761864 and 049efeb03): all of 88:E546..E8A4 ported and the new helper 84:AB56; on the 600-frame window BSFNH9215, 890 of 890 calls, 0 untraced, closed 1 of 1 chain; 40 of 40 forced kinds equal and take their branch; only the jump-table guards throw. They run in the test driver, not in the playable exe."
              }
            },
            {
              "id": "x1.bosses.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 129,
              "status": "partial",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [
                "docs/tasks/done/N47-engine-complete-definition-and-process.md",
                "docs/tasks/done/N48-boss-complete-single-site.md",
                "docs/tasks/done/N31h-boss-fight-closed-loop.md",
                "docs/tasks/done/N31j-boss-frozen-entry.md",
                "docs/tasks/done/BC2-boss-complete-rule.md",
                "docs/tasks/done/BC1-boss-complete-audit.md",
                "docs/tasks/open/N32-boss-fanout.md",
                "docs/tasks/done/BC3-spark-flame-long-windows.md",
                "docs/tasks/done/BC7-flame-mammoth-respawn-chain.md",
                "docs/tasks/done/BC10-oracle-tests-run-fight-end-windows.md",
                "docs/tasks/done/BC11-digging-machines-forced-and-vile-fortress-entry.md",
                "docs/tasks/done/BC13-oracle-tests-run-bc8-windows.md",
                "docs/tasks/done/BC14-boomer-long-window-chain.md",
                "docs/tasks/done/BC9-death-windows-from-davids-takes.md",
                "docs/tasks/done/BC15-sigma-humanoid-and-vile-fortress-death-windows.md",
                "docs/tasks/done/BC16-oracle-tests-run-bc15-and-sting-windows.md",
                "docs/tasks/done/BC17-oracle-tests-run-bc9-windows.md",
                "docs/tasks/done/BC19-oracle-tests-run-bospider-and-vile-intro.md",
                "docs/tasks/done/BC18-rangda-bangda-death.md",
                "docs/tasks/done/BC20-rangda-bangda-controller-window-and-test.md",
                "docs/tasks/done/BC21-rangda-bangda-last-forced-kinds.md"
              ],
              "note": {
                "pt": "Regra 2026-10-12 (completo: todo caminho fora das guardas executado, gravado ou forçado, e igual ao original): um chefe conta quando o código dele não lança erro fora das guardas da tabela de saltos (regra da BC1, relida na árvore 0673b8072), não tem desvio registrado como não alcançado e a luta inteira é igual ao original. 13 de 23: Thunder Slimer 0x03, RT-55J 0x09, abelha gigante 0x22, Utuboros 0x23, Velguarder 0x26, submarino 0x28, Spark Mandrill 0x31, Storm Eagle 0x52, Rangda Bangda 0x5E, D-Rex 0x61, Bospider 0x63, Vile na fortaleza Sigma 1 0x69 e Sigma final 0x6B. Em 2026-10-12 a N48 (commit 6313a5d3d) provou que 88:A341 (Spark Mandrill), 87:DDED (Storm Eagle) e 87:908B (Boomer Kuwanger) são guardas da tabela de saltos, e a L121 leu no oráculo do Spark Mandrill que o desvio 88:A0ED, antes anotado como não alcançado, é tomado (88:a0ed=2; desvios não tomados 0 de 100). Não contam (10): Chill Penguin 0x02 (18 lançamentos, 81:BB98..81:BB64); Boomer Kuwanger 0x05 (87:8C56 não alcançado; 87:908B é guarda desde a N48); Launch Octopus 0x07 (81:C7FC, 81:C9E1); Sting Chameleon 0x0A (88:877D, 88:8C6F, 88:8D00); Flame Mammoth 0x0C (87:9711, 87:9646, 87:9352); Armored Armadillo 0x14 (83:B32E, 83:B915); subchefe do Launch Octopus 0x21 (três criações com a página cheia: 82:B688, 82:B711, 82:B73C; os outros cinco lançamentos são guardas de tabela de saltos); máquinas escavadeiras 0x2C (83:C346 e 83:C08F não alcançados); Vile da estrada de abertura 0x32 (83:CFC9..D01B não alcançado); Sigma humanoide 0x65 (88:C916, 88:CA6C). Antes: verificado pela Regra C, 23 de 23, 129 pontos; depois da N47: parcial 11 de 23, 61 pontos (queda declarada, não progresso); depois da N48 e da L121: parcial 13 de 23, 72 pontos (129 · 13 / 23, arredondado para baixo). Evidência em laço fechado (Regra C, David, 2026-10-08, BC2; não substitui a cobertura): Chill Penguin: laço fechado 2 de 2 cadeias, 7939 de 7939 passos; 588 de 592 tipos de acerto forçados iguais, os 4 restantes excluídos com a razão impressa (a própria chamada escreve $39 antes de 81:B645). N31j, commit f53efce7f. Contados pela BC6 (janela longa da entrada à morte, BC1 commit 639aa4f7f; teste rodado de novo em 2026-10-08): Thunder Slimer (0x03, SSMCR4444L, aberto 1736 de 1736, fechado 1 de 1 cadeia); RT55J, boss.chameleon-capsule-guardian (0x09, BSXBN5620L, aberto 4797 de 4797, fechado 2 de 2); Armored Armadillo (0x14, BDRNH843L, aberto 2168 de 2168 com 60 de 60 chamadas 80:D53A da morte, fechado 1 de 1); Velguarder (0x26, BSFNH1923L, aberto 1543 de 1543, fechado 1 de 1); o submarino (0x28, BLSAC7227L, aberto 2873 de 2873, fechado 2 de 2); Storm Eagle (0x52, BRBCH10532L, aberto 3058 de 3058 com 60 de 60 chamadas 80:D53A, fechado 1 de 1). Contados em 2026-10-08 (janelas da entrada à morte nos testes): Spark Mandrill (0x31, BDRNH7693 e BDRNH7693L, aberto 3344 de 3344 com 60 de 60 chamadas 80:D53A da morte, fechado 2 de 2, BC3 commit a070c473b); Flame Mammoth (0x0C, FML12304, FML12304L e FML18304L, aberto 8127 de 8127 com 60 de 60 chamadas 80:D53A, fechado 4 de 4, o chefe renasce depois da morte do X, BC7 e BC10 commit 7b8d89d07); Utuboros (0x23, BLSAC10283L e BLSAC16283L, aberto 35763 de 35763, fechado 2 de 2, BC10 commit b3c609693). Contados depois em 2026-10-08: máquinas escavadeiras (0x2C, EODH1903L, EODH4771 e EODH5371L, aberto 1811 de 1811, fechado 3 de 3, BC11 commit b2a1b1f01); Sigma final (0x6B, BSFNH9215 e SFW9215L, aberto 9764 de 9764, fechado 2 de 2, BC13 commit db5906656); Launch Octopus (0x07, BDRNH12031 e LOASF22927L, aberto 4733 de 4733 com 60 de 60 chamadas 80:D53A, fechado 2 de 2, BC13 commit e489609f3); Boomer Kuwanger (0x05, BBSAH18013 e BK34162L, aberto 3240 de 3240 com 60 de 60 chamadas 80:D53A, fechado 2 de 2, o byte de fronteira $37 vem do bumerangue apanhado de volta em 83:AC55, BC14 commit d57c88547). Contados no fim de 2026-10-08, todos com janelas das gravações do David: abelha gigante (0x22, BBEH603 e IH3537L, aberto 1102 de 1102, BC17 commit 741b9b697); subchefe do Launch Octopus (0x21, BLMCH3266 e LOASF3351L, aberto 1413 de 1413, commit 6c02f0f04); D-Rex (0x61, BDRCR18924 e S20983L, aberto 8856 de 8856, commit 944d97dee); Bospider (0x63, BBSVA22226, SZA24390L e SZA30390L, aberto 9925 de 9925, BC19 commit df6d52c2b); Vile da estrada de abertura (0x32, BVICR10546 e IH10546L até a saída roteirizada, aberto 2761 de 2761, fronteira $0C escrita pelo caminhão 0x1A em 88:96B2..96B9, commit e7b5c87dd); Vile na fortaleza Sigma 1 (0x69, VFDB16578, VFDB12274L e SZA10131L, aberto 12552 de 12552, BC16 commit 53a73cf43); Sting Chameleon (0x0A, SSCRH4015 e SC19523L, aberto 4101 de 4101, sete caminhos novos traduzidos, commit bc6359f9a); Sigma humanoide (0x65, SFNB1201L, SFNB26449L e SFNB32449L, aberto 14234 de 14234, commit a6642acac). Rangda Bangda (o controlador 0x5D é o objeto principal, decisão do coordenador; BRBSA15921 e S37538L até o fim da sequência de derrota, aberto 9941 de 9941, fechado 2 de 2, 133 de 133 tipos forçados; o bit 7 de +$27 é o aviso de vida alterada da barra, 84:9EA5; o auxiliar 84:81FF..8240 traduzido; BC18, BC20 e BC21, commit bc5505285). Os 23 chefes do X1 rodam a luta inteira, da entrada à morte, igual ao original.",
                "en": "Rule 2026-10-12 (complete: every non-guard path executed, recorded or forced, and equal to the original): a boss counts when its code throws nowhere outside the jump-table guards (BC1 rule, re-read on tree 0673b8072), has no branch recorded as not reached, and its whole fight equals the original. 13 of 23: Thunder Slimer 0x03, RT-55J 0x09, the giant bee 0x22, Utuboros 0x23, Velguarder 0x26, the submarine 0x28, Spark Mandrill 0x31, Storm Eagle 0x52, Rangda Bangda 0x5E, D-Rex 0x61, Bospider 0x63, Vile in Sigma fortress 1 0x69 and Sigma final 0x6B. On 2026-10-12 N48 (commit 6313a5d3d) proved 88:A341 (Spark Mandrill), 87:DDED (Storm Eagle) and 87:908B (Boomer Kuwanger) to be jump-table guards, and L121 read from the Spark Mandrill oracle that the branch 88:A0ED, formerly noted as not reached, is taken (88:a0ed=2; branches not taken 0 of 100). Not counted (10): Chill Penguin 0x02 (18 throws, 81:BB98..81:BB64); Boomer Kuwanger 0x05 (87:8C56 not reached; 87:908B is a guard since N48); Launch Octopus 0x07 (81:C7FC, 81:C9E1); Sting Chameleon 0x0A (88:877D, 88:8C6F, 88:8D00); Flame Mammoth 0x0C (87:9711, 87:9646, 87:9352); Armored Armadillo 0x14 (83:B32E, 83:B915); the Launch Octopus miniboss 0x21 (three spawns with a full page: 82:B688, 82:B711, 82:B73C; its other five throws are jump-table guards); the digging machines 0x2C (83:C346 and 83:C08F not reached); Vile on the intro highway 0x32 (83:CFC9..D01B not reached); Sigma humanoid 0x65 (88:C916, 88:CA6C). Before: verified under Rule C, 23 of 23, 129 points; after N47: partial 11 of 23, 61 points (a disclosed drop, not progress); after N48 and L121: partial 13 of 23, 72 points (129 x 13 / 23, rounded down). Closed-loop evidence (Rule C, David, 2026-10-08, BC2; it does not replace coverage): Chill Penguin: closed loop 2 of 2 chains, 7939 of 7939 steps; 588 of 592 forced hit kinds equal, the 4 left excluded with the reason printed (the call itself writes $39 before 81:B645). N31j, commit f53efce7f. Counted by BC6 (long window from entry to death, BC1 commit 639aa4f7f; test rerun on 2026-10-08): Thunder Slimer (0x03, SSMCR4444L, open 1736 of 1736, closed 1 of 1 chain); RT55J, boss.chameleon-capsule-guardian (0x09, BSXBN5620L, open 4797 of 4797, closed 2 of 2); Armored Armadillo (0x14, BDRNH843L, open 2168 of 2168 with 60 of 60 death 80:D53A calls, closed 1 of 1); Velguarder (0x26, BSFNH1923L, open 1543 of 1543, closed 1 of 1); the submarine (0x28, BLSAC7227L, open 2873 of 2873, closed 2 of 2); Storm Eagle (0x52, BRBCH10532L, open 3058 of 3058 with 60 of 60 80:D53A calls, closed 1 of 1). Counted on 2026-10-08 (entry-to-death windows in the tests): Spark Mandrill (0x31, BDRNH7693 and BDRNH7693L, open 3344 of 3344 with 60 of 60 death 80:D53A calls, closed 2 of 2, BC3 commit a070c473b); Flame Mammoth (0x0C, FML12304, FML12304L and FML18304L, open 8127 of 8127 with 60 of 60 80:D53A calls, closed 4 of 4, the boss respawns after X dies, BC7 and BC10 commit 7b8d89d07); Utuboros (0x23, BLSAC10283L and BLSAC16283L, open 35763 of 35763, closed 2 of 2, BC10 commit b3c609693). Counted later on 2026-10-08: the digging machines (0x2C, EODH1903L, EODH4771 and EODH5371L, open 1811 of 1811, closed 3 of 3, BC11 commit b2a1b1f01); Sigma final (0x6B, BSFNH9215 and SFW9215L, open 9764 of 9764, closed 2 of 2, BC13 commit db5906656); Launch Octopus (0x07, BDRNH12031 and LOASF22927L, open 4733 of 4733 with 60 of 60 80:D53A calls, closed 2 of 2, BC13 commit e489609f3); Boomer Kuwanger (0x05, BBSAH18013 and BK34162L, open 3240 of 3240 with 60 of 60 80:D53A calls, closed 2 of 2, the boundary byte $37 comes from the boomerang caught back at 83:AC55, BC14 commit d57c88547). Counted at the end of 2026-10-08, all from windows in David's takes: the giant bee (0x22, BBEH603 and IH3537L, open 1102 of 1102, BC17 commit 741b9b697); the Launch Octopus miniboss (0x21, BLMCH3266 and LOASF3351L, open 1413 of 1413, commit 6c02f0f04); D-Rex (0x61, BDRCR18924 and S20983L, open 8856 of 8856, commit 944d97dee); Bospider (0x63, BBSVA22226, SZA24390L and SZA30390L, open 9925 of 9925, BC19 commit df6d52c2b); Vile on the intro highway (0x32, BVICR10546 and IH10546L to the scripted exit, open 2761 of 2761, boundary $0C written by the 0x1A truck at 88:96B2..96B9, commit e7b5c87dd); Vile in Sigma fortress 1 (0x69, VFDB16578, VFDB12274L and SZA10131L, open 12552 of 12552, BC16 commit 53a73cf43); Sting Chameleon (0x0A, SSCRH4015 and SC19523L, open 4101 of 4101, seven new paths ported, commit bc6359f9a); Sigma humanoid (0x65, SFNB1201L, SFNB26449L and SFNB32449L, open 14234 of 14234, commit a6642acac). Rangda Bangda (the controller 0x5D is the key object, coordinator ruling; BRBSA15921 and S37538L to the end of the defeat sequence, open 9941 of 9941, closed 2 of 2, 133 of 133 forced kinds; bit 7 of +$27 is the bar's health-changed flag, 84:9EA5; helper 84:81FF..8240 ported; BC18, BC20 and BC21, commit bc5505285). All 23 X1 bosses run their whole fight, entry to death, equal to the original."
              },
              "partial": {
                "seen": 13,
                "total": 23,
                "$source": "docs/tasks/done/N47-engine-complete-definition-and-process.md Result step 1 (BC1 throw rule re-read on tree 0673b8072 and the Rule C windows of BC6 to BC21: 11 of 23) plus docs/tasks/done/N48-boss-complete-single-site.md Result (level >= 9 ends 88:A341, 87:DDED, 87:908B proved as jump-table guards, commit 6313a5d3d: 12 of 23) plus card L121-engine-bosses-complete-13 Result step 1 (oid31 oracle takes 88:A0ED: 88:a0ed=2, branches not taken 0 of 100; build/N47/bosses.py 13 of 23)"
              }
            },
            {
              "id": "x1.bosses.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 129,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "x1.stages",
          "weightBp": 623,
          "group": "x1",
          "title": {
            "pt": "X1 · Fases e câmera",
            "en": "X1 · Stages and camera"
          },
          "description": {
            "pt": "Carregar cada fase, a câmera, o surgimento dos inimigos e as partes móveis do cenário.",
            "en": "Loading each stage, the camera, enemies appearing and the moving parts of the scenery."
          },
          "steps": [
            {
              "id": "x1.stages.port.load",
              "title": {
                "pt": "Carga das 13 fases",
                "en": "Loading all 13 stages"
              },
              "weightBp": 28,
              "status": "verified",
              "acceptance": {
                "pt": "A memória de cada fase montada pelo motor próprio é igual à do original no momento da carga.",
                "en": "Each stage's memory built by our own engine equals the original's at load time."
              },
              "evidence": [
                "docs/tasks/done/N22-level-image-from-pack.md"
              ],
              "note": {
                "pt": "N22 (commit efd5b74b2): python 13/13, capture 13/13 (412 cargas capturadas iguais).",
                "en": "N22 (commit efd5b74b2): python 13/13, capture 13/13 (412 load captures equal)."
              }
            },
            {
              "id": "x1.stages.port.camera",
              "title": {
                "pt": "Câmera e rolagem nos trechos gravados",
                "en": "Camera and scrolling on the recorded stretches"
              },
              "weightBp": 28,
              "status": "verified",
              "acceptance": {
                "pt": "A câmera do motor próprio dá o mesmo resultado do original em cada chamada gravada.",
                "en": "Our engine's camera gives the same result as the original on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N26-native-camera-scroll.md"
              ],
              "note": {
                "pt": "N26 (commit fc3c0d647): T1 1196/1196, T2 1170/1170, vertical BK 240/240. Card estacionado: travamento de rolagem e 34 desfechos de desvio ainda sem gravação (fase \"completo\").",
                "en": "N26 (commit fc3c0d647): T1 1196/1196, T2 1170/1170, vertical BK 240/240. Card parked: scroll lock and 34 branch outcomes not yet recorded (the \"complete\" phase)."
              }
            },
            {
              "id": "x1.stages.port.spawner",
              "title": {
                "pt": "Surgimento dos inimigos nos trechos gravados",
                "en": "Enemies appearing on the recorded stretches"
              },
              "weightBp": 28,
              "status": "verified",
              "acceptance": {
                "pt": "O motor próprio faz surgir os mesmos inimigos, nos mesmos quadros, que o original nas chamadas gravadas.",
                "en": "Our engine spawns the same enemies on the same frames as the original on the recorded calls."
              },
              "evidence": [
                "docs/tasks/done/N27-stage-event-spawner.md"
              ],
              "note": {
                "pt": "N27 (commit 26833ffd3): T1 598/598 chamadas (9 surgimentos), T2 598/598 (13), BK 120/120 (cobertura por entrada forçada). Card concluído (commit c2687ba7c).",
                "en": "N27 (commit 26833ffd3): T1 598/598 calls (9 spawns), T2 598/598 (13), BK 120/120 (forced-input coverage). Card done (commit c2687ba7c)."
              }
            },
            {
              "id": "x1.stages.port.tables",
              "title": {
                "pt": "Tabelas de eventos das 13 fases",
                "en": "Event tables of all 13 stages"
              },
              "weightBp": 28,
              "status": "verified",
              "acceptance": {
                "pt": "As tabelas de eventos montadas pelo motor próprio são iguais às do original em todas as fases.",
                "en": "The event tables our own engine builds equal the original's in every stage."
              },
              "evidence": [
                "docs/tasks/done/N27-stage-event-spawner.md"
              ],
              "note": {
                "pt": "N27 (commit c2687ba7c): tabelas iguais às capturas em 13 de 13 fases (412 de 412 janelas).",
                "en": "N27 (commit c2687ba7c): tables equal the captures on 13 of 13 stages (412 of 412 windows)."
              }
            },
            {
              "id": "x1.stages.port.pickups",
              "title": {
                "pt": "Itens que caem",
                "en": "Pickups"
              },
              "weightBp": 28,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N33-native-pickups.md",
                "docs/tasks/done/N33a-misc-pool-host.md"
              ],
              "note": {
                "pt": "N33 (commits a813ca7a2, bf5a55235, bd006e6d6, 8a9ab9510, a715560ac): os cinco itens iguais ao original em todas as chamadas gravadas: 1-up $04 79 de 79, sub tank $05 381 de 381, heart tank $0B 190 de 190, energia de vida $02 22 de 22, energia de arma $01 71 de 71 (743 de 743, 0 sem rastro); o espaço de objetos dos itens (N33a, commit 294799b0f) 176 de 176. Fora das janelas gravadas: dois tipos forçados do sub tank esperam a correção de leitura do export em 81:E662.",
                "en": "N33 (commits a813ca7a2, bf5a55235, bd006e6d6, 8a9ab9510, a715560ac): the five pickups equal the original on every recorded call: 1-up $04 79 of 79, sub tank $05 381 of 381, heart tank $0B 190 of 190, life energy $02 22 of 22, weapon energy $01 71 of 71 (743 of 743, 0 untraced); the pickups' object pool (N33a, commit 294799b0f) 176 of 176. Outside the recorded windows: two forced sub tank kinds wait on the export decode fix at 81:E662."
              }
            },
            {
              "id": "x1.stages.port.stage-changes",
              "title": {
                "pt": "Mudanças de cenário",
                "en": "Stage changes"
              },
              "weightBp": 28,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N42-native-stage-changes.md",
                "docs/tasks/done/N22-level-image-from-pack.md"
              ],
              "note": {
                "pt": "N42 (commit 2fb01b6e0): as mudanças de fase (Sting Chameleon alagada, Spark Mandrill no escuro, Flame Mammoth congelada) são a rotina de carga 80:BC5C, já traduzida no pacote (N22, efd5b74b2): igual ao original em 442 de 442 cargas gravadas (29 com a mudança) e em 32 de 32 casos forçados; 0 sem rastro. Fica de fora a troca de paleta 80:B4E7.",
                "en": "N42 (commit 2fb01b6e0): the stage changes (Sting Chameleon flooded, Spark Mandrill dark, Flame Mammoth frozen) are the load routine 80:BC5C, already ported in the pack (N22, efd5b74b2): equal to the original on 442 of 442 recorded loads (29 with the change) and on 32 of 32 forced kinds; 0 untraced. Left out: the palette switch 80:B4E7."
              }
            },
            {
              "id": "x1.stages.port.moving-platforms",
              "title": {
                "pt": "Plataformas móveis",
                "en": "Moving platforms"
              },
              "weightBp": 27,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N37-native-moving-platforms.md"
              ],
              "note": {
                "pt": "N37 (commits c892cb10b, d1253cd11, e40cc091d, bc3275453): as cinco plataformas móveis iguais ao original em todas as chamadas gravadas: 0x16 448 de 448, 0x3D 1193 de 1193, 0x2B 462 de 462, 0x48 1020 de 1020, 0x3F 1221 de 1221 (N11, ca3a2fe81); 0 sem rastro.",
                "en": "N37 (commits c892cb10b, d1253cd11, e40cc091d, bc3275453): the five moving platforms equal the original on every recorded call: 0x16 448 of 448, 0x3D 1193 of 1193, 0x2B 462 of 462, 0x48 1020 of 1020, 0x3F 1221 of 1221 (N11, ca3a2fe81); 0 untraced."
              }
            },
            {
              "id": "x1.stages.port.destructibles",
              "title": {
                "pt": "Partes destrutíveis",
                "en": "Destructibles"
              },
              "weightBp": 27,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N40-native-destructibles.md"
              ],
              "note": {
                "pt": "N40 (commit 5a49288b5): os quatro objetos destrutíveis iguais ao original em todas as chamadas gravadas: tanque de gás 0x46 286 de 286, esmagador 0x0F 566 de 566, pedras 0x18 125 de 125, vidro 0x41 393 de 393 (N11: e99b1f27c, 13340fda9, d6c697fa6); 0 sem rastro. Fica de fora a quebra de bloco pelo capacete, que é código do próprio X (81:9EBC), não um objeto.",
                "en": "N40 (commit 5a49288b5): the four destructibles objects equal the original on every recorded call: gas tank 0x46 286 of 286, crusher 0x0F 566 of 566, rocks 0x18 125 of 125, glass 0x41 393 of 393 (N11: e99b1f27c, 13340fda9, d6c697fa6); 0 untraced. Left out: the helmet block break, which is X's own code (81:9EBC), not an object."
              }
            },
            {
              "id": "x1.stages.port.conveyors-water",
              "title": {
                "pt": "Esteiras e água",
                "en": "Conveyors and water"
              },
              "weightBp": 27,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N41-native-conveyors-water.md"
              ],
              "note": {
                "pt": "N41 (commits b086995ff, e44271e73, 422bf4f77, 940da1e0c): os cinco objetos iguais ao original em todas as chamadas gravadas: bloco que cai 0x39 876 de 876, laser 0x42 1207 de 1207, feixe em quatro direções 0x43 609 de 609, gota de lava 0x4C 867 de 867, armadilha de laser 0x44 404 de 404 (N11: 9a91ed1ed); 0 sem rastro. As correntes de vento são do próprio Storm Eagle 0x52 (87:DABD), iguais em BOSS8 (48ef2cbf9, 3058 de 3058). A água não é um objeto: é o próprio X reagindo ao terreno (tipos 0x0D e 0x0E, 84:9490 e 84:9600) e fica para as linhas do jogador.",
                "en": "N41 (commits b086995ff, e44271e73, 422bf4f77, 940da1e0c): the five objects equal the original on every recorded call: falling block 0x39 (the export's conveyor) 876 of 876, laser 0x42 1207 of 1207, 4-way laser beam 0x43 609 of 609, lava drip 0x4C 867 of 867, laser trap 0x44 404 of 404 (N11: 9a91ed1ed); 0 untraced. The currents are Storm Eagle 0x52's own 87:DABD, equal in BOSS8 (48ef2cbf9, 3058 of 3058). Water is not an object: it is X's own terrain code (types 0x0D and 0x0E, 84:9490 and 84:9600), left to the player rows."
              }
            },
            {
              "id": "x1.stages.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 187,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidade: as 13 fases do X1. Regra 2026-10-12: uma fase conta quando uma gravação verificada do início da fase à morte do chefe repete K de K no motor próprio com 0 delegações ao núcleo gerado e os objetos da própria fase alcançam todos os contadores de desvio. 0 de 13: nenhuma fase tem essa execução registrada (N47; a câmera da N26 segue estacionada, com o travamento de rolagem e 34 desfechos de desvio sem gravação).",
                "en": "No acceptance recorded yet. Unit: the 13 X1 stages. Rule 2026-10-12: a stage counts when one verified take from stage start to boss death replays K of K on our own engine with 0 generated-core delegates and the stage's own objects reach every branch counter. 0 of 13: no stage has such a run on record (N47; N26's camera is still parked, with the scroll lock and 34 branch outcomes not recorded)."
              }
            },
            {
              "id": "x1.stages.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 187,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "x1.campaign",
          "weightBp": 359,
          "group": "x1",
          "title": {
            "pt": "X1 · Campanha, menus e itens",
            "en": "X1 · Campaign, menus and items"
          },
          "description": {
            "pt": "Título, escolha de fases, senha, cápsulas, itens, cenas e créditos.",
            "en": "Title, stage select, password, capsules, items, scenes and credits."
          },
          "steps": [
            {
              "id": "x1.campaign.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 143,
              "status": "partial",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N52k-campaign-heart-tanks.md",
                "docs/tasks/done/N52j-campaign-password-and-pause.md",
                "docs/tasks/done/N52i-title-d345-register-exact.md",
                "docs/tasks/done/N52h-campaign-object-walks.md",
                "docs/tasks/done/N52g-campaign-callees-exports-and-leaves.md",
                "docs/tasks/done/N52e-options-password-controls-native.md",
                "build/N52/census.json",
                "build/N52/slices.md"
              ],
              "note": {
                "pt": "Unidade: as 30 linhas de campanha, melhorias e itens do ledger do X1. Contam 11: título, menu, opções, senha e seleção de fases (campaign.title-select), os controles (foundation.controls) a tela que gera a senha (foundation.save-password, N52j: 2223 de 2223 e 97 de 97) e os 8 tanques de coração (N52k: 4606 de 4606 chamadas), cada entrada e cada rotina chamada traduzidas e iguais ao original quadro a quadro, sem nada emprestado do jogo (N52b a N52i: título 413 de 413, título-b 412 de 412, início da seleção 65 de 65, opções 980 de 980, senha 831 de 831, seleção 287 de 287). Faltam as cápsulas, os itens, as cenas e os créditos.",
                "en": "Unit: the 30 campaign, upgrade and item rows of the X1 ledger. 11 count: title, menu, options, password and stage select (campaign.title-select), the controls (foundation.controls) the save-password screen (foundation.save-password, N52j: 2223 of 2223 and 97 of 97) and the 8 heart tanks (N52k: 4606 of 4606 calls), every entry and every called routine ported and equal to the original frame by frame, with nothing borrowed from the game (N52b to N52i: title 413 of 413, title-b 412 of 412, select init 65 of 65, options 980 of 980, password 831 of 831, stage select 287 of 287). Left: capsules, items, scenes and credits."
              },
              "partial": {
                "seen": 11,
                "total": 30,
                "$source": "build/N52/census.json and build/N52/slices.md (the 30 units: 12 campaign rows, 18 upgrade and item rows); campaign.title-select, foundation.controls, foundation.save-password and the 8 item.heart units native and gated with every entry and callee (N52b-N52j; coordinator ruling 2026-10-12: a unit counts only when no callee is delegated)"
              }
            },
            {
              "id": "x1.campaign.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 108,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades: 12 linhas de campanha e 18 de melhorias e itens no ledger do X1 (8 corações, 4 sub tanks, 4 partes de armadura, Hadouken, ride armor). Nada traduzido ainda (marco M8).",
                "en": "No acceptance recorded yet. Units: 12 campaign rows and 18 upgrade and item rows in the X1 ledger (8 hearts, 4 sub tanks, 4 armour parts, Hadouken, ride armour). Nothing ported yet (milestone M8)."
              }
            },
            {
              "id": "x1.campaign.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 108,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades: 12 linhas de campanha e 18 de melhorias e itens no ledger do X1 (8 corações, 4 sub tanks, 4 partes de armadura, Hadouken, ride armor). Nada traduzido ainda (marco M8).",
                "en": "No acceptance recorded yet. Units: 12 campaign rows and 18 upgrade and item rows in the X1 ledger (8 hearts, 4 sub tanks, 4 armour parts, Hadouken, ride armour). Nothing ported yet (milestone M8)."
              }
            }
          ]
        },
        {
          "id": "x1.audio",
          "weightBp": 132,
          "group": "x1",
          "title": {
            "pt": "X1 · Som e música",
            "en": "X1 · Sound and music"
          },
          "description": {
            "pt": "Efeitos e músicas tocados pelo motor próprio, iguais ao chip de som original.",
            "en": "Effects and music played by our own engine, equal to the original sound chip."
          },
          "steps": [
            {
              "id": "x1.audio.port.commands",
              "title": {
                "pt": "Pedidos de som a cada quadro",
                "en": "Sound requests on every frame"
              },
              "weightBp": 14,
              "status": "verified",
              "acceptance": {
                "pt": "O motor próprio pede os mesmos sons, na mesma ordem e no mesmo quadro que o original.",
                "en": "Our engine requests the same sounds, in the same order and on the same frame as the original."
              },
              "evidence": [
                "docs/tasks/done/N21-sound-command-gate.md",
                "docs/tasks/done/N21b-command-gate-windows.md"
              ],
              "note": {
                "pt": "N21b (commit 5888e2a49): 48445 de 48445 quadros iguais em cinco trechos, 0 caminhos sem rastro.",
                "en": "N21b (commit 5888e2a49): 48445 of 48445 frames equal on five windows, 0 untraced."
              }
            },
            {
              "id": "x1.audio.port.sfx-start",
              "title": {
                "pt": "Decisão de qual efeito toca",
                "en": "Deciding which effect plays"
              },
              "weightBp": 13,
              "status": "verified",
              "acceptance": {
                "pt": "A regra do chip de som que aceita ou recusa cada efeito dá o mesmo resultado no motor próprio.",
                "en": "The sound chip's rule that accepts or refuses each effect gives the same result on our engine."
              },
              "evidence": [
                "docs/tasks/done/N29-spc-driver-sfx-path.md"
              ],
              "note": {
                "pt": "N29 sessão 2 (commit 2c0604122): início, ARAM e escritas DSP iguais em 4023 de 4023 comandos em cinco trechos.",
                "en": "N29 session 2 (commit 2c0604122): start, ARAM and DSP writes equal on 4023 of 4023 commands in five windows."
              }
            },
            {
              "id": "x1.audio.port.schedule",
              "title": {
                "pt": "Servidor de som agenda cada efeito",
                "en": "Sound server schedules every effect"
              },
              "weightBp": 13,
              "status": "verified",
              "acceptance": {
                "pt": "Num trecho gravado, cada pedido de som vira o arquivo certo, no momento certo.",
                "en": "On a recorded stretch, every sound request becomes the right file at the right time."
              },
              "evidence": [
                "docs/tasks/done/N23-sound-server-offline.md"
              ],
              "note": {
                "pt": "N23 (commit 6b29764b1): map 117/117, schedule 117/117, solo 1/1, repeat 2/2. Ainda não é igual amostra a amostra ao chip original (o modelo de canais veio depois, na N30).",
                "en": "N23 (commit 6b29764b1): map 117/117, schedule 117/117, solo 1/1, repeat 2/2. Not yet sample-equal to the original chip (the channel model came later, in N30)."
              }
            },
            {
              "id": "x1.audio.port.files",
              "title": {
                "pt": "Músicas e efeitos iguais ao chip original",
                "en": "Music and effects equal to the original chip"
              },
              "weightBp": 13,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/N3-audio-pack-render.md",
                "docs/tasks/done/N4-music-loops.md",
                "docs/tasks/done/N24-sfx-channel-stop.md",
                "docs/tasks/done/N30-sound-channel-model.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. N3 estacionado (três conferências de música falharam); N4 exportou as voltas sem limite de aceitação; N24 (107/117 canais) foi substituído pela N30 (canais 117/117 num trecho de efeitos), mas a música ainda não é igual ao chip.",
                "en": "No acceptance recorded yet. N3 parked (three music gates failed); N4 exported the loops with no acceptance threshold; N24 (107/117 channels) was superseded by N30 (channels 117/117 on one effects window), but the music is not yet equal to the chip."
              }
            },
            {
              "id": "x1.audio.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 40,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidade: o som das 13 fases, incluindo comandos $F0+ e o sequenciador.",
                "en": "No acceptance recorded yet. Unit: the sound of all 13 stages, including $F0+ commands and the sequencer."
              }
            },
            {
              "id": "x1.audio.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 39,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "x1.presentation",
          "weightBp": 105,
          "group": "x1",
          "title": {
            "pt": "X1 · Imagem na tela",
            "en": "X1 · Picture on screen"
          },
          "description": {
            "pt": "A imagem que o motor próprio desenha a partir do estado do jogo.",
            "en": "The picture our own engine draws from the game state."
          },
          "steps": [
            {
              "id": "x1.presentation.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 42,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/NP10i-vram-pre-f914-and-carry.md",
                "docs/tasks/done/NP10h-vram-0000-0fff-pack-kind.md",
                "docs/tasks/done/NP9-native-ppu-state.md",
                "tests/native/x1_seed_path_oracle_test.cpp"
              ],
              "note": {
                "pt": "O motor próprio desenha a imagem a partir do próprio estado, sem ler nenhuma imagem do original, desde o começo da fase: NP10h, 600 de 600 imagens no início da fase; NP10i (commit 65a254188), dados de vídeo de antes da fase vindos do cartucho (tipos vram-bg3, vram-bg12, vram-obj), 10.068 quadros seguidos, e os dois trechos de referência: T1 599 de 599 imagens do Mesen mais 1 quadro em que a captura do Mesen repetiu a imagem anterior (f5557; a memória do jogo é igual nos dois e o jogo não atrasou: build/NP10i/diag_f5557_wram.log), T2 600 de 600. Leituras da imagem do original: 0. Falta um bloco de 32 bytes de sprite (palavras $67F0-$67FF) sem origem encontrada no cartucho; ele não aparece em nenhuma imagem dos trechos.",
                "en": "Our engine draws the picture from its own state, reading no picture of the original, from the start of the stage: NP10h, 600 of 600 pictures at stage start; NP10i (commit 65a254188), the video data loaded before the stage taken from the cartridge (kinds vram-bg3, vram-bg12, vram-obj), 10,068 frames in a row, and both reference stretches: T1 599 of 599 Mesen pictures plus 1 frame where the Mesen capture repeated the previous picture (f5557; the game memory is equal in both and the game did not lag: build/NP10i/diag_f5557_wram.log), T2 600 of 600. Reads of the original's picture: 0. One 32-byte sprite block (words $67F0-$67FF) has no source found in the cartridge yet; it shows in no picture of the stretches."
              }
            },
            {
              "id": "x1.presentation.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 32,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidade: a imagem de cada fase desenhada pelo motor próprio a partir do próprio estado (L66: os trechos de referência sem ler a imagem do original). Completo exige todas as fases e telas.",
                "en": "No acceptance recorded yet. Unit: each stage's picture drawn by our engine from its own state (L66: the reference stretches without reading the original's picture). Complete needs every stage and screen."
              }
            },
            {
              "id": "x1.presentation.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 31,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidade: a imagem de cada fase desenhada pelo motor próprio a partir do próprio estado (L66: os trechos de referência sem ler a imagem do original). Completo exige todas as fases e telas.",
                "en": "No acceptance recorded yet. Unit: each stage's picture drawn by our engine from its own state (L66: the reference stretches without reading the original's picture). Complete needs every stage and screen."
              }
            }
          ]
        },
        {
          "id": "x1.pack",
          "weightBp": 96,
          "group": "x1",
          "title": {
            "pt": "X1 · Dados extraídos do cartucho",
            "en": "X1 · Data extracted from the cartridge"
          },
          "description": {
            "pt": "Imagens, paletas, fases e sons extraídos do cartucho do próprio jogador.",
            "en": "Graphics, palettes, stages and sounds extracted from the player's own cartridge."
          },
          "steps": [
            {
              "id": "x1.pack.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 38,
              "status": "partial",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/open/N46-pack-fonts-audio-and-shot-28.md",
                "docs/tasks/done/N5-pack-builder-graphics.md",
                "docs/tasks/done/N5b-pack-metatiles-collision.md",
                "docs/tasks/done/N5c-pack-anims-assemblies.md",
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Unidade: os 11 tipos de dado da seção 2 do design (tiles, paletas, animações de paleta, layouts, metatiles, colisão, listas de eventos, montagens de sprite, tabelas de animação, fontes, áudio renderizado). N5: paletas 4578/4578, gráficos 1017/1017, animações de paleta 26/26, layouts 13/13, eventos 14/14. N5b (commit 2e7478326): metatiles 104/104 e colisão 26/26, iguais ao extrator de referência. N5c (commit 2befea98b): tabelas de animação 1808/1808 e montagens de sprite 3601/3601 (176 sprites), iguais aos leitores de extract_char_sheets.py. N46 (commit 4b10aab34): fontes 240 de 240 (86:F6F7 bloco $0F, primeiro glifo $10), e o CHR de BG3 do diálogo 256 de 256 igual ao do original ao desenhar diálogo. Falta o áudio renderizado: escrito por tools/audio_pack (N3, N4), ainda sem conferência N de N no pacote (razão na N46).",
                "en": "Unit: the 11 data kinds of design section 2 (tiles, palettes, palette animations, layouts, metatiles, collision, event lists, sprite assemblies, animation tables, fonts, rendered audio). N5: palettes 4578/4578, graphics 1017/1017, palette animations 26/26, layouts 13/13, events 14/14. N5b (commit 2e7478326): metatiles 104/104 and collision 26/26, equal to the reference extractor. N5c (commit 2befea98b): animation tables 1808/1808 and sprite assemblies 3601/3601 (176 sprites), equal to the extract_char_sheets.py readers. N46 (commit 4b10aab34): fonts 240 of 240 (86:F6F7 block $0F, first glyph $10), and the dialogue BG3 CHR 256 of 256 equal to the original's while it draws dialogue. Left: rendered audio, written by tools/audio_pack (N3, N4), with no pack gate N of N yet (reason in N46)."
              },
              "partial": {
                "seen": 10,
                "total": 11,
                "$source": "docs/plans/2026-09-30-native-engine-design.md section 2 \"Asset pack\" (11 kinds) + docs/tasks/done/N5-pack-builder-graphics.md, docs/tasks/done/N5b-pack-metatiles-collision.md, docs/tasks/done/N5c-pack-anims-assemblies.md and docs/tasks/open/N46-pack-fonts-audio-and-shot-28.md Result gates"
              }
            },
            {
              "id": "x1.pack.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 29,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            },
            {
              "id": "x1.pack.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 29,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "x2.player",
          "weightBp": 293,
          "group": "x2",
          "title": {
            "pt": "X2 · X: movimento e sobrevivência",
            "en": "X2 · X: movement and survival"
          },
          "description": {
            "pt": "Movimentos, dano, morte e melhorias do personagem, conferidos com o jogo original.",
            "en": "The character's moves, damage, death and upgrades, checked against the original game."
          },
          "steps": [
            {
              "id": "x2.player.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 117,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.player.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 88,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.player.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 88,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            }
          ]
        },
        {
          "id": "x2.weapons",
          "weightBp": 244,
          "group": "x2",
          "title": {
            "pt": "X2 · Armas e tiros",
            "en": "X2 · Weapons and shots"
          },
          "description": {
            "pt": "Tiro normal e carregado e as armas especiais, com energia e efeitos.",
            "en": "Normal and charged shots and the special weapons, with energy and effects."
          },
          "steps": [
            {
              "id": "x2.weapons.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 98,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.weapons.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 73,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.weapons.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 73,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            }
          ]
        },
        {
          "id": "x2.enemies",
          "weightBp": 366,
          "group": "x2",
          "title": {
            "pt": "X2 · Inimigos",
            "en": "X2 · Enemies"
          },
          "description": {
            "pt": "Cada família de inimigo conta uma vez, não uma vez por fase.",
            "en": "Each enemy family counts once, not once per stage."
          },
          "steps": [
            {
              "id": "x2.enemies.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 146,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.enemies.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 110,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.enemies.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 110,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            }
          ]
        },
        {
          "id": "x2.bosses",
          "weightBp": 440,
          "group": "x2",
          "title": {
            "pt": "X2 · Chefes e subchefes",
            "en": "X2 · Bosses and minibosses"
          },
          "description": {
            "pt": "Cada chefe e subchefe: entrada, ataques, dano, derrota e recompensa.",
            "en": "Each boss and miniboss: entrance, attacks, damage, defeat and reward."
          },
          "steps": [
            {
              "id": "x2.bosses.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 176,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.bosses.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 132,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.bosses.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 132,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            }
          ]
        },
        {
          "id": "x2.stages",
          "weightBp": 635,
          "group": "x2",
          "title": {
            "pt": "X2 · Fases e câmera",
            "en": "X2 · Stages and camera"
          },
          "description": {
            "pt": "Carregar cada fase, a câmera, o surgimento dos inimigos e as partes móveis do cenário.",
            "en": "Loading each stage, the camera, enemies appearing and the moving parts of the scenery."
          },
          "steps": [
            {
              "id": "x2.stages.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 254,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.stages.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 191,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.stages.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 190,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            }
          ]
        },
        {
          "id": "x2.campaign",
          "weightBp": 366,
          "group": "x2",
          "title": {
            "pt": "X2 · Campanha, menus e itens",
            "en": "X2 · Campaign, menus and items"
          },
          "description": {
            "pt": "Título, escolha de fases, senha, cápsulas, itens, cenas e créditos.",
            "en": "Title, stage select, password, capsules, items, scenes and credits."
          },
          "steps": [
            {
              "id": "x2.campaign.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 146,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.campaign.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 110,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.campaign.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 110,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            }
          ]
        },
        {
          "id": "x2.audio",
          "weightBp": 134,
          "group": "x2",
          "title": {
            "pt": "X2 · Som e música",
            "en": "X2 · Sound and music"
          },
          "description": {
            "pt": "Efeitos e músicas tocados pelo motor próprio, iguais ao chip de som original.",
            "en": "Effects and music played by our own engine, equal to the original sound chip."
          },
          "steps": [
            {
              "id": "x2.audio.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 54,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.audio.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 40,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.audio.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 40,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            }
          ]
        },
        {
          "id": "x2.presentation",
          "weightBp": 107,
          "group": "x2",
          "title": {
            "pt": "X2 · Imagem na tela",
            "en": "X2 · Picture on screen"
          },
          "description": {
            "pt": "A imagem que o motor próprio desenha a partir do estado do jogo.",
            "en": "The picture our own engine draws from the game state."
          },
          "steps": [
            {
              "id": "x2.presentation.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 43,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.presentation.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 32,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.presentation.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 32,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            }
          ]
        },
        {
          "id": "x2.pack",
          "weightBp": 98,
          "group": "x2",
          "title": {
            "pt": "X2 · Dados extraídos do cartucho",
            "en": "X2 · Data extracted from the cartridge"
          },
          "description": {
            "pt": "Imagens, paletas, fases e sons extraídos do cartucho do próprio jogador.",
            "en": "Graphics, palettes, stages and sounds extracted from the player's own cartridge."
          },
          "steps": [
            {
              "id": "x2.pack.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 39,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.pack.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 30,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            },
            {
              "id": "x2.pack.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 29,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x2.md lista 110 entradas na tabela de objetos, 78 delas sem código marcado no export, e nenhuma fase decodificada. Os testes do esqueleto N2/N2B deram NOT-YET (24,39 % de telas iguais no jogo) e não pontuam.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x2.md lists 110 object-table entries, 78 of them not marked as code in the export, and no decoded stages. The N2/N2B skeleton tests were NOT-YET (24.39 % equal gameplay screens) and earn nothing."
              }
            }
          ]
        },
        {
          "id": "x3.player-x",
          "weightBp": 147,
          "group": "x3",
          "title": {
            "pt": "X3 · X: movimento e sobrevivência",
            "en": "X3 · X: movement and survival"
          },
          "description": {
            "pt": "O personagem X neste jogo.",
            "en": "The character X in this game."
          },
          "steps": [
            {
              "id": "x3.player-x.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 59,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.player-x.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 44,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.player-x.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 44,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            }
          ]
        },
        {
          "id": "x3.player-zero",
          "weightBp": 146,
          "group": "x3",
          "title": {
            "pt": "X3 · Zero: movimento, ataques e sobrevivência",
            "en": "X3 · Zero: movement, attacks and survival"
          },
          "description": {
            "pt": "O comportamento original de Zero, com o código dele trazido para o motor próprio.",
            "en": "Zero's original behaviour, with his code brought into our own engine."
          },
          "steps": [
            {
              "id": "x3.player-zero.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 58,
              "status": "verified",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [
                "docs/tasks/done/PC7B2-x3-zero-frame-pairs.md",
                "docs/tasks/done/PC7B-x3-zero-frame-body-port.md",
                "docs/tasks/done/PC7C-x3-zero-body-collision-x1-terrain.md",
                "docs/tasks/done/PC7H-zero-air-attack-terrain-exits.md",
                "knowledge_base/mmx3/rom/zero_frame_pairs_2026-10-04_finish.json"
              ],
              "note": {
                "pt": "PC7B/B2: 900/900 chamadas exatas (carga total $4A/$4C/$4E/$50, sabre verde $5C/$5E, morte); PC7C: colisão 300/300; PC7H (commit b5cf95b38): 29 de 29 saídas aéreas. A cadeia contínua antiga ainda dá 1827/3370 (fase \"completo\"). Hoje roda hospedado no executável atual, dentro das fases do X1.",
                "en": "PC7B/B2: 900/900 exact calls (full charge $4A/$4C/$4E/$50, green saber $5C/$5E, death); PC7C: collision 300/300; PC7H (commit b5cf95b38): 29 of 29 air exits. The old chained run is still 1827/3370 (the \"complete\" phase). Today it runs hosted in the current exe, inside X1 stages."
              }
            },
            {
              "id": "x3.player-zero.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 44,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [
                "docs/tasks/done/PC7H-zero-air-attack-terrain-exits.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. PC7H estacionado: chute na parede, deslizar e agarrar escada durante $4E/$50 sem gravação; laço contínuo 1827/3370.",
                "en": "No acceptance recorded yet. PC7H parked: wall kick, wall slide and ladder grab during $4E/$50 not captured; chained loop 1827/3370."
              }
            },
            {
              "id": "x3.player-zero.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 44,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "x3.weapons",
          "weightBp": 244,
          "group": "x3",
          "title": {
            "pt": "X3 · Armas e tiros",
            "en": "X3 · Weapons and shots"
          },
          "description": {
            "pt": "Tiro normal e carregado e as armas especiais, com energia e efeitos.",
            "en": "Normal and charged shots and the special weapons, with energy and effects."
          },
          "steps": [
            {
              "id": "x3.weapons.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 98,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.weapons.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 73,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.weapons.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 73,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            }
          ]
        },
        {
          "id": "x3.enemies",
          "weightBp": 366,
          "group": "x3",
          "title": {
            "pt": "X3 · Inimigos",
            "en": "X3 · Enemies"
          },
          "description": {
            "pt": "Cada família de inimigo conta uma vez, não uma vez por fase.",
            "en": "Each enemy family counts once, not once per stage."
          },
          "steps": [
            {
              "id": "x3.enemies.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 146,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.enemies.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 110,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.enemies.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 110,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            }
          ]
        },
        {
          "id": "x3.bosses",
          "weightBp": 440,
          "group": "x3",
          "title": {
            "pt": "X3 · Chefes e subchefes",
            "en": "X3 · Bosses and minibosses"
          },
          "description": {
            "pt": "Cada chefe e subchefe: entrada, ataques, dano, derrota e recompensa.",
            "en": "Each boss and miniboss: entrance, attacks, damage, defeat and reward."
          },
          "steps": [
            {
              "id": "x3.bosses.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 176,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.bosses.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 132,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.bosses.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 132,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            }
          ]
        },
        {
          "id": "x3.stages",
          "weightBp": 635,
          "group": "x3",
          "title": {
            "pt": "X3 · Fases e câmera",
            "en": "X3 · Stages and camera"
          },
          "description": {
            "pt": "Carregar cada fase, a câmera, o surgimento dos inimigos e as partes móveis do cenário.",
            "en": "Loading each stage, the camera, enemies appearing and the moving parts of the scenery."
          },
          "steps": [
            {
              "id": "x3.stages.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 254,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.stages.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 191,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.stages.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 190,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            }
          ]
        },
        {
          "id": "x3.campaign",
          "weightBp": 366,
          "group": "x3",
          "title": {
            "pt": "X3 · Campanha, menus e itens",
            "en": "X3 · Campaign, menus and items"
          },
          "description": {
            "pt": "Título, escolha de fases, senha, cápsulas, itens, cenas e créditos.",
            "en": "Title, stage select, password, capsules, items, scenes and credits."
          },
          "steps": [
            {
              "id": "x3.campaign.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 146,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.campaign.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 110,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.campaign.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 110,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            }
          ]
        },
        {
          "id": "x3.audio",
          "weightBp": 134,
          "group": "x3",
          "title": {
            "pt": "X3 · Som e música",
            "en": "X3 · Sound and music"
          },
          "description": {
            "pt": "Efeitos e músicas tocados pelo motor próprio, iguais ao chip de som original.",
            "en": "Effects and music played by our own engine, equal to the original sound chip."
          },
          "steps": [
            {
              "id": "x3.audio.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 54,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.audio.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 40,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.audio.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 40,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            }
          ]
        },
        {
          "id": "x3.presentation",
          "weightBp": 107,
          "group": "x3",
          "title": {
            "pt": "X3 · Imagem na tela",
            "en": "X3 · Picture on screen"
          },
          "description": {
            "pt": "A imagem que o motor próprio desenha a partir do estado do jogo.",
            "en": "The picture our own engine draws from the game state."
          },
          "steps": [
            {
              "id": "x3.presentation.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 43,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.presentation.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 32,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.presentation.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 32,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            }
          ]
        },
        {
          "id": "x3.pack",
          "weightBp": 98,
          "group": "x3",
          "title": {
            "pt": "X3 · Dados extraídos do cartucho",
            "en": "X3 · Data extracted from the cartridge"
          },
          "description": {
            "pt": "Imagens, paletas, fases e sons extraídos do cartucho do próprio jogador.",
            "en": "Graphics, palettes, stages and sounds extracted from the player's own cartridge."
          },
          "steps": [
            {
              "id": "x3.pack.port",
              "title": {
                "pt": "Traduzido e igual ao original nos trechos gravados",
                "en": "Translated and equal to the original on the recorded stretches"
              },
              "weightBp": 39,
              "status": "pending",
              "acceptance": {
                "pt": "O código do motor próprio dá o mesmo resultado que o jogo original em cada chamada gravada.",
                "en": "Our engine's own code gives the same result as the original game on every recorded call."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.pack.complete",
              "title": {
                "pt": "Completo: todos os casos conferidos",
                "en": "Complete: every case checked"
              },
              "weightBp": 30,
              "status": "pending",
              "acceptance": {
                "pt": "Todos os casos, estados e caminhos conferidos com o original, também em sequência, sem nenhum trecho faltando.",
                "en": "Every case, state and path checked against the original, also in sequence, with nothing missing."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            },
            {
              "id": "x3.pack.playable",
              "title": {
                "pt": "Jogável no motor próprio e aprovado",
                "en": "Playable on our own engine and approved"
              },
              "weightBp": 29,
              "status": "pending",
              "acceptance": {
                "pt": "Funciona no jogo montado só com o motor próprio e passa por uma partida revisada.",
                "en": "Works in the game built on our own engine alone and passes a reviewed run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Unidades ainda não contadas: docs/rom/census_x3.md lista 110 entradas na tabela de objetos, 16 delas sem código marcado no export, e nenhuma fase decodificada.",
                "en": "No acceptance recorded yet. Units not counted yet: docs/rom/census_x3.md lists 110 object-table entries, 16 of them not marked as code in the export, and no decoded stages."
              }
            }
          ]
        },
        {
          "id": "integration.navigation",
          "weightBp": 200,
          "group": "integration",
          "title": {
            "pt": "Escolher e trocar entre os três jogos",
            "en": "Choose and switch between the three games"
          },
          "description": {
            "pt": "Um só programa com X1, X2 e X3 e um jeito fácil de ir de um para outro.",
            "en": "One program with X1, X2 and X3 and an easy way to move between them."
          },
          "steps": [
            {
              "id": "integration.navigation.1",
              "title": {
                "pt": "Escolha do jogo e volta para ela",
                "en": "Game choice and returning to it"
              },
              "weightBp": 100,
              "status": "pending",
              "acceptance": {
                "pt": "Escolher X1, X2 ou X3 no mesmo programa e voltar ao menu sem perder nada.",
                "en": "Pick X1, X2 or X3 in the same program and return to the menu without losing anything."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            },
            {
              "id": "integration.navigation.2",
              "title": {
                "pt": "Progresso e opções de cada jogo",
                "en": "Progress and options for each game"
              },
              "weightBp": 100,
              "status": "pending",
              "acceptance": {
                "pt": "Cada jogo guarda o próprio progresso e as próprias opções.",
                "en": "Each game keeps its own progress and options."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "integration.cross-weapons",
          "weightBp": 200,
          "group": "integration",
          "title": {
            "pt": "Armas de um jogo nos outros",
            "en": "One game's weapons in the others"
          },
          "description": {
            "pt": "As armas do X1 no X2 e no X3, e as do X2 e X3 nas fases do X1.",
            "en": "X1's weapons in X2 and X3, and X2's and X3's weapons in X1's stages."
          },
          "steps": [
            {
              "id": "integration.cross-weapons.1",
              "title": {
                "pt": "Armas do X1 no X2 e no X3",
                "en": "X1's weapons in X2 and X3"
              },
              "weightBp": 100,
              "status": "pending",
              "acceptance": {
                "pt": "Usar as armas do X1 nas fases do X2 e do X3, com o mesmo comportamento do jogo de origem.",
                "en": "Use X1's weapons in X2 and X3 stages, behaving as in their source game."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. Tabela de tipos de dano decidida na seção 2 do design (30/09); nada construído.",
                "en": "No acceptance recorded yet. Damage-type table decided in design section 2 (09-30); nothing built."
              }
            },
            {
              "id": "shared-arsenal-1",
              "title": {
                "pt": "Primeira arma de outro jogo",
                "en": "First weapon from another game"
              },
              "weightBp": 100,
              "status": "pending",
              "acceptance": {
                "pt": "Conferir a arma contra o jogo de origem e integrá-la a X1.",
                "en": "Check the weapon against its source game and integrate it into X1."
              },
              "evidence": [],
              "note": {
                "pt": "Veio dos Extras (\"Arsenal entre jogos\"). Ainda sem aceite registrado.",
                "en": "Moved from Extras (\"Cross-game arsenal\"). No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "integration.bosses",
          "weightBp": 200,
          "group": "integration",
          "title": {
            "pt": "Chefes e inimigos reagem às armas de qualquer jogo",
            "en": "Bosses and enemies react to weapons from any game"
          },
          "description": {
            "pt": "Cada arma tem um tipo de dano; fraquezas e resistências valem para armas de qualquer jogo.",
            "en": "Each weapon has a damage type; weaknesses and resistances apply to weapons from any game."
          },
          "steps": [
            {
              "id": "shared-arsenal-2",
              "title": {
                "pt": "Compatibilidade e equilíbrio",
                "en": "Compatibility and balance"
              },
              "weightBp": 100,
              "status": "pending",
              "acceptance": {
                "pt": "Definir dano, imunidades, energia e interações por alvo.",
                "en": "Define damage, immunity, energy and target interactions."
              },
              "evidence": [],
              "note": {
                "pt": "Veio dos Extras (\"Arsenal entre jogos\"). Ainda sem aceite registrado.",
                "en": "Moved from Extras (\"Cross-game arsenal\"). No acceptance recorded yet."
              }
            },
            {
              "id": "integration.bosses.2",
              "title": {
                "pt": "Reações dos chefes conferidas",
                "en": "Boss reactions checked"
              },
              "weightBp": 100,
              "status": "pending",
              "acceptance": {
                "pt": "Queimar, congelar, quebrar armadura e cortar partes seguem as tabelas originais de cada chefe.",
                "en": "Burning, freezing, armour break and cutting parts follow each boss's original tables."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. Tabela de tipos de dano decidida na seção 2 do design (30/09); nada construído.",
                "en": "No acceptance recorded yet. Damage-type table decided in design section 2 (09-30); nothing built."
              }
            }
          ]
        },
        {
          "id": "integration.weapon-choice",
          "weightBp": 200,
          "group": "integration",
          "title": {
            "pt": "Escolha das armas",
            "en": "Weapon choice"
          },
          "description": {
            "pt": "Escolher quais armas levar, entre as dos três jogos.",
            "en": "Choose which weapons to take, among those of the three games."
          },
          "steps": [
            {
              "id": "integration.weapon-choice.1",
              "title": {
                "pt": "Escolher as armas antes da fase",
                "en": "Choosing the weapons before a stage"
              },
              "weightBp": 100,
              "status": "pending",
              "acceptance": {
                "pt": "Montar a seleção de armas antes de entrar numa fase, em qualquer um dos jogos.",
                "en": "Build the weapon selection before entering a stage, in any of the games."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado.",
                "en": "No acceptance recorded yet."
              }
            },
            {
              "id": "shared-arsenal-3",
              "title": {
                "pt": "Seleção e apresentação",
                "en": "Selection and presentation"
              },
              "weightBp": 100,
              "status": "pending",
              "acceptance": {
                "pt": "Completar seleção, ícones, efeitos e som do arsenal oferecido.",
                "en": "Complete selection, icons, effects and sound for the offered arsenal."
              },
              "evidence": [],
              "note": {
                "pt": "Veio dos Extras (\"Arsenal entre jogos\"). Ainda sem aceite registrado.",
                "en": "Moved from Extras (\"Cross-game arsenal\"). No acceptance recorded yet."
              }
            }
          ]
        },
        {
          "id": "integration.translation",
          "weightBp": 200,
          "group": "integration",
          "title": {
            "pt": "Tradução para português do Brasil",
            "en": "Brazilian Portuguese translation"
          },
          "description": {
            "pt": "Todo o texto de X1, X2 e X3 disponível em português do Brasil no motor próprio.",
            "en": "All the text of X1, X2 and X3 available in Brazilian Portuguese in our own engine."
          },
          "steps": [
            {
              "id": "integration.translation.1",
              "title": {
                "pt": "Lista de todos os textos de cada jogo",
                "en": "The list of every text in each game"
              },
              "weightBp": 67,
              "status": "pending",
              "acceptance": {
                "pt": "Uma lista contada de todos os textos de X1, X2 e X3, tirada do próprio cartucho de cada jogo.",
                "en": "A counted list of every text in X1, X2 and X3, taken from each game's own cartridge."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. Item pedido em 2026-10-05; nenhuma lista de textos contada ainda.",
                "en": "No acceptance recorded yet. Item requested on 2026-10-05; no text list counted yet."
              }
            },
            {
              "id": "integration.translation.2",
              "title": {
                "pt": "Texto em português para cada item",
                "en": "Portuguese text for every entry"
              },
              "weightBp": 67,
              "status": "pending",
              "acceptance": {
                "pt": "Cada item da lista tem seu texto em português do Brasil escrito e revisado.",
                "en": "Every entry of the list has its Brazilian Portuguese text written and reviewed."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. Item pedido em 2026-10-05; nenhuma lista de textos contada ainda.",
                "en": "No acceptance recorded yet. Item requested on 2026-10-05; no text list counted yet."
              }
            },
            {
              "id": "integration.translation.3",
              "title": {
                "pt": "Opção de idioma no jogo, aprovada",
                "en": "Language option in play, approved"
              },
              "weightBp": 66,
              "status": "pending",
              "acceptance": {
                "pt": "Uma opção de idioma no motor próprio mostra o texto em português durante o jogo e é aprovada numa partida.",
                "en": "A language option in our own engine shows the Portuguese text during play and is approved in a run."
              },
              "evidence": [
                "docs/plans/2026-09-30-native-engine-design.md"
              ],
              "note": {
                "pt": "Ainda sem aceite registrado. Item pedido em 2026-10-05; nenhuma lista de textos contada ainda.",
                "en": "No acceptance recorded yet. Item requested on 2026-10-05; no text list counted yet."
              }
            }
          ]
        }
      ]
    },
    {
      "id": "extras-x1",
      "title": {
        "pt": "Extras",
        "en": "Extras"
      },
      "color": "#ff626e",
      "totalWeightBp": 10000,
      "description": {
        "pt": "Modos novos e coisas realmente inéditas: personagens extras, treino, desafios, mapas gerados, editor e criações próprias.",
        "en": "New modes and truly new content: extra characters, training, challenges, generated maps, the editor and our own creations."
      },
      "context": {
        "pt": "Vile e Zero já funcionam em testes do início de Chill Penguin. Mapas gerados e treino também têm entregas verificadas; os modos completos continuam em desenvolvimento.",
        "en": "Vile and Zero already work in tests at the start of Chill Penguin. Generated maps and training also have verified deliverables; complete modes remain in development."
      },
      "totals": {
        "verifiedBp": 3000,
        "partialBp": 0,
        "sumBp": 3000
      },
      "features": [
        {
          "id": "extra-characters",
          "weightBp": 1500,
          "title": {
            "pt": "Vile jogável e desbloqueável",
            "en": "Playable, unlockable Vile"
          },
          "description": {
            "pt": "Movimentos e ataques próprios, com integração à campanha de X1.",
            "en": "His own moves and attacks, integrated into the X1 campaign."
          },
          "steps": [
            {
              "id": "vile-motion",
              "weightBp": 300,
              "status": "verified",
              "title": {
                "pt": "Movimento, paredes e escadas",
                "en": "Movement, walls and ladders"
              },
              "acceptance": {
                "pt": "Movimentos seguem a especificação aprovada do personagem nos testes dedicados.",
                "en": "Moves follow the approved character specification in dedicated tests."
              },
              "evidence": [
                "docs/plans/2026-10-03-pc10-vile-native-plan.md",
                "tests/native/vile_move_ground_test.cpp",
                "tests/native/vile_move_wall_test.cpp"
              ],
              "note": {
                "pt": "PC10C/D; aceitação das rotinas de movimento, não de todas as fases.",
                "en": "PC10C/D; movement-routine acceptance, not all-stage acceptance."
              }
            },
            {
              "id": "vile-attacks",
              "weightBp": 300,
              "status": "verified",
              "title": {
                "pt": "Canhão, bomba e ataque com dash",
                "en": "Cannon, bomb and dash attack"
              },
              "acceptance": {
                "pt": "Os três ataques respeitam os dados aprovados de velocidade, dano e duração.",
                "en": "All three attacks follow the approved speed, damage and duration data."
              },
              "evidence": [
                "docs/tasks/done/PC10F-vile-shoulder-cannon.md",
                "docs/tasks/done/PC10G-vile-air-bomb.md",
                "docs/tasks/done/PC10H-vile-dash-attack.md"
              ],
              "note": {
                "pt": "Testes native.vile-cannon, native.vile-bomb e native.vile-dash-attack.",
                "en": "Tests native.vile-cannon, native.vile-bomb and native.vile-dash-attack."
              }
            },
            {
              "id": "vile-health",
              "weightBp": 200,
              "status": "verified",
              "title": {
                "pt": "Dano, vida e barra própria",
                "en": "Damage, health and character gauge"
              },
              "acceptance": {
                "pt": "Receber dano e atualizar a barra preserva as regras e o ícone do personagem.",
                "en": "Taking damage and updating the gauge preserves the character rules and icon."
              },
              "evidence": [
                "docs/tasks/done/PC10E-vile-hurt-and-health.md",
                "docs/tasks/done/PC10R-hud-character-icon.md"
              ],
              "note": {
                "pt": "PC10E/R; testes de vida e HUD.",
                "en": "PC10E/R; health and HUD tests."
              }
            },
            {
              "id": "vile-opening",
              "weightBp": 200,
              "status": "verified",
              "title": {
                "pt": "Primeiro trecho de Chill Penguin",
                "en": "Chill Penguin opening section"
              },
              "acceptance": {
                "pt": "Entrar na fase e executar a sequência de movimentos e ataques sem falha.",
                "en": "Enter the stage and execute the movement and attack sequence without faults."
              },
              "evidence": [
                "docs/tasks/done/PC10O-vile-in-chill-penguin.md"
              ],
              "note": {
                "pt": "1017 chamadas, sem fallback ou exceção. Não é uma fase inteira.",
                "en": "1017 calls, no fallback or exception. This is not a whole stage."
              }
            },
            {
              "id": "vile-campaign",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Fase completa e restante da campanha",
                "en": "Full stage and remaining campaign"
              },
              "acceptance": {
                "pt": "Validar chefe, checkpoints, morte e continuação; repetir nas outras fases.",
                "en": "Validate the boss, checkpoints, death and retries; repeat in the other stages."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "vile-unlock",
              "weightBp": 100,
              "status": "pending",
              "title": {
                "pt": "Desbloqueio, seleção e progresso salvo",
                "en": "Unlocking, selection and saved progress"
              },
              "acceptance": {
                "pt": "Desbloquear e selecionar Vile pelo jogo, preservando a escolha ao salvar e carregar.",
                "en": "Unlock and select Vile in the game, preserving the selection across save and load."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "vile-presentation",
              "weightBp": 100,
              "status": "pending",
              "title": {
                "pt": "Apresentação e som completos",
                "en": "Complete presentation and sound"
              },
              "acceptance": {
                "pt": "Conferir animações, efeitos, sons e tema durante uma partida completa.",
                "en": "Review animations, effects, sounds and theme throughout a complete run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "zero-x1",
          "weightBp": 1000,
          "title": {
            "pt": "Zero nos mapas do X1",
            "en": "Zero in X1 stages"
          },
          "description": {
            "pt": "A adaptação ao mundo de X1 tem sua própria aceitação. As rotinas originais do personagem contam em X3.",
            "en": "The adaptation to the X1 world has its own acceptance. The original character routines count in X3."
          },
          "steps": [
            {
              "id": "zero-x1-drive",
              "weightBp": 100,
              "status": "verified",
              "title": {
                "pt": "Entrada e controle do personagem",
                "en": "Character entry and controls"
              },
              "acceptance": {
                "pt": "Selecionar Zero na execução local e transmitir comandos, posição e câmera.",
                "en": "Select Zero in a local run and connect input, position and camera."
              },
              "evidence": [
                "docs/tasks/done/PC7D-zero-x1-drive-skeleton.md"
              ],
              "note": {
                "pt": "native.zero-drive; seleção por --player zero, não por um menu final.",
                "en": "native.zero-drive; selection through --player zero, not a final menu."
              }
            },
            {
              "id": "zero-x1-combat",
              "weightBp": 200,
              "status": "verified",
              "title": {
                "pt": "Combate no primeiro trecho",
                "en": "Combat in the opening section"
              },
              "acceptance": {
                "pt": "Sabre e tiros atingem os inimigos conferidos no começo de Chill Penguin.",
                "en": "Saber and shots hit the checked enemies at the start of Chill Penguin."
              },
              "evidence": [
                "docs/plans/2026-10-04-zero-x1-drive-plan.md",
                "tests/native/zero_x1_integration_test.cpp"
              ],
              "note": {
                "pt": "50 acertos com dano exato; seis estados de ataque. Chefes e lâmina verde no cenário ainda pendentes.",
                "en": "50 exact-damage hits; six attack states. Bosses and the green blade in the scene remain pending."
              }
            },
            {
              "id": "zero-x1-retry",
              "weightBp": 150,
              "status": "verified",
              "title": {
                "pt": "Dano, barra de vida e continuação",
                "en": "Damage, health gauge and retries"
              },
              "acceptance": {
                "pt": "Receber dano, morrer e retornar à fase na sequência verificada.",
                "en": "Take damage, die and return to the stage in the verified sequence."
              },
              "evidence": [
                "docs/tasks/done/PC7F-zero-hurt-and-health-bar.md",
                "docs/plans/2026-10-04-zero-x1-drive-plan.md"
              ],
              "note": {
                "pt": "Dois retornos no teste native.zero-hurt; sem afirmação sobre todos os checkpoints.",
                "en": "Two retries in native.zero-hurt; no claim about every checkpoint."
              }
            },
            {
              "id": "zero-x1-exits",
              "weightBp": 150,
              "status": "pending",
              "title": {
                "pt": "Ataques aéreos, paredes e escadas",
                "en": "Air attacks, walls and ladders"
              },
              "acceptance": {
                "pt": "Completar saídas de ataques aéreos com e sem parede ou escada próxima.",
                "en": "Complete airborne attack exits with and without a nearby wall or ladder."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "zero-x1-stage",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Chill Penguin completo, incluindo o chefe",
                "en": "All of Chill Penguin, including the boss"
              },
              "acceptance": {
                "pt": "Completar percurso, perigos, checkpoints, morte, continuação e chefe em uma partida.",
                "en": "Complete traversal, hazards, checkpoints, death, retries and boss in one run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "zero-x1-presentation",
              "weightBp": 100,
              "status": "pending",
              "title": {
                "pt": "Cores, efeitos, ícone e som",
                "en": "Colors, effects, icon and sound"
              },
              "acceptance": {
                "pt": "Aplicar as cores dinâmicas e os efeitos; completar ícone e sons compatíveis.",
                "en": "Apply dynamic colors and effects; complete the icon and compatible sounds."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "zero-x1-campaign",
              "weightBp": 100,
              "status": "pending",
              "title": {
                "pt": "Seleção no jogo e demais fases",
                "en": "In-game selection and remaining stages"
              },
              "acceptance": {
                "pt": "Disponibilizar seleção e conferir água, melhorias, chefes e progressão em X1.",
                "en": "Provide selection and check water, upgrades, bosses and progression across X1."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "training",
          "weightBp": 1000,
          "title": {
            "pt": "Fase de treino",
            "en": "Training stage"
          },
          "description": {
            "pt": "Um lugar para praticar controles e experimentar ferramentas.",
            "en": "A place to practice controls and try tools."
          },
          "steps": [
            {
              "id": "training-entry",
              "weightBp": 300,
              "status": "verified",
              "title": {
                "pt": "Entrada pelo menu e chegada à arena",
                "en": "Menu entry and arena arrival"
              },
              "acceptance": {
                "pt": "Entrar no treino com cenário estável e apresentação de chegada.",
                "en": "Enter training with a stable background and arrival presentation."
              },
              "evidence": [
                "docs/tasks/done/M12-training-entry-with-ready.md"
              ],
              "note": {
                "pt": "M12: READY e teleporte conferidos; revisão manual final permanece pendente.",
                "en": "M12: READY and beam-in checked; final manual review remains pending."
              }
            },
            {
              "id": "training-tools",
              "weightBp": 300,
              "status": "verified",
              "title": {
                "pt": "Ferramentas de vida e melhorias",
                "en": "Health and upgrade tools"
              },
              "acceptance": {
                "pt": "Alterar vida e melhorias com estado e barra atualizados nos testes.",
                "en": "Change health and upgrades with state and gauge updated in tests."
              },
              "evidence": [
                "docs/tasks/done/M10-training-entry-and-tools-fixes.md"
              ],
              "note": {
                "pt": "M10: seleção preservada, vida máxima e recarga verificadas.",
                "en": "M10: preserved selection, maximum health and refill verified."
              }
            },
            {
              "id": "training-arena",
              "weightBp": 200,
              "status": "verified",
              "title": {
                "pt": "Arena de treino carregada no jogo",
                "en": "Training arena loaded in the game"
              },
              "acceptance": {
                "pt": "Usar o cenário revisado na fase de treino.",
                "en": "Use the revised layout in the training stage."
              },
              "evidence": [
                "docs/tasks/done/M14B-training-arena-v2-in-game.md"
              ],
              "note": {
                "pt": "M14B; a aceitação final pelo jogador não está incluída.",
                "en": "M14B; final player acceptance is not included."
              }
            },
            {
              "id": "training-final",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Saída, prática livre e aprovação final",
                "en": "Exit, free practice and final approval"
              },
              "acceptance": {
                "pt": "Fechar o fluxo de saída e conferir uma sessão completa de prática.",
                "en": "Finish the exit flow and review a complete practice session."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "bloody-palace",
          "weightBp": 1500,
          "title": {
            "pt": "Bloody Palace",
            "en": "Bloody Palace"
          },
          "description": {
            "pt": "Uma sequência de arenas de combate, com dificuldade crescente.",
            "en": "A sequence of combat arenas with increasing difficulty."
          },
          "steps": [
            {
              "id": "bloody-palace-1",
              "weightBp": 500,
              "status": "pending",
              "title": {
                "pt": "Ondas e arenas",
                "en": "Waves and arenas"
              },
              "acceptance": {
                "pt": "Definir e executar a sequência completa de combates.",
                "en": "Define and run the complete combat sequence."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "bloody-palace-2",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Chefes e encontros",
                "en": "Bosses and encounters"
              },
              "acceptance": {
                "pt": "Integrar adversários, limites de arena e câmera em cada encontro.",
                "en": "Integrate opponents, arena boundaries and camera in each encounter."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "bloody-palace-3",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Progressão, derrota e reinício",
                "en": "Progression, defeat and restart"
              },
              "acceptance": {
                "pt": "Passar entre desafios, encerrar a tentativa e reiniciar sem perder o estado correto.",
                "en": "Advance between challenges, end the attempt and restart with correct state."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "bloody-palace-4",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Recompensas e interface",
                "en": "Rewards and interface"
              },
              "acceptance": {
                "pt": "Mostrar objetivos, resultados e recompensas de forma consistente.",
                "en": "Show goals, results and rewards consistently."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "bloody-palace-5",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Partida completa aprovada",
                "en": "Approved complete run"
              },
              "acceptance": {
                "pt": "Terminar uma sequência completa e conferir equilíbrio e controles.",
                "en": "Finish a complete sequence and review balance and controls."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "boss-rush",
          "weightBp": 800,
          "title": {
            "pt": "Boss Rush",
            "en": "Boss Rush"
          },
          "description": {
            "pt": "Enfrentar chefes em sequência no motor atual.",
            "en": "Face bosses in sequence in the current engine."
          },
          "steps": [
            {
              "id": "boss-rush-1",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Entrada e sequência",
                "en": "Entry and sequence"
              },
              "acceptance": {
                "pt": "Escolher o modo e avançar pelos encontros previstos.",
                "en": "Choose the mode and advance through the planned encounters."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "boss-rush-2",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Chefes, arenas e personagens",
                "en": "Bosses, arenas and characters"
              },
              "acceptance": {
                "pt": "Conferir cada combate com os personagens oferecidos.",
                "en": "Check each fight with the available characters."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "boss-rush-3",
              "weightBp": 150,
              "status": "pending",
              "title": {
                "pt": "Derrota e nova tentativa",
                "en": "Defeat and retry"
              },
              "acceptance": {
                "pt": "Perder e reiniciar sem resíduos do encontro anterior.",
                "en": "Lose and restart without leftover state from the previous encounter."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "boss-rush-4",
              "weightBp": 150,
              "status": "pending",
              "title": {
                "pt": "Conclusão e aprovação",
                "en": "Completion and approval"
              },
              "acceptance": {
                "pt": "Terminar o modo e validar resultado, controles e apresentação.",
                "en": "Finish the mode and validate results, controls and presentation."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "roguelike",
          "weightBp": 2000,
          "title": {
            "pt": "Roguelike e mapas gerados",
            "en": "Roguelike and generated maps"
          },
          "description": {
            "pt": "A geração de mapas já começou; o ciclo completo de uma partida ainda precisa ser construído.",
            "en": "Map generation has started; the full run loop still needs to be built."
          },
          "steps": [
            {
              "id": "rogue-geometry",
              "weightBp": 250,
              "status": "verified",
              "title": {
                "pt": "Blocos de cenário e caminhos",
                "en": "Scenery chunks and paths"
              },
              "acceptance": {
                "pt": "Montar cenários a partir de blocos da fonte e verificar caminhos alcançáveis no modelo.",
                "en": "Assemble layouts from source chunks and check reachable paths in the model."
              },
              "evidence": [
                "docs/tasks/done/M14A-map-chunks-and-reachability.md",
                "docs/tasks/done/M14M-screen-level-assembly.md"
              ],
              "note": {
                "pt": "Alcançabilidade do modelo não prova uma partida completa; limites de portas e terreno permanecem no M14P.",
                "en": "Model reachability does not prove a complete run; door and terrain limits remain in M14P."
              }
            },
            {
              "id": "rogue-loading",
              "weightBp": 200,
              "status": "verified",
              "title": {
                "pt": "Exportação e carregamento de mapas",
                "en": "Map export and loading"
              },
              "acceptance": {
                "pt": "Exportar mapas gerados, carregá-los no jogo e verificar o início do percurso.",
                "en": "Export generated maps, load them in the game and check the start of traversal."
              },
              "evidence": [
                "docs/tasks/done/M14H-generated-map-export.md",
                "docs/tasks/done/M14I-load-generated-stage.md"
              ],
              "note": {
                "pt": "Quatro mapas carregados; caminhadas em três amostras. Sem aceitação de encontros ou de fases completas.",
                "en": "Four maps loaded; walks in three samples. No encounter or full-stage acceptance."
              }
            },
            {
              "id": "rogue-encounters",
              "weightBp": 400,
              "status": "pending",
              "title": {
                "pt": "Inimigos, itens e encontros",
                "en": "Enemies, items and encounters"
              },
              "acceptance": {
                "pt": "Povoar os mapas com encontros e recompensas compatíveis com o percurso.",
                "en": "Populate maps with encounters and rewards compatible with the route."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "rogue-variety",
              "weightBp": 500,
              "status": "pending",
              "title": {
                "pt": "Variedade e travessia completa",
                "en": "Variety and complete traversal"
              },
              "acceptance": {
                "pt": "Gerar mapas distintos e atravessáveis, incluindo portas, água e trechos verticais.",
                "en": "Generate distinct, traversable maps, including doors, water and vertical sections."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "rogue-run",
              "weightBp": 500,
              "status": "pending",
              "title": {
                "pt": "Ciclo de partida e progressão",
                "en": "Run loop and progression"
              },
              "acceptance": {
                "pt": "Completar início, escolhas, recompensas, derrota ou vitória e nova tentativa.",
                "en": "Complete the start, choices, rewards, defeat or victory and a new attempt."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "rogue-acceptance",
              "weightBp": 150,
              "status": "pending",
              "title": {
                "pt": "Equilíbrio e aprovação",
                "en": "Balance and approval"
              },
              "acceptance": {
                "pt": "Conferir partidas completas em várias sementes e aprovar os controles.",
                "en": "Review complete runs across multiple seeds and approve the controls."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "map-editor",
          "weightBp": 1000,
          "title": {
            "pt": "Editor de mapas e comunidade",
            "en": "Map editor and community"
          },
          "description": {
            "pt": "Editar, salvar e jogar mapas próprios, com compartilhamento seguro.",
            "en": "Edit, save and play custom maps, with safe sharing."
          },
          "steps": [
            {
              "id": "editor-data",
              "weightBp": 300,
              "status": "verified",
              "title": {
                "pt": "Leitura, edição e gravação dos dados",
                "en": "Reading, editing and writing data"
              },
              "acceptance": {
                "pt": "Regravar os mapas sem edição de forma idêntica e produzir a alteração solicitada.",
                "en": "Rewrite unedited maps identically and produce the requested edit."
              },
              "evidence": [
                "docs/tasks/done/M3-editor-pack-backend.md",
                "tests/cpp/map_editor_pack_backend_test.cpp"
              ],
              "note": {
                "pt": "13/13 layouts idênticos. Teste do backend; a interface completa não foi aceita.",
                "en": "13/13 identical layouts. Backend test; the complete interface has not been accepted."
              }
            },
            {
              "id": "editor-load",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Mapa editado jogável",
                "en": "Playable edited map"
              },
              "acceptance": {
                "pt": "Criar, salvar, reabrir e jogar uma fase editada pelo fluxo do editor.",
                "en": "Create, save, reopen and play an edited stage through the editor flow."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "editor-ui",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Fluxo de edição completo",
                "en": "Complete editing workflow"
              },
              "acceptance": {
                "pt": "Editar terreno, objetos e pontos de entrada com retorno visual e validação.",
                "en": "Edit terrain, objects and entry points with visual feedback and validation."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            },
            {
              "id": "editor-share",
              "weightBp": 200,
              "status": "pending",
              "title": {
                "pt": "Exportar e importar criações",
                "en": "Export and import creations"
              },
              "acceptance": {
                "pt": "Compartilhar uma criação, importá-la em outra instalação e conferir limites de arquivos.",
                "en": "Share a creation, import it in another installation and check file boundaries."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda não há aceitação registrada para esta entrega.",
                "en": "No acceptance has been recorded for this deliverable yet."
              }
            }
          ]
        },
        {
          "id": "original-content",
          "weightBp": 1200,
          "title": {
            "pt": "Conteúdo inédito: inimigo, cenário, chefe e armas novos",
            "en": "Original content: a new enemy, tileset, boss and weapons"
          },
          "description": {
            "pt": "Criações próprias que não existem em X1, X2 nem X3: pelo menos um inimigo novo, um cenário novo (conjunto de blocos de fase), um chefe novo e armas novas.",
            "en": "Our own creations that exist in none of X1, X2 or X3: at least one new enemy, one new tileset, one new boss and new weapons."
          },
          "steps": [
            {
              "id": "original-enemy",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Um inimigo novo",
                "en": "A new enemy"
              },
              "acceptance": {
                "pt": "Comportamento, imagem e som próprios, colocado numa fase e aprovado numa partida.",
                "en": "Its own behaviour, picture and sound, placed in a stage and approved in a run."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Os pontos vieram das duas entregas que passaram para o plano do motor (arsenal entre jogos e opções visuais).",
                "en": "No acceptance recorded yet. The points came from the two deliverables that moved to the engine roadmap (cross-game arsenal and visual options)."
              }
            },
            {
              "id": "original-tileset",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Um cenário novo",
                "en": "A new tileset"
              },
              "acceptance": {
                "pt": "Blocos, cores e colisão próprios, formando pelo menos uma área jogável aprovada.",
                "en": "Its own tiles, colours and collision, forming at least one approved playable area."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Os pontos vieram das duas entregas que passaram para o plano do motor (arsenal entre jogos e opções visuais).",
                "en": "No acceptance recorded yet. The points came from the two deliverables that moved to the engine roadmap (cross-game arsenal and visual options)."
              }
            },
            {
              "id": "original-boss",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Um chefe novo",
                "en": "A new boss"
              },
              "acceptance": {
                "pt": "Entrada, ataques, dano, derrota e recompensa próprios, aprovados numa luta completa.",
                "en": "Its own entrance, attacks, damage, defeat and reward, approved in a complete fight."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Os pontos vieram das duas entregas que passaram para o plano do motor (arsenal entre jogos e opções visuais).",
                "en": "No acceptance recorded yet. The points came from the two deliverables that moved to the engine roadmap (cross-game arsenal and visual options)."
              }
            },
            {
              "id": "original-weapons",
              "weightBp": 300,
              "status": "pending",
              "title": {
                "pt": "Armas novas (pelo menos duas)",
                "en": "New weapons (at least two)"
              },
              "acceptance": {
                "pt": "Tiro normal e carregado, energia, tipo de dano e efeito em inimigos e chefes, aprovados em jogo.",
                "en": "Normal and charged shot, energy, damage type and effect on enemies and bosses, approved in play."
              },
              "evidence": [],
              "note": {
                "pt": "Ainda sem aceite registrado. Os pontos vieram das duas entregas que passaram para o plano do motor (arsenal entre jogos e opções visuais).",
                "en": "No acceptance recorded yet. The points came from the two deliverables that moved to the engine roadmap (cross-game arsenal and visual options)."
              }
            }
          ]
        }
      ]
    }
  ]
}
