Update 2.65
6/10/2026
v2.65.0BETA
Seymour
PC/Player Growth in the Spira Data Atlas (read-only, `proved-candidate`, byte-grounded, work/-independent)
- Plugs the REAL source of PC growth/stats into the provider: new
SpiraDataAtlasDetailKind.PlayerGrowthStat+ value-guarded accessorSpiraDataAtlasCatalog.TryGetPlayerGrowthStat(source, characterIndex, field, currentRawValue). Source =ply_save.bin(base/current stats) +ply_rom.bin(growth ROM: AP-requirement curveApReq A/B/C/Max+ per-stat auto-growth coefficients*CoefA/B), the SAME tables thePlayerGrowthEditoredits (parserPlayerKernel_File, RT0-proved by--player-rt0). The 20 slots (0–6 PC, 7 guest=Seymour, 8–17 Aeons, 18–19 unmapped) come from a byte-grounded compiled table (FfxLib/SpiraDataAtlas/PlayerGrowthData.cs, generated bytools/ffxdataparser_bridge/build_player_growth_index.ps1 -EmitCSharpfrom the.binfiles), so they exist in ANY build WITHOUTwork/(unlikePcAeonFineStat, which depends onwork/pc_save_stats_catalog.csvand is only a snapshot). Labels resolve at runtime viaCharacter_Enum(single source of truth). Honesty (non-obvious): the stat-growth coefficients are Aeon-only — PC/guest slots carry ZERO coefficients (PCs grow stats via the Sphere Grid); the only PC growth knob in this ROM is the AP-requirement curve. This is a DIFFERENT axis from BRASKA'ssum_grow.bin(auto-level ≠ customization recipe). REGION-SPECIFIC:ply_save/ply_romare NOT locale-invariant (thenew_uspcdata section differs from jppc/inpc; compiled table =new_uspc, the region the editor loads). The in-game AP-per-level / per-coefficient gain formula isRT2-pending(bytes/fields proved, runtime arithmetic not reversed). Value-guard = same value-space the editor edits → editing the field (raw mismatch), or an unknown slot/source/field → accessorfalse→ badge hides (mirror of Aeon/Shop/Mix). Gate--spiraatlas-rt021296 → 21316(+20; all unique) + 18 new asserts (count 20/8/10/2; PC coef zero; Aeon coef non-zero; region uspc; lookup Tidus BaseHp 520 / ply_rom AP max 22000 / Valefor HpCoef 6; value-guard9999hides; out-of-range slot/source/field miss; domain search; BIBLE domain player-growth). Read-only: no writer/UI/runtime/SIN; does not touchWriteSave/WriteRom, thePlayerGrowthEditorUI, ANIMA'sCommonengine (consumed only), or BRASKA/AURON/JECHT/RIKKU/WAKKA/VALEFOR/AURORA/SIN. Build 0 errors / 361 warnings;--player-rt0+--spiraatlas-rt0+--aicmdmeta-rt0PASS. Docs:docs/ai/ATLAS_TIDUS_PC_GROWTH_PROVIDER_RESULT_2026-06-10.md+ scoutdocs/ai/ATLAS_TIDUS_PC_GROWTH_SCOUT_RESULT_2026-06-10.md
v2.64.3
v2.65.1BETAPATCH
Seymour
Atlas evidence badge in the PlayerGrowthEditor + honest Sphere None/Passive labels (read-only, value-guarded, hide-on-edit)
- Atlas UI Sweep. (1) PlayerGrowthEditor: new
<common:AtlasEvidenceBadgeStrip>in the "Growth Curves" card (ply_rom.bin) consuming the already-built accessorSpiraDataAtlasCatalog.TryGetPlayerGrowthStat(source, characterIndex, field, currentRawValue)(v2.65.0, TIDUS). NewAtlasEvidenceInfo? SelectedCharacterEvidenceinPlayerGrowthEditor_DataModel, recomputed on slot change and inCharacterRowChanged(edit) → hide-on-edit: the badge anchors on 3 gate-proven growth values spanning both files/cards (ply_saveBase HP +ply_romAP max + HP coef A — the same lookups--spiraatlas-rt0proves: 520 / 22000 / 6); if any anchor diverges from the byte-grounded corpus the strip self-hides (same anchoring depth as the Mixv2.64.1/Aeonv2.64.3badges). (2) Sphere labels (honest,partial):sphere.bin ActionValue=0x0000now reads "None / Passive" andRangeValue=0x00reads "None" instead of "Unknown" —0x00is the third legitimate corpus value (~40% of spheres have no on-touch effect, Jarvis-AURON scout), not unknown; a "None" option is seeded into the dropdown + the fallback label fixed. (3)AiBibleWhereAppears.For: read-onlyplayer-growthandmixcases (honest "where it appears" text, no runtime-effect promotion;sphere-grid-nodealready existed). (REUSE of existing capability: UI consuming the already-built accessor + ANIMA'sCommonengine + label polish; direct precedent: the Mixv2.64.1/Aeonv2.64.3/Shopv2.61.2badges were PATCH; tie-breaker doubt→PATCH). No new writer: the SphereGridExplorer badge already shipped (v2.60.1); the player-growth writer/save path and sphere topology are untouched. Does not touch the provider/gate (--spiraatlas-rt0intact), ANIMA'sCommonengine (consumed only), runtime/Aurora/native-menu/SIN, or TIDUS/BRASKA/JECHT/RIKKU/WAKKA/VALEFOR/AURORA. Build 0 errors / 361 warnings;--spiraatlas-rt0+--player-rt0+--spheregrid-layout-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_LULU_PLAYER_GROWTH_SPHERE_BADGE_UI_RESULT_2026-06-10.md
v2.65.0
v2.65.2BETAPATCH
Seymour
Sphere Grid: empty-node RedundantContent preserved (0xFFFF) + Atlas where-appears polish
- Atlas Polish / Evidence Housekeeping (Jarvis-BARTHELLO). (A) Sphere Grid hardening (byte fidelity): in
SphereGrid_File.Builder.cs(the v2 LAYOUT writer, gated by--spheregrid-layout-rt0), the AUTHORING/EDIT pathsAddNode/NodeWithwroteRedundantContent = (ushort)(contentIndex & 0xFF)→ for an empty node (content0xFF) that produced0x00FF, diverging from shipped data. The corpus (Jarvis-AURON scout, 3,444/3,444 nodes: low byte == ContentIndex, high byte set only on the 23 empty Expert nodes) proves an empty node =0xFFFF, a filled node =0x00<content>. New private helperRedundantContentFor(contentIndex)mirrors the shipped convention (empty→0xFFFF, filled→0x00NN).FromExisting/Clonestill copiesRedundantContentverbatim → the no-edit round-trip stays byte-identical (untouched, re-proved by the gate). New assert in--spheregrid-edit-rt0(synthetic + the 3 corpus grids):SetNodeContent(idx, 0xFF)→ layout writes0xFFFFat node+0x06 + contents byte0xFF+ re-reads empty. Gameplay risk low (redundant field; the game reads content fromdat09/10/11+ reach-lists — IDA-proved by AURON on both binaries), but it is a fidelity divergence in an already-shipped writer. (B)AiBibleWhereAppears.Forpolish (read-only): added theaeon-growthcase (an Atlas domain closed inv2.64.0that was falling through to the empty fallback) with honest "where it appears / mapping" text; updatedsphere-grid-node(was stale: "Unknown6 stays raw/unknown") to reflect AURON's burn-down —Node.Unknown6is gameplay-inert (IDA-proved on both binaries), the possible residual = menu layout/visual (metadata-only), with no invented gameplay semantics. (fixes a latent fidelity bug in an already-shipped writer — "a consumer would benefit" → yes, byte fidelity — plus read-only text polish; tie-breaker doubt→PATCH). No new writer, no new UI, no provider/gate-count change (--spiraatlas-rt0intact), noCommonengine (ANIMA), runtime/AURORA/VALEFOR/native-menu/SIN, CHAPPU/save, or real grid topology (create/move/relink node stays a frontier) touched. Build 0 errors / 361 warnings;--spheregrid-edit-rt0+--spheregrid-layout-rt0+--spiraatlas-rt0+--aicmdmeta-rt0PASS. Doc:docs/ai/ATLAS_BARTHELLO_POLISH_RESULT_2026-06-10.md
v2.65.1
v2.65.3BETAPATCH
Seymour
SEYMOUR audit: the Atlas's 124 ATEL `unknown-call-shape` rows resolved into honest classes (read-only, byte-proven)
- ATEL Call-Shape Audit (pre-SIN). The
124field-writes the v8 semantic pass could not classify (field-write-unknown-call-shape) were audited at the bytecode level over the whole corpus (FFXDataParser target/text, 346 scripts) and decompose entirely into TWO proven classes, 0 remaining. (1)0x70A8 btlSetMotionData— 116 rows (100%): uniform shapePUSHII actor · PUSHII field · (PUSHII|PUSHF) value · CALLPOPA=(actor, field, value)into the motionProperty namespace (fields0x00..0x09, all named inAiMotionPropertyNames); the actor is a REAL ref (113× Self0xFFF3+ Monster#01/#02/#030x15/16/17h), across 25 monsters → classset-motion-data-actor-field-value(the explicit-actor sibling of0x70B2 setMotionField; NOTsetStatField). (2)0x7032 setActorFacingAngle— 8 rows: NOT a field write — it is(actor, angle), a 2-push call with no field-id; they leaked into the field catalog as a regex false-positive (only FLOAT angles render.facingAngle = 90.0 [42B40000h]and the v7 regex matched the.0 [hex]of the decimal; the 63 integer-angle sibling sites= 90 [5Ah]did not leak) → classnot-field-write. Changes: the bridgetools/ffxdataparser_bridge/build_atel_semantic_catalog.ps1(Get-FieldWriteSemanticKind+ risk notes) reclassifies both call-ids; v8 regenerates with0unknown (116+8 in the new classes); theAtelFieldWriteShapecount stays202(the relabel preserves thecallId|fieldHex|fieldName|semanticKind|fieldCategorykey cardinality, proven before/after); theunknown-healthpass drops199 → 75(the 124 ATEL leave the "blocked-until-audited" bucket); theSpiraDataAtlasCatalognarratives (atlas:field-call-shapes+ guardrail +atlas:unknown-health) are updated; the--spiraatlas-rt0asserts move (detail entries 21316→21192,Unknown health rows 199→75) + 2 new lock-asserts (0remaining unknown call-shapes +0x70A8motion-data present). Honesty: classifying ≠ authorizing a writer — everyAtelFieldWriteShapestaysread-only;not-writer-authority,70A8still has no button/write, nothing is promoted to SIN. Read-only fidelity finding: the EDITOR decoder (AiScript_File.cs) does not gloss70A8(absent fromFieldArgBack/FieldNameForFunc) andAiStackModellacks its arity → a display gap handed off to the MAGIC lane (docs/ai/HANDOFF_SEYMOUR_ATEL_DECODER_GLOSS_GAP_2026-06-10.md), with no gameplay effect. PATCH (refines/classifies an existing read-only catalog, resolves a SIN data-blocker; precedentv2.61.3/v2.62.1; tie-breaker doubt→PATCH). No new writer; does not touch runtime/AURORA/VALEFOR/native-menu/SIN-chain-builder/CHAPPU/save. Verified by an adversarial workflow (3 refuters + completeness critic). Build 0 errors / 361 warnings;--spiraatlas-rt0+--aicmdmeta-rt0+AiScriptLab --ai2(346/346) PASS. Doc:docs/ai/ATLAS_SEYMOUR_ATEL_CALL_SHAPE_AUDIT_RESULT_2026-06-10.md
v2.65.2