Update 2.77
6/10/2026
v2.77.0BETAMINOR
Seymour
SIN Chain Builder Gate 3: AiScriptLab validation bridge for the `SinApplyPlan` (read-only) — validates plans, does NOT apply; SIN stays BLOCKED for writing
- Opens Gate 3 of the SIN Chain Builder: it takes SHINRYU's preview-only
SinApplyPlan(Gate 2) and runs AiScriptLab/AiValidator-compatible checks over it, still without loading a monster, withoutRebuild/Splice, without an AEON diff, without disk and without applying anything. It answers exactly one question: "is this preview-only plan structurally acceptable (the bytecode it would emit is well-formed), and what are the honest blockers/warnings/errors that still stand between it and an apply?". New classes inFfxLib/Ai/Sin:SinPlanValidator(Validate(SinApplyPlan) → SinPlanValidationResult, reads onlyAiScript_Filestatic tables +AiStackModel+ the plan),SinPlanValidationResult(mirrorsAiValidationReport's vocabulary at the plan level:Errors/Blockers/Warnings/Infos,StructurallyValid= no Error,ApplyAcceptable= false by construction at Gate 3) andSinAiScriptLabBridge(the low-level checks over a looseAiInstructionstream, noAiScriptFile). Checks (the SOUND offline subset, identical to whatAiValidatoritself uses): (1) every opcode ∈ the 48 proven (AiScript_File.IsKnownOpcode); (2)HasOperandagrees with the0x80size rule (IsOperandBearing) — elseEmit()mis-sizes the stream; (3) per-instruction RT0 (Emit()re-decodes to the same opcode+operand); (4) statement-level stack balance viaAiStackModel(a linear body nets 0; a guard leaves exactly 1 bool for D7/POPXNCJMP). Verdict for the 3 pilots: all structurally valid BUT apply-BLOCKED (preview-only) — SIN-006/SIN-009 (linear) balance at net 0; SIN-010 (HP-guard) leaves exactly 1 bool + a net-0 action. SHINRYU's DIV/MUL finding handled EXPLICITLY (NEMESIS decision = keep as an EXPECTED BLOCKER, do NOT fix): the direction is proven (0x16=DIV/0x17=MULvia a 345-monster census + IDAFFX_Atel_InterpretWorkerOpcodes@0x864180+ FFXDataParser), soAiSnippetLibrary'sMULbound to0x16is a confirmed bug — but the full reconciliation (fix the constant + re-validate EVERY consumer:MonsterAiEditor,AiAutomation,--aiasm-rt0/--ai2/--ai3+ re-prove RT0/RT2) is a dedicated PATCH outside a read-only validation gate (and RT2 is forbidden for Gate 3). The structural insight proving why it must be a BLOCKER and not an Error:AiStackModelgives net -1 for BOTH DIV and MUL → the stack balances identically, the byte re-parses, and only RT2 catches the wrong arithmetic. The validator surfaces it as a Warning + Blocker with the full evidence, and the gate confirms the HP% recipe stays blocked and was NOT silently fixed (the planner still emits0x16,AiSnippetLibraryuntouched). Additive (non-breaking) extension:SinPlannedStepgainedGuardOps/BodyOps(the rawAiInstructions the planner already computed) so the validator inspects exactly what the planner produced (single source of truth; default empty → every Gate-2 construction site keeps compiling and--sin-dryrun-rt0stays PASS). New read-only gate--sin-validate-rt0: validates the 3 pilots and asserts structurally-valid + apply-NOT-acceptable + honest blockers + the promotion ladder unsatisfied + no candidate→authoring-ready + (SIN-010) the DIV/MUL blocker present and not-fixed; deterministic validation. (NEW executable capability: validator + gate). Scope/honesty: SIN stays BLOCKED for writing — Gate 3 validates plans, it does not apply plans; "Clean for DESIGN is not unlocked for WRITING" — and clean-structure does not unlock writing either. It does NOT do writer/save/Rebuild/Splice/AEON diff/backup/RT2/button/UI; it does NOT touchmonster_*.bin/runtime/Aurora/native-menu/Blitzball/Shop/Mix/Sphere/Common(ANIMA) or theMonsterAiEditor. Build 0 errors;--sin-validate-rt0+--sin-dryrun-rt0(Gate 2, no regression) +--aicmdmeta-rt0+--spiraatlas-rt0+--aiasm-rt0(AiScriptLab, 346/346 RT0 on the real corpus) all PASS. Docs:docs/ai/SIN_NEMESIS_AISCRIPTLAB_VALIDATION_RESULT_2026-06-10.md+docs/ai/HANDOFF_NEMESIS_SIN_AEON_DIFF_GATE_NEXT_2026-06-10.md
v2.76.0