Skip to content

Terra Firma: Awakening — Functional Specification

Engine: Unreal Engine 5
Status: Engineering contract for Year 1 implementation
Companion locks: GDD (design truth) · Terra_Firma_FrontEnd_UI_UX_Spec.md (boot / menu / Command Deck)
Architecture map: Architecture Map
Does not replace: GDD catalogs (named bases, affix bible, Phonon recipes, Unique spreadsheet)

This document translates locked GDD systems into implementable Unreal Engine 5 requirements: actors, components, data, input, replication, and acceptance tests. Numeric bands that the GDD marks TBD stay TBD here. Pipeline shape, hard locks, and ownership of stats are not TBD.


A functional specification for the playable game: what the engine must do, who owns the data, and how a build is accepted. Every requirement is written so a programmer can implement it without inventing a second design.

Layer Owns File / volume
Product / FE flow Boot, Solo vs Online pools, EOS, Command Deck, Tab Local / World maps, GUI locator, Esc Terra_Firma_FrontEnd_UI_UX_Spec.md
Design Fantasy, catalogs, formulas, figures Master GDD + HTML reader tfa_gdd_html/
This spec Runtime behavior, UE5 mapping, acceptance This file. Player economy: FS-PRD-007 + §16b FS-ECO
Balance sheets Impact / Mag / Range bands, WSM, socket counts, XP curve Separate data. Cadence numbers locked here (FS-GUN-007); Fire Mode + AA baseline on Receiver (FS-GUN-008)
Worldbuilding Earth fiction, OmniVisor name, Spiritus Sight rarity Terra_Firma_Earth_Worldbuilding.md

Conflict rule: later volume lock wins over older GDD wording. Vol. 15 wins on HUD names (Field / Specialist / Siege). Vol. 16 + Character I win on attributes (STR / DEX / CON / INT / WIS; Energy is a pool). FE spec wins on Solo / Online save pools.

FS-<SYS>-<nnn> — functional shall.
AC-<SYS>-<nnn> — acceptance check.
TBD-<nnn> — open lock that must not be invented in code (expose as data).

Start from Lyra (CommonUI, Enhanced Input, modular experience, EOS hooks). Do not start a blank FPS template and re-derive menus.

Need UE5 system
Skills, Ultimates, auras, tentacles, grenades, procs Gameplay Ability System (GAS) + Gameplay Effects + Gameplay Cues
Stance, channels, quality, vision, difficulty Gameplay Tags
Tap / hold 1–7, double-tap dodge, contextual vault Enhanced Input (chord + hold + tap-hold)
Front-end, Character I, Command Deck CommonUI (UCommonActivatableWidget, UPrimaryGameLayout)
Online identity Epic Online Services (EOS)
Item / frame / affix / gem tables Primary Data Assets + Data Tables (not Blueprint-only bags)
Modular guns / melee Actor Components + skeletal sockets; Niagara attach on frame sockets
Vision overlays Post-process materials + custom stencil / custom depth
FPP ↔ TPP Custom APlayerCameraManager + spring-arm TPP + view-target blend
Melee Drive Motion Warping + root-motion windows; no homing magnet
Replication Server-authoritative combat and inventory on Online; local authority on Solo

Terra Firma: Awakening is a sci-fi action RPG: seamless first-person gun combat and third-person melee, ARPG item depth, procedural story dungeons, biomechanical tentacle progression, anti-FOMO cosmetics, Solo and Online integrity, Year 1 on Earth.

Two orthogonal axes. Do not collapse them.

Axis Values Owner
Realm Solo Local · Online FE spec. Separate character pools. Never transfer.
Ruleset Story · Progressive Multiplayer · Competitive Ladder Combat / loot. Same gunfeel baseline. Different Crit % and gear normalization.
  • Solo realm always runs Story ruleset.
  • Online realm can run Story campaign, Progressive MP, Ladder, Raids (2 / 4 / 8), and special coop Vaults.
  • Solo endgame uses authored SOLO OPS dungeons (Biolab Purge, Grid Collapse, System Purge, Core Collapse). No Raid. No special coop.

Human only. Race is read-only on Create Character. Later years unlock races on that same screen.

Order → Faction. Faction is derived from Order (not a free picker). Subclass is not chosen on Create Character. The Create Character widget (FE17) has no subclass control. Confirm writes the main class only (Enforcer / Arcwarden / Phantom). Subclasses are not a starting loadout; they open one after another as that class levels, in roster order (T1 then T2 then T3 then T4 then T5). Unlock levels live in data: TBD-029. Do not invent those levels in code.

Order Faction (main class) Subclass unlock order
Fist Enforcer Berserker → Vanguard → Shock Trooper → Battle Master → Seraph
Magus Arcwarden Pyrocaster → Torrentcaller → Zypher → Cyromancer → Stormbringer
Hidden Phantom Infiltrator → Specialist → Wraith → Shadow → Ghost

No class-specific item bases or paper-doll slots. All weapon and armor families are universal.

FS-PRD-005 — Difficulty tiers (resist penalty)

Section titled “FS-PRD-005 — Difficulty tiers (resist penalty)”
ID Fiction Non-kinetic resist penalty
Difficulty.Operative Normal 0
Difficulty.Veteran Nightmare −40
Difficulty.ApexThreat Hell −100; immunities common

Authority (Full game): Difficulty tier is area-authored — same spirit as monster level (FS-CMP-006) and Recommended Level (ARL) for PowerΔ (FS-DMG-009). The space / sector / dungeon / raid row owns the active Difficulty.* tag and RecommendedLevel. It is not chosen on Create Character and not a global player preference that overrides the world.

Entering an area applies that area’s difficulty (resist penalty on non-kinetic channels — FS-DMG-005 step 3) and that area’s ARL for Level Power Delta. Leaving / transitioning updates to the destination area’s tier and ARL. Exact area→tier / ARL table rows and any override spaces (e.g. pinnacle): TBD-001 (data fill — model is locked).

Demo Mod Encounter / difficulty may dial the tier and ARL session-wide for lab sims only — does not change Full-game area authorship. Design: docs/superpowers/specs/2026-10-26-demo-combat-economy-stats-design.md · docs/superpowers/specs/2026-10-26-level-power-delta-design.md.

Marketplace sells looks only (shaders, titles, hangar liveries). Seasons never vault. Power crafting is grind-honest, not shop-gated. Marketplace spend is LUMENAR (from BTUCOIN convert only; cash packs mint BTUCOIN 51/49 and do not grant LUMENAR). Play-earned Credits are for in-world vendors only — they do not buy Marketplace. Crowdfunding (CF) exclusives and Founding Club in-game rewards are the same rule: three stackable layers — Material (surface), Armor FX (overlay), Body prop (silhouette — wings, mantle, trails, shoulder pips) — plus titles, emotes, hangar / nameplate / VISION-chip chrome, weapon wraps, club tags / ranks / decals — looks only, never power (FS-ECO-012, GDD founding-clubs-cf-cosmetics). Materials / FX / props must not change light/heavy plate size or underarmor joint scale; body props grant no flight or glide. See FE spec §11 and FS-PRD-007 / FS-ECO.

FS-PRD-007 — Credits, BTUCOIN, and LUMENAR (locked)

Section titled “FS-PRD-007 — Credits, BTUCOIN, and LUMENAR (locked)”

Three player-facing ledgers:

Ledger What Spends on
Credits Soft in-world currency, account-shared (EOS PUID Online · local profile Solo) In-game vendors / world NPC transactions only — every character on the account spends/earns the same pool
BTUCOIN Crypto ledger (was “Currency”). Player 49% of every mint on the EOS PUID Convert → LUMENAR on Marketplace Wallet only. Never marketplace tender. Never vendor spend
LUMENAR Soft marketplace currency — not crypto Storefront + player listings (looks only)

Character I title bar (W_TFA_IWallet): CREDITS chip · gap ≥ 16 px · BTUCOIN chip · gap · X. Two chips only — LUMENAR lives on Marketplace Wallet, not the I bar. Not bag tiles. Not a second pair on the Inventory header. Not the menu roll W_TFA_Credits.

Play grants Credits from stashes / caches, monster kills, boss kills, side missions, and milestones. Amounts: TBD-037. Credits Find affixes modify play grants only.

Play also mints BTUCOIN from daily tasks, weekly tasks, and hard objectives. Online pool only — they do not exist on Solo. They live with other game objectives: world markers and the Missions & Objects / Operations drawer on every Tab map (Local Map and World Map). Filter Tasks. Set as Primary tracks them. Grant tables are fiat (V) (TBD-039); mint (M = V / P) at settlement so BTUCOIN falls when market is above floor and LUMENAR stays flat on convert. Every BTUCOIN mint (play or fiat path) splits 51 / 49 — studio treasury / player. See FS-ECO-004 / FS-ECO-005 / FS-ECO-008 / FS-CMP-009.

Acquire LUMENAR: convert any portion of player 49% BTUCOIN → LUMENAR on Marketplace Wallet (FS-ECO-006) only. Irreversible. Rates: TBD-036. Cash / fiat Marketplace SKUs do not grant LUMENAR — they mint BTUCOIN at 51/49 (FS-ECO-003); the buyer converts to spend.

Of every BTUCOIN mint:

Share Owner
51% Studio treasury. Never the player wallet.
49% Player BTUCOINBalance (CryptoBalance) on that EOS PUID

BTUCOIN display name is locked: BTUCOIN (TBD-034 closed). Price floor: TBD-035. Settlement (P) = max(floor, market). Play grants and cash mints size BTUCOIN as fiat value (V) / (P) so when market is above floor, fewer BTUCOIN mint; convert uses the same (P) so LUMENAR out stays flat for that (V). BTUCOIN does not buy SKUs or listings directly — convert to LUMENAR first. Credits do not buy Marketplace.

Year 1 is a studio ledger plus an external market-price feed. Do not invent an on-chain client. Runtime, widgets, replication, and acceptance: §16b FS-ECO. Chrome: FE spec §11.


Architecture map (separate page): plugins · modules · classes · client/server · hit auth · threads — see Architecture Map.

This table is the logical ownership map (class prefixes, tags, data). Physical packing is Lyra Game Feature Plugins — see §2.5. Do not fork LyraGame into UBT modules named TFACombat / TFAUI. Keep LyraGame as the host (experiences, pawn data, CommonUI layout, EOS hooks).

Module Responsibility GFP packing (§2.5)
TFA Game instance, experience definition, subsystem registry Host LyraGame + TFACore / TFAMaps experiences
TFACore Tags, channels, stance enums, shared types TFACore
TFACombat Camera engine, stance, vitality, shared combat ASC host, damage pipeline spine TFACombat (thin)
TFAMelee Melee Drive / freeflow verbs TFAMelee (Plugify)
TFASingularity Kinetic Flow meter + Singularity climax TFASingularity (Plugify)
TFAInventory 15-slot doll, bags, sockets, artifacts, salvage, Credit chip on Inventory TFACharacterI Runtime (split TFAInventory GFP only if C++ outgrows UI)
TFAEconomy Credits grants, BTUCOIN ledger, LUMENAR ledger, cash→LUMENAR, convert BTUCOIN→LUMENAR TFAEconomy
TFAProgression XP, stats, trees, Customizable 4×4, tentacle sets TFAProgression
TFAWeapons Frames, parts, gunfeel, Firehand Bus, melee families TFAWeapons
TFAUI OmniVisor, Character I, Command Deck, Social (FE widgets may live here or in Frontend) TFAOmniVisor + TFACharacterI + TFAFrontend
TFAFrontend Intro, menu, mode, EOS, character select (FE spec §13) TFAFrontend
TFAWorld Vision volumes, vault/wall tags, encounter director, mission flags TFAWorld + TFAVision
TFAAI AI substrate: Logic Driver Pro host, fuzzy membership, Squad + Agent runners, difficulty profile DAs. Product brains (MP bots / monster packs / patrol) are separate LD asset families on this GFP TFAAI
TFAOnline EOS session, Connect Discord identity (FS-ID), server inventory, raid matchmaking, Ladder normalization, clan / fireteam / Discord invite tokens, Match Results snapshot + LastMatchRecap TFAOnline
Class Role
ATFAGameMode / ATFAGameState Ruleset, difficulty, match phase
ATFAPlayerState Level, XP, stats, trees, loadout, realm pool ID
ATFACharacter Movement, stance, mesh (FPP arms + TPP body), GAS avatar
ATFAPlayerController Enhanced Input, camera requests, UI router
UTFAAbilitySystemComponent Skills, auras, tentacles, Ultimate, grenades, Flow GEs
UTFACameraDirector FPP / TPP / Shift-Out / takedown
UTFALoadoutComponent Slots W1–W4, Wrist, Phys Shield, stance machine
UTFAVitalityComponent Shield / Armor / Health + incoming pipeline
UTFAVisionComponent Seven modes, one active
UTFAInventoryComponent Bags + equipped 15
UTFACreditWalletComponent Per-character Credits. I title-bar chip. Vendors only — not Marketplace
UTFACryptoLedger EOS-account BTUCOIN (player 49% share of every mint, including FS-ECO-008). Studio treasury is not this component
UTFALumenarLedger EOS-account LUMENAR (marketplace soft currency). Cash grants + BTUCOIN convert. Storefront / listings debit
UTFACraftingSubsystem Station-only recipes
UTFAObjectiveSubsystem Active missions, sector objects, one Primary; drives GUI locator (pip + heading tape + tracker blip)
ATFAAIController AI pawn controller; hosts Logic Driver Agent runner, perception / nav bridge (FS-AI-001)
UTFAAISquadCoordinator One Squad / Team Logic Driver instance per team, pack, or patrol cell (FS-AI-003)
UTFAFirehandBus Active weapon → reticle family, bloom, mag, brick
TFA.Stance.SoloGun
TFA.Stance.SoloMelee
TFA.Stance.WristMelee
TFA.Stance.DualGun
TFA.Stance.DualMelee
TFA.Stance.GunPhysShield
TFA.Stance.MeleePhysShield
TFA.Stance.Hybrid
TFA.Stance.TwoHand
TFA.Channel.Kinetic
TFA.Channel.Thermal
TFA.Channel.Cryo
TFA.Channel.Arc
TFA.Channel.Toxin
TFA.Channel.Isotopic
TFA.Channel.Fission
TFA.Channel.Plasma
TFA.Channel.Void
TFA.Ammo.Field
TFA.Ammo.Specialist
TFA.Ammo.Siege
TFA.Vision.Normal
TFA.Vision.Infrared
TFA.Vision.Heat
TFA.Vision.Ultraviolet
TFA.Vision.Sonar
TFA.Vision.MotionTrace
TFA.Vision.AetherSight
TFA.Quality.Common
TFA.Quality.Uncommon
TFA.Quality.Augmented
TFA.Quality.Rare
TFA.Quality.Legendary
TFA.Quality.Unique
TFA.Quality.Apex
TFA.Ruleset.Story
TFA.Ruleset.Progressive
TFA.Ruleset.Ladder
TFA.Realm.Solo
TFA.Realm.Online
TFA.Flow.Tier1
TFA.Flow.Overclocked
TFA.Flow.Singularity

Do not add TFA.Channel.Anomalous or TFA.Channel.Magic. Removed.

Same C++ for Solo and Online. Solo = listen / local authority (no dedicated process). Online = dedicated or listen server is the only writer of power. Do not ship a second Solo path that skips validation.

Domain Solo Online
Movement, camera, local HUD Client Client predict; server reconcile pose
Damage, Flow, death, loot rolls Local (same writers as Online) Server
Inventory, sockets, craft, dismantle Local save Server; fail closed
Character create / delete / reset Local pool Server pool
Marketplace listings Locked Server
Marketplace owned cosmetics Local unlock after EOS buy Server + local cache
Credits Local save Server; fail closed
BTUCOIN ledger (player 49%) N/A without EOS Server on PUID; fail closed
LUMENAR ledger Local unlock cache after EOS buy Server on PUID; fail closed
Vision unlock + actor relevancy Local Server; overlay is client (TBD-028)
Chat send / flood Local Server RPC + rate limit (TBD-033)
Fireteam join, clan rank, invite consume N/A or local stub Server
Player report / Trust spectate / kick / ban N/A Server (FS-TRS). Discord webhook is worker-only.

Server-authoritative (never trust the client packet as truth)

Section titled “Server-authoritative (never trust the client packet as truth)”

Damage, hits, TTK, Flow, death, loot rolls. Mag / brick / Energy spend, ability commit, grenade spawn. Inventory add/remove, sockets, salvage, Apex Invoke, dismantle. Credits grants, LUMENAR cash grants, BTUCOIN mint 51/49, convert BTUCOIN→LUMENAR, LUMENAR spend. CF / Founding Club EntitlementFlags upsert and presentation unlocks (FS-ECO-012) — looks only; never Combat power. XP, Commit stats, tree nodes, subclass unlock. Mission complete, Primary objective, raid rewards. Character create/delete/reset, pool membership. Fireteam join policy, clan ranks, invite consume. Vision unlock and which actors exist in relevancy — do not send hidden hostiles the visor must not reveal (TBD-028).

Client RPCs are requests. The server simulates, validates against data tables, then replicates. There is no client “grant class” RPC that skips server Apex Invoke tables (TBD-030). Economy and Invoke fail closed.

Client-allowed (prediction / presentation; server reconciles)

Section titled “Client-allowed (prediction / presentation; server reconciles)”

Camera, anim, recoil/bloom, ADS feel, stance mesh. OmniVisor chrome; chat compose (send is RPC). Character I layout; bag filter/sort of a replicated snapshot. Vision overlay materials for modes the server says are active. Frontend widgets, Game Settings, local Solo save file I/O. Audio, Niagara, cosmetics already owned.

  • Portable home: economy/marketplace fraud, statistical signal ingest, and case-log store hooks live in the MonetaryPlatform plugin’s public AntiCheat module (UAntiCheatSubsystem). Lyra / TFACore enable that plugin and call the API without TFAEconomy (money adapter only).
  • Not in MonetaryPlatform: cheap Game Thread hit-auth (rewind / cadence / LOS) stays in TFACombat / TFAWeapons (FS-ARCH-013).
  • HUD numbers (Credits, BTUCOIN, LUMENAR, ammo) can be spoofed locally. Persisted values change only after server ack.
  • Speed / fly: Character Movement Component + server correction. Custom TFA move modes are simulated on the server (FS-MOV-005).
  • ESP: relevancy + visor fog. Client stencil / post-process is not a data source.
  • Discord AccessToken is never written to disk (FS-ID). EOS PUID is the identity.
  • Player-facing Trust UI (report sheet, Trust overlay, ghost spectate chrome) and Discord pager: FS-TRS-001–FS-TRS-006. Those surfaces stay game-side; they submit into the platform case/signal API. Never on the Game Thread hit path.

FS-ARCH-013 — Hybrid hit auth (feel vs security)

Section titled “FS-ARCH-013 — Hybrid hit auth (feel vs security)”

Terra Firma is an ultra-lethal FPS + melee hybrid (FS-CMB-001). TTK is one to three connects. A legit shot or Melee Drive that the server later rejects feels like the gun/melee is broken. Waiting a full RTT before muzzle flash, impact, or lunge connect is also broken. Balance: instant presentation, fast geometric auth, expensive cheat analysis off the hot path.

Layer Owns Budget
Presentation Client Same frame as fire / strike: tracer, muzzle, melee trail, hit mark, impact FX. Predicted.
Power Server HP, death, Flow, loot, mag/brick/Energy. Never from the client packet alone.
Shot / strike request Client → server RPC Origin, aim/facing, timestamp, weapon/stance id. Not damage numbers.
Auth Server Game Thread Rewind target pose to shot time, cheap trace / melee capsule, LOS, cadence, mag.
Heuristics Worker, then marshal into MonetaryPlatform AntiCheat Aimbot / snap stats, replay, economy fraud signals. Must not delay the damage GE.

Hitscan (Precision Fire): Client fires immediately. Server lag-compensates: rewind the victim to the shooter’s timestamp, line-trace, apply pipeline (FS-DMG-003). If auth fails, HP does not change; predicted hit marks / tracers may ghost-cancel.

Projectiles (SKG wrap in TFAWeapons): Client may predict a local projectile. Server-spawned projectile owns overlap. Do not let the client spawn a damaging actor.

Melee Drive (FS-CMB-002): Client plays the lunge immediately. Server validates inside the authored notify window against a reach capsule vs rewind pose. No magnet. Whiff on server is a miss (Flow reset rules still server).

Security that stays cheap (every shot / tick):

  • Rate-limit requests to locked cadence (FS-GUN-007) plus a small jitter. Drop extras; do not queue a backlog.
  • Reject impossible origin (not near replicated pawn), fire without mag/Energy, strike outside the melee window, traces through world without LOS.
  • Prefer false accept of a geometrically plausible connect inside the rewind window over false reject of a real connect. TTK is too short to be stingy on rewind.
  • Prefer hard reject of impossible packets over waiting for a second factor. Do not round-trip EOS, Discord, or HTTP to confirm a hit.

Security that is allowed to be slow: statistical anti-cheat, demo/replay, report / case pipeline via MonetaryPlatform AntiCheat. Those never sit on the Game Thread hit path (FS-ARCH-012).

Rewind window (max ms of pose history): TBD-041. Past that window the shot misses rather than killing through teleport. PvP uses the same path as PvE (FS-DMG-007 scalars stay data); do not add a second “slow secure” combat.

Host project: Lyra 5.8 (demo5.8) plus marketplace SKGShooterFramework and AimAssistSystem. TFA packing uses Lyra’s existing plugin system:

  • Always-on engine plugins (not Game Features): CommonGame, CommonUser, GameSettings, UIExtension, GameplayMessageRouter, ModularGameplayActors, AsyncMixin, loading screens.
  • Game Feature Plugins under Plugins/GameFeatures/, ExplicitlyLoaded, activated by ULyraExperienceDefinition::GameFeaturesToEnable plus UGameFeatureAction (add components, widgets, abilities).
  • Content-only GFPs (maps / experiences) vs Runtime GFPs (code).

Each TFA GFP is Plugins/GameFeatures/<Name>/<Name>.uplugin, Runtime module <Name>Runtime except TFAMaps (content-only). ExplicitlyLoaded: true, CanContainContent: true. Default Registered. Only TFACore and existing ADDON are Active at boot. Experiences enable the rest.

Keep Why
LyraGame / LyraEditor Experiences, pawn data, CommonUI layout, EOS hooks
ShooterCore / Explorer / Maps / Tests / TopDownArena Reference until TFA experiences replace them
SKG + Aim Assist Gun mesh, attachments, ballistics — wrap, do not rewrite
ADDON SKG-on-Lyra glue only (ATerraFirmaCharacter, SKG components). Do not put inventory, HUD, economy, or GAS combat into ADDON — those systems live in their GFPs (TFAOmniVisor ships the HUD; Demo uses placeholder chrome until final art)

New TFA systems do not go into ADDON. ADDON may depend on TFACore later.

GFP FS owners Ships Notes
TFACore §2 tags/types P0 Shared tags, message structs, pawn data refs. No GAS combat. Boot Active contracts.
TFAFrontend FE spec, FS-SES, FS-ID, FS-MCH chrome, FS-CAR chrome P0 then P9 Plugify — Intro, mode, create/select, Command Deck, settings, Results / Career / Triumphs / Ladder chrome. CommonUI only.
TFAOnline FS-ID, FS-SES Online, P9 social, FS-MCH recap, FS-CAR rollups P0 then P9 Plugify — EOS Connect, Discord, fireteam/clan/invites, Match Results / History / career rollups. No combat.
TFATrust FS-TRS P9b Plugify — Report / Trust overlay / ghost chrome. Cases in MonetaryPlatform AntiCheat; this GFP submits/displays. Depends Online + Frontend + MonetaryPlatform.
TFACombat §4–5, §8–9 camera, input extras, movement modes, stance, vitality, shared combat ASC host P1–P2 Thin spine GFP. Components via Game Feature Actions. Does not own Melee Drive or Singularity implementations (those are sibling GFPs).
TFAMelee FS-CMB-002 Melee Drive / freeflow verbs P2 Plugify — swappable melee. Publishes hit/kill messages via TFACore; no #include of TFAWeapons / TFASingularity.
TFASingularity FS-CMB-004/005 Kinetic Flow + Singularity climax P2 Plugify — swappable climax. Subscribes to kill/Flow credit messages; Ultimate stays separate (FS-CMB-006).
TFAWeapons Gun frames, Firehand Bus, SKG adaptors P3 Plugify — swappable guns. Calls SKG; cadence from data (FS-GUN-007). Publishes kill credit messages; no hard Singularity call.
TFAModular Fake-modular / parts dials (FS-GUN-012) P3+ Optional split from TFAWeapons when modular Refit is a product surface; Demo may keep dials under TFAWeapons until then.
TFAOmniVisor HUD, chat OV29/31/32, FE30 locator P1 Plugify — swappable in-game GUI. UIExtension into Lyra HUD host; message contracts only.
TFACharacterI Character I, inspect, invoke presentation, inventory C++ until a split P4 Plugify — widgets; mutations via inventory/economy RPCs.
TFAProgression XP, trees, 4×4, tentacles, ordnance P5 Plugify — GAS abilities granted from data.
TFACrafting Crafting station P6 Plugify — server recipes only.
TFAEconomy FS-ECO, Credits, BTUCOIN 51/49, LUMENAR, CF / Founding Club entitlement routes P4b Plugify — TFA money adapter only (enables MonetaryPlatform, grants, I chips, marketplace routes, entitlement-flag apply). Does not gate AntiCheat. No HUD widgets. Cosmetics presentation is Character I / Frontend / OmniVisor — never Combat power.
MonetaryPlatform Ledgers · Marketplace Wallet · AntiCheat case store · EntitlementFlags P4b prep Portable .uplugin (not a GFP) — Plugify money product; omit/swap without forking TFA* gameplay.
TFAVision Vision modes P7 Plugify — PP/stencil client; unlock + fog-of-war server (TBD-028).
TFAWorld Objectives, missions, map drawers P7–P8 Plugify — encounter director, mission flags. Last match row is a drawer chip (FS-MCH-003), not a mission. Enables TFAAI.
TFAAI FS-WLD-001, FS-AI-* P7–P8 (Demo C earlier) Plugify — Logic Driver Pro substrate; depends on TFACore. Does not own damage / gunfeel.
TFAMaps Content-only like ShooterMaps P0 hub then P8 Plugify content GFP — Experiences list GameFeaturesToEnable.

Dependency rule: downward only. UI GFPs talk to gameplay through Gameplay Message Router + interfaces on TFACore, not by including Combat headers.

Plugify (shall): Every major product surface ships as its own plug so an Experience can omit or replace it without editing LyraGame or sibling source. Complete set: ADDON (glue) · TFACore · TFAFrontend · TFAOmniVisor · TFACombat (spine) · TFAMelee · TFASingularity · TFAWeapons · TFAModular (optional) · TFACharacterI · TFAProgression · TFACrafting · TFAEconomy · TFATrust · TFAVision · TFAWorld · TFAAI · TFAOnline · TFAMaps · plus portable MonetaryPlatform (ledgers / AntiCheat / EntitlementFlags — not a GFP). Sibling GFPs shall not hard-include each other — only TFACore contracts + messages. Catalog MASTER: Programming Bible 02-gfp-cookbook.md Plugify lock · 02b-plugin-dependencies.md.

Phase mapping: P0 = Core + Frontend + Online + Maps hub. P1 = Combat spine (camera/move/stance) + OmniVisor. P2 = TFAMelee + TFASingularity (Flow/GAS climax). P3 = Weapons (+ optional TFAModular). P4 = CharacterI. P4b = Economy. P5–P9 as §21. TFAAI enables with world / encounter / bot-fill Experiences (P7–P8; Demo sandbox C may pull earlier for team prove).

Unreal has one Game Thread that may mutate UObject / AActor. There is no second game thread. Workers exist (Task Graph, thread pool, loading, audio, RHI). Non-mission-critical work may run off the Game Thread if it uses a snapshot or an engine-async API and marshals results back (AsyncTask(ENamedThreads::GameThread, …)). Lyra AsyncMixin already covers async asset loads.

Must stay on Game Thread: GAS activate / Gameplay Effect apply; movement / physics writes; replication; RPCs; inventory / economy / progression mutations; widget tree construct / tick that touches gameplay objects; spawning actors; changing collision.

Safe off Game Thread, then apply on Game Thread: EOS / HTTP, Discord OAuth, marketplace catalog, price feed; save serialize / compress; JSON parse; chat log disk, analytics, crash, screenshots, benchmark; inventory search on a copied array; procedural layout with a seed (commit actors on Game Thread); asset async load; engine systems already threaded (audio, Niagara, streaming, nav build).

Never apply Gameplay Effects, call an RPC, or write actor components from a worker.

Hit authentication (FS-ARCH-013) stays on the Game Thread and must stay a cheap rewind + trace / capsule. Do not move per-shot auth onto a worker “to be safer.”

FS-ARCH-014 — Tick discipline (Lyra 5.8)

Section titled “FS-ARCH-014 — Tick discipline (Lyra 5.8)”

Lyra host practice (verified ALyraCharacter / ULyraHealthComponent on Engine 5.8): default PrimaryActorTick.bCanEverTick = false and bStartWithTickEnabled = false (same for components). Prefer no Tick. Power and world truth are server-owned; clients predict presentation and reconcile (FS-ARCH-013).

Prefer Avoid
Events / delegates / Gameplay Messages / Anim Notifies Per-frame polls for “did X happen?”
FTimerManager / GAS ability timers for delays & intervals Empty or low-value Tick / TickComponent on every pawn
GAS tags · attributes · GE durations Client Tick that applies damage, Flow, loot, economy, inventory
CMC + Enhanced Input + Ability activation Ambient magnet / AimAssist / target search every Tick (Demo: melee magnet forbidden)
Server-only Tick only if proven needed (enable in BeginPlay when HasAuthority(), never in CDO ctor by Role) Enabling Tick on all clients “because the server needs it”
Replicate state; clients react Client Tick that invents authority

Shall:

  1. New TFA Actors / Components ship with Tick off unless a written note justifies every-frame work.
  2. Gameplay-changing logic runs under HasAuthority() (or GAS ServerOnly / server validate path). Clients may Tick presentation only (camera feel, local VFX bookkeeping) — never HP / Flow / mag / loot / Credits.
  3. If server-only Tick is required: leave bCanEverTick false in the constructor; SetActorTickEnabled(true) / SetComponentTickEnabled(true) in BeginPlay when HasAuthority(). Role is not reliable on the CDO.
  4. Prefer Timer or event over Tick Interval “polls” for cooldowns, windows, and meters.
  5. GFP Actions that mutate gameplay check authority before apply (Lyra Game Feature Action pattern).
  6. Melee target pick / Counter window / Singularity fill never run as a client-wide Tick magnet (FS-CMB-002).

Empty enabled Ticks on many pawns burn client and listen-server frame time and can desync feel when clients run logic the server never sees.

A new engineer can name the owning logical module, GFP, and class for camera, loadout, damage, inventory, HUD, Credits, BTUCOIN, and LUMENAR from this section without opening the GDD.

A new engineer can name which GFP is Active at boot vs Experience-enabled, and can state whether Credits mutation, camera tick, and EOS HTTP run on the Game Thread or a worker.

On a listen-server with ~80 ms one-way delay: fire a hitscan at a moving dummy and connect a Melee Drive. Muzzle / lunge present on the firing client the same frame. Dummy HP and Flow change only after server auth. A shot through a solid wall does not apply HP. Cadence spam above FS-GUN-007 is dropped.

Sampled TFA Actor/Component constructors default Tick off. Any enabled Tick has a one-line authority note (server-only vs presentation-only). No combat power, Flow credit, or economy mutation runs from a non-authority Tick.


Front-end screens, widget names, and flow edges are specified in the FE spec. This section is the runtime contract those screens drive.

  • Solo: local save, max 10, tagged LOCAL. Never listed on Online.
  • Online: EOS + server slots, max 10. Never listed on Solo.
  • Characters never transfer.
CharacterId, Realm, DisplayName, Sex (Male|Female), AppearanceId,
Order, Faction, UnlockedSubclassCount (0–5), ActiveSubclass (nullable), Race=Human,
Level, XP, UnspentStatPoints, UnspentSkillPoints,
Stats{STR,DEX,CON,INT,WIS},
Equipped[15], LoadoutAssignments, Bags,
Trees{Combat,Tentacles,Ordnance}, Customizable[4][4], ActiveLoadoutIndex,
TentacleSets[3]{Unlocked, Mode Off|Def}, MechanicalArmsEquipped,
CampaignFlags, LastTransform, CampaignComplete,
Hangar, Collections, CodexKills, MarketplaceUnlocks,
ClanId (Online only),
LastMatchRecap (Online only; one frozen RAID / Vault / Ladder recap or empty)

EOS account / Solo local profile (not the character record) stores CreditsBalance (int64 — shared across every character on that account; FS-ECO-001), BTUCOINBalance / CryptoBalance (player 49% of every BTUCOIN mint, including FS-ECO-008 play grants), LUMENARBalance, studio-treasury mint accounting, EntitlementFlags (CF titles / FX / materials / body props / club / hangar / nameplate / emote ids — FS-ECO-012), and a Discord link for invite delivery. Display name of the crypto token: BTUCOIN (TBD-034 closed).

Create defaults (Confirm on FE17): UnlockedSubclassCount = 0, ActiveSubclass = null. Faction is the origin main class. Multiclass Commit on a later class also starts that class at UnlockedSubclassCount = 0.

Character Select only. Two-step confirm. Wipes story / location / campaign-complete. Keeps identity (including subclass unlock progress), gear, Collections, Codex, hangar, clan, marketplace unlocks, and LastMatchRecap (session flavor, not story). Not Delete. Not New Game+. Online is server-authoritative and fails closed. Credits, BTUCOIN, and LUMENAR live on the EOS account / Solo profile — not character fields — and are not wiped. Solo never has LastMatchRecap.

Condition Load
New character Tutorial / opening cinematic (Kailashia → playable after)
Existing Last transform + mission flags
Online + campaign complete Endgame hub on that character
After reset Campaign start, kept gear

Pause is a session flag, not a widget type. Command Deck, Character I, Tab maps, Esc, Settings, Deck children, and the Crafting Page all share this policy.

  • Hotkey I = Character screen I. Not a second HUD. Solo: pauses the local world. Online: overlay only.
  • Esc = session menu. Solo: pauses. Online: overlay only; world does not pause. Esc title is PAUSED (Solo) or LIVE (Online).
  • Command Deck = in-world top bar + child screens. Online: the Deck can be up while the session runs. Never pause GameState, the dedicated/listen server, or replicated actors.
  • Tab = Map interface & GUI locator ping. In gameplay: Tap pings the Primary on the OmniVisor (quiet world pip + heading tape + tracker blip; name / meters for 4 s). Hold / Press opens contextual Map (Local Map on planet, World Map in orbit/station). Inside Map: Tab toggles between Local and World Map views. Fast travel: TBD-002. Maps follow the same pause policy. Exception: while OmniVisor chat compose is focused (IMC_TFA_Chat), Tab cycles chat channels only — no ping, no map.
  • Enter (Online, in play, no overlay) opens OmniVisor chat compose (FS-HUD-010). Overlays (Deck, I, map, Esc) close compose without sending and keep Enter as UI. Solo has no chat widget.
  • Crafting Page is Inventory → Gear maximize (W_TFA_CraftingPage, FS-GUI-008). Forge fills everything except the paper doll and LOAD OUT; the Gear bag hides; Forge needs empty Gear slots; the world-mat rail and the recipe list each scroll. Hubs / field fabricators host the same page with a station bonus. Online overlay does not pause; spend lock is FS-CRF-001.
  • Overlay input (both realms): UI cursor on; move / look / fire / abilities off. Online: the pawn still simulates (damage, CC, death). OmniVisor Shield / Armor / Health stay readable under the glass.
  • A hit does not auto-close Command Deck or I. Downed, death, or disconnect dumps the CommonUI overlay stack to OmniVisor death / respawn or the session-lost screen. Fireteam members are unaffected.
  • CommonUI: Solo may use a pausing menu layer. Online must push the same widgets onto a non-pausing game overlay layer. Do not SetGamePaused on an Online world.

Online listen-server: open Command Deck → Marketplace while a dummy keeps firing. The dummy is not frozen. The pawn takes damage. OmniVisor vitals update under the overlay. Marketplace stays open on hit. On death, the overlay stack closes to OmniVisor death / respawn. Repeat in Solo: opening the Deck freezes the dummy until Resume.

Runtime contract for the FE create screen. Widget chrome lives in the FE spec; this is what Confirm must persist.

  • Required inputs: DisplayName (2–16, unique in pool), Sex (Male|Female), Appearance (FS-APP-001–004), Order (Fist|Magus|Hidden).
  • Derived, not a picker: Faction from Order. Race = Human (Year 1, read-only).
  • Forbidden on this screen: subclass picker, difficulty, corp.
  • Persist: Order, Faction, UnlockedSubclassCount = 0, ActiveSubclass = null. Combat tree grants the origin faction chip only. Subclass GAS nodes stay gated until TBD-029.
  • Return to Character Select with that slot selected, current pool only.

FS-APP-001 — Appearance product lock (Full game)

Section titled “FS-APP-001 — Appearance product lock (Full game)”

Full game only. Demo keeps placeholder meshes and fake-modular dials — no Mutable / MetaHuman create path in the Demo Ladder slice.

AppearanceId on the character record is a structured appearance blob (face preset, groom ids, feature dials, hair/skin colors, tattoo slots) — not a forever-opaque int. Catalog row counts: TBD-057.

Player can

  • Choose Sex: Male | Female (two fixed body bases; no other body types).
  • Pick a premade MetaHuman face from the Year-1 catalog (not live MetaHuman Creator DNA sculpt in-game).
  • Pick groom set(s): hair / brows / facial hair authored for that Sex.
  • Nudge a small set of facial feature dials Mutable can drive (material params / limited baked reshape — not MH Creator blending).
  • Set hair color and skin color.
  • Apply tattoos on face and body (projectors / decals onto underarmor + head textures).

Player cannot

  • Change body size, limb length, mass, or per-body-part scale.
  • Resize underarmor joints or visible flesh when equipping Light / Medium / Heavy plates (FS-FX-004).
  • Pick Race (Year 1 = Human, read-only).
  • Pick Subclass, Difficulty, or Corp on create.

FE chrome: Create Character Appearance (W_TFA_Appearance / FE17). Runtime write on Confirm: FS-SES-006.

FS-APP-002 — Mesh stack (MetaHuman + Mutable)

Section titled “FS-APP-002 — Mesh stack (MetaHuman + Mutable)”

TF player mesh stack (Full game):

  1. MetaHuman head — separate component recommended (do not merge the huge face skeleton into body).
  2. Body + underarmor — fixed Sex base; Mutable colors / tattoos / underarmor materials.
  3. Flare — skinned to flare bones only (only cloth besides underarmor).
  4. Armor plates — rigid pieces on a_socket_* (FS-MESH-001). Plate meshes have no deformation bone chain of their own.
  5. Body props / CF cosmetics — silhouette add-ons; never change plate size or underarmor joint scale (FS-ECO-012 / FS-FX-004).

Mutable is a mesh/texture assembly graph. Every attachable part must share a compatible skeleton whose attachment bones/sockets already exist on the host. Do not rely on Epic cloth-morph / body-shape clip for player armor plates.

GFP target: Create + Appearance UI → TFAFrontend; blob persist → TFACore; Mutable runtime → TFACore or thin TFAAppearance (Full game); plate equip visuals → TFACombat loadout apply; gun module mesh Refit → TFAWeapons (+ optional TFAModular).

FS-APP-003 — Appearance apply + post-create edit

Section titled “FS-APP-003 — Appearance apply + post-create edit”
  • On pawn spawn / Character Select enter world: apply the appearance blob to MetaHuman + Mutable parameters before first possess.
  • Post-create Appearance edits (same dials as create) rewrite the blob and re-apply; Sex change is forbidden after Confirm (FS-SES-006 Sex is sticky).
  • Solo and Online each persist their own blob on that character record. Cosmetics / shaders bought offline still apply through Appearance (FE store rules) — they do not rewrite Sex or face-catalog identity.
  • Demo: Appearance picker may be stubbed / skipped; Confirm still requires Sex + Order + name.

FS-APP-004 — Weapon mesh Refit (Full game)

Section titled “FS-APP-004 — Weapon mesh Refit (Full game)”

Align with FS-GUN-004 / FS-GUN-006:

  • Class = Spine chassis skeleton; modules attach to Spine bones (w_socket_* / w_module_* — FS-MESH-001).
  • Receiver seats on Spine before Barrel; Frame is data only (no chassis mesh).
  • Accessory Refit swaps module meshes on Spine bones via Mutable CustomizableObject or SKG attach once Firehand wraps SKG (FS-GUN-005).

Demo remains fake-modular (stats / dials only; mesh unchanged) until Full-game mesh Refit ships (FS-GUN-012).

Full-game Create: Sex Male → fixed male body; equip Light then Heavy chest — plate meshes change, underarmor joint scale unchanged. Face preset + groom + tattoo persist after quit/relaunch. Attempt body-scale dial: control absent. Demo Ladder slice: no Mutable dependency required to enter world.

Create a Solo character, play, quit, relaunch: same slot, same gear, same location. That slot is invisible on the Online select after EOS login.

Open Create Character (FE17). There is no subclass dropdown. Confirm Order of the Fist. Saved record: Faction = Enforcer, UnlockedSubclassCount = 0, ActiveSubclass null. Combat tab shows the Enforcer main class; T1–T5 exist as preview-only until their gates. Combat points on a gated subclass tree are rejected. Repeat Magus → Arcwarden and Hidden → Phantom. A create that writes a starting subclass (for example Vanguard) fails this test.

3.X Authentication and identity — Discord to EOS

Section titled “3.X Authentication and identity — Discord to EOS”

EOS is the Online identity provider. Discord is an external credential on that PUID, not a second game account and not a second character pool. Username / password on W_TFA_EOSLogin stays. TFA (Screen B) stays on that path only.

Pipeline follows the EOS Connect Interface for external identity providers.

Players authenticate, log in, and link game profiles with Discord credentials. Epic Online Services (EOS) remains the backend identity. Online characters stay on that PUID’s server pool. Solo characters never appear.

FS-ID-002 — Discord authorization (client)

Section titled “FS-ID-002 — Discord authorization (client)”
  1. The game client initializes the shipped Discord SDK (Social SDK and/or Embedded App SDK). Both must yield a Discord OAuth2 AccessToken.
  2. The player starts login or link. Discord OAuth2 consent opens.
  3. On success, Discord returns a short-lived AccessToken to the client.
  4. Do not persist that access token as a game password. Do not send it to TFA game servers as a session cookie; it is an EOS Connect credential only.

The client calls EOS_Connect_Login.

Parameter Lock
External credential type EOS_EExternalCredentialType::EOS_ECT_DISCORD_ACCESS_TOKEN
Token string The Discord AccessToken from FS-ID-002

Do not invent another external credential type for Discord.

Scenario EOS result Client
A — Existing user Discord ID already linked to an EOS Product User ID (PUID) Complete login. Use the returned EOS session. Same Online character pool.
B — New user EOS_InvalidUser (Discord ID unrecognized) and the client has no live PUID Call EOS_Connect_CreateUser with the ContinuanceToken. Provision a new PUID and automatically link this Discord identity. Online pool starts empty.
C — Link to live session Player already has a PUID (username / password login, or prior Connect session) Call EOS_Connect_LinkAccount with the Discord AccessToken. Do not CreateUser. Same PUID, same Online cards. This is the Social Discord pane.

If Discord is already linked to a different PUID, fail closed. Do not silent-merge character pools. Surface: this Discord is already tied to another Terra Firma EOS user.

  • Expired Discord token: If EOS_Connect_Login (or LinkAccount) fails because the external token expired, silently refresh the Discord OAuth2 token and retry the EOS call once. A second failure surfaces to the player. Do not loop.
  • Network timeout: Notify the player to check the connection to Discord Services, then wait for a player retry. Do not silent-spin.
  • Other EOS failures (banned, service down) fail closed on the existing EOS login error chrome.

Cold Online path: Continue with Discord. Scenario A returns the existing PUID and the same Online cards. Scenario B (EOS_InvalidUser) creates one PUID; Character Select is empty except Create. Username / password still reaches Character Select. Discord Continue does not open TFA Screen B.

Log in with username / password (Ash Cantor pool). Social → Discord → Link. LinkAccount keeps the same PUID and HAVOC card. A CreateUser on that path fails this test.

FS-ID-006 — Stay signed in (this device)

Section titled “FS-ID-006 — Stay signed in (this device)”

The player does Discord OAuth / username login once on a device. Later launches reuse a persisted EOS session for the same PUID.

Store Do Do not
EOS Connect session / refresh for this PUID OS secure storage (Windows Credential Manager / DPAPI or equivalent) Game server as a cookie. Plaintext in an ini.
Discord OAuth refresh (Discord SDK persist) Allowed, so the SDK can mint a new AccessToken without consent Persist the short-lived Discord AccessToken
Username Remember username (existing lock) —
Password Remember password only if username is also saved; warning shown Store if Stay signed in is off and Remember password is off

Launch (Online path):

  1. If local persist exists, attempt silent EOS_Connect_Login with the persisted EOS credential (and/or a Discord AccessToken the SDK refreshed without UI).
  2. Success → Character Select. No Screen A. No Discord consent. No TFA Screen B.
  3. Fail → drop persist, show Screen A. Discord Continue runs full FS-ID-002 again.
  4. After a successful interactive login, write persist if Stay signed in is on (default on).

Log Out of EOS deletes persist on this device. Next Online path is interactive. Discord revoke or EOS invalid refresh is the same as fail in step 3.

Do not invent a day-count. Refresh lifetime is EOS + Discord. Do not use EOS_ECT_DEVICEID_ACCESS_TOKEN as a stand-in — that would be a different identity.

Continue with Discord, Stay signed in on, quit the client, Online again: Character Select with no Screen A and no Discord consent. Log Out, Online again: Screen A. Repeat username / password with Remember password: same skip until Log Out. A build that writes the Discord AccessToken to disk fails this test.


The Dynamic Camera Engine is baseline kit. Phonons, Frames, and parts never retune FOV, blend, or Shift-Out.

Condition Camera
Firearm is the active stance, or LT / RT pressed FPP, tight high FOV (~105°)
Melee is the active equipped stance Always TPP. Never remain in FPP.
Square / X Melee Strike while a gun is drawn Pull to TPP for the strike
Special Takedown (Singularity) Always TPP for the sequence
Shift-Out (LT during TPP melee follow-through) Blend through the head into FPP in 0.2 s bullet-time

There is no dedicated weapon-swap camera button.

Precision / tactical. Firehand Bus reticle fully active. Bloom ring is the accuracy cone.

Wide cinematic third-person, character-centered. Precision reticle dropped or softened. Shared OmniVisor chrome stays.

During a TPP melee strike, holding LT pulls the camera through the back of the head into FPP before the melee animation ends. Window = 0.2 s micro time-dilation for a distant headshot. Does not exist if ADS is disabled for the current stance (dual-weapon, or any Phys Shield in-hand pair).

These systems must not write camera FOV, blend time, or Shift-Out:

  • Phonon Shards / Chords
  • Modular parts
  • Affixes
  • Artifact Sets
  • Vision modes (they tint; they do not change camera rig)

FS-CAM-006 — Look vs move vs body (no camera flip)

Section titled “FS-CAM-006 — Look vs move vs body (no camera flip)”

Camera orientation is always mouse / right-stick Look (FS-INP) in both TrueFPP and WideTPP. Locomotion is always move keys / left-stick. The body may rotate, flip, twist, or somersault for any reason — double-jump flip, melee / gun attack montages, dodge/roll, Wall Run re-stick, root motion — and that motion is mesh-only. It must never:

  • Rotate, pitch, roll, or re-aim the gameplay camera
  • Steal or freeze mouse / RS look
  • Copy mesh orientation into control rotation

During flip / attack, the camera keeps facing the aim it had (plus any new look deltas). Look input stays live for the whole animation unless a later explicit CC / ability camera mode says otherwise (Singularity may grant a temporary ability camera — it must restore free look after).

Channel Owner Must not
Look / camera Mouse or RS → control rotation (pitch + yaw) — always Follow mesh root, flip somersault, melee/gun attack twist, jump montage, dodge/roll, or Wall Run mesh / curve re-stick
Move (ground / air) WASD / LS — relative to camera yaw (not pitch) Steal look; ignore move while flipping unless a separate CC rule says so
Move (Wall Run) WASD / LS — wall-locked (FS-MOV-004) Follow camera yaw; peel from look alone
Body (local + remotes) AnimInstance / montage on TPP mesh (and local FPP view / bone-hide when TrueFPP — FS-CAM-002) Write camera FOV, blend, or control rotation

TrueFPP: eye / control rotation; if body or arms flip, camera does not roll/pitch with the spine. WideTPP: spring-arm follows capsule / pawn, not flipping mesh bones. Remotes never use your camera — only replicated movement + TPP anim. Dual-component net rules stay FS-CAM-002. ADS presentation stays FS-GUN-013.

Draw a 1H gun → FPP. Tap 4 to a 1H melee → TPP and stay TPP. Fire LT/RT from melee via Shift-Out → FPP for 0.2 s then return per stance. Hold 2 into Gun + Phys Shield: LT does not ADS and Shift-Out does not open. Equip Phonon Chord → camera numbers unchanged. During a jump flip or melee montage, mouse look still steers; camera does not roll with the mesh (FS-CAM-006).


Verb Default (pad / key) Notes
Move / sprint LS / WASD; Toggle Sprint default (FS-INP-006) — not full-tilt stick sprint
Look RS / mouse Both perspectives; never follows mesh flip (FS-CAM-006)
Melee Strike Square / X Directional lunge along stick facing
Vault Space / Cross / A Contextual — tagged ledge only (FS-MOV-003). Same key as Jump / Wall Run enter / wall jump-off / air double jump
Crouch Circle / B / Ctrl Sprint+Crouch = Slide. Not Wall Run.
Dodge Double-tap move axis Crouch+Dodge = Roll. While Wall Running: opposite-side double-tap = wall-to-wall dash (FS-MOV-004), not ground Dodge
Wall Run Space / Cross / A (enter) Contextual — sprint + tagged wall. Continues without hold. Binding was TBD-003 hold — superseded 2026-10-27 (Demo / GDD).
Wall jump-off Space / Cross / A (while Wall Running) Leaves the wall with exit momentum (FS-MOV-004). Not Vault. Not opposite-wall dash.
Double jump (post wall-exit) Space / Cross / A (air, after wall jump-off) One air jump along the wall-exit direction — not a free midair redirect (FS-MOV-004). Mesh flip may play; Look unchanged (FS-CAM / look-vs-body lock).
Precision Aim LT / L2 Instant FPP. HARD LOCK off in dual-weapon stances and while Physical Shield is in-hand (GunPhysShield / MeleePhysShield). Solo firearm / solo 2H gun only. Same gate as FS-LOD-007. When Phys Shield is in-hand on the left hand, this control is Phys Shield bash / block instead (see FS-LOD-009) — not ADS.
Weapon Discharge RT / R2 Instant FPP; fires firearm. When Phys Shield is in-hand on the right hand, this control is Phys Shield bash / block instead (FS-LOD-009) — partner 1H uses the opposite side.
Phys Shield bash Same-side attack button as the hand holding the board FS-LOD-009. Only while Phys Shield in-hand.
Vision cycle D-pad Up / V Seven modes, wrap. V is Vision — not a hotbar key.
Loadout Keys 1–7 · Hold RB / R1 stance wheel Keyboard tap/hold per §7. Pad: hold RB → stance wheel (7 wedges) → RS aim → release RB commits (FS-INP-005). Playtest-provisional.
Character I I · Hold Menu / Options Pad tap Menu = session Esc; hold Menu = Character I.
Map (Contextual) Tab (Hold) / Hold View / Create On planet: Local Map; Off planet: World Map. Not while chat compose is focused.
GUI locator ping Tab (Tap) / M (Tap) / Tap View / Create Pulses Primary pip + tape + tracker; name / meters 4 s. Not while chat compose is focused.
Map Toggle (Local ↔ World) Tab (Inside Map UI) Same inside map on pad View.
Chat open Enter (chat closed, Online, in play) Pad: soft keyboard / platform chat path TBD-033. Solo: no chat.
Chat send Enter (compose focused, no Shift) Sends the line. Empty Enter closes without sending.
Chat newline Shift+Enter Inserts a line; keep typing.
Chat channel Tab (compose focused) Cycles Fireteam → Clan → Match → General → Proximity → Fireteam. Skip empty seats. Whisper is not Tab.
Session menu Esc · Tap Menu / Options Chat compose open: Esc closes chat without sending, does not open Esc.
Combat hotbar (6) KB: Q·E·Z·X·C·F · Pad: Hold LB / L1 ability radial Keyboard taps cast slots. Pad: hold LB → 6-wedge radial (slots 1–6) → RS aim → release LB casts highlighted. Cancel: return stick to deadzone and release, or B/Circle while held. Contents = Ultimates and/or Combat skills (FS-GUI-005). Shared Shiv charge. Tentacles / grenades never. Playtest-provisional (FS-INP-005).
Grenade throw G · Y / Triangle Tap = throw / start cook. Hold = cook if authored. Release = throw if cooking.
Reload R · Tap RB / R1 Mag → reserve. Hold RB is stance wheel, not reload.
Interact KB: E (shares hotbar 2) · Pad: D-pad Down Keyboard: Interact prompt legal → E prefers Interact. Pad: D-pad Down confirms Interact (hold-to-complete if authored) — not shared with the ability radial. Vault stays A/Cross / Space.
Tentacles Active / Inactive T · RS click / R3 Toggle mounted tentacles on/off. Does not flip Off ↔ Def.

Special Takedown has no button. It auto-fires at 30 combo.

FS-INP-005 — Gamepad defaults (playtest provisional)

Section titled “FS-INP-005 — Gamepad defaults (playtest provisional)”

Xbox and DualSense share this map (Xbox name · DualSense name). Playtest may remap faces; keyboard stays authoritative for PC. Full Press/Hold/Release: Programming Bible docs/08-camera-input-movement.md § K pad table.

Input Tap Hold Release
LB / L1 no-op Open ability radial (hotbar 1–6) Cast highlighted wedge (if any)
RB / R1 Reload Open stance wheel (loadout 1–7) Commit highlighted stance
Y / Triangle Grenade throw / cook start Cook if authored Throw if cooking
RS click / R3 Tentacles Active ↔ Inactive — —
D-pad Up Vision cycle — —
D-pad Down Interact (when prompt legal) Hold-to-complete if authored Cancel hold-interact
D-pad Left / Right Reserved playtest — —
View / Create GUI locator ping Open Local / World map —
Menu / Options Session Esc Character I —
A / Cross Jump family (Vault / Wall Run / …) — Does not cancel Wall Run
B / Circle Crouch / Slide gate Stay crouched End crouch per mode
X / Square Melee Strike — —
LT / L2 · RT / R2 ADS / Fire (shield bash per FS-LOD-009) Sustain End ADS / stop fire
LS Move; click (L3) = Toggle Sprint (FS-INP-006) — not full-tilt sprint — —
RS Look; while LB/RB held = radial / wheel aim — —

Ability radial wedge order (clockwise from top): 1=Q · 2=E · 3=Z · 4=X · 5=C · 6=F. Empty wedges draw but do not cast.

Implement as one Input Context for On-Foot (IMC_TFA_Default) plus a UI context (IMC_TFA_UI), Map context (IMC_TFA_Map), and Chat context (IMC_TFA_Chat).

  • IA_TFA_Map: Chorded Tap vs Hold action on Tab (and M). Suppressed while IMC_TFA_Chat is active.
    • Tap (Triggered < hold threshold): Broadcasts OnPingPrimaryWaypoint from UTFAObjectiveSubsystem. Brightens the GUI locator: W_TFA_3DWaypoint (world pip) + W_TFA_HeadingTape + tracker gold blip. Reveals name + meters for 4 s. Does not open the map. Does not draw a nameplate on the Firehand reticle.
    • Hold (Triggered ≥ hold threshold): Evaluates planetary context (IsPlayerOnPlanet()). If true, pushes W_TFA_LocalMap; if false, pushes W_TFA_WorldMap onto UPrimaryGameLayout game menu layer.
  • IA_TFA_MapToggle: Inside IMC_TFA_Map, pressing Tab triggers ToggleMapPerspective() to switch smoothly between W_TFA_LocalMap and W_TFA_WorldMap.
  • IMC_TFA_Chat: Pushed when Online compose is focused. Higher priority than IMC_TFA_Default map chords. Popped on send, empty Enter, Esc, or any overlay (Deck, I, map, Esc).
    • IA_TFA_ChatOpen: Enter on foot, chat closed, Online, no overlay. Solo ignores.
    • IA_TFA_ChatSend: Enter, no Shift. Empty body closes without send.
    • IA_TFA_ChatNewline: Shift+Enter. Inserts a newline; compose stays open.
    • IA_TFA_ChatChannel: Tab. Cycles Fireteam → Clan → Match → General → Proximity (wrap). Skip empty seats (ClanId empty → skip Clan; outside matchmade activity → skip Match). Whisper is not Tab. Remember last Tab-cycle channel per PUID.
    • IA_TFA_ChatClose: Esc. Closes compose without sending. Does not open the session menu.
  • Hold threshold: 200 ms lab / Demo default on UTFAInputConfig (was TBD-006 — locked 2026-10-30). Same value for loadout 2·4·6·7, Tab ping vs map, pad LB ability radial, pad RB stance wheel. Tunable in Demo Mod / data — do not hardcode magic numbers in GA graphs. Chat has a message limit; the number is TBA. Gamepad chat binds and flood rate also TBD-033.

Follows current stance mode (FS-LOD-005). In Wrist / single gun / single melee, wheel runs the singles loop (Wrist + guns + melee — skip empty). Does not open a 1–7 strip on the play HUD. Does not enter Dual or Phys Shield.

FS-INP-004 — Press / Hold / Release state matrix

Section titled “FS-INP-004 — Press / Hold / Release state matrix”

Every bound control shall define gameplay for Press, Hold, and Release (and context when the same key changes verb). The authoritative matrix lives in the Programming Bible: docs/08-camera-input-movement.md § Keymapping bible. Verb defaults in FS-INP-001, pad defaults in FS-INP-005 (playtest-provisional), sprint engage in FS-INP-006, loadout tap/hold in FS-LOD-004, and movement pairs in FS-MOV-* remain the shalls; the bible expands them to edge-complete states. Hold threshold 200 ms (was TBD-006). Open: pad chat TBD-033, D-pad Left/Right playtest reserve, parkour meter defaults via playtest. Do not invent alternate pad faces in C++ without updating FS-INP-005.

FS-INP-006 — Sprint engage (toggle default · Auto Sprint option)

Section titled “FS-INP-006 — Sprint engage (toggle default · Auto Sprint option)”

Default binds

Platform Default Notes
PC Toggle Sprint on Left Shift Remappable (FS-INP-001)
Pad Toggle Sprint on LS click (L3) Remappable
Hold Sprint Separate remappable bind — unbound by default Needed when the player wants hold-to-sprint for Slide / Wall Run enter gates without Toggle

No full-tilt stick sprint. Move stick magnitude alone never enters sprint.

Toggle Sprint (Press): if not sprinting and grounded / legal → enter sprint; if already sprinting → exit sprint. Same for Shift and L3. Hold under Toggle default is —. Release under Toggle is no-op (sprint stays until cancel or second Press).

Hold Sprint (only when that bind is mapped): maintain sprint while held; Release exits sprint. Does not cancel an already-started Slide; does not cancel Wall Run (Wall Run is not hold-to-stick).

Sprint cancel (any engage path): stop move · ADS · Fire start · plain Crouch (not Slide) · illegal stance. Cancel clears sprint; does not peel Wall Run already attached.

Auto Sprint (Options → Controls): boolean, OFF by default. When ON, forward move past threshold while grounded / legal auto-enters sprint (no Shift / L3 required). Toggle Sprint still cancels / re-engages. Hold Sprint (if bound) still works. Slide and Wall Run enter gates still require the sprinting state — Auto Sprint can supply it. Same Options asset from Main Menu and Esc Settings (FE Spec).

No single button owns Dodge, Vault, Slide, and Wall Run as unconditional verbs. Space may contextually Vault or enter Wall Run or Jump or wall jump-off or post-exit double jump — it never Dodges or Slides. Sprint+Crouch never Wall Runs. Double-tap+Crouch never Slides. Double-tap opposite during Wall Run is wall-to-wall dash, not ground Dodge. Space while Wall Running jumps off; it does not cancel by release and does not wall-to-wall dash. Default Left Shift / L3 Toggle Sprint engages without full-tilt stick; Auto Sprint OFF by default (FS-INP-006).

In PIE on-foot (plus sampled chat / map / I): each control in the Programming Bible keymapping matrix matches its Press / Hold / Release rows. Space release never cancels Wall Run. Hold 2 / 4 / 6 / 7 and Tap counterparts match FS-LOD-004. Tab tap pings; Tab hold opens map; Tab in chat cycles channels only.


Baseline for every operative in FPP and TPP, all rulesets. Affixes and skills may change distance, cooldown, or cost. They do not gate the verbs.

  • Double-tap Forward / Back / Left / Right → Dodge on that axis (world/camera-relative).
  • Crouch held/pressed during that double-tap → Roll (same i-frame / recovery window; different anim and silhouette).
  • Short displacement, not a teleport. Cannot chain infinitely. Recovery frames and stamina/Energy cost: TBD-007.
  • Stamina / sprint reserve is not on the play HUD unless a later pass asks.

Both required: moving at or above the slide threshold speed (SlideMinSpeed, lab default 750 cm/s, about 16.8 mph, a tunable dial — it is a speed threshold, not the Sprint button) and Crouch. Feet-first (boots lead). If below the threshold, Crouch only crouches. Crouch is hold-to-crouch, not a toggle (designer lock 2026-11-02): hold crouches, release stands. Once a Slide starts it runs to its end (SlideMaxDuration, lab default 1.25 s) — releasing Crouch mid-Slide does not stand up early (designer lock 2026-11-03); still holding after the Slide ends means crouch. Can chain into melee, dodge, or ADS (Slide-Fire Effectiveness applies).

Near a vaultable tagged ledge / cover lip / low barrier, Space / Cross / A while moving into it (same physical key as Jump / Wall Run enter — context wins). Keep directional momentum. Pick a random clip from a small authored set. All clips share the same start / apex / land gameplay windows. Failed vaults do not soft-lock. When both vault and wall-run contexts are legal, prefer authored priority on the parkour DA (default: Vault if Vaultable dead-ahead; else Wall Run).

Tag: TFA.World.Vaultable.

FS-MOV-004 — Wall Run (was “Wall Walk”)

Section titled “FS-MOV-004 — Wall Run (was “Wall Walk”)”

Enter: sprint speed and Space / Cross / A and contact / legal proximity with a tagged wall. Same Space as Vault / Jump — contextual. Sprinting into a wall without Space does nothing.

Persist: Wall Run continues while valid wall contact — not a hold-to-stick. Releasing Space does not cancel. Ends on leave surface / fail / Wall Run duration timeout (WallRunMaxDuration — data-driven; TBD default) / wall jump-off. Successful opposite-wall dash jump does not end Wall Run — see below.

Wall Run timer: Each Wall Run stint has a duration budget that counts down while attached. Fresh enter from ground/sprint starts the timer at full. A successful opposite-wall dash jump that attaches to the new wall resets the Wall Run timer to full. Failed / out-of-range dash does not reset. Wall jump-off ends the stint (timer discarded until next enter).

Wall jump-off: While Wall Running, Space / Cross / A peels the operative off the wall into air with exit momentum (away from / along the leave vector of that wall run). Ends Wall Run. Not Vault. Not opposite-wall dash jump.

Double jump after wall jump-off: In the air window after a wall jump-off, Space / Cross / A once more performs a double jump whose travel direction follows the wall-exit jump direction (carry the leave vector — do not grant a free midair redirect onto look/stick alone). Same mesh-only flip rule as normal double jump (camera / Look unchanged). Consumes the normal air-jump charge for that leave; landing or re-sticking to a wall refreshes per baseline jump rules. Ground / ordinary jump double-jump unchanged.

Opposite-wall dash jump (wall-to-wall): While Wall Running, double-tap move toward the opposite side (Left run → double-tap Right, and vice versa). Presentation is a dash jump across the gap (short airborne transfer, not ground Dodge). If an opposite tagged wall is within MaxWallDashDistance (data-driven; TBD default), the operative dash-jumps to that wall, continues Wall Run on the new side, and resets WallRunMaxDuration to full. Out of range → no transfer (no free teleport); timer unchanged. Same-side double-tap does not wall-to-wall. On ground, double-tap remains Dodge (FS-MOV-001). Not Space (Space while Wall Running = wall jump-off only).

Not Tic-Tac: Controlled distance-gated transfer — not Carbon Tic-Tac montages (Demo cut).

Tag: TFA.World.WallRunnable (alias / migrate TFA.World.WallWalkable).

Extend Lyra / CMC with custom modes: MOVE_TFA_Slide, MOVE_TFA_WallRun (was WallWalk), MOVE_TFA_Vault, MOVE_TFA_Dodge, plus opposite-wall dash jump as a short transition that re-enters MOVE_TFA_WallRun on the far wall and resets the Wall Run duration timer, plus wall jump-off → airborne with a single directional double-jump charge. Do not overload MOVE_Flying for wall run.

On an authored movement sandbox: Dodge, Roll, Slide, Vault, Wall Run each fire only from their input pair. Space enters Vault or Wall Run by context, never Dodge/Slide. While Wall Running, Space jumps off; a second Space in that air window double-jumps along the exit direction. Opposite double-tap during Wall Run dash-jumps only when the far wall is in MaxWallDashDistance, then continues Wall Run with the duration timer reset to full. Untagged walls never stick.


Weapon1, Weapon2, Weapon3, Weapon4, // guns or melee only
WristMelee, // Wrist Razors / Blades only; hotkey 1
PhysicalShield, // dedicated board; not a hotkey alone
Helm, Chest, Gloves, Belt, Boots,
EnergyShield, // Barrier / Aegis only; always on
Ring1, Ring2, Amulet

Charms / chips are bag power, not doll slots. Physical Shield is not a doll callout — it lives in LOAD OUT with W1–W4.

FS-LOD-002 — Assignments (player-configured)

Section titled “FS-LOD-002 — Assignments (player-configured)”
  • Wrist Melee → key 1
  • Primary gun / Secondary gun → keys 2 / 3
  • Primary melee / Secondary melee → keys 4 / 5
  • Physical Shield → Hold 2 / Hold 4 cycles when filled

Not hard-locked to Weapon 1–4 index.

FS-LOD-003 — Default stance is always single

Section titled “FS-LOD-003 — Default stance is always single”

Tap 2 / 3 / 4 / 5 selects that assignment and resets that family to single-wield.

Input Result
1 Wrist Melee. Never pairs with Phys Shield.
Tap 2 Primary gun, single
Hold 2 Cycle Dual guns ↔ Gun + Phys Shield (skip empty steps)
Tap 3 Secondary gun, single
Tap 4 Primary melee, single
Hold 4 Cycle Dual melee ↔ Melee + Phys Shield (skip empty steps)
Tap 5 Secondary melee, single
Tap 6 Primary gun + Primary melee
Hold 6 Primary gun + Secondary melee
Tap 7 Secondary gun + Primary melee
Hold 7 Secondary gun + Secondary melee

If Phys Shield empty, skip shield step. If only one valid 1H in that family, skip dual. Hybrids require both pieces 1H; else no-op.

Singles loop (Wrist + weapons only — never dual, never Phys Shield, never hybrid). Skip empty / illegal. Order wraps:

Wrist → Primary gun → Secondary gun → Primary melee → Secondary melee

Mode Wheel
Wrist Singles loop (above)
Single gun Singles loop (above) — includes Wrist
Single melee Singles loop (above) — includes Wrist
Gun + Phys Shield Which 1H gun is paired (stays in shield stance; Wrist not in this loop — Tap 1 or leave shield first)
Melee + Phys Shield Which 1H melee is paired (same; Wrist not in this loop)
Dual guns / dual melee No-op
Hybrid Four gun × melee combos

Wheel does not activate Dual or Phys Shield — those stay Hold 2 / Hold 4 (FS-LOD-004). Do not fold Dual / Phys Shield into the singles mouse-wheel loop (fat-finger + ADS-off risk mid-fight). Pad Hold-RB stance wheel may still list every stance. Optional later: modifier+wheel for Dual/Shield only — not the default singles loop.

  • Wrist Melee + Physical Shield: never.
  • Physical Shield alone: no combat stance.
  • Dual + shield, or gun + melee + shield: impossible (three hands).
  • Active 2H gun or 2H melee: lock duals, hybrids, and Phys Shield pair. Stowed 2H in another slot does not lock 1H draws.
  • Energy Shield slot stays equipped and active in every stance.
  • While Phys Shield is not in the active pair: equipped but not in-hand (no block / bash).
  • ADS / Precision Aim / Shift-Out: HARD LOCK off for any dual-weapon stance and any Phys Shield in-hand pair (FS-LOD-007, FS-INP-001, FS-CAM-004).
Stance ADS
Solo firearm, solo 2H gun Allowed
Gun + Phys Shield HARD LOCK: no ADS (shield in-hand)
Dual guns, Hybrid, Dual melee HARD LOCK: no ADS
Solo melee, Wrist, Melee + Phys Shield N/A (TPP melee; shield in-hand has no ADS)

TFA.Stance.GunPhysShield and TFA.Stance.MeleePhysShield never admit Precision Aim, ADS reticle tighten, or Shift-Out. Dual-weapon gun stances: slower reload (tunable penalty).

Implement UTFALoadoutComponent as an explicit state machine. Tags in §2.3 are the replicated stance. Weapon actors spawn / holster from state, not from raw key index.

FS-LOD-009 — Phys Shield hand side · bash / block

Section titled “FS-LOD-009 — Phys Shield hand side · bash / block”

Hand rule: In GunPhysShield / MeleePhysShield, the 1H partner and the Phys Shield occupy opposite hands. Default: partner on right, shield on left (mirror / lefty preference may swap — data on pawn). Replicated hand tags drive mesh attach and input remap.

Bash / block button = the control on the shield’s side (not a third dedicated key):

Shield hand Pad Mouse (PC) Partner 1H uses
Left (default) LT / L2 RMB (ADS seat) RT / R2 · LMB fire / melee strike
Right RT / R2 LMB LT / L2 · RMB
State Behavior (shield-side button only; board in-hand)
Press (tap) Shield bash — short offensive bash GA
Hold Block / guard (FBR frames — damage pipeline step)
Release End block

Inactive / unequipped board: no bash, no block (FS-LOD-006). ADS / Shift-Out stay hard-locked while any Phys Shield is in-hand — the shield-side button never opens ADS in these stances.

Fill W1–W4 with two 1H guns and two 1H melee, plus Phys Shield. Prove every row in FS-LOD-004. Empty the shield and confirm Hold 2 / 4 skip the shield step. Draw a 2H and confirm 6 / 7 / shield pair no-op. Hold 2 into Gun + Phys Shield: LT / Precision Aim is refused (no ADS reticle tighten); tap LT (default left shield) bashes; hold LT blocks. Hold 4 into Melee + Phys Shield: same shield-side bash/block; no ADS/Shift-Out. Solo gun after Tap 2: ADS works again on LT/RMB.


Ultra-lethal, high-speed. Not drawn-out trades.

Target Melee (TPP) Ranged (FPP)
Basic Grunt 1 hit clean decap / slice 1 head / 2 torso
Elite / Brawler 2–3 balanced inputs Break Shield / Armor first

Melee Strike = directional lunge / slash from Left Stick facing + camera. Range and connect are player spacing. No auto target pull. Cadence is player-driven (dash / vault / slide), not auto-leap radius doubling.

Manual aim. Headshots neutralize when TTK rules allow. Gunfeel layer in §12. One shared baseline for all rulesets.

Kill combo meter. Thin ring around the Terra Firma symbol. Flow and Ultimate are separate meters that both read kills.

Tier Combo Effect
1 0–15 Baseline velocity
2 Overclocked 15–30 +30% move speed; visor pulse
3 Singularity 30+ 0.5 s bullet-time on the trigger kill; auto Special Takedown

Kill credit / Demo combat bar: Melee Drive and Precision Fire both feed Kinetic Flow → Singularity (FS-CMB-005 Burst Storm). Demo lock (2026-10-27): Asymmetric Flow · second meter · full Burst Storm art are in the Ladder Demo (not deferred). Ultimate stays separate (FS-CMB-006). Design: docs/superpowers/specs/2026-10-26-singularity-one-flow-two-verbs-design.md · bible docs/22-demo.md.

Reset to Tier 1 / combo 0 when:

  • Special Takedown resolves, or
  • Whiff (strike empty air / miss execution window), or
  • Damage break — interim: take any damage (legacy shall). Final rule open: TBD-056 (no freeflow Block input; options under review: Health-only dump · Shield/Armor forgiven · Health damage budget · soft decay / combo armor). Do not invent forgiveness numbers in C++ until TBD-056 locks.

Whiff reset applies 0.5 s stagger. Damage-break stagger follows the locked TBD-056 rule (interim: 0.5 s with any-damage dump).

Singularity is a climax, not a sustained state. One auto takedown → back to Tier 1.

FS-CMB-005 — Special Takedown / Singularity Burst Storm

Section titled “FS-CMB-005 — Special Takedown / Singularity Burst Storm”
  • No player button. No aim.
  • Always TPP.
  • Payload: 10 grounded radial varieties (random, repeats allowed) + Kinetic outward kick.
  • Character stays grounded. No jump, hang-time, or aerial slam (reserved for Ultimates / authored combo skills).
  • Burst length ≈ 0.2–0.45 s so varieties can chain.
  • Knockback bands: 0–2 m heavy fly · 2–5 m stagger + slide · 5–8 m light push.
  • Channels: Kinetic always present; others from the nine-channel set; Prism Storm may flicker multiple.

Implement as a GAS ability GA_TFA_SingularityTakedown granted to every operative. Variety table is data (DA_TFA_SingularityBursts).

Ultimates are player-spent, charged on the Terra Firma symbol, empowered by the Customizable 4×4. Singularity is the Flow climax. Do not merge them.

FS-CMB-007 — Ultimate + Skill Energy kill economy (lab defaults)

Section titled “FS-CMB-007 — Ultimate + Skill Energy kill economy (lab defaults)”

Streak math (Approach A): on each kill, streakCount = kills in the last window (including this kill, min 1). mult = min(Cap, 1 + (streakCount - 1) × Step). Credit for this kill = Base × mult (then clamp). Gap longer than the window resets streak to 1 on the next kill.

Meter Base / kill Passive Window Step Cap
Ultimate (Shiv %) 8% 0.4%/s in combat (dealt or took damage in last 8 s) 6 s +0.25× 2.5×
Skill / Arms Energy 6 4/s regen (EnergyMax 100 before INT) 6 s +0.2× 2.0×

Demo Mod may override these dials session-wide (docs/superpowers/specs/2026-10-26-demo-combat-economy-stats-design.md). Visual spend ladder unchanged (FS-HUD-007). Flow combo unchanged (FS-CMB-004).

Chain 30 kills without a damage-break → auto TPP takedown → Flow = 0. Interim (TBD-056 open): one any-damage hit at combo 20 → Flow = 0 and 0.5 s stagger. When TBD-056 locks, re-run this AC against the chosen rule (Health-only / budget / soft decay / …). Confirm no takedown button exists in the Input Context. Three kills inside 6 s: Ultimate credits rise per kill (Approach A). Skill Energy gains a smaller streak sip on the same kills.


Kinetic plus eight energy: Thermal, Cryo, Arc, Toxin, Isotopic, Fission, Plasma, Void. Anomalous / Magic do not exist.

FS-DMG-002 — Chance to hit (kinetic melee / hybrid ballistic)

Section titled “FS-DMG-002 — Chance to hit (kinetic melee / hybrid ballistic)”
ChanceToHit% = clamp( 200 × (AR / (AR + DR)) × (alvl / (alvl + dlvl)) , 5, 95 )

Miss → 0 kinetic damage; on-striking procs do not fire. Ignore Target Defense / some skills skip or modify this roll. alvl / dlvl are character / monster level from §14 / FS-CMP-006. Demo Mod Encounter lab may set both for CtH / hardness sims.

Online: this roll runs on the server after geometric auth (FS-ARCH-013). The client must not apply ChanceToHit or damage. Presentation may show a predicted connect; a server miss ghosts the mark and deals 0.

FS-DMG-003 — Kinetic pipeline (order is the contract)

Section titled “FS-DMG-003 — Kinetic pipeline (order is the contract)”

A BaseMin/Max → B flat min/max → C ED% bucket → D attribute %ED by weapon class → E skill multipliers → E2 Level Power Delta outgoing (OutgoingMul — FS-DMG-009) → F convert % physical to elemental → G Crit / Deadly Strike (double physical portion) → H on-hit (Crushing Blow, Open Wounds, Prevent Monster Heal) → I target mitigation → J Life / Energy steal from damage actually dealt.

Publish one ED model in data and do not hide it:

(Base + flat) × (1 + weaponED) × (1 + offWeaponED + attrs + auras) × skillMult × OutgoingMul

Elemental / skill outgoing (FS-DMG-004) also multiplies by OutgoingMul after skill damage is formed and before enemy resist application.

EnemyEffectiveResist = EnemyResist − Pierce% − Mastery − LR analogues
If EffectiveResist ≥ 100 → Immune (unless broken below 100)
DamageDealt = SkillDamage × (1 − clamp(EffectiveResist, −∞, 99) / 100)

Negative resist amplifies. Cryo chill/freeze; CBF negates freeze on player. Toxin is total damage over duration. Plasma is strong vs shields. Void has sparse natural resists.

FS-DMG-005 — Incoming to player (order is the contract)

Section titled “FS-DMG-005 — Incoming to player (order is the contract)”
  1. Avoidance (Dodge / Avoid / Evade, miss vs monster AR)
  2. Block (Phys Shield in-hand + Dex; FBR frames)
  3. Difficulty resist penalty on non-kinetic channels
  4. Level Power Delta incoming (IncomingMul — FS-DMG-009) — multiply remaining channel damage so Apex resist crater and underlevel glass stack
  5. Clamp resist to cap (default 75% + max-resist items) for the eight energy channels
  6. Absorb flat / %
  7. DR flat / % on kinetic
  8. Energy Shield shifts % to Energy
  9. Armor / analogue pools
  10. Remainder to Shield then Armor then Health (HUD: blue / amber / red)
  11. Hit Recovery if damage ≥ threshold

Never merge Shield, Armor, and Health into one pool.

Ruleset Crit % Headshot TTK
Story Enabled. Non-headshot can roll crit (+50% baseline). Crit+ on consecutive headshots. Applies
Progressive MP No Crit % from rolls, gear, or skills Applies (aim / frame only)
Ladder No Crit %; affix deltas flattened / zeroed Applies

Do not author separate aim-assist profiles per ruleset.

Separate global PvP damage scalar. Leech / Crushing Blow reduced. Ladder kits normalized. Scalar value: TBD-008.

  • Offensive sets mirror the active weapon channel at an Energy cost. Coefficient × weapon hit after Step E (then Step E2 PowerΔ). Crit timing (before vs after): TBD-009 — pick one in data and lock it.
  • Defensive sets do not deal damage; they add absorb / CC.
  • Mechanical Arms use the same Offensive mirror at a reduced coefficient (TBD-010).

FS-DMG-009 — Level Power Delta (activity floor + asymmetric out/in)

Section titled “FS-DMG-009 — Level Power Delta (activity floor + asymmetric out/in)”

Wrong-activity feel without a separate power-score number. Character Level is the only power number; activities publish Recommended Level (ARL).

MobOffset = clamp(dlvl − ARL, −3, +5)
EffectiveDelta = (alvl − ARL) + MobOffset
OutgoingMul, IncomingMul = nearest-integer knot lookup on EffectiveDelta (data table)
Lever Owns
ARL + PowerΔ Damage dealt / taken scalars only
alvl vs dlvl ChanceToHit only (FS-DMG-002) — unchanged
Difficulty Non-kinetic resist penalty (FS-PRD-005) — unchanged

Lab-default knots (tune in data; soft overlevel, harsh underlevel):

EffectiveDelta OutgoingMul IncomingMul
≤ −10 0.35 1.75
−7 0.50 1.50
−5 0.65 1.35
−3 0.80 1.20
−1 0.92 1.08
0 1.00 1.00
+1 1.04 0.97
+3 1.10 0.92
+5 1.14 0.88
≥ +8 1.15 cap 0.85 floor
  • PvP / Ladder: force both muls to 1.0.
  • Story + Progressive MP PvE: apply.
  • Band assumption until TBD-017: meaningful Δ ≈ ±10 on ~1–60 levels.
  • Authorship: area / activity row owns RecommendedLevel with Difficulty and monster policy (FS-PRD-005 · FS-CMP-006). Demo Mod Encounter may override ARL for lab only.
  • Design: docs/superpowers/specs/2026-10-26-level-power-delta-design.md.
HUD name Color Source
SHIELD Blue Energy Shield (Barrier / Aegis) slot; always on
ARMOR Amber Plate integrity
HEALTH Red Life / CON + Trauma Weave

Overshield (tentacle / ability): tint Shield and Armor purple for the buff duration. Health stays red. Purple is a state tint, not a fourth bar.

One Skill / Arms Energy pool for Combat skills and tentacles. Default max 100 (INT can raise max — FS-PRG-002). Regen 4/s; pickups accelerate. Kill sip 6 × streak mult (FS-CMB-007). Offensive casts and tentacle verbs drain it. Some Defensive tentacle skills may restore it. Ordnance does not drain it.

Pickup form (world bricks vs orbs vs both): TBD-011.

Unit test the kinetic pipeline and incoming pipeline with a fixed spreadsheet example. Changing step order fails the test. A Story crit must not fire under Ladder tags. Include FS-DMG-009 PowerΔ: Δ = 0 → muls 1.0; known underlevel knot (e.g. −5) matches table; PvP / Ladder tags force muls to 1.0.


Baseline kit. Not Phonon-gated. Cycle wrap. Works in FPP and TPP. Illumination affix widens Normal Light; it is not an eighth mode.

# Mode Function
1 Normal Light Visible spectrum
2 Infrared Low-light silhouette; not Heat
3 Heat Thermal bloom (bodies, engines, discharge, footprints)
4 Ultraviolet Stains, nanite residue, glyphs, tripwires
5 Sonar / Pulse Echo Short-range ping; takes over bottom-left tracker disc
6 Motion Trace Fading displacement trails
7 Aether Sight Auras, Phonon signatures, tentacle draw

Worldbuilding may call mode 7 Spiritus Sight. Ship GDD name Aether Sight until a global rename (TBD-012). Spiritus Sight remains rare / unstable fiction — not a second standard mode.

  • UTFAVisionComponent replicates the active tag.
  • Each mode is a post-process material + optional Niagara / custom-depth pass.
  • Shared OmniVisor chrome must remain readable under every overlay.
  • Author invisibility families so each has at least one strong mode and one weak mode.
  • Pulse Echo grenade may temporarily take over the tracker disc (same seat as Sonar).

Cycle 1→7→1. Only one pip lit. Overlay changes; Shield / Armor / Health / Terra Firma symbol stay readable. A cloaked actor tagged for IR is visible in IR and not in Normal.


Illustrated lock: GDD vol. 15, figures OV1–OV11. Chat stills OV29 / OV31. Feel: dense sci-fi visor chrome, TFA-original marks. Not a GDD infographic.

FS-HUD-001 — Three player-locked anchors

Section titled “FS-HUD-001 — Three player-locked anchors”
Seat Content
Top left Shield / Armor / Health stacked
Center top Terra Firma / Shiv mark is the Ultimate meter. Painted Shiv (inward horns, three side spikes, needle chin, inner mask lines). FE30 still shows it fire / red. No second Ultimate bar. No metal ring. Facet wireframe around the mark carries charge; flame on the mark at 100%. Vision chip under the symbol. Active Customizable loadout pip (1 of 4) next to the symbol.
Top right Skill / Arms Energy. Three tentacle-set pips (Off / Def) + Active/Inactive read. Pre-gate: one Mechanical Arms pip. Compact combat hotbar (6 slots · Q/E/Z/X/C/F) + CDs under Energy — Ultimates and/or Combat-tree skills only; tentacles and grenades never.
  • FPP: center reticle + bloom from Firehand Bus (weapon-linked, not one generic crosshair)
  • Incoming-hit chevrons on visor rim
  • World-space IFF brackets (friend / foe / squad)
  • Bottom left: motion tracker / IFF disc (Sonar can take over). Online: faded chat log above this disc (FS-HUD-010); compose is contextual.
  • Bottom right: weapon + mag / reserve / reload + Field / Specialist / Siege brick + grenade type/count + compact stance pip (solo / dual / shield / 2H). Reserve is the ammo counter (FS-AMMO-001).
  • Physical Shield guard pip only when board is in-hand

Active auras (few pips), proc / DoT / CC, Overclocked pulse, Singularity flare, Shift-Out frame, Dea comms text (no portrait billboard), GUI locator (quiet world pip; heading tape; tracker gold blip — name + {dist} m + elevation chevron only on Tap Tab / M ping), interact / vault prompt (OmniVisor chrome — not a Carbon widget; vault execute remains Space / Cross / A per FS-MOV-003; Interact confirm shares E with hotbar slot 2 — when prompt legal, Interact wins), Suit Cell / brownout, hit / headshot marks (Crit marks Story-only), Online chat compose (W_TFA_Chat — FS-HUD-010).

Full 1–7 strip, compass rose, Skill GUI, paper doll, Crafting Page, Customizable 4×4, XP bar, a second Ultimate bar, Discord as a chat channel, a Command Deck chat tab, chat on Character screen I.

Looked-at hostile: name / rank + Shield / Armor / Health. Grunt short; Elite longer; Boss stays up for the encounter. Player bars stay top-left. Miss vs AR/Def = miss tick, not a hit mark.

Fusion, Linear, Trace, Wave, Bow, Support frame, Charged Strike: charge ring on the Firehand Bus reticle. Trace / Fusion vent is a pip on that ring.

Empty 0% dead iron → ~25% few cyan traces on the facet cage → ~50% most facet lines + dull fire on the Shiv → ~75% hot outline, no full flame → 100% Shiv on fire. On spend: flame dies first, then facet collapse. Brand mark: painted Shiv only (figures/tf_shiv_logo.png, fire treatment tf_shiv_logo_fire.png). No gem housing on FE; play HUD cage is facet wireframe only. Triangle-eye never on game screens.

FS-HUD-008 — GUI locator (FE30 primary; FE28 / FE29 secondary)

Section titled “FS-HUD-008 — GUI locator (FE30 primary; FE28 / FE29 secondary)”

FE26’s name + meters + rings on the reticle is the clutter anti-example. Primary never owns screen-center.

Primary lock — ship FE30. Quiet world pip + heading tape + tracker gold blip together. Still: fe30_waypoint_combo.png. Center-top Ultimate is the painted Shiv on fire.

Secondary options (thinner density; not the default ship):

  • FE28 — world pip only (name still hidden until ping). Use when the tape would fight a cinematic / tutorial visor.
  • FE29 — heading tape as the heading cue (gold Primary pip under the brow). Use when the world pip is off (e.g. target behind camera and you want tape-only).

Tracker gold blip on the existing IFF disc may stay in all three. Do not mix FE26 callouts into any option.

UTFAObjectiveSubsystem holds exactly one Primary. That Primary is the GUI locator source. It is not a second minimap and not a compass rose over the world.

FE30 default (always on while a Primary is set):

  • Quiet world pip (W_TFA_3DWaypoint): 8–12 px gold diamond projected onto the target in world space. Sits off the Firehand reticle. No name, no meters, no rings.
  • Heading tape (W_TFA_HeadingTape): thin tick strip under the visor brow. Shiv Ultimate stays center-top; the tape runs behind / beside it. Gold pip = Primary heading. Off-FOV: pip parks at the tape end with a chevron. Not a compass rose painted over the world.
  • Tracker blip: gold diamond on the existing W_TFA_TrackerDisc. Red blips stay hostiles. Not a second minimap. Sonar still takes over this disc.

Ping (Tap Tab / M, 4 s):

  • Reveal name + {dist} m + elevation chevron (▲/▼ if >3 m) next to the quiet pip, never on the reticle.
  • Brighten tape pip and tracker blip.

Off-FOV:

  • World pip hides. Tape + tracker remain. Tiny rim tick on the visor ellipse (not a nameplate, not FE26’s visor-rim callout).

Hold Tab still opens the map. Clearing Primary hides all locator seats.

Lock: ship FE30. FE28 and FE29 are secondary options only. Do not ship FE26. Center-top Ultimate / Shiv is the painted horned mark (figures/tf_shiv_logo.png) — fire treatment tf_shiv_logo_fire.png. Never a new skull, helmet, or triangle-eye.

Widget Seat
W_TFA_OmniVisor Root play HUD
W_TFA_Vitals Top left
W_TFA_UltimateGlyph Center top
W_TFA_VisionChip Under glyph
W_TFA_EnergyHotbar Top right
W_TFA_HeadingTape Under visor brow; gold Primary pip
W_TFA_TrackerDisc Bottom left IFF disc + Primary gold blip
W_TFA_WeaponAmmo Bottom right
W_TFA_TargetPlate Look-at
W_TFA_Comms Handler text (Dea). Not player chat.
W_TFA_Chat Online player chat. Seat above the tracker, off the reticle. FS-HUD-010.
W_TFA_3DWaypoint GUI locator — quiet world pip off reticle; ping reveals name

Combat hotbar slot count: 6 (Q/E/Z/X/C/F) — was TBD-013, locked 2026-10-30 (F added same day; V remains Vision). Chat has a message limit (number TBA). Flood / gamepad: TBD-033.

FPP gun: reticle + bloom + three vitals + glyph + energy. Swap to melee: reticle softens, chrome remains. Dual-gun / Hybrid / Gun + Phys Shield: no ADS reticle tighten (FS-LOD-007). XP does not appear on the visor.

FS-AMMO-001 — Ammo counter, never a bag tile

Section titled “FS-AMMO-001 — Ammo counter, never a bag tile”

World ammo bricks (Field / Specialist / Siege) auto-pickup into that brick’s reserve counter on W_TFA_WeaponAmmo (OmniVisor bottom right). They are never a bag tile — not Gear, not Socketables, not Artifacts, not a Crafting stack. Not Inspect. Not a stack in W_TFA_Bag_Gear. Dual Stack Cells, Frames, Blueprints, and Kha-Shards stay Crafting reagents / keys; they are not ammo.

Magazine is the gun mag. Reload pulls from reserve. Caps per brick: TBD-040. Do not invent numbers.

Pickup: overlapping a brick adds to that brick’s reserve until the cap. If the counter is already full, pickup fails closed — the brick stays on the ground. If adding would overflow, fill to cap and leave the remainder on the world brick. Player cannot pick up more until reserve drops (spend / reload).

Ordnance grenade charges are a different pool (FS-PRG). They are not ammo bricks.

Walk a dummy Field brick while Field reserve is under cap: reserve ticks up; no Gear tile appears. Fill to cap, walk another Field brick: it stays in the world; bag unchanged. Open I → Gear: no ammo icons. Spend reserve under cap, walk the left brick: pickup resumes.

Online OmniVisor only. Not a Command Deck tab. Not on Character screen I. Discord is not this chat and not a channel. Dea handler text stays on W_TFA_Comms.

Seat: lower-left, above the tracker disc, off the Firehand reticle. Last few log lines may stay faded while compose is closed. Solo: no widget.

GDD master: In-game Chat (#in-game-chat). Stills: OV29 compose (Fireteam / HAVOC team). OV31 Tab cycle. OV32 Shift+Enter new line. Lock plate: locks/lock_hud_chat.svg (keys + message limit TBA). Do not number a chat still OV30 (FE30 is the GUI locator). Do not invent a limit number or proximity meters on a still.

Channels. Tab cycle (wrap). Skip empty seats. Whisper is not in the Tab cycle. Remember last Tab-cycle channel per PUID. Whisper is sticky only while that DM thread is active; leaving Whisper returns to the last Tab-cycle channel.

Channel Audience Tab cycle
Fireteam Current fireteam only (example label HAVOC team). A fireteam of 1 still has this channel. Yes
Clan Every online member of your ClanId, including other instances. Send fails closed with no clan. Yes — skip if ClanId is empty
Match Everyone registered in this matchmade activity (RAID / Vault / Ladder). Not the Social fireteam roster by itself. Yes — only while in that activity
General Everyone in the current instance. Yes
Proximity Online players within the server proximity radius. Radius meters stay TBA — do not invent a number. Yes
Whisper One target PUID. Chip shows the target display name. Open from a chat-log name, Social / instance row Whisper, or Match Results name. No

Tab order: Fireteam → Clan → Match → General → Proximity → wrap. From an active Whisper thread, Tab leaves Whisper and advances the Tab-cycle table from the last remembered Tab channel.

Input: FS-INP-002 IMC_TFA_Chat. Enter (closed) opens compose. Tab while compose is up cycles the table above (not Whisper). Enter sends. Shift+Enter inserts a newline and keeps typing. Empty Enter closes without sending. Esc closes without sending and does not open the session menu. Opening Deck, I, map, or Esc closes compose without sending. Overlay Enter is UI, not chat.

There is a chat message limit. The number is TBA (TBD-033). Do not invent a character count or flood rate. Compose must enforce the limit once that number lands. Gamepad chat binds stay on TBD-033. Proximity radius meters TBA. Server-authoritative. Ghost spectators never appear on any channel and cannot send.

Online in play: Enter opens compose. Tab cycles Fireteam → Clan → Match → General → Proximity → Fireteam (skip empty seats; Whisper is not Tab). Shift+Enter inserts a second line; Enter then sends both. Empty Enter closes. Esc closes without sending and does not open Esc. With compose up, Tab does not ping and Hold Tab does not open the map. Overlay (I) closes compose. No ClanId: Tab skips Clan. Outside matchmade RAID / Vault / Ladder: Tab skips Match. Solo: Enter does not open chat. Discord is not a channel. Whisper opens only from a name / Whisper action.


FS-GUN-001 — Baseline dials (Receiver AA + Frame kit)

Section titled “FS-GUN-001 — Baseline dials (Receiver AA + Frame kit)”

Expose as independently tunable dials, not per ruleset:

Rotation, Strafing, Magnetism, Stickiness, Range Falloff, Bloom, Barrel Jump, Barrel Sway, Stability→magnetism degradation, Recoil, Kickback, Impact, Reload, Mag Size, Equip Speed, Airborne / Hip-Fire / Slide-Fire Effectiveness.

Ownership split:

Owner Owns
Class Compatibility + Spine (one core chassis mesh / plate per Class; everything attaches to Spine)
Receiver (FS-GUN-008) Fire Mode, cadence unit, default burst count (when Burst), AA baseline (Magnetism / Stickiness / Rotation / Strafing), reticle family, stance flags; art subclass body mesh (one per Type) that seats on the Class Frame
Frame archetype (FS-GUN-007, FS-GUN-009, FS-GUN-010, FS-GUN-011) Exact cadence number (RPM / charge ms / draw ms + burst override when specialty), recoil pattern, Impact / Mag / Range band bias, RangeStat (0–100); on Class Shotgun (and pellet specialty Frames e.g. Spread Shot HC), Shot Type plus PelletCount / PelletSpreadBase when Shot Type = Spread. Look: none — chassis mesh is Class-owned
Accessory parts Non-AA, non-cadence dials only (Range, Mag, Optic, Stock, Grip, …). Parts never rewrite AA baselines

Cadence number is authored on the Frame × Receiver row (FS-GUN-007). It is exposed for Inspect / telemetry. It is not a part dial and not an affix dial. Fire Mode and cadence unit come from the Receiver — Frame cannot turn Auto into Charge.

Ladder zeroes affix deltas. Parts only delta the locked gunfeel set. Parts never own Rotation / Strafing / Magnetism / Stickiness. Parts never own Fire Mode or cadence. Nothing rewrites FOV / camera baseline.

Accuracy = cone the bullets stay inside (Initial → Final). Bloom is the player-facing cone. Stability = how much the barrel itself moves and how fast magnetism radius degrades. Tune both; they are not the same stat. All projectiles stay inside the current cone. Shotgun Spread fans multiple pellets inside that cone; Shotgun Single fires one projectile like Rifle / Hand Cannon (FS-GUN-010).

Pellet fan vs Accuracy: PelletCount and PelletSpreadBase are not Accuracy/Bloom dials and not Aim Assist. They author how many projectiles leave the muzzle and how wide the fan is inside the current Accuracy → Bloom cone. Effective fan = clamp(PelletSpreadBase + Barrel PelletSpreadDelta) and must not exceed the current Accuracy cone.

Authored per Frame / Receiver (learnable paths), not pure random. Parts change Recoil / Kickback magnitude; patterns stay frame-authored.

FS-GUN-004 — Class, Receiver (Type), and Frame

Section titled “FS-GUN-004 — Class, Receiver (Type), and Frame”

Ranged Augmented / Rare guns use a four-layer taxonomy. Corp finish (C1–C5) is paint only — not structural. Player word for what Receiver authors is Type. For art / mesh, Receiver is the subclass body on the Class Frame (Sniper is a Rifle subclass kit — not a new Class).

Layer Word Role
1 Corp C1–C5 finish on Receiver and accessory parts (look only; mixed-corp allowed)
2 Class Compatibility bucket + Spine (one core chassis mesh per Class; everything attaches to Spine). Gates which Receivers are legal. Identity key for a drop is Class × Receiver
3 Receiver Required structural part that authors Type (Auto, Scout, Fusion, …) and the art subclass body mesh. Owns Fire Mode, cadence unit, AA baseline, Stance (FS-GUN-008). Seats onto the Class Spine. Replaces the old “Family = weapon type” word for guns. Most Types live in one Class. Gatling is multi-Class (Rifle / Machine Gun / Heavy Gun) with Class-specific Stance, kits, and scaled Receiver meshes
4 Frame (archetype) Cadence-number kit inside that Type (FS-GUN-007). Intrinsic on the drop; cannot be swapped on an existing item. Does not own chassis art — Adaptive / Aggressive / … share the Class Spine

Art / mesh lean lock (Year-1): Class owns Spine — one core chassis mesh per Class; everything attaches to the Spine. Frame archetype (Adaptive, Aggressive, Precision, Rapid-Fire, Lightweight, High-Impact, and specialties) is data only (cadence, I/M/R, recoil / gunfeel) and does not get its own chassis mesh. Receiver is the art subclass body (one mesh per Type) that seats onto that Class Spine before Barrel; on tip-share Classes it also owns barrel length and the universal Barrel tip socket. Gatling keeps three Class-scaled Receiver bodies (Rifle / Machine Gun / Heavy Gun). Shared kinetic Barrels (one Soft Object Path 5-pack) are allowlisted on Rifle Auto/Pulse/Scout/SMG + Hand Cannon + Sidearm + Machine Gun (non-Gatling) — fully shrouded. Player / Refit word stays Barrel; art handoff = barrel tip. Hand Cannon + Sidearm use Underlug (external densifier block under the barrel stub — Soft Object Path pack) instead of Brace — no Front Grip, no Stock, no Counterweight. Heavy / Rocket keep Brace; long-guns use Stock or Brace by Class. Shotgun, Sniper, Gatling×3, Heavy, GL Barrels stay keyed. Other modules: Mag / Stock|Brace / Optic / Grip / Front Grip (long-gun only) / Underlug (pistols) / Bow Stabilizer (Bow only) unless keyed (Sniper Optic; Coil / Rail / Emitter; Rocket Tube + Backblast Collar — not Warhead; Limbs / Prod; Cylinder; GL Year-1 Breech). Specialty Frame archetypes share the Class Spine. Sniper reuses Rifle Spine. See docs/superpowers/specs/2026-10-20-gun-art-lean-mesh-design.md.

Every Augmented / Rare firearm rolls a Receiver (Type) and a Frame. Neither is a Year-1 Refit Install. Changing Type = Forge a different Receiver × Frame key. Accessory Refit stays five sockets (FS-GUN-006, FS-CRF-008).

Adaptive Auto and Adaptive Hand Cannon share a Frame name and nothing else — they do not share RPM or Fire Mode (Auto = FullAuto; Hand Cannon = Semi). They sit on different Classes (Rifle vs Hand Cannon), so their Receivers never share an allowlist.

Heavy Gun (definition): man-portable 2H handheld support guns held like a handheld gatling (cradled / forward-mass pose — they do not have to be gatling guns). Occupies both hands (no Phys Shield while equipped). High Impact; slow Equip; large Mag; low strafe freedom. Class Receivers: Heavy Gun (general) and Gatling (rotating-barrel / spin-up). Not an LMG — that is Machine Gun Class.

Gatling (multi-Class Receiver): rotating-barrel / spin-up FullAuto Type. Legal on Rifle, Machine Gun, and Heavy Gun. Each Class × Gatling row is a separate data key (kits, AA, Stance do not cross). Rifle / Machine Gun Gatling may be 1H (dual-wield / Phys Shield rules follow 1H). Heavy Gun Gatling is Handheld2H only (gatling-hold pose; no 1H).

Class → Receiver map

Class Receivers (Type)
Rifle Auto, Pulse, Scout, SMG, Sniper, Gatling
Hand Cannon Hand Cannon
Sidearm Sidearm
Shotgun Shotgun
Machine Gun Machine Gun, Gatling
Heavy Gun Heavy Gun, Gatling
Grenade Launcher Grenade Launcher
Rocket Rocket
Bow Bow
Crossbow Crossbow
Directed Energy Fusion, Linear Fusion, Trace

Gates (hard): Class allowlists Receivers. Sibling platforms stay separate (Hand Cannon ≠ Sidearm, Rocket ≠ Grenade Launcher, Bow ≠ Crossbow). Heavy Gun ≠ Machine Gun for non-Gatling kits — a Heavy Gun Receiver never installs on Machine Gun Class. Gatling is the multi-Class exception: Rifle × Gatling, Machine Gun × Gatling, and Heavy Gun × Gatling are three keys; Stance / AA / accessory kits do not share across those rows. Directed Energy owns Fusion / Linear / Trace only. Forge, drop, and CSV import reject illegal Class × Receiver pairs.

Receiver → Frame: Frame rows key Class × Receiver × Frame when the Receiver name is multi-Class (Gatling); otherwise Receiver × Frame is enough. Specialty Frames stay scoped (Wave on Grenade Launcher, Spin-Up on each Class’s Gatling row, Heavy Sustained on Heavy Gun, …). Forge / drop / CSV reject illegal pairs.

Receiver → accessory kit: the five-pack (or specialty kit) keys off Receiver, not Class alone (FS-GUN-006).

Shared cores: Adaptive, Aggressive, Precision, Rapid-Fire, Lightweight, High-Impact. Not every Receiver ships every core. Specialty Frames per GDD Receiver lists (Support, bursts, Rocket-Assisted, Wave, Longbow, Braced Heavy, …). Legendary / Unique / Apex may use unique intrinsics.

Cadence number lock: FS-GUN-007. Fire Mode + AA: FS-GUN-008. Impact / Mag / Range bands: FS-GUN-009 (closes TBD-014 as qualitative bands). RangeStat 0–100 → meters: FS-GUN-011 (closes Range half of TBD-IMR-FLOAT). Shotgun Shot Type: FS-GUN-010. Demo fake-modular Mag/Optic/Zoom: FS-GUN-012. AA float map = TBD-AA-FLOAT; Impact / Mag floats remain TBD-IMR-FLOAT.

UTFAFirehandBus IDs the Dual Armory mag and draws that gun’s reticle family from the Receiver (FS-GUN-008). Support Frame: charge on damage dealt; hip-fire at allies spends charge; ally-valid reticle when a teammate is under the aim point. Support heal vs Energy / mode locks: TBD-015.

Builder stack (lock): Firehand = TFA gun brain in TFAWeapons (active gun, reticle/bloom/mag/cadence data, Flow handoff). Now: live fire / kill credit = ShooterCore / Lyra. Later: wrap marketplace SKGShooterFramework (SKG) for FPS mesh / attach / ballistics presentation — do not enable SKG until Firehand is wired (no dual ShooterCore+SKG fire). GDD names the player-facing Bus; this row owns plugin join. Bible: docs/11-weapons-firehand-bus.md · docs/22-demo.md.

Socket Primary variables
Barrel Range, falloff, velocity; PelletSpreadDelta (choke — Spread Shotguns / pellet Frames only; ignored when Shot Type = Single; never changes PelletCount or Shot Type); Recoil / Jump
Magazine / Cell / Quiver Mag size, reload
Optic ADS acquisition, zoom, ADS initial accuracy. Absent on Heavy Gun / Heavy Gatling (see Counterweight)
Counterweight Heavy Gun + Heavy Gatling only — replaces Optic socket. Tip settle / forward-mass / Kickback–Stability. No Zoom / AA
Stock / Brace Stability, recoil control, sway, kickback. Stock on long guns. Brace on Heavy Gun / Heavy Gatling (Handheld2H cradle). Hand Cannon + Sidearm: Brace-class variables via Underlug (no shoulder stock). Linear Fusion uses Grip, not Brace.
Grip Handling, equip, reload; airborne / hip / slide
Receiver specialty sockets Coil, rail, emitter, tube, warhead, limbs, prod, string — per GDD Receiver kit. No Year-1 Bipod kit

Receiver is the required structural part that sets Type (FS-GUN-004). It is not one of the five Year-1 Refit Install sockets. Accessory Refit installs Barrel / Mag / Optic or Counterweight / Stock|Brace / Grip (or that Receiver’s specialty five-pack). Heavy Gun / Heavy Gatling: Barrel · Mag · Counterweight · Brace · Grip.

Module pools (shared vs keyed) — Year-1 art / mesh budget lock:

  • Shared per Class (one 5-pack): Mag (default), Stock or Brace, Optic / Sight or Counterweight (Heavy), Grip, Front Grip — unless a Receiver override applies.
  • Shared kinetic Barrels (one Soft Object Path 5-pack): allowlisted on Rifle Auto/Pulse/Scout/SMG + Hand Cannon + Sidearm + Machine Gun (non-Gatling). Universal tip socket; Receiver owns length. Not Class-named lookalike copies. All five fully shrouded. Player / Refit = Barrel (art: barrel tip).
  • Pistol Underlug (one Soft Object Path 5-pack): Hand Cannon + Sidearm external under-barrel densifier block — not Front Grip / Brace / Counterweight. Visible in profile. Heavy / Rocket keep Brace; long-guns Stock or Brace by Class.
  • Keyed by Receiver (own 5-pack when geometry must differ): Barrel-slot family (Shotgun barrels; Sniper long tubes; Gatling rotor clusters at Rifle / MG / Heavy scales; Heavy barrels; Accel Coil / Accel Rail / Emitter; Rocket Tube + Backblast Collar; Bow Limbs; Crossbow Prod; GL wide-bore Barrel); mag-slot substitutes (HC Cylinder, GL Year-1 single-shot Breech — revolving drums Legendary+ later, Bow Quiver+String mix, DE Cell); Sniper long-range Optic 5-pack (never share Rifle core holo–mid optics); Heavy Counterweight 5-pack (replaces Optic on Heavy Gun / Heavy Gatling).
  • Frame archetype never keys a new chassis mesh. Class Frame + Receiver body + shared/keyed module packs are the modular mesh inventory.

Rifle · Sniper accessory subclass: Sniper remains Class Rifle × Receiver Sniper (not a separate Class). Its accessory allowlist is a subclass kit under Rifle — long-lane Optic set plus precision Mag / Stock / Grip furniture (five-pack: Barrel · Mag · Optic · Stock · Grip). No Bipod socket / kit in Year-1. Forge / drop / CSV / Refit reject cross-install: core Rifle Optics (Auto / Pulse / Scout / SMG / Rifle Gatling = Auto Sight pack) on Sniper, and Sniper long-lane Optics on other Rifle Receivers. Sniper Barrel stays Class × Receiver–gated (≠ Scout / Auto / …).

C1–C5 finishes change look only. Mixed-corp kits allowed. Legendary / Unique / Apex are outside modular kits. Part identity and Refit: FS-CRF-008. Accelerator Coil / Bow String do not own charge ms / draw ms.

Optic vs Counterweight (Class × Receiver):

Class × Receiver Optic socket Notes
Fusion, Crossbow, SMG, Machine Gun Sight (ScopeShort allowlisted per inventory) Keep sights
Rifle × Gatling Same Sight pack as Auto (Sight · ScopeShort) Inherit Rifle mid/close optic family
Machine Gun × Gatling Same Sight pack as Machine Gun (Sight · ScopeShort) Inherit MG optic family
Heavy Gun × Heavy Gun None — socket = Counterweight No Sight / Scope
Heavy Gun × Gatling None — socket = Counterweight No Sight / Scope
Grenade Launcher Sight only (Year-1) Arc / Velocity fire — see ADS exception below

Counterweight (Heavy + Heavy Gatling fifth accessory): tip settle / forward-mass bias / Kickback–Stability (Handheld2H). Never AA, Fire Mode, cadence, or Zoom. Five-pack: Barrel · Mag · Counterweight · Brace · Grip (Counterweight replaces Optic; Brace stays). Hard reject Optic on Heavy / Heavy Gatling; hard reject Counterweight on Rifle/MG Gatling.

Grenade Launcher ADS: Sight improves aim acquisition / reticle. Does not use kinetic ADS_Falloff = Hip × ZoomMult. Engage distance = Velocity / arc + soft RangeStat (FS-GUN-011). Catalog: docs/inventory/demo-fake-modular-optics-mags.md.

Barrel slot catalog (Class × Receiver)

Two cases. Specialty first sockets still own Barrel variables (Range / falloff / velocity / pellet / Recoil / Jump) unless noted.

A — Socket name Barrel (not interchangeable across Class × Receiver)

Class Receiver Barrel-slot part
Rifle Auto, Pulse, Scout, SMG, Sniper Barrel
Rifle Gatling Barrel (Rifle Gatling only)
Hand Cannon Hand Cannon Barrel
Sidearm Sidearm Barrel
Shotgun Shotgun Barrel
Machine Gun Machine Gun Barrel
Machine Gun Gatling Barrel (MG Gatling only)
Heavy Gun Heavy Gun Barrel
Heavy Gun Gatling Barrel (Heavy Gatling only)
Grenade Launcher Grenade Launcher Barrel

B — Barrel slot replaced (specialty part; no Barrel install)

Class Receiver Barrel-slot part
Directed Energy Fusion Accel Coil
Directed Energy Linear Fusion Accel Rail
Directed Energy Trace Emitter
Rocket Rocket Tube
Bow Bow Limbs
Crossbow Crossbow Prod / Limbs

Auto Barrel does not fit Pulse. Rifle Gatling Barrel does not fit Heavy Gun Gatling or MG Gatling. Accel Coil does not fit Trace. Tube does not fit Grenade Launcher Barrel.

Melee sockets (exactly five on every melee family): Head → Damage / AR; Guard → Block; Haft → WSM; Weight (Pommel / Brace) → damage↔speed / knockback / tip settle; Core → channel bias. Glaives are melee-only (no projectile). Staff / Scepter caster sticks block AR / ED combat prefixes. Melee taxonomy is unchanged (no Class / Receiver stack).

No socket owns Fire Mode or cadence. Barrel / Mag / Optic / Stock / Grip / Receiver specialty sockets (including Accel Coil / Accel Rail / Emitter / Tube / Limbs / Prod) must not write RPM, charge time, draw time, or burst count. Accessory parts must not write Rotation / Strafing / Magnetism / Stickiness (FS-GUN-008).

FS-GUN-008 — Receiver Fire Mode + AA profile

Section titled “FS-GUN-008 — Receiver Fire Mode + AA profile”

Every DA_TFA_GunReceiver row authors the fire-behavior shell. Exact cadence numbers stay on DA_TFA_GunFrame (FS-GUN-007).

Fire Mode enum: FullAuto · Burst · Semi · Charge · Beam · Draw · Pump · SingleShot.

Field Meaning
FireMode How the trigger behaves
CadenceUnit RPM / charge ms / draw ms (must match FireMode)
DefaultBurst Burst size when FireMode = Burst (specialty Frames may override 2/3/4)
AA baseline Magnetism / Stickiness / Rotation / Strafing bands (Low · Mid · Mid-High · High · Very High). Float map = TBD-AA-FLOAT
ReticleFamily Drawn by Firehand Bus
Stance 1H / 2H / Handheld2H (Heavy Gun Class — gatling-hold pose)

AA exclusion: Receiver AA baselines never include PelletCount, PelletSpreadBase, PelletSpreadDelta, or RangeStat / falloff meters. Pellets = FS-GUN-010; Range = FS-GUN-011; Barrel deltas = FS-GUN-006.

Frames may bias Stability→magnetism degradation and recoil feel. Frames must not rewrite Receiver AA baselines or change Fire Mode (cannot turn Auto FullAuto into Charge). Sniper long-range Optics do not rewrite AA baselines (Optic owns ADS acquisition / zoom / initial accuracy only).

Receiver catalog — AA Mag / Stick / Rot / Strafe (canonical; design 2026-10-20-aa-impact-mag-range-bands-design.md):

Class Receiver Fire Mode Unit Mag Stick Rot Strafe Notes
Rifle Auto FullAuto RPM Mid Mid Mid Mid Classic assault
Rifle Pulse Burst RPM + burst Mid-High High Mid Mid DefaultBurst = 3
Rifle Scout Semi RPM High Mid Low Low Precision mid-lane
Rifle SMG FullAuto RPM Low High High High Close sticky hip
Rifle Sniper Semi RPM Very High Low Low Low ADS long-lane; optic subclass
Rifle Gatling FullAuto RPM Mid High Mid Mid 1H allowed
Hand Cannon Hand Cannon Semi RPM Mid Mid Mid Mid Brace; Burst = specialty Frame
Sidearm Sidearm Semi* RPM Low High High High *Rapid-Fire cores FullAuto
Shotgun Shotgun Pump* RPM High (short) Mid Mid Mid Mag Low past mid; *RF FullAuto; Shot Type on Frame (FS-GUN-010)
Machine Gun Machine Gun FullAuto RPM Mid High Low Low LMG; Stock
Machine Gun Gatling FullAuto RPM Mid High Low Low 1H allowed
Heavy Gun Heavy Gun FullAuto RPM Mid Mid Very Low Very Low Handheld2H
Heavy Gun Gatling FullAuto RPM Low High Very Low Very Low Handheld2H only
Grenade Launcher Grenade Launcher SingleShot RPM Mid Low Mid Low Arc
Rocket Rocket SingleShot RPM High Very Low Low Low Lock language
Bow Bow Draw draw ms High† Low† Mid Low †High Mag at full draw; Low while drawing
Crossbow Crossbow Draw‡ draw ms Mid-High Mid Mid Mid ‡Repeating Frame → Semi
Directed Energy Fusion Charge charge ms Mid§ High§ Mid Mid §Mid Mag while charging; High Stick on release
Directed Energy Linear Fusion Charge charge ms Very High Low Low Low Precision bolt
Directed Energy Trace Beam RPM beam Mid High Mid Mid No charge; continuous Cell

FS-GUN-007 — Cadence lock (RPM / charge / draw)

Section titled “FS-GUN-007 — Cadence lock (RPM / charge / draw)”

DA_TFA_GunFrame is keyed by Receiver × Frame, or Class × Receiver × Frame when the Receiver name is multi-Class (Gatling). Class, CadenceUnit, and Stance come from the Class × Receiver row (FS-GUN-008). Each row authors one cadence number in that unit. Runtime fire interval, charge duration, and draw duration read that field. Do not derive cadence from Impact, Mag Size, or parts. Do not change Fire Mode on the Frame row.

Unit Receivers (from Receiver CadenceUnit)
RPM Auto, Pulse, Scout, Hand Cannon, SMG, Sidearm, Shotgun, Sniper, Trace (beam), Grenade Launcher, Rocket, Machine Gun, Heavy Gun, Gatling
Charge ms Fusion, Linear Fusion
Draw ms Bow, Crossbow

Burst Frames author RPM and burst count (example: Pulse Adaptive Burst = 390 RPM · 3-burst). Default burst comes from Receiver; specialty Frames may override. Two Frames on the same Receiver must not share a cadence string. Designers may trim ±5% on the data asset; the uniqueness invariant still holds. Playtest must not collapse Adaptive Auto onto Adaptive Hand Cannon.

Ship bands (GDD Figure G5). Empty cell = that core is not in the Receiver pool.

Receiver Adaptive Aggressive Precision Rapid-Fire Lightweight High-Impact
Auto 600 RPM — 450 RPM 720 RPM 660 RPM 360 RPM
Pulse — — — 540 RPM · 3-burst 420 RPM · 3-burst 340 RPM · 3-burst
Scout 200 RPM 120 RPM 180 RPM 260 RPM 220 RPM 150 RPM
Hand Cannon 140 RPM 120 RPM 180 RPM — — —
SMG 800 RPM — 600 RPM — 950 RPM —
Sidearm 300 RPM — 260 RPM 450 RPM 360 RPM —
Shotgun — 55 RPM 65 RPM 140 RPM 100 RPM —
Sniper 90 RPM 72 RPM — 140 RPM — —
Fusion 660 ms charge 740 ms charge 780 ms charge 500 ms charge — 960 ms charge
Linear Fusion — — 533 ms charge · 1 bolt — — —
Trace 1000 RPM beam — — — — —
Grenade Launcher 90 RPM — 72 RPM 150 RPM 100 RPM —
Rocket 20 RPM 25 RPM 15 RPM — — 12 RPM
Machine Gun 450 RPM 600 RPM — 900 RPM — 360 RPM
Bow — — — — — —
Heavy Gun 420 RPM 500 RPM 360 RPM — — 280 RPM
Gatling (Rifle) 800 RPM 950 RPM — 1100 RPM — 650 RPM
Gatling (Machine Gun) 900 RPM 1100 RPM — 1200 RPM — 700 RPM
Gatling (Heavy Gun) 900 RPM 1100 RPM — 1200 RPM — 700 RPM

Specialty cadence (same uniqueness rule inside the Receiver):

Receiver Frame Cadence
Auto Support Frame 520 RPM
Pulse Heavy Burst (2) 300 RPM · 2-burst
Pulse Adaptive Burst (3) 390 RPM · 3-burst
Pulse Aggressive Burst (4) 450 RPM · 4-burst
Pulse Rocket-Assisted Pulse 160 RPM · 3-burst
Hand Cannon Spread Shot HC 80 RPM
Hand Cannon Heavy Burst HC 260 RPM · 2-burst
Sidearm Rocket-Assisted Sidearm 90 RPM
Sidearm Heavy Burst Sidearm 325 RPM · 2-burst
Sidearm Adaptive Burst Sidearm 490 RPM · 3-burst
Shotgun Pinpoint Slug Frame 70 RPM
Sniper Disruption Frame 50 RPM
Fusion Aggressive Fusion (Line Burst) 800 ms charge
Linear Fusion Adaptive Burst Linear 640 ms charge · 3 bolts
Grenade Launcher Compressed Wave Frame 60 RPM
Grenade Launcher Wave Frame 80 RPM
Grenade Launcher Double Fire Frame 85 RPM
Grenade Launcher Micro-Missile Frame 110 RPM
Grenade Launcher Area Denial Frame 120 RPM · burst
Rocket Precision Tracking Rocket 18 RPM
Bow Lightweight Bow (Recurve) 540 ms draw
Bow Precision Bow (Compound) 684 ms draw
Bow High-Impact Longbow 760 ms draw
Crossbow Lightweight Crossbow 480 ms draw
Crossbow Precision Crossbow 620 ms draw
Crossbow High-Impact Crossbow 740 ms draw
Crossbow Repeating Crossbow 360 ms draw · semi
Heavy Gun Heavy Burst 240 RPM · 3-burst
Heavy Gun Heavy Sustained 550 RPM
Gatling (any Class) Spin-Up 400 RPM spool → Class Rapid-Fire cap
Gatling (any Class) Rotor Sustained Class Adaptive band sustained

Inspect shows Class, Receiver (Type), Fire Mode, Frame, and the locked cadence string (example: Hand Cannon · Semi · Adaptive · 140 RPM). Firehand does not retune cadence or AA baseline.

FS-GUN-009 — Impact / Mag / Range bands (closes TBD-014)

Section titled “FS-GUN-009 — Impact / Mag / Range bands (closes TBD-014)”

Frame-authored relative bands for Impact, Mag (or Cell / Quiver capacity bias), and Range. Cadence stays FS-GUN-007. AA stays FS-GUN-008. Band enum: Low · Mid · Mid-High · High · Very High. Triple format: Impact / Mag / Range. Empty cell = Frame not in that Receiver pool. Float map: Range → FS-GUN-011 / docs/inventory/weapon-range-falloff.md; Impact / Mag → TBD-IMR-FLOAT.

Parts may delta Mag / Range / Impact magnitude inside the locked gunfeel set; they do not rewrite Receiver AA. Within one Class × Receiver, two Frames must not share an identical I/M/R triple and an identical cadence string (cadence uniqueness remains primary).

Core Frames

Receiver Adaptive Aggressive Precision Rapid-Fire Lightweight High-Impact
Auto Mid / Mid / Mid — Mid-High / Low / High Low / High / Mid Low / Mid / Mid-High High / Low / Mid
Pulse — — — Mid / High / Mid Mid / Mid / Mid-High High / Low / Mid
Scout Mid-High / Mid / High High / Low / Mid-High High / Low / Very High Mid / High / High Mid / Mid / High Very High / Very Low / High
Hand Cannon High / Low / Mid High / Very Low / Mid Mid-High / Low / Mid-High — — —
SMG Low / High / Low — Mid / Mid / Mid — Very Low / Very High / Low —
Sidearm Low / Mid / Low — Mid / Low / Mid Low / High / Low Low / Mid-High / Low —
Shotgun — Very High / Low / Very Low High / Low / Low Mid / High / Low Mid / Mid / Low —
Sniper High / Low / Very High Very High / Very Low / Very High — Mid / Mid / High — —
Fusion Mid / Mid / Mid Mid-High / Low / Mid High / Low / Mid-High Low / High / Mid — Very High / Very Low / Mid
Linear Fusion — — Very High / Very Low / Very High — — —
Trace Mid / High / Mid — — — — —
Grenade Launcher Mid / Mid / Mid — High / Low / Mid-High Low / High / Mid Mid / Mid / Mid-High —
Rocket Very High / Very Low / Mid High / Low / Mid Very High / Very Low / High — — Very High / Very Low / Mid-High
Machine Gun Mid / High / Mid Mid / Very High / Mid — Low / Very High / Mid — High / Mid / Mid
Bow — — — — Mid / Mid / Mid —
Crossbow — — High / Low / Mid-High — Mid / Mid / Mid High / Very Low / Mid
Heavy Gun High / High / Mid High / Very High / Mid Very High / Mid / Mid-High — — Very High / Mid / Mid
Gatling (Rifle) Mid / Mid / Mid Mid / High / Mid — Low / High / Mid — High / Low / Mid
Gatling (Machine Gun) Mid / High / Mid Mid / Very High / Mid — Low / Very High / Mid — High / Mid / Mid
Gatling (Heavy Gun) High / High / Mid High / Very High / Mid — Mid / Very High / Mid — Very High / Mid / Mid

Specialty Frames (I / M / R)

Class × Receiver Frame Impact / Mag / Range
Rifle × Auto Support Frame Low / Mid / Mid
Rifle × Pulse Heavy Burst (2) High / Low / Mid
Rifle × Pulse Adaptive Burst (3) Mid / Mid / Mid
Rifle × Pulse Aggressive Burst (4) Mid-High / Mid / Mid
Rifle × Pulse Rocket-Assisted Pulse High / Low / Mid-High
Hand Cannon × HC Spread Shot HC Mid / Low / Low
Hand Cannon × HC Heavy Burst HC High / Low / Mid
Sidearm × Sidearm Rocket-Assisted Sidearm High / Low / Mid
Sidearm × Sidearm Heavy Burst Sidearm Mid-High / Low / Mid
Sidearm × Sidearm Adaptive Burst Sidearm Mid / Mid / Low
Shotgun × Shotgun Pinpoint Slug Frame High / Low / Mid
Rifle × Sniper Disruption Frame Mid-High / Low / Very High
DE × Fusion Aggressive Fusion (Line Burst) High / Low / Mid
DE × Linear Fusion Adaptive Burst Linear High / Low / High
GL × GL Compressed Wave Frame Mid-High / Low / Mid
GL × GL Wave Frame Mid / Mid / Mid
GL × GL Double Fire Frame Mid / Mid-High / Mid
GL × GL Micro-Missile Frame Mid / High / Mid-High
GL × GL Area Denial Frame Mid / High / Low
Rocket × Rocket Precision Tracking Rocket Very High / Very Low / High
Bow × Bow Lightweight Bow (Recurve) Mid / Mid / Mid
Bow × Bow Precision Bow (Compound) High / Low / Mid-High
Bow × Bow High-Impact Longbow Very High / Very Low / High
Crossbow × Crossbow Lightweight Crossbow Mid / Mid / Mid
Crossbow × Crossbow Precision Crossbow High / Low / Mid-High
Crossbow × Crossbow High-Impact Crossbow Very High / Very Low / Mid
Crossbow × Crossbow Repeating Crossbow Mid / High / Mid
Heavy Gun × Heavy Heavy Burst High / Mid / Mid
Heavy Gun × Heavy Heavy Sustained Mid-High / Very High / Mid
Gatling (any Class) Spin-Up Mid / High / Mid (Class Mag tier follows that Class’s Gatling Adaptive Mag)
Machine Gun × MG Rotor Sustained Mid / Very High / Mid
Heavy Gun × Gatling Spin-Up (Heavy) High / Very High / Mid

FS-GUN-011 — RangeStat 0–100 → falloff meters (closes Range half of TBD-IMR-FLOAT)

Section titled “FS-GUN-011 — RangeStat 0–100 → falloff meters (closes Range half of TBD-IMR-FLOAT)”

Every DA_TFA_GunFrame row authors RangeStat (0–100). Meters are not universal: RangeStat = 100 on Shotgun is not the same distance as 100 on Sidearm or Scout. Each Receiver owns a hip-fire falloff curve. Firehand maps:

EffectiveStat = clamp(RangeStat + BarrelRangeDelta, 0, 100)
FalloffStart_m = Start0 + (Start100 − Start0) × (EffectiveStat / 100)
FalloffEnd_m = End0 + (End100 − End0) × (EffectiveStat / 100)

Damage scales linearly from Start → End down to the Receiver damage floor %. Past End, floor holds. Hip curve authorship stays here. ADS multiplies hip meters by ZoomMult (FS-GUN-012 Demo fake-optic; Full-game Optic part later).

Ownership

Field Owner
RangeStat Frame (DA_TFA_GunFrame)
Curve endpoints (Start0/100, End0/100, floor %) Receiver (catalog in Programming Bible docs/inventory/weapon-range-falloff.md)
RangeStat / meter delta Barrel (primary); Optic may bias ADS effective range later — never rewrite Receiver curve
AA Mag / Stick / Rot / Strafe Never RangeStat or meters (FS-GUN-008)

Qualitative Range band in FS-GUN-009 remains the design shorthand. Default RangeStat midpoints: Very Low≈15 · Low≈25 · Mid≈50 · Mid-High≈65 · High≈80 · Very High≈95. Shotgun Single (Pinpoint Slug) uses the Shotgun (Single / Slug) curve, not the Spread pellet curve (FS-GUN-010). Grenade Launcher / Rocket remain Velocity-primary; RangeStat soft-biases useful engage distance only.

Canonical tables (curves + every Receiver × Frame default): Programming Bible docs/inventory/weapon-range-falloff.md. Impact / Mag numeric floats stay TBD-IMR-FLOAT.

Spawn Auto Adaptive and Sidearm Adaptive both at RangeStat 50: FalloffStart_m differs (Receiver curves). Spawn Shotgun Aggressive (Spread, low RangeStat) and Pinpoint Slug (Single, Mid RangeStat): Slug uses Single/Slug curve; Spread uses pellet curve. Swap Barrel on Auto: EffectiveStat may change; Receiver curve endpoints unchanged; AA Mag baseline unchanged. Fail CSV import if a Frame row omits RangeStat.

FS-GUN-012 — Demo fake-modular overrides (data only · no mesh)

Section titled “FS-GUN-012 — Demo fake-modular overrides (data only · no mesh)”

Demo only. Pre-art sandbox + Ladder launch. W_TFA_DemoMod is a switchable team modification system (bDemoModEnabled; external default false). Hotkey O only when ON — OV36 lists paper-doll combat seats (W1–W4 · Wrist · Phys Shield · Helm · Chest · Gloves · Belt · Boots · Energy Shield · Ring1 · Ring2 · Amulet; category chips Weapons · Armor · Jewelry/ES · Specials ×4 TBA · Ordnance ×4 TBA · Tentacles ×4 TBA) → OV37 subtabs (1080p: body scrolls): Stats (Equipped kit + type/quality + locked Name + authored Unique name on Legendary/Unique/Apex + plate) · Affixes (Demo Quality ladder: Common 0+0 · Uncommon 1 prefix OR 1 suffix · Augmented 1+1 · Rare 2+2 · Legendary/Unique/Apex 3+3; clamp on open/commit — Full-game Rare ≤3+3 remains FS-ITM-002) · Sockets (Demo default open wells by Quality: Common/Uncommon 2 · Augmented 3 · Rare 4 · Legendary 5 · Unique/Apex 6; editable 0–6; Phonon/Gem/Jewel; Artifact Unique/Apex only; Phonon Chord on Common) · Gunfeel (guns: Mag / Optic or Counterweight / AA dials). Quality field locks: Name always RO; Unique name + Artifact locked below their Quality gates; affix rows only as Quality allows (Uncommon xor). Name modes: Common/Uncommon/Augmented affix-built; Rare GDD First Word + Second Word lexicon (family-gated); Legendary/Unique/Apex hand-authored Unique name (not the Rare lexicon). Kit change resets defaults for that seat (session fill; no mesh). OK on Fake Mag refreshes OmniVisor AMMO from MagSize / MagFamily (FS-AMMO-001, OV38). Catalog: docs/inventory/demo-mod-item-specs.md. Visual mesh never changes. This is not Full-game Refit / socket Install (FS-GUN-006, FS-CRF-008). External playtest builds strip / gate Mod (docs/22-demo.md).

OV36 seat on/off (session loadout test): Doll section lists show every seat (filled and empty). Per-row equip ON/OFF writes session fillOverrides (null = unequipped) — real empty seats, not mute. Isolate snapshots current fill, unequips every other doll seat, keeps the selected seat. Restore kit reapplies that snapshot, or clears overrides to the scenario default if none. Re-equip uses last kit on that seat, else first id from kitCatalogForSeat. Affix totals / OmniVisor ammo / export read effective fill only. Specials / Ordnance / Tentacles stay always-4 TBA stubs (no seat toggle). Enter piece refused on empty seats.

Kit catalogs (ranged vs melee): Pack mock KIT_CATALOG keeps separate buckets (ranged · melee · armor · …). Seats resolve via SEAT_CATALOG_KEYS (arrays of bucket keys). W1–W4 are ["ranged"] during the ranged pass; set DEMO_ALLOW_MELEE_ON_W = true (or append "melee" to those keys) when the melee pass starts. Wrist stays ["melee"] only. Equipped-kit picker groups Ranged / Melee optgroups — do not merge into one flat weapons list. Ranged kits are Receiver × Frame (auto_adaptive, hc_aggressive, sg_rapid, …) with Frame-band MagSize/reserve per Frame Mag band (FS-GUN-009); legacy ids (auto, hc, …) alias the primary Frame. Authority: docs/inventory/demo-mod-item-specs.md · docs/inventory/demo-fake-modular-optics-mags.md · mock tfa_gdd_html/figures/demo_mod_mock_data.js.

Hard gates: Overrides never rewrite Fire Mode, cadence, AA Mag/Stick/Rot/Strafe, damage auth, or hit auth. Client never owns those. OK commits; Esc/Cancel discards.

Export / Import / Promote: Team dumps session Lab dials and piece overrides to separate JSON files per concern (lab-formulas · lab-economy · lab-raw · lab-encounter · one piece file per seat/kit) under schema tfa-demo-mod/v1. Catalog: docs/inventory/demo-mod-export.md. Promote CLI: python promote_demo_mod.py <exports> → DT_TFA_CombatEconomy.json · DA_TFA_AttrFormulas.json · kits/*.json · gunfeel/DemoKitGunfeel.csv (lab-raw / encounter lab defaults are not shipping globals). Does not authorize client-owned combat numbers.

Enum: Box · Tube · Drum · Cylinder · Cell · Quiver.

Mod may expose MagFamily + MagSize + ReloadSpeed as session dials. MagSize / reserve are Frame-kit-owned (Demo Frame-band integers per Receiver × Frame × MagFamily — e.g. hc_adaptive 11/88 ≠ hc_aggressive 8/64 ≠ auto_adaptive 40/280). MagFamily change snaps MagSize to that kit’s family default and clamps edits to kit×family min/max — never a global Box=30 preset. Catalog: Programming Bible docs/inventory/demo-fake-modular-optics-mags.md · mock GUN_FRAME_ROWS / MAG_SIZE_TABLE. Full-game Frame Mag floats stay TBD-IMR-FLOAT.

Enum: Sight · ScopeShort · ScopeLong.

Kind Optic class ZoomAdd band (Demo default)
Sight Iron / reflex / holo / RDS / bow sight +0.0 … +0.3
ScopeShort Short tube / mid prism / ACOG-ish +0.4 … +0.9
ScopeLong Long tube / sniper glass +1.0 … +5.0 (Sniper only for high end)

Optic allowlist + Counterweight (Full-game sockets · Demo Mod mirrors)

Section titled “Optic allowlist + Counterweight (Full-game sockets · Demo Mod mirrors)”
  • Fusion · Crossbow · SMG · Machine Gun: Sight (+ ScopeShort per catalog).
  • Rifle × Gatling: Auto Sight pack. Machine Gun × Gatling: MG Sight pack.
  • Heavy Gun × Heavy Gun / Heavy Gun × Gatling: no OpticKind — Counterweight dials only (tip settle / Kickback–Stability).
  • Grenade Launcher: OpticKind Sight only; ZoomAdd ignored for falloff (fixed 1.0); arc/Velocity note read-only. No ScopeLong.
HipStart_m / HipEnd_m = FS-GUN-011 curve(EffectiveRangeStat)
ZoomMult = clamp(ReceiverBaseZoom + OpticZoomAdd, OpticMin, OpticMax)
ADS_FalloffStart_m = HipStart_m × ZoomMult
ADS_FalloffEnd_m = HipEnd_m × ZoomMult

Receiver BaseZoom + OpticKind allowlist: inventory doc. Grenade Launcher: Sight aids acquisition only — no Hip×ZoomMult falloff (arc / Velocity). Heavy / Heavy Gatling: no OpticKind. AA baselines stay FS-GUN-008.

RangeStat · BarrelRangeDelta (optional) · FalloffStart/End_m (read-only hip) · MagFamily · MagSize · ReloadSpeed · OpticKind / ZoomAdd / ZoomMult / ADS meters or Counterweight dials (Heavy) · GL: Sight + arc/Velocity note (no ZoomMult falloff).

FS-GUN-013 — TrueFPP ADS (weapon FOV + optic aim)

Section titled “FS-GUN-013 — TrueFPP ADS (weapon FOV + optic aim)”

Sight / ScopeShort / ScopeLong drive TrueFPP weapon ADS: gameplay camera FOV from ZoomMult + gun raise / optic presentation. OmniVisor is chrome around ADS — not the zoom authority. HUD-only digital zoom without weapon / optic aim is retired.

OpticKind Local ADS presentation
Sight Mild FOV; iron / reflex / holo / RDS on the gun
ScopeShort Mid FOV; look-through short tube / prism / ACOG-style
ScopeLong Heavy FOV; look-through long-tube / sniper glass (optic socket / overlay allowed)

Watching another player ADS: remotes see that pawn’s TPP ADS / cheek-weld pose. They do not share the local ADS FOV or look-through optic view.

Stance locks still apply (FS-LOD-007). Falloff meters while ADS remain FS-GUN-012 (Hip × ZoomMult) except Grenade Launcher / Heavy exceptions. Catalog: docs/inventory/demo-fake-modular-optics-mags.md.

Character has Auto in W1 + Plate Chest: OV36 Weapons shows W1 Auto (and empty W seats as OFF); Armor shows every armor seat. Toggle W2 OFF → seat empty; affix totals / active gun ignore it. Isolate W1 → other doll seats empty; Restore kit → prior fill returns. Toggle empty W3 ON → first ranged catalog kit equips (melee kits still refused on W while DEMO_ALLOW_MELEE_ON_W is false). Enter Chest → OV37 Stats/Affixes: edit ArmorValue and a prefix band; OK persists session. Enter W1 → Stats: Equipped kit picker shows Ranged Frame kits (e.g. Auto Rifle · Adaptive, Hand Cannon · Aggressive); change auto_adaptive→hc_adaptive → MagSize 11 / reserve 88 (not Auto 40/280); swap to hc_aggressive → 8/64; OK → list shows Frame name (mesh unchanged). Enter auto_adaptive → Gunfeel: set RangeStat 50 → hip Start_m matches Auto curve; set OpticKind ScopeShort + ZoomAdd 0.6 → ADS Start = hip × (1.5+0.6); edit a Kinetic Output prefix name. Attempt OpticKind ScopeLong on Hand Cannon: refused (allowlist). Attempt MagFamily Cylinder on Auto: refused. Attempt OpticKind Sight on Heavy Gun: refused (Counterweight only). Rifle Gatling OpticKind follows Auto allowlist. GL Sight: ADS falloff meters stay hip×1.0 (arc). On Auto set MagFamily Drum → MagSize snaps to that Frame kit’s Drum default (not a global preset); MagSize 999 clamps to kit Drum max; OK: OmniVisor AMMO shows clamped MagSize / kit reserve, clip Drum (OV38); mesh unchanged; Firehand uses overrides. Jewelry Common + Phonon order matching a Demo Chord → Chord banner; Gem break → No Chord. Set Quality Uncommon → one prefix OR one suffix (other side locks); Augmented → 1+1; Rare → 2+2 + First/Second Word dropdowns (Name = e.g. Null Coil). Unique name + Artifact locked below gates. Set Quality Apex → 3+3, Unique name editable (hand-authored, not lexicon), Name mirrors Unique name, Artifact picker, default wells 6. Drop to Rare → Unique name cleared; lexicon Words return; affixes clamped to 2+2. Enter piece on an empty seat: refused until toggle ON. External build with Mod gated: O does nothing.

FS-GUN-010 — Shotgun Shot Type + pellet fan (Spread | Single)

Section titled “FS-GUN-010 — Shotgun Shot Type + pellet fan (Spread | Single)”

Class Shotgun Frames author a Shot Type. This is orthogonal to Fire Mode (FS-GUN-008) and cadence (FS-GUN-007). It is not a player Refit toggle. The same pellet fields may be reused on specialty pellet Frames (e.g. Spread Shot HC).

Enum: Spread · Single.

Shot Type Projectile grammar Pellet fields Impact
Spread Multi-pellet cone per trigger pull inside the Accuracy → Bloom cone (FS-GUN-002) Frame PelletCount + PelletSpreadBase; Barrel PelletSpreadDelta (choke) Split across pellets (per-pellet Impact before resists)
Single One projectile per trigger pull — same single-bullet grammar as Rifle / Hand Cannon / Sidearm / Scout Force count = 1; ignore PelletSpreadBase and Barrel PelletSpreadDelta Full shot Impact on one hit

DA_TFA_GunFrame fields (pellet / Shot Type):

Field Owner Meaning
ShotType Frame Spread · Single. Required on Class Shotgun rows
PelletCount Frame Integer pellet count. Required when ShotType = Spread. Unused / forced to 1 when Single
PelletSpreadBase Frame Base fan size (band or float — numeric map later with TBD-style float sheet). Unused when Single

DA_TFA_GunPart Barrel field:

Field Owner Meaning
PelletSpreadDelta Barrel (Shotgun keyed barrels; other pellet Frames when allowlisted) Choke delta only. Ignored if equipped Shot Type = Single. Never changes PelletCount or ShotType

Runtime (Firehand): EffectiveSpread = clamp(PelletSpreadBase + PelletSpreadDelta) and must stay inside the current Accuracy / Bloom cone. If ShotType = Single → one projectile; ignore spread fields. AA baselines never include PelletCount / PelletSpreadBase / PelletSpreadDelta (FS-GUN-008).

Year-1 Frame map (Shotgun × Shotgun):

Frame Shot Type Cadence Pellet fields
Aggressive Spread 55 RPM Count + SpreadBase required (ints later)
Precision Spread 65 RPM Count + SpreadBase required
Rapid-Fire Spread 140 RPM Count + SpreadBase required
Lightweight Spread 100 RPM Count + SpreadBase required
Pinpoint Slug Frame Single 70 RPM Count = 1; spread N/A

Future Shotgun Frames may author either Shot Type. Inspect shows Shot Type (and Pellet Count when Spread) beside Class · Receiver · Fire Mode · Frame · cadence.

Hard gates: Accessory parts never rewrite Shot Type or PelletCount (same invariant as Fire Mode). A Spread Frame cannot become Single by installing a Barrel; Barrel choke cannot change pellet count. DA_TFA_GunFrame rows for Class Shotgun must set ShotType; Spread rows must set PelletCount + PelletSpreadBase. Non-Shotgun Classes leave ShotType unset / N/A unless a specialty pellet Frame (Spread Shot HC) opts in. CSV import / Forge reject Shotgun rows with missing ShotType or Spread rows missing pellet fields. Firehand Bus branches: Spread → pellet fan inside Accuracy cone; Single → one projectile inside Accuracy cone.

Design authority: GDD Gun Family Frames · Shotgun · Aim Assist & Gunfeel (Accuracy / Bloom — pellet fan lock).

Swap a barrel on an Augmented Auto: Recoil / Range change; Rotation assist, FOV, Fire Mode, and RPM do not. Same gun under Ladder tags: affix deltas ignored, frame baseline identical to Story.

Spawn an Adaptive Auto (600 RPM) and an Adaptive Hand Cannon (140 RPM): both Inspect as Adaptive; fire intervals differ; Classes are Rifle vs Hand Cannon; Fire Modes are FullAuto vs Semi. Swap Mag / Barrel / Grip on the Auto: RPM stays 600; Receiver stays Auto; AA Magnetism baseline unchanged. Spawn High-Impact Auto (360 RPM) and Rapid-Fire Auto (720 RPM): cadences differ; both stay FullAuto Auto Receiver / Rifle Class. Spawn SMG and Sniper: both Class Rifle; SMG FullAuto, Sniper Semi. Spawn Fusion: Fire Mode Charge; Inspect shows charge ms; Frame Rapid-Fire Fusion = 500 ms still Charge. Fail the build if two DA_TFA_GunFrame rows on the same Receiver share Cadence. Fail if a Heavy Gun Frame row lists an Auto Receiver; if Sidearm Receiver lists Class Hand Cannon; if Rocket Receiver lists Class Grenade Launcher; if Crossbow Receiver lists Class Bow; if a Frame row sets FireMode Charge on an Auto Receiver.

Spawn Heavy Gun Adaptive and Machine Gun Adaptive: different Classes and Receivers; Heavy Gun Stance = Handheld2H. Spawn Rifle × Gatling (1H allowed), Machine Gun × Gatling (1H allowed), and Heavy Gun × Gatling (Handheld2H only): three Class × Receiver keys; accessory kits do not cross. Attempt install of Rifle Gatling Barrel on Heavy Gun Gatling: refused. Attempt install of MG non-Gatling Barrel on Heavy Gun: refused. Open Inspect on Fusion: first accessory socket is Accel Coil (no Barrel). Open Inspect on Rocket: Tube. Open Inspect on Bow / Crossbow: Limbs / Prod/Limbs. Accel Coil Install on Trace refused. Spawn Hand Cannon and Sidearm: AA Stickiness bands differ (Sidearm High, HC Mid). Pulse Adaptive Burst Inspect shows Burst · 3; Pulse Heavy Burst (2) shows Burst · 2 without changing Receiver.


Spawn Shotgun Aggressive (Spread) and Pinpoint Slug (Single): both Class Shotgun · Receiver Shotgun; Fire Mode remains Pump (or Rapid-Fire FullAuto when that Frame applies). Aggressive fires PelletCount pellets inside Accuracy cone; Slug fires one projectile. Swap Barrel on Aggressive: PelletSpreadDelta / Range may change; ShotType and PelletCount stay Frame-authored. AA Mag/Stick/Rot/Strafe unchanged by Barrel. Attempt to set ShotType on an Auto Frame row: rejected. Fail the build if a Shotgun DA_TFA_GunFrame row omits ShotType, or a Spread row omits PelletCount / PelletSpreadBase.

FS-GUI-001 — One Character I screen, five tabs

Section titled “FS-GUI-001 — One Character I screen, five tabs”

Hotkey I toggles. Tabs: Inventory · Combat · Tentacles · Ordnance · Channels. Tabs swap center only. Persistent: rotatable 3D paper doll, LOAD OUT (W1–W4 + PHYS SHIELD), stats strip (STR / DEX / CON / INT / WIS), Customizable 4×4, Shield / Armor / Health. Channels (W_TFA_I_Channels) is the scrollable damage / resist readout — not the attribute strip and not a skill tree. The Crafting Page (W_TFA_CraftingPage) is Inventory → Gear after maximize — not a sixth top tab, not an Inventory inner bag. Maximize layout is FS-GUI-008 (GDD still OV18).

When any I panel is maximized, Minimize (inward arrows) sits in the title bar left of the window X, same size, with a gap — never a wallet chip. Esc also restores. The red X still closes Character I.

Credits and BTUCOIN live on Character I persistent chrome — title bar only (W_TFA_IWallet). Layout, left → right: tabs (Inventory · Combat · Tentacles · Ordnance · Channels) · reserved gap · CREDITS chip · gap ≥ 16 px · BTUCOIN chip · gap · window X. Two sibling chips. They never overlap each other, never cover a tab, never cover the X. Not bag tiles. Not a second pair on the Inventory header. Not the menu roll W_TFA_Credits. LUMENAR is Marketplace Wallet only (FS-ECO-007 / FS-ECO-009) — not an I title-bar chip. BTUCOIN ticks from the player 49% of every BTUCOIN mint, including daily / weekly / hard-objective grants (FS-ECO-008).

No Map / Quests / social on I. Pause vs overlay is FS-SES-005 — this widget does not own world time.

HELM head · AMULET neck · CHEST plate · BELT waist · BOOTS feet · GLOVES gauntlets · RING 1 / RING 2 hands (labels are Ring 1 / Ring 2, not Hands) · WRIST MELEE forearm razors (not a handheld knife) · ENERGY SHIELD Barrier field on torso (never a board).

Bag Contents
Gear Guns, armor. Click / right-click Inspect. No ammo. Ammo is FS-AMMO-001. Compact Forge chip auto-maximizes Forge (FS-GUI-008, OV18). Gear bag hides until Minimize. Forge needs empty Gear slots equal to the output (wide Frames = 2). Refit is Inspect (FS-CRF-008).
Socketables Phonons, Gems, Jewels (one page)
Artifacts Chips. Socket U/Apex. Sets are Unique / Apex item pieces (FS-ITM-004); Legendary never. Worn SetIDs are unlimited by count; only active Sets feed thresholds under ASBP (FS-ITM-004). The bag does not confer Set membership.

Up to 6 Phonon / Gem / Jewel sockets (hard cap). Birth count = base type + item level. Bore on Inspect spends Well Tap + Dual Stack Cells to open one more well, never a 7th (FS-CRF-010). Open empty wells draw numbered and take Phonons / Gems / Jewels. Unopened wells still draw to the 6 cap as locked (no drop), separate from parts. Artifact socket is not a Bore well. Inspect’s left column is a picker: Phonons / Gems / Jewels, plus an Artifacts tab on Unique / Apex. Drag an Artifact onto the Artifact socket (one per item). Click a filled well to return it. The Artifact tab is Inspect-only; Character I still has W_TFA_Bag_Artifacts (OV23). Unique / Apex Inspect may show authored Set name + piece index. Legendary Inspect never shows Set membership or an Artifact socket. Socketing or unsocketing an Artifact does not change Set piece status (FS-ITM-004). Weapon Inspect always shows the stat plate (Class + Receiver/Type + Frame + cadence string + Impact / Range / Stability / Handling / Reload / Mag or Cell / Recoil / Accuracy on guns; Damage / Block / Speed / Knockback / Channel on melee). Cadence and Impact are Frame — they do not ghost. Receiver and Class do not ghost. Unique / Apex also show one Artifact socket. Augmented / Rare guns show the structural Receiver (Type; not an Install target) and list five accessory part sockets with Refit on this Inspect (FS-CRF-008, FS-GUN-006): Barrel, Mag / Cell / Quiver, Optic, Stock / Brace, Grip. Melee lists Head, Guard, Haft, Weight, Core. Empty accessory sockets still draw (Receiver / melee-family baseline). Select an owned accessory variant to preview (stat plate ghosts + / −). Preview is free. Install writes one accessory socket and pays that socket’s Receiver / melee-family mix at the item’s rarity + Dual Stack Cells. Armor / jewelry / shields / Mechanical Arms / Legendary / Unique / Apex have no Refit and no Install. Dismantle previews yield first. Guns → unlock the matching Weapon Frame for that Receiver + Frame + rarity + mats, the Receiver finish key, and on Augmented / Rare each installed accessory variant. Melee → unlock the matching Weapon Frame for that melee family + Frame + rarity + mats, and on Augmented / Rare each installed part variant. Armor → unlock the matching Armor Blueprint for that armor type (slot × Light/Med/Heavy where it applies) + rarity + mats. That typed key stays accessible on the Crafting Page (FS-CRF-006). Socketed chips return to bag. Item is destroyed.

Rewrite is a separate Inspect chip (FS-CRF-009). Augmented / Rare guns, melee, armor, jewelry, and shields get Reroll and Change. Legendary / Unique / Apex get Reroll only — Change is hidden; empty wells cannot be filled. Mechanical Arms and Common never. Socketable jewel chips do not Rewrite.

Bore is a separate Inspect spend that opens one Phonon / Gem / Jewel well (FS-CRF-010). Well Tap is the reagent. Legendary / Unique / Apex may Bore up to 6. Chord bases and Mechanical Arms never.

Apex quality items expose Invoke Power on this full Inspect (socket) view only if the instance is world-found (FS-PRG-009). Crafted Apex (Crafting Page, Weapon Frame or Armor Blueprint + mats) does not. Legendary / Unique do not. Two-step confirm (break warning), then hold to invoke. If the item breaks, chips return to bag the same as dismantle — Invoke is not salvage (no Weapon Frame / Armor Blueprint).

Weapon trackers (FS-TRK-001): gun and melee Inspect only. Child strip W_TFA_Inspect_Trackers below the stat plate. Per item instance lifetime: Kills, Precision kills, Precision %, Assists, Damage dealt, Time equipped, Best kill streak. Server-owned on Online; local on Solo. Refit preview ghosts the stat plate — trackers do not ghost. Armor / jewelry / shields never draw trackers. Dismantle destroys the instance and its counts. Match Results expand rows show per-slot stats for that match only; Inspect shows lifetime on this item. Receiver / melee-family career totals on Collections → Weapons (FS-CAR-002).

FS-GUI-005 — Customizable dock + combat hotbar

Section titled “FS-GUI-005 — Customizable dock + combat hotbar”

Customizable 4×4 (empowerment): 4 columns (loadouts L1–L4) × 4 rows (Ultimate 1–4). Drag learned Combat or Tentacle skills (or item-granted skills) from the tree tabs into cells — those skills empower that Ultimate in that loadout. Grenades cannot socket. Empty cells still draw. Active column highlighted; HUD pip is 1 of 4. Named Ultimate skills per subclass: TBD-016.

Combat hotbar (cast): six slots on Character I (mirrored under Energy on the play HUD). Drag Ultimate seats (rows from the dock / named Ultimates) and/or Combat-tree skills onto slots. Slot keys are fixed: Q · E · Z · X · C · F (FS-INP-001). A fast Ultimate recharge build can fill several slots with Ultimates; a slow recharge build can mix Combat skills for the interim. Tentacle skills never enter the hotbar — they mount on the Tentacles tab and toggle Active/Inactive with T. Grenades stay on Ordnance / G. V remains Vision, not a seventh hotbar key.

  • Combat: Offensive + Auras. Drag learned skills into the dock. Maximize expands the tree over the paper doll; stats and the Customizable dock stay.
  • Tentacles: Set 1→2→3 (Off or Def per set). Pre-gate: Mechanical Arms in the center only; tree disabled. Maximize keeps the back doll and LOAD OUT.
  • Ordnance: learn many, equip one. Stay out of the dock. Maximize keeps the front doll and grenade socket.
  • Channels (W_TFA_I_Channels): scrollable center list — Offense (Kinetic + eight energy), Defense (same nine resists), Core defenses (Shield / Armor / Health maxima, Barrier vs Phys Shield note, resist-cap reminder). Not a skill tree: scrollbar + wheel scroll only; no pan, no zoom. Maximize keeps the front doll and LOAD OUT; the list expands over stats and the dock. Exact outgoing-damage formula: data TBD.
  • Inventory maximize keeps the doll and LOAD OUT. Gear maximize is Forge filling the rest (FS-GUI-008, OV18). Socketables / Artifacts maximize is a full bag (OV26).
Widget Notes
W_TFA_CharacterI Root; CommonUI activatable
W_TFA_PaperDoll Rotate; slot callouts
W_TFA_LoadoutBar W1–W4 + Phys Shield
W_TFA_StatsStrip STR DEX CON INT WIS + unspent
W_TFA_CustomizableDock Persistent 4×4
W_TFA_Bag_Gear / _Socketables / _Artifacts Inventory inner bags only. Gear hides while Forge is open (FS-GUI-008).
W_TFA_CraftingPage Child of Inventory maximize on Gear (OV18). Fills everything except doll and LOAD OUT; Gear bag hides. Occupancy used / cap on the workbench. Search + Armor / Weapons + Ranged / Melee + rarity; recipe list and world-mat rail each have their own scrollbar. Forge spends only if Gear bag has room. Same widget at hubs / field fabricators.
W_TFA_CreditChip Do not ship a second pair. W_TFA_IWallet is the only I-screen wallet
W_TFA_IWallet Title-bar pocket: CREDITS chip, gap, BTUCOIN chip, then (when a panel is maxed) Minimize left of X, then X. Persistent. Never overlaps tabs. GDD stills reserve this pocket empty, then paint the chips — never a wall-to-wall header. LUMENAR is Marketplace Wallet only
W_TFA_Inspect Stat plate + chip sockets (open vs locked to cap 6) + Bore (Well Tap) + Artifact drop well on Unique / Apex + Refit preview / Install on Aug/Rare + Rewrite chip (Reroll+Change Aug/Rare; Reroll only L/U/Apex) + Apex Invoke + weapon trackers on guns / melee (FS-TRK-001)
W_TFA_Inspect_Trackers Child of Inspect. Per-instance Kills / Precision kills / Precision % / Assists / Damage dealt / Time equipped / Best kill streak. Guns and melee only. (FS-TRK-001)
W_TFA_MatchHistory Journey Match History + Social shortcut (FS-MCH-006)
W_TFA_JourneyCareer Journey Career tab (FS-CAR-001)
W_TFA_CollectionsMastery Collections Weapons tab (FS-CAR-002)
W_TFA_Triumphs Journey Triumphs (FS-CAR-003)
W_TFA_ModeAggregates Journey Modes (FS-CAR-004)
W_TFA_LadderBoard Journey Ladder + queue read-only (FS-CAR-005)
W_TFA_Inspect_Rewrite Child of Inspect. Reroll / Change one prefix or suffix. Etch pays. L/U/Apex: Reroll only — Change hidden. (FS-CRF-009)
W_TFA_Inspect_Invoke Confirm + hold. Grants missing main classes (FS-PRG-009).
W_TFA_Tree_Combat / _Tentacles / _Ordnance Center swap
W_TFA_I_Channels Center swap. Scrollable offense / defense channel readout (OV35). Not a skill tree.

FS-GUI-008 — Inventory maximize / Forge (OV18)

Section titled “FS-GUI-008 — Inventory maximize / Forge (OV18)”

GDD still OV18. Compact Forge chip on the Gear header (or Inventory Maximize while Gear is selected) auto-maximizes Inventory.

Stay: paper doll, LOAD OUT, Inventory inner tabs (Gear / Socketables / Artifacts), Forge chip, W_TFA_IWallet.

Hide / yield: Gear bag (W_TFA_Bag_Gear); stats strip; Customizable dock; Shield / Armor / Health. W_TFA_CraftingPage fills everything other than the doll and LOAD OUT — not a 50/50 bag | workbench split.

Workbench chrome: search by name; Armor / Weapons chips; Ranged / Melee once Weapons is selected; rarity chip (All, or Common → Apex). World mats draw in a stack rail with its own scrollbar. Recipes scroll in their own column with its own scrollbar. Occupancy reads on the workbench (Gear bag used / cap). Not a Materials bag. Not a sixth top tab (Channels is the fifth).

Forge spend: output writes into the Gear bag. Refuse if that bag has fewer empty slots than the recipe needs (default 1; wide Frames 2) (FS-CRF-003). Dim the Forge control; a click does not write. Online combat / downed spend lock is FS-CRF-001.

Socketables / Artifacts maximize: full bag at slot size, no workbench (OV26). Inner-tab switch while Inventory is maxed on Gear restores Forge; switch off Gear hides the workbench and shows that bag.

Restore: Minimize (title bar, left of X) or Esc returns docked Inventory — Gear bag, stats, and dock visible again.

Open I, rotate doll, switch all five top tabs: doll / LOAD OUT / dock / stats never rebuild. Switch Inventory inner tabs Gear / Socketables / Artifacts. Open Channels: center scrolls Offense / Defense / Core defenses; no tree pan or zoom. Open Inventory → Forge: auto-maximizes (FS-GUI-008, OV18); Forge fills everything except the paper doll and LOAD OUT; Gear bag is hidden; inner tabs and the Forge chip stay; occupancy reads on the workbench; the world-mat rail and the recipe list each have a scrollbar. Open Inspect on a Rare Trace: stat plate draws Class Directed Energy + Receiver Trace + Frame; five accessory part sockets (Barrel, Cell, Optic, Stock, Grip); Receiver is structural (not an Install target); chip sockets show open vs locked to cap 6 (lab starts HAB Trace at 2 of 6); Rewrite chip is visible; Bore is visible. Select Compensator: Range / Recoil ghost; Install is enabled; cadence string unchanged. Install writes Barrel. Bore spends Well Tap + Cells and opens one well; locked wells refuse chips; a 7th well is refused. Open Rewrite: select a filled prefix; Reroll + Etch writes a new name/band in the same group and does not change Frame, parts, or chips. Change on an empty suffix with a free sigil fills that well; a duplicate group is refused. Open Inspect on armor: no stat plate, no Refit, Rewrite is visible, Bore is visible. Open Inspect on Apex: stats + Artifact tab + Artifact socket + Invoke + Rewrite (Reroll only; Change hidden), no Refit, no Install, Bore is visible up to 6. Open Inspect on a Unique Set piece: Set name + piece index draw; Artifact well may be empty. Open Inspect on Legendary: Rewrite (Reroll only; Change hidden), no Artifact socket, no Set membership line. Drag an Artifact onto a Unique / Apex Artifact socket; numbered wells 1–6 refuse Artifacts and take Phonons / Gems / Jewels only. Attempt to socket an Artifact on Legendary: fail. Title bar shows CREDITS and BTUCOIN as two separate chips with a visible gap; neither covers Inventory / Combat / Tentacles / Ordnance / Channels; neither covers the X. Hip grenade slot is visible on the paper doll (Ordnance equip). Gear bag has no ammo tiles. Dismantle a socketed Rare: chips in Socketables / Artifacts, Frame/Blueprint granted on Crafting, item gone.

Inspect a world-found Apex item while at least one main class is unowned: Invoke Power is visible. Inspect crafted Apex, Legendary / Unique / Rare: Invoke is hidden. With all three main classes owned: Invoke is hidden or disabled. Invoke confirm warns of break chance (TBD-030). After a successful grant, Combat chips show the new class(es) at the highest owned class level with Combat points equal to that class’s earned Combat budget. If the item breaks: chips in bag, item gone, no Frame/Blueprint. If it holds: item remains socketed. Server rejects Invoke on InvokeEligible = false (crafted stamp).

Open I → Inventory → Forge (OV18 / FS-GUI-008): two columns only — doll + LOAD OUT left; Forge workbench fills the rest. No Gear grid. No stats strip. No Customizable dock. Inner tabs Gear / Socketables / Artifacts and the Forge chip stay. World-mat rail has its own scrollbar. Recipe list has its own scrollbar. Occupancy reads on the workbench. Forge with room writes into Gear. Fill the bag: Forge buttons dim; click is refused. Minimize (left of the window X) or Esc restores docked Gear bag + stats + dock. Switch to Socketables while still maxed: full bag, no workbench.

FS-GUI-009 — Secure Locker (W_TFA_SecureLocker)

Section titled “FS-GUI-009 — Secure Locker (W_TFA_SecureLocker)”

Hub / station terminal only. Account overflow storage for unused equipment. Not a Character I top tab. Not the Armory foundry (discovered spines). Not Online coop Vault. Tab SKU expand: FS-ECO-014 (secure_locker_tab_slot).

Dual-pane chrome:

Pane Label Grid
Left CHARACTER GEAR (Gear · Socketables · Artifacts) 10 × 6 = 60 cells
Right SECURE LOCKER (selected tab) 12 × 12 = 144 cells

Center transfer rail: DEPOSIT → / ← WITHDRAW. Title bar: Account + realm chip + LUMENAR (Buy Tab) — not CREDITS / BTUCOIN I-bar chips. Six free tabs (rename + symbol + accent). More tabs cost LUMENAR. Occupancy reads tab used / 144.

Transfer:

  • Deposit: select bag tile → DEPOSIT →; or drag bag → Locker (or onto a tab chip); right-click / double-click deposits to the active tab when space allows.
  • Withdraw: select Locker tile → ← WITHDRAW; or reverse drag / double-click / right-click. Refuse if Gear lacks a free footprint rect (FS-GUI-010). Equipped seats must unequip to bag first.
  • Search: name, type, quality, slot, sort; scope Current tab or All tabs. Search never moves items.

Account-bound per realm (Solo local · Online EOS PUID). Shared across that realm’s characters. Deposit / withdraw does not flip InvokeEligible. Online: server fail-closed outside hub, in combat, or downed.

Lab: #ux-secure-locker. Still: figures/secure_locker_hub.jpg. GDD: In-Game GUIs → Secure Locker.

Open Secure Locker at a hub: left CHARACTER GEAR 10×6, right Locker 12×12, center DEPOSIT → / ← WITHDRAW. Deposit a chest (2×3) into a free Locker rect. Withdraw into a full Gear bag: refuse; bag unchanged. Buy Tab spends LUMENAR only. Outside hub / in combat: open refused.

Multi-cell rectangular Gear footprints — not uniform 1×1 slots. Contract with FS-GUI-009, FS-AMMO-001, FS-GUI-008 / FS-CRF. Catalog: tfa_gdd_html/data/tfa_item_footprints_v2.json (+ cook CSV tfa_gdd_html/data/DT_TFA_ItemFootprints.csv → UE DT_TFA_ItemFootprints). Design: docs/superpowers/specs/2026-11-11-item-footprints-storage-design.md. Matrix still: figures/item_footprints_matrix.jpg.

Surface Holds Size rule
Character I Gear / Secure Locker gear pane Guns, melee, armor, jewelry, shields, Mechanical Arms, Refit modules Authored W×H (modules always 1×1)
Socketables Phonons, Gems, Jewels 1×1 only
Artifacts Artifact / Set chips 1×1 only
Crafting rail (Forge) Dual Stack Cells, Frames, Blueprints, world mats, Kha-Shards, Well Tap Stack chips — not Gear cells
HUD counters Field / Specialist / Siege ammo; Ordnance charges Never a bag tile
Currency chips Credits, BTUCOIN, LUMENAR Never a bag tile — No Credits / BTUCOIN / LUMENAR tiles in bags

Rules: rectangles only — no L / T / diagonal. Quality / Unique / Apex / sockets / affixes do not change size. Light / Med / Heavy armor = same footprint. 90° rotate on Gear / Locker. Forge / deposit needs a free rectangle.

Guns (Class × Receiver, unrotated examples): Sidearm / Hand Cannon 2×1 · Rifle SMG 2×2 · Rifle Auto / Pulse / Scout / Trace 3×1 · Shotgun | 3×2 · Sniper / Linear Fusion 4×1 · Crossbow 2×3 · Bow | 2×4 · DE Fusion / Machine Gun / Gatling / GL 3×2 · Heavy / Rocket / Crown 4×2.

Melee: wrist/dirk 1×2 · 1H 1×3 · staff 1×4 · 2H sword 2×3 · polearm 2×4.

Armor / jewelry: ring / amulet / Refit modules 1×1 · belt 2×1 · helm / gloves / boots / Energy Shield 2×2 · chest / Phys Shield / Mechanical Arms 2×3.

Grid sizes: Gear 10 × 6 = 60. Secure Locker tab 12 × 12 = 144.

Active Sets budget ASBP=6 multi-active is Year-1 ship surface (TBD-072 | Closed — ships multi-active; no single-Set Year-1 clamp).


XP from kills and completed tasks. Fill bar → +1 level. Level / unspent points live on I only (no visor XP bar). Level cap, XP curve, task vs kill weighting: TBD-017. Multiclass XP tax still applies when more than one main class is owned; it does not replace this loop. FS-PRG-009 Apex Invoke grants missing classes without the Combat-tab Unlock Commit; owning more than one class still applies the tax to later class XP.

On level up, grant stat points (TBD-018 — the number that must be written before tuning). Manual assign on I. Working attributes and Year-1 / Demo lab feeds (dialable in Demo Mod — raw points and per-pt formulas):

Stat Feeds Lab defaults (per point)
STR Melee ED%; melee knockback/stagger; encumber soft (cuts Heavy armor / 2H move penalty — never blocks equip) +1.5% melee ED · +2% knockback · −0.5% of encumber penalty (cap 100% of penalty)
DEX AR; handling feel; weapon swap ms; light move % +2 AR · −8 ms swap (floor 200 ms) · +0.15% move
CON Max Health; trauma duration resist Base HP 200 + +12 HP · −0.4% trauma
INT Skill Energy max; skill CD shave +1 Energy max · −0.3% skill CD
WIS Aura upkeep discount; tentacle Energy cost −0.5% aura upkeep · −0.4% tentacle cost

Encumber baselines (before STR resist): Heavy armor −12% move · 2H gun/melee −8% move (Demo dials). Frame cadence (RPM / charge / draw ms) is not attribute-authored (FS-GUN-007). Flow Overclocked +30% move stays Flow-only (FS-CMB-004).

Energy is a pool, not a sixth assignable attribute. Older GDD volumes that say Vit / Energy-as-stat are superseded. Stat respec: TBD-019. Design: docs/superpowers/specs/2026-10-26-demo-combat-economy-stats-design.md.

Separate budget from stat points. Grant per level: TBD-020. Limited respecs are the GDD direction for skills.

One tree: offensive verbs + auras. Offensive drains Energy. Auras: per-skill upkeep / pulse / gain. Both can enter Customizable. Exact nodes per Order / Faction / Subclass: TBD-021.

Create grants the main class only (faction chip). UnlockedSubclassCount starts at 0. Subclass trees T1–T5 stay locked until their class-level gate. They open in roster order, one after another — T1, then T2, then T3, then T4, then T5. Never skip a tier. Never pick a subclass out of order. Never choose a subclass on Create Character. Thresholds: DT_TFA_SubclassUnlock (TBD-029). Combat tab: locked subclass tabs are preview-only; spend / refund / Use on a gated tree is rejected until that count increments.

When the origin (or multiclass) class level crosses the next TBD-029 row, increment UnlockedSubclassCount by 1 (cap 5) and set ActiveSubclass to that roster row if it was null. Reset Campaign keeps this count.

Combat-tab Unlock Commit starts that class at level 1, UnlockedSubclassCount = 0, and the usual XP tax. Apex Invoke is a separate grant path (FS-PRG-009).

HARD LOCK: max 3 sets × 2 tentacles. Each set is Offensive or Defensive, never mixed inside a set. Unlock Set 1 → 2 → 3 by character level (thresholds TBD-022). Mixed loadouts across sets are valid.

Active / Inactive: mounted tentacles are either Active (deployed / usable) or Inactive (retracted). Toggle with T on-foot (FS-INP-001). This does not flip Offensive ↔ Defensive — skill polarity stays authored. Tentacles do not occupy the combat hotbar.

Mechanical Arms gate: before Set 1, Tentacle tree is disabled. Worn pair is Off or Def, one attribute, no Prefix/Suffix, lowest Tentacle skills only. Gate level ≤ Set 1. When Set 1 unlocks, Arms UI retires in favor of sets.

One shared tree for every operative. Ordnance Core is free (unlocks HUD pip). Four families × three = twelve types. Learn many, equip one. After any three learned, equip one Ordnance mod. After any two learned, Support family unlocks.

Family Types
Impact Kinetic Brick, Fission Cap, Plasma Skip
Adhere Arc Spike, Isotopic Seed, Void Well
Deny Thermal Fan, Cryo Canister, Toxin Bloom
Support Barrier Charge, Pulse Echo, Soft Cover

Mods: Quick Fuse · Heavy Payload (max charges 2→3, slower regen) · Channel Bleed.

Charges: own pool, max 2 (3 with Heavy Payload). One charge regenerates slowly. Field bricks / pickups refill the equipped type only. Does not drain Skill Energy. Swap from Ordnance tab or weapon wheel, not a second HUD bar. Fission Cap optional Siege-brick cook: TBD-023.

Active loadout’s four sockets tag the Ultimate on cast (damage, count, duration, radius, Energy economy, extra tentacle discharges, aura pressure). Exact tag→modifier maps: TBD-024. Dock does not passively drain Energy.

Every Combat / Tentacle / Ordnance / Ultimate node is a Gameplay Ability with a Gameplay Tag. Grant on learn. Customizable stores ability tags, not widget pointers. Tentacle sets are components that grant/remove abilities when mode or unlock changes.

Apex quality can be found (world / mission / pinnacle loot) or crafted (Weapon Frame or Armor Blueprint + materials on the Crafting Page, by item type). Both are Apex for stats, Artifact sockets, Ultimate synergy, and may feed Sets (FS-ITM-003, FS-ITM-004).

Invoke Power is on Inspect (full socket view) only for world-found Apex. Crafted Apex never offers Invoke. Legendary / Unique never offer Invoke.

Stamp at creation, server-authoritative, persist on the instance:

Origin How it appears InvokeEligible
World-found Loot, mission reward, named drop, world lottery true
Crafted Crafting Page recipe using Frame / Blueprint + mats false

Trade, mail, stash, and dismantle do not flip the stamp. A client cannot set InvokeEligible.

On a confirmed invoke of a world-found Apex:

  1. Take the player’s highest owned main class (max class.level; ties: origin first).
  2. Grant every unowned main class (Enforcer / Arcwarden / Phantom). Already-owned classes are unchanged.
  3. Each granted class: class.level and class XP match the highest class. UnlockedSubclassCount is the TBD-029 row for that class level (same gates as if that class had been leveled there). ActiveSubclass = first unlocked roster row if it was null.
  4. Grant Combat skill points on each new class equal to the highest class’s earned Combat budget (unspent + spent on that class’s Combat tree). Tentacle / Ordnance / stat points are not copied. The player can spend those points to match the highest class’s Combat investment.
  5. Do not run Combat-tab Unlock Commit. Do not start the new class at level 1. Invoke itself does not charge the XP tax; after the grant, multiclass tax applies because more than one class is owned.
  6. Then roll break chance TBD-030. Do not invent a percentage. On break: destroy the Apex item; socketed Phonons / Gems / Jewels / Artifact return to bag; no salvage Frame/Blueprint. On hold: the item stays.

If all three main classes are already owned, or the item is crafted / not Apex / not world-found, Invoke is unavailable (no roll, no consume). Fail closed.

GDD lock plates (HTML figures): lock_gui_apex_invoke.svg, lock_gui_apex_origin.svg, lock_gui_apex_paths.svg, lock_gui_apex_inspect_gate.svg. Rebuild: python tfa_gdd_html/figures/build_apex_invoke_locks.py.

Enforcer origin at class level L with Combat earned P. Inspect a world-found Apex. Invoke. Arcwarden and Phantom become owned at class level L, subclass gates per TBD-029 at L, Combat unspent P each. Enforcer unchanged. Repeat with all three owned: Invoke hidden. Legendary Inspect: Invoke hidden. Inspect a crafted Apex of the same package: Invoke hidden; Invoke RPC fails closed.

Level up → unspent stats on I, not on HUD. Before Set 1, Tentacles tab shows Mechanical Arms only. Equip Kinetic Brick, throw twice, confirm Energy unchanged and charges = 0. Socket a grenade into Customizable: rejected.

New Enforcer: UnlockedSubclassCount = 0. Combat tab is main class; T1 Berserker through T5 Seraph are preview-only. Drive the class through DT_TFA_SubclassUnlock (TBD-029): T1 opens first, then T2 Vanguard, then T3 Shock Trooper, then T4 Battle Master, then T5 Seraph. T3 must stay locked while T2 is still locked. Combat points on a still-gated tree are rejected. Magus and Hidden follow their roster rows in FS-PRD-004. A create-time Vanguard (or any other starting subclass) fails this test.


Base tier (Normal / Exceptional / Elite = Operative / Veteran / Apex fiction) is independent of quality:

Common → Uncommon → Augmented → Rare → Legendary → Unique → Apex.

Quality Apex ≠ Apex Threat difficulty ≠ Elite base-tier fiction.

  • Augmented: at most 1 Prefix + 1 Suffix.
  • Rare: up to 3 Prefix + 3 Suffix; equal chance of 3 / 4 / 5 / 6 mods; 50/50 then reject if side at 3 or group already present. Cosmetic First Word + Second Word (no stats). Second Word gated by item family.
  • Same affix group cannot stack twice.
  • Staff / Scepter: no AR / ED combat prefixes.
  • Mechanical Arms: never roll Prefix/Suffix.
  • Armor: Light / Medium / Heavy only. No modular armor parts. Former modules are affix families (Plating → Trauma Weave).
  • Level requirement ≈ 75% of highest affix level on the item.

Full name/effect catalog stays in GDD vol. 04. Engine consumes DT_TFA_Affixes with group IDs.

Hand-authored packages. Not modular kits. Not Phonon Chord bases. Same prefix and suffix count on Legendary and Unique — affix slot count is not the difference.

Shared: Rewrite Reroll only (no Change), no Refit, no Stamp / Coda on craft. Nanite Residue on craft. Craft reprints the designer package (no new affix rolls at forge). Never Invoke. Unique salvage does not pay Legendary recipes (FS-CRF-007).

Legendary never carries a Set ID. Spawn and cook fail-closed if a Legendary row authors one (SetID none, PieceIndex 0). Equipping it never feeds 2 / 3 / 4 / 5 / 6-piece bonuses. Legendary has no Artifact socket.

Unique is authored either standalone (no Set ID) or as a named Set piece (Set ID + piece index). A Unique with a Set ID counts as that piece while equipped, with or without an Artifact in the well.

Exactly one Artifact socket on Unique unless a Unique explicitly disables it. Apex primary payoff is Ultimate-facing and may feed Sets (optional Set ID + piece index on the Apex item, same count rule as Unique). Apex also has exactly one Artifact socket unless disabled.

Apex quality Inspect offers Invoke Power only on world-found Apex. Crafted Apex does not. Full grant / break rules: FS-PRG-009. Quality Apex ≠ Apex Threat difficulty ≠ Elite base-tier fiction.

Server item instance fields: Quality, SetID (Name; none unless Unique / Apex), PieceIndex (ignored if SetID is none), ArtifactSocket (optional chip ID).

Player / loadout fields: ActiveSetIDs (Name array; server-validated).

  • Artifact sockets only on Unique and Apex.
  • One Artifact per item. Separate from the 6 normal sockets.
  • Set membership is on the Unique / Apex item, not the chip.
  • Worn (unlimited by Set count): across the 15 paper-doll slots, Unique / Apex pieces may carry any mix of SetIDs. Distinct worn Sets are capped only by slots and authored set sizes (not every Set is 6 pieces). Legendary never carries SetID.
  • Active (budgeted): only Sets in ActiveSetIDs feed 2→6 thresholds. Inactive worn Set pieces keep looks, slots, Origins, Traits, and Artifacts — they contribute zero Set ladder power.
  • Equipped count (per SetID, server): for each of the 15 paper-doll slots, if the equipped item is Unique or Apex and item.SetID matches that SetID, add 1. Empty Artifact well still counts. Duplicate slots still count as separate pieces.
  • Active Set Budget Points (ASBP): base ASBP = 6. Cost of each active Set = that Set’s equipped count. Legal iff sum(costs of ActiveSetIDs) ≤ ASBP. Activating a Set whose equipped count is < 2 is refused (no threshold at 1). Server refuses illegal toggles; the last illegal pick does not stick.
  • Independent ladders: each active Set evaluates its own 2 / 3 / 4 / 5 / 6 thresholds from its own equipped count. No cross-Set piece pooling.
  • Illegal under ASBP 6 (examples): 5+2, 4+4, 3+3+3, 6+anything. Legal examples: one 6; 4+2; 3+3; 2+2+2; 5 alone; 3+2.
  • Character I exposes an Active Sets strip (LOAD OUT / doll chrome): dynamic list of every worn SetID · equipped n · pips · toggle · budget meter used / 6. Inspect still shows per-item Set name + pips (membership only). Year 1 ships the full multi-active budget (TBD-072 | Closed). Store / validate against ASBP=6.
  • Legendary fail-closed: SetID always none; no Artifact socket. Rare and below cannot host Artifacts and cannot carry a Set ID.
  • Thresholds 2 / 3 / 4 / 5 / 6-piece. All 15 eligible slots can feed equipped counts, including W1–W4, Wrist, Phys Shield — only Unique / Apex pieces in those slots.
  • Set bonuses never retune Aim Assist baseline or camera verbs.
  • Socket / unsocket Artifacts on Crafting Page (cost TBD-025). That spend does not grant, revoke, or change Set membership or ActiveSetIDs.

11 types × 5 tiers (Chipped → Perfect) × 4 contexts (weapon / helm / armor / shield) = 220 fixed outcomes.

Channel map: Ruby Thermal · Sapphire Cryo · Topaz Arc · Emerald Toxin · Gammitite Isotopic · Nucleite Fission · Helion Plasma · Nullite Void. Utility: Amethyst, Diamond, Siphonite.

Crafting Page: 3× same tier → 1× next (optional material tax). Socketing permanent until unsocket recipe destroys socketables (GDD). Dismantle of the item returns chips to bag — different path from unsocket recipe.

1×1 chips. Augmented 1–2 affixes, Rare up to 4, Unique Rainbow Facets (+% skill damage and −% enemy resist per channel).

Shards = Sanskrit letters A → Ma. Chords = Sanskrit words in exact order on white/gray socketed bases, socket count = Chord length. Bore / Well Tap cannot change Chord length. Artifact socket is never consumed by a Chord. Chords never gate camera, Flow, or Aim Assist baseline. HPS (Nna–Ma) = endgame trade currency. Full recipes stay in GDD vol. 08 (DT_TFA_PhononChords).

Str / Dex (and Energy where listed) gate equip. Reduced Requirements affixes apply. Fail = cannot equip (slot rejects).

FS-ITM-009 — Master lists as data, not code

Section titled “FS-ITM-009 — Master lists as data, not code”

Named melee triples (98), armor / shield / jewelry triples (69), gun Receivers (Types) + Classes, and Unique spreadsheet are Data Assets. Code knows Receivers / Classes / melee families, slots, and quality rules — not individual nameplates.

Roll a Rare: ≤3 prefix and ≤3 suffix, no duplicate group. Attempt Artifact socket on a Rare: fail. Assemble a Chord on an Augmented base: fail. Assemble on a white base with exact sockets and order: succeed. Camera / AA unchanged.

FS-ITM-010 — Trait vs Origin quality gate

Section titled “FS-ITM-010 — Trait vs Origin quality gate”

Lock 2026-11-13d. Weapons and armor / shields carry named Trait columns by quality. Jewelry has no Trait columns and no Origin lane from this system.

Weapons (guns / melee)

Quality Trait columns Origin / Set
Common — (none) —
Uncommon Verb —
Augmented Feed + Verb —
Rare Bullets + Feed + Verb —
Legendary Bullets + Feed + Plate + Verb —
Unique Bullets + Feed + Plate + Verb (same as Apex) 1 Origin · optional SetID (FS-ITM-004)
Apex Bullets + Feed + Plate + Verb (same as Unique) 2 Origins (OriginId + OriginId2) · optional SetID

Armor / shields — same unlock counts; armor-native columns:

Quality Trait columns Origin / Set
Common — (none) —
Uncommon Verb —
Augmented Stride + Verb —
Rare Shell + Stride + Verb —
Legendary Shell + Stride + Brace + Verb —
Unique Shell + Stride + Brace + Verb 1 Origin · optional SetID
Apex Shell + Stride + Brace + Verb 2 Origins · optional SetID

Feed (weapons) player label = {MagFamily} Spec (Cell Spec, Drum Spec, …). Crafting Refit unchanged — Feed is a Trait column, not a Mag Install. Shell / Stride / Brace are armor-only columns (not gun Feed/Bullets/Plate). Stride never rewrites movement mechanics (sprint/slide/wall/jump) — only soft DR / gun settle in those states. No mantle/vault (FS-MOV-003).

Stacking: One active Trait per unlocked column. Unique 1 Origin; Apex 2 Origins. Rare/Legendary never Origin. Set Unique/Apex only. Jewelry never Traits/Origins from this gate. Refit never writes Trait column ids or Origins.

Instance fields: guns — traitVerbId · traitFeedId · traitBulletsId · traitPlateId (+ mags). Armor/shields — traitVerbId · traitStrideId · traitShellId · traitBraceId (+ mags). Jewelry — none of these Trait fields.

Modes: AlwaysOn or Ambient only. Ambient may use normal-play triggers (on_hit, on_kill, while_ads, below_hp, …). Banned: stack-to-empower activation chores; writes to Fire Mode, Aim Assist, FOV, or camera verbs.

Does not replace: affixes, Receiver / Frame, Refit parts, Phonon / Gem / Jewel wells, Artifact chips. Refit parts never author Traits or Origins.

Catalog rows: TBD-058 (weapon Traits), TBD-059 (armor Traits), TBD-060 / TBD-061 (Origins). Names + modes + effects + column in docs/superpowers/specs/tfa_trait_origin_catalog_v1.json. Magnitudes still TBD.

FS-ITM-014 — Field Spec slots (guns + melee)

Section titled “FS-ITM-014 — Field Spec slots (guns + melee)”

Lock 2026-11-13 (extended 2026-11-13e for melee). Weapon combat-plug lane. Player word: Field Spec (not “mod,” not Trait, not Mag Install, not Shiv Spec, not Demo Mod chrome).

Guns + melee. Armor / jewelry / Phys Shield / ES: 0 slots.

Quality Field Spec slots
Common · Uncommon · Augmented 0
Rare 1
Legendary 2
Unique 3
Apex 4

Instance fields: fieldSpecId1 … fieldSpecId4. Distinct ids per piece. Adept catalog rows Unique/Apex only. Catalog rows carry lanes (gun / melee / both). Capacity Specs (mag/reserve) are guns only.

Capacity Specs (e.g. Reserve Bandolier, Deep Clip) add magDelta / reserveDelta on top of kit MagSize / reserve for OmniVisor HUD (FS-GUN-012 · OV38). Soft Magnets never rewrite Receiver AA baselines (FS-GUN-008). Melee Specs never write MagSize.

Catalog: Programming Bible docs/inventory/demo-mod-field-specs.md · mock FIELD_SPEC_CATALOG. Year-1 live set 26 rows (FS-01…FS-26; shared + gun-only + melee-only).

FS-ITM-015 — Shiv Spec socket (Unique / Apex weapons)

Section titled “FS-ITM-015 — Shiv Spec socket (Unique / Apex weapons)”

Lock 2026-11-13e (rename 2026-11-13f). Unique/Apex exclusive upgrade lane. Player word: Shiv Spec.

Unique + Apex only · guns + melee · 1 socket (shivSpecId). Armor / jewelry / Phys Shield / ES / Common→Legendary: 0.

Catalog is per Unique/Apex nameplate (hand-authored when that weapon is designed). Until a nameplate has rows in SHIV_SPEC_BY_UNIQUENAME, the socket shows stub SHIV-TBD. Effects remain TBD until that weapon’s fantasy is locked.

Does not replace: Field Spec · Trait / Origin · Masterwork · Artifact · Invoke · Mag Install.

Docs: docs/inventory/demo-mod-shiv-specs.md · mock SHIV_SPEC_*.

Server (Online) / local Solo applies equipped power in this order after slot intrinsics:

  1. Affixes / authored package stats
  2. Per-piece Trait columns (active ids for unlocked columns)
  3. Per-piece Origin (Unique 1 · Apex 2 via OriginId2)
  4. Per-piece Field Specs (FS-ITM-014 — guns + melee; Rare→Apex slots)
  5. Per-piece Shiv Spec (FS-ITM-015 — Unique/Apex guns + melee; when completed)
  6. Socket chips (Gem / Jewel / Phonon / Chord)
  7. Active Set thresholds (FS-ITM-004)
  8. Artifact chip power
  9. Authored exclusive verbs on Unique / Apex nameplates when present
  10. Masterwork finish soft layer (FS-ITM-013) when ranked

Inspect shows one strip per unlocked Trait column — guns: Feed labeled {MagFamily} Spec · Bullets · Plate · Verb; armor/shield: Shell · Stride · Brace · Verb; jewelry: no Trait strips — plus Origin strip(s) on Unique / Apex, Field Spec pips on guns and melee Rare→Apex, Shiv Spec pip on Unique/Apex weapons, Set 2–6 pips when SetID is present on Unique/Apex, plus Familiarity / Masterwork chrome (FS-ITM-013).

Trait / Origin / Set-perk catalogs are Data Tables / Data Assets (DT_TFA_WeaponTraits, DT_TFA_ArmorTraits, DT_TFA_OriginTraits, DT_TFA_SetBonuses / DA_TFA_Set). Code knows quality gate, mutual exclusion, apply order, and bans — not individual verb names.

FS-ITM-013 — Familiarity and Masterwork on gear instances

Section titled “FS-ITM-013 — Familiarity and Masterwork on gear instances”

Two orthogonal meters on weapon/armor instances:

  • Familiarity — earned while that instance is equipped (style-weighted combat credit on weapons; worn-performance on armor / jewelry / ES).
  • Masterwork — Crafting Page only (FS-CRF-012); requires Familiarity gate rank.

Neither replaces Power / ARL. Caps tune gunfeel / Trait mag / chrome — not raw TTK spikes. Refit / Rewrite / Bore do not reset Familiarity or Masterwork. Dismantle destroys both with the instance.

Instance fields: familiarityXp, derived familiarityRank, masterworkRank. See design docs/superpowers/specs/2026-11-11-gear-familiarity-masterwork-design.md. Costs/curves TBD-065…068.

Guns: Spawn Common: no Trait columns; Origins empty; Field Spec slots 0; Shiv Spec 0. Spawn Uncommon: Verb only; Field Spec 0; Shiv Spec 0. Spawn Augmented: Feed+Verb; Field Spec 0; Shiv Spec 0. Spawn Rare: Bullets+Feed+Verb; Origins empty; SetID none; Field Spec 1; Shiv Spec 0. Spawn Legendary: Bullets+Feed+Plate+Verb; Origin empty; Field Spec 2; Shiv Spec 0. Spawn Unique with Set A: four Trait columns + one Origin + SetID; Field Spec 3; Shiv Spec socket 1 (SHIV-TBD until nameplate authored). Spawn Apex: four Trait columns + OriginId + OriginId2; optional Set; Field Spec 4; Shiv Spec 1. Attempt Adept Field Spec on Rare: fail. Attempt Field Spec on armor/jewelry: fail. Attempt Shiv Spec on Legendary or armor: fail. Equip Reserve Bandolier: OmniVisor MagSize/reserve gain catalog deltas.

Melee: same Field Spec quality ladder as guns (Rare 1 … Apex 4); melee-lane Specs only (no Capacity mag Specs). Unique/Apex melee: Shiv Spec 1 (per-name TBD). Phys Shield / ES: Field Spec 0, Shiv Spec 0.

Armor/shields: same quality curve with Shell·Stride·Brace·Verb (Augmented = Stride+Verb; Rare = Shell+Stride+Verb; L/U/Apex = Shell+Stride+Brace+Verb). Jewelry: spawn at any quality → no Trait column ids and no Origin from this gate. Field Spec / Shiv Spec never on armor/jewelry.

Attempt Origin on Legendary: fail. Attempt OriginId2 on Unique: fail. Attempt Set on Rare: fail. Attempt Trait column write on jewelry: fail.

Spawn a Unique with Set ID A, piece 1, empty Artifact well: equip it; equipped count for A is 1; toggle A into ActiveSetIDs is refused (< 2). Attempt to socket an Artifact on a Legendary: fail. Unequip the Unique: equipped count for A is 0. Spawn a Legendary whose data row authored a Set ID: instance SetID is none, no Artifact socket, and it never feeds bonuses. Spawn an Apex with Set ID A, piece 2: equip it with the Unique; equipped count for A is 2; activate A succeeds (cost 2, ASBP used 2/6); 2-piece threshold for A is live. Equip a second Set B to equipped count 4 while A stays active at 2: activate B succeeds (2+4=6). Attempt to activate a third Set C at equipped count 2 while A+B are active: refuse (sum would be 8). Deactivate B, then activate C at 2: succeed (A+C = 4). Equip Set D to 6 and attempt activate D while any other Set is active: refuse. Forge a Unique: output reprints the DA Set ID; the player cannot pick a Set ID on the workbench. Rewrite / Refit / Bore / Install refuse to write SetID or PieceIndex.


There is no Cube inventory item. All synthesis happens on the Crafting Page.

The Crafting Page is the Inventory → Gear maximize workbench (W_TFA_CraftingPage, FS-GUI-008, OV18). Doll and LOAD OUT stay; the Gear bag hides; stats / dock yield so Forge fills the rest of Character I. Inner tabs Gear / Socketables / Artifacts stay. World mats and recipes each have their own scrollbar. Occupancy reads on the workbench. It is not a fifth top tab and not an Inventory inner bag. This page Forges new gear. Forge is refused if the Gear bag has no room for that output (wide Frames need two empty slots). Refit is on that item’s Inspect (FS-CRF-008). Rewrite is also Inspect (FS-CRF-009). Bore is also Inspect (FS-CRF-010).

Hubs and unlocked field fabricators host the same page with a station bonus (exact bonus TBD) — not exclusive access.

Overlay spend lock (Online): catalog browse is allowed while I is open. Forge / Refit / Rewrite / Bore / repair / other spends fail closed while in combat or downed. Server rejects spends that fire during a lock. Solo pause has no extra gate.

Intentionally expensive.

Destroy item → unlock that typed Weapon Frame or Armor Blueprint for this character (FS-CRF-005, FS-CRF-006) + mats. Augmented / Rare guns also unlock the Receiver identity (Class × Receiver × finish variant) and each installed accessory part variant (Class × Receiver × Socket × Variant) (FS-CRF-008). Augmented / Rare melee unlocks each installed melee part variant (melee Family × Socket × Variant). First breakdown of a key unlocks it. Repeat breakdowns of the same key still yield mats. Higher quality unlocks the higher-rarity key of that same type. Socketed Phonons / Gems / Jewels / Artifact return to bag. Part variants are not bag tiles.

Forge weapons (unlocked Frame + heavy mats; Augmented / Rare also owned part variants or random rolls) and armor (unlocked Blueprint + heavy mats). Output lands in the Gear bag. Forge is fail-closed if that bag has fewer empty slots than the recipe needs (default 1; wide Frames 2). The recipe catalog is long: search by name, Armor / Weapons chips, Ranged / Melee once Weapons is selected, and a rarity chip (All, or Common → Apex) on every view. World mats stay in a scrolling stack rail with its own scrollbar; recipes scroll in their own column. Not a Materials bag. Refit Augmented / Rare weapons on Inspect (FS-CRF-008) — not a park well, not a workbench mode. Assemble Chords. Upgrade gems / Shards (3:1 + tax). Socket services. Socket / unsocket Artifacts — chip power only; this spend does not grant or revoke Set membership (FS-ITM-004). Bore (add a Phonon / Gem / Jewel well) is Inspect (FS-CRF-010), not a Forge park well — Well Tap still stacks on this page. Repair / recharge / unsocket (Kha-Shard). Blood / caster-style crafts still need that Frame / Blueprint unlocked where applicable. Apex recipes are allowed: output is Apex quality with InvokeEligible = false (FS-PRG-009). Do not stamp crafted Apex as world-found. Legendary / Unique / Apex Forge reprints the designer package (stats, Unique / Apex Artifact well if authored, Unique / Apex Set ID if any). Legendary never gains an Artifact well. The player cannot pick a Set ID on the workbench. Recipes do not consume the Frame / Blueprint.

Materials are a sink. Breakdown is a meaningful choice. Frames / Blueprints are a second chase layer. Cosmetics stay on Marketplace (LUMENAR); power is not shop-gated. Credits are the in-world vendor spend (FS-ECO). They do not replace Dual Stack Cells, Frames, Blueprints, or Kha-Shards.

FS-CRF-005 — Frame / Blueprint identity (no generic stacks)

Section titled “FS-CRF-005 — Frame / Blueprint identity (no generic stacks)”

There is no single “Weapon Frames” pile and no single “Armor Blueprints” pile.

Key Identity Stacks with
Weapon Frame Gun Class × Receiver (Type) or melee family + that Frame (core / specialty) + rarity (FS-GUN-004) Only another Frame with the same Class × Receiver (or melee family), same Frame, and same rarity
Armor Blueprint Armor type (slot × Light / Medium / Heavy where the slot uses weight) + rarity. Jewelry and shields use their slot (no weight class). Only another Blueprint with the same type and same rarity

Pulse Adaptive Rare does not stack with Pulse Aggressive Rare, Auto Adaptive Rare, or Pulse Adaptive Legendary. Helm Light Rare does not stack with Helm Heavy Rare or Chest Light Rare. Unique-stamped Frames / Blueprints do not stack with Legendary of the same Receiver / melee family, and Unique salvage cannot pay a Legendary recipe.

Dual Stack Cells and Kha-Shards still stack as themselves. World mats stack by SKU + rarity (FS-CRF-007).

Crafting recipes require the matching typed key to be unlocked by breakdown. They do not consume, hide, or re-lock that key. Do not invent a wildcard Frame.

FS-CRF-006 — Permanent Frame / Blueprint access

Section titled “FS-CRF-006 — Permanent Frame / Blueprint access”

Once a typed Weapon Frame or Armor Blueprint is unlocked by breaking down an item, that key stays accessible on the Crafting Page for that character. Later crafts of that identity spend materials (and other recipe costs) only. You cannot craft a Frame or Blueprint you have never broken down. Trade or mail of finished gear does not grant the key — only breakdown does. Invoke break is still not salvage (FS-PRG-009): no unlock.

Eight shared body families, rarity-stamped: Ferrospine (Metals), Weldalloy (Alloys), Optic Lens (Lenses), Helion Prism (Prisms), Sealant Mesh (Composites), Capacitor Coil (Coils), Warhead Compound (Payloads), Limb Filament (Filaments). Same SKU + different rarity do not stack and cannot pay each other. Item type picks families; item rarity picks the stamp. Exact counts TBD.

These stacks draw on the Crafting Page world-mat rail (W_TFA_CraftingPage), with an independent scrollbar — not a Materials bag (FS-GUI-008).

Also on recipes: Dual Stack Cells (one pile, no rarity stamp, power tax). Well Tap (one pile, no rarity stamp, opens one chip well on Inspect — FS-CRF-010). Legendary / Unique / Apex crafts add Nanite Residue (not a rarity of Ferrospine). Augmented / Rare crafts spend Forge Stamp per prefix slot and Telemetry Coda per suffix slot (same rarity rule). Guided crafts add a group sigil (not rarity-stamped). Channel affixes also spend the matching Gem. Legendary / Unique / Apex crafts spend no Stamp / Coda. Mechanical Arms never. Common spends no affix reagents. Uncommon default none.

Do not name mats Operative / Veteran / Apex Threat (zone difficulty) or Normal / Exceptional / Elite (base-tier fiction). Quality Apex is not Apex Threat.

Keep out of this catalog: Kha-Shards, typed Frames / Blueprints, weapon parts (unlock catalog, FS-CRF-008), Phonons / Gems / Jewels / Artifacts, ammo bricks.

3:1 rarity upconvert is off. Must not skip into Legendary / Unique / Apex.

Salvage returns a slice of the same families at that item’s rarity (fraction TBD, must stay a sink) and unlocks the Frame / Blueprint on first salvage. Augmented / Rare salvage also unlocks installed part variants (FS-CRF-008). Unique salvage yields Unique-stamped body mats + Residue — not Legendary mats, not Forge Stamps, and it cannot pay a Legendary recipe.

FS-CRF-008 — Weapon parts (unlock catalog + Refit)

Section titled “FS-CRF-008 — Weapon parts (unlock catalog + Refit)”

Augmented / Rare guns and melee only. Armor, jewelry, shields, Mechanical Arms, Legendary / Unique / Apex: no part sockets, no Refit.

Guns — Receiver (structural) + five accessory sockets: Receiver authors Type and is required on every Augmented / Rare gun (FS-GUN-004). Year-1 Refit Install does not swap Receiver. Accessory sockets (FS-GUN-006): Barrel, Mag / Cell / Quiver, Optic, Stock / Brace, Grip (or that Receiver’s specialty five-pack). Melee uses five: Head, Guard, Haft, Weight, Core. Phonon / Gem / Jewel wells are not part sockets.

Gun accessory part identity = Class × Receiver × Socket × Variant. Melee part identity = melee Family × Socket × Variant. Corp finish C1–C5 is paint on that variant (look only; mixed-corp allowed). Rare variants do not install on Augmented. Auto Barrel does not fit Pulse. Rifle Gatling Barrel does not fit Heavy Gun Gatling. Empty accessory sockets are legal (Receiver baseline). Cross-Class kits are illegal except where a multi-Class Receiver name has a matching Class × Receiver row.

Unlock: first salvage of an Augmented / Rare gun grants the Receiver × finish key and each installed accessory variant for this character. First salvage of Augmented / Rare melee grants each installed melee variant. Keys stay accessible. Forge and Refit spend materials only. Trade / mail / Invoke break do not grant parts. Parts are not bag tiles and do not stack as items.

Forge: pick owned variants or roll cheaper from owned variants; gun recipes require a legal Receiver × Frame pair (FS-GUN-004). Refit is the Inspect activity on Augmented / Rare weapons. Preview = select an owned accessory variant; the stat plate ghosts + / −; no spend. Install = the spend that writes one accessory socket and pays that socket’s Receiver mix at the item’s rarity + Dual Stack Cells (counts TBD). Finish-only swap (same variant, new C1–C5) costs Dual Stack Cells only. Install does not change Receiver, Class, Frame, cadence, affixes, or socketed Phonons / Gems / Jewels / Artifact. Install does not write SetID, PieceIndex, or InvokeEligible. There is no park well. Do not label the pay button Refit or Commit.

Parts never write Fire Mode, AA baselines, RPM, charge ms, draw ms, or burst count (FS-GUN-007, FS-GUN-008).

FS-CRF-009 — Rewrite (affix Reroll / Change)

Section titled “FS-CRF-009 — Rewrite (affix Reroll / Change)”

Post-hoc one-slot affix retouch on Inspect. Not Forge. Not Refit. Not Install.

Who: Augmented / Rare guns, melee, armor, jewelry, shields — full Reroll and Change. Legendary / Unique / Apex — Reroll only; Change tab hidden; empty wells illegal. Mechanical Arms never. Common never. Uncommon default off. Socketable jewel chips do not Rewrite; doll jewelry items do.

Seat: W_TFA_Inspect_Rewrite, full child above Inspect. I or Esc closes Rewrite first, then Inspect.

Reroll: keep the affix group; roll a new named affix + band inside it. Cannot pick Terminal vs Razor by name. Empty wells: Reroll illegal.

Change: pay a group sigil; pick a different family; then roll. Cannot duplicate a group already on the item. May fill an empty legal well (Rare ≤3 prefix + 3 suffix; Augmented ≤1+1). Staff / Scepter refuse Combat prefixes.

Etch: the click that pays after free odds preview. Not a hold.

Materials: prefix → Forge Stamp (item rarity). Suffix → Telemetry Coda. Change → one group sigil (Combat, Siphon, Tempo, Channel, Attribute, Yield, Vital, Plating, Guard, …). Channel groups → matching Gem. Every Etch → Dual Stack Cells. Overpay 0–3 extra matching Stamp/Coda + extra Cells weights the band table; never 100%. Lab / still bias table: [50,35,15] → [30,40,30] → [18,37,45] → [10,30,60] for low/mid/high. Exact counts TBD (lab floor 1 Stamp or 1 Coda + 12 Cells; Change +1 sigil; Channel +1 Gem; overpay +1 reagent +12 Cells per step).

Cannot write: Frame, cadence, parts, Phonons / Gems / Jewels / Artifact, InvokeEligible, SetID, PieceIndex, AA / camera / FOV.

Online: browse OK; Etch fail-closed in combat or downed (overlay spend lock).

Post-hoc open of one Phonon / Gem / Jewel well on Inspect. Not Forge. Not Refit. Not Install. Not Rewrite.

Material: Well Tap — Crafting stack, one pile, no rarity stamp. Plus Dual Stack Cells. Exact counts TBD (TBD-042). Lab floor: 1 Well Tap + 8 Cells × the next well index (well 1 costs 8, well 6 costs 48).

Seat: Inspect, under the chip-socket strip (W_TFA_Inspect). No child window. No park well.

Effect: openWells += 1, hard cap 6. The new well is empty. Does not fill it. Does not write Frame, cadence, affixes, parts, seated Phonons / Gems / Jewels, Artifact, InvokeEligible, SetID, or PieceIndex. Cannot add a 7th chip well. Cannot add or remove the Artifact socket. Cannot add part sockets.

Who: guns, melee, armor, jewelry, shields that have chip wells, including Legendary / Unique / Apex (authored birth count; player may Bore to 6). Mechanical Arms never. Ammo never. Common / Uncommon Chord bases never — socket count is Chord length (FS-ITM-007). Socketable jewel chips do not Bore; doll jewelry items do.

Draw: six positions always. Open empty wells are numbered and droppable. Unopened wells draw locked (no drop).

Online: browse OK; Bore fail-closed in combat or downed (overlay spend lock).

Open I → Inventory → Forge: auto-maximizes; Forge fills everything except the paper doll and LOAD OUT; Gear bag hides until Minimize. Forge is present. Refit is not a workbench mode. Open Inspect on a Rare Auto: Refit is present. Inventory inner tabs do not include Crafting. Doll / LOAD OUT / wallet stay. Stats / dock yield to Forge. Breakdown of a Unique returns its Artifact to the Artifacts bag and unlocks that typed Frame/Blueprint permanently (FS-CRF-005, FS-CRF-006). Auto Adaptive Rare Frame lists once as a key, not a pile of copies. Auto Adaptive Rare and Pulse Adaptive Rare are two keys. Helm Light Rare and Chest Light Rare are two Blueprint keys.

Open I → Inventory → Forge: no tile labeled only “Weapon Frames” or only “Armor Blueprints” covering mixed Receivers / melee families. Dummy salvage of a Rare Auto unlocks an Auto Rare Frame (Rifle Class derived), not a generic Frame.

Character A salvages a Rare Auto Adaptive once, then crafts that Auto Rare Frame recipe twice, paying mats each time. The second craft succeeds without another salvage. Character B, who never broke down that Auto, cannot craft it.

Rare Auto recipe rejects Common Ferrospine. Unique salvage yields Unique-stamped body mats + Residue, not Legendary mats and not Forge Stamps. Unique-stamped Ferrospine cannot pay a Legendary recipe. Crafted Apex spends Apex-stamped families + Residue, stamps InvokeEligible = false, and spends no Stamp / Coda.

Open I → Inventory → Forge: no Barrel / Head / part tiles. Salvage a Rare Auto with an installed Barrel variant: that Auto × Barrel × variant unlocks; Inspect → preview a second Auto’s Compensator (stats ghost) → Install spends Rare Ferrospine + Cells and does not consume the unlock. Install refuses a Pulse Barrel. RPM stays 600. Inspect on armor or Apex offers no Refit and no Install. Armor offers full Rewrite. Apex offers Rewrite Reroll only.

Online overlay: open I → Inventory → Forge while a dummy is firing (in combat). Catalog browse succeeds. Forge / Refit / Rewrite / Bore / repair are rejected (fail closed). Repeat out of combat: spends succeed. Repeat while downed: spends rejected. Solo pause: spends succeed with no extra gate.

Open Inspect on a Rare Trace: Rewrite is visible. Reroll a Kinetic Output prefix: Etch writes a new name/band in Kinetic Output; Frame, parts, and chips unchanged. Change an empty suffix with a free sigil: the well fills. Change that tries to duplicate a group already on the item is refused. Open Inspect on Crown Rifle (Apex) or TFA Warden (Legendary): Rewrite is visible; Change tab is hidden. Reroll a filled prefix: Etch writes a new name/band in the same group. Change on an empty well is refused. Socketable jewel chips do not expose Rewrite.

Open Inspect on HAB Trace (lab: 2 of 6 open). Locked wells 3–6 refuse a Gem drop. Bore spends 1 Well Tap + Cells and opens well 3 empty; Frame, parts, affixes, and seated chips unchanged. Repeat to 6. A 7th Bore is refused. Open Inspect on Plate Helm (lab: 0 of 6): first Bore opens well 1. Open Inspect on a Chord-locked Common: Bore is refused. Crown Rifle may Bore remaining wells to 6; Artifact socket count stays 1. Forge lists Well Tap as a stack; the spend is Inspect, not a park well.

Open I → Inventory → Forge. Search “Trace” shows HAB Trace Rare Frame and hides Helm Light Rare Blueprint. Armor chip hides all Frames; Weapons chip hides all Blueprints and reveals Ranged / Melee. Ranged hides Wrist Melee; Melee hides Auto Adaptive. Rarity Rare hides Common Helm Light and Crown Rifle Apex. All + All restores the full scrolling list. World mats stay in the stack rail (not a bag). The mat rail and the recipe list each have their own scrollbar.

Open I → Inventory → Forge: Gear bag is hidden; doll and LOAD OUT stay (FS-GUI-008, OV18). Gear occupancy reads on the workbench. The world-mat rail has its own scrollbar. Forge with free slots writes the item into Gear (wide Crown Rifle Apex Frame consumes two slots). Fill the bag: Forge buttons dim; click is refused; bag count unchanged. Minimize restores docked Gear with the forged tiles. Socketables / Artifacts maximize is still a full bag with no workbench.


FS-CRF-011 — Forge / Refit vs Trait and Origin

Section titled “FS-CRF-011 — Forge / Refit vs Trait and Origin”

Forge stamps active Trait ids for each quality-unlocked column — guns: Verb / Feed / Bullets / Plate; armor/shields: Verb / Stride / Shell / Brace; jewelry: none. Forge Legendary: four Trait columns, no Origin. Forge Unique: four columns + one Origin + optional Set. Forge Apex: four columns + two Origins + optional Set. Common→Rare never stamp Origin.

Refit Install / preview: never writes Trait column ids, OriginId, OriginId2, SetID, or PieceIndex.

Trait lane: TBD-064 locked 2026-11-13b — Common→Legendary Rewrite may change Trait column picks (cost TBD). Unique/Apex Crafting unlocks options; out-of-combat swap among unlocked. Origin / OriginId2 never Rewrite (Unique/Apex authored only).

Requires Familiarity at or above gate rank (FS-ITM-013). v1: masterworkRank 0 → 1. Applies Masterwork Inspect chrome + one authored finish bonus from DT_TFA_MasterworkFinishes (Trait mag band / one plate column / socket glow — not a free affix roll). Does not write Trait column ids, Origins, SetID, affixes, wells, Artifact, or InvokeEligible. Costs TBD-067.

Forge Rare gun: Bullets+Feed+Verb; Origin empty. Forge Rare armor: Shell+Stride+Verb; Origin empty. Forge Legendary: four Trait columns (gun Plate / armor Brace); Origin empty. Forge Apex: four columns + two Origins. Forge jewelry: no Trait columns. Refit Install on Rare: Trait/Origin/Set fields unchanged. Attempt Masterwork below Familiarity gate: fail.

16b. Player economy — Credits, BTUCOIN, and LUMENAR

Section titled “16b. Player economy — Credits, BTUCOIN, and LUMENAR”

Product lock: FS-PRD-007. This section is the runtime contract.

Three ledgers:

  1. Credits — in-world vendors / NPC transactions. Account-shared (PUID / Solo profile). Play-sourced.
  2. BTUCOIN — crypto token on the EOS PUID. Never marketplace tender. Convert → LUMENAR only.
  3. LUMENAR — soft marketplace currency (not crypto). Storefront + listings. Bought with cash or BTUCOIN convert.

They do not replace craft mats. The menu roll W_TFA_Credits is a different screen — never bind the wallet there.

Year 1 BTUCOIN is a studio-operated ledger plus an external market-price feed. Do not invent an on-chain client, wallet seed, or exchange listing in C++. Later Proof of Stake hybrid (deposit / withdraw / optional stake) is GDD BTUCOIN — PoS Hybrid and FS-ECO-013 under TBD-038.

Account-shared. int64 CreditsBalance on the EOS PUID (Online) or Solo local profile — not a per-character field. Every character on that account reads and spends the same pool (alt mule / power-up is intentional). Never a bag tile. Character I title bar only (W_TFA_IWallet) — CREDITS chip, gap, BTUCOIN chip, then X; chip shows the shared balance on every character. Solo: local profile save. Online: server-authoritative on PUID; fail closed. Reset Campaign and character delete keep Credits (account ledger). Account wipe / PUID delete clears the pool.

Spend: in-game vendors / world NPC transactions only. Affixes of Profit / of Payday (Credits Find) modify play grants only. Credits do not buy Marketplace storefront or listings.

Credits drop and award from play. Sources (locked):

Source Notes
Stashes / caches Opened containers. Amount TBD-037
Monster kills Trash / elite. Credits Find affixes apply. Amount TBD-037
Boss kills Distinct from trash. Amount TBD-037
Side missions On completion. Amount TBD-037
Milestones / accomplishments Anti-FOMO earn path. Same Credits, not LUMENAR

Do not invent per-kill numbers. DT_TFA_CreditRewards stays empty until TBD-037.

FS-ECO-003 — Marketplace cash → BTUCOIN mint (then convert)

Section titled “FS-ECO-003 — Marketplace cash → BTUCOIN mint (then convert)”

Marketplace fiat / cash SKUs (BTUCOIN packs, checkout that takes real money) mint BTUCOIN on the buyer’s EOS PUID using FS-ECO-004 — 51% BTU Games (studio treasury) / 49% buyer. Pack tables are fiat value (V) (TBD-036), not fixed BTUCOIN counts. At mint time, settlement (P) = FS-ECO-005; total mint (M = V / P); player credit = (0.49M). When market is above floor, the pack mints fewer BTUCOIN; converting that mint at the same (P) yields the same LUMENAR for (V) (FS-ECO-006). Do not grant LUMENAR from cash. Do not grant Credits from cash.

To buy storefront, listings, or Season Pass Advanced: buyer converts their 49% BTUCOIN → LUMENAR (FS-ECO-006), then spends LUMENAR (FS-ECO-010). BTUCOIN never tenders SKUs directly.

Store login still does not move a Solo character into the Online pool. A Solo character with EOS can receive the BTUCOIN mint locally / on PUID and convert; cosmetic unlocks still require LUMENAR spend after convert.

FS-ECO-004 — BTUCOIN mint split (51 / 49)

Section titled “FS-ECO-004 — BTUCOIN mint split (51 / 49)”

Every BTUCOIN mint uses this split — play grants (FS-ECO-008) and any future fiat path that explicitly mints BTUCOIN. There is no mint that skips the studio cut.

Share Owner
51% Studio treasury. Never shown as the player’s wallet.
49% Player BTUCOINBalance / CryptoBalance on that EOS PUID

Player BTUCOIN is only this 49% share. They cannot spend, list, or convert the studio 51%. BTUCOIN is never Marketplace tender.

FS-ECO-005 — BTUCOIN price floor + settlement (P)

Section titled “FS-ECO-005 — BTUCOIN price floor + settlement (P)”

BTUCOIN has a studio-set floor price in fiat (TBD-035) — the marketplace base value. Live market comes from the Year-1 price feed (later exchange / oracle under TBD-038).

Symbol Meaning
(P_{\text{floor}}) Studio floor (TBD-035). Never invent a number in code docs.
(P_{\text{market}}) Free-market / feed price at the operation’s timestamp.
(P) Settlement = (\max(P_{\text{floor}},, P_{\text{market}})).

(P) is shared by cash mint (FS-ECO-003), play mint (FS-ECO-008), and convert (FS-ECO-006). The token never settles below the floor. If the open market trades above the floor, (P) follows the market — so BTUCOIN quantity minted for a fixed fiat value (V) falls, while LUMENAR from converting that mint at the same (P) stays flat.

Holding BTUCOIN across a price move can change later convert LUMENAR (mint (P) ≠ convert (P)). Immediate convert of a fresh mint keeps LUMENAR = (V_{49} \times R).

FS-ECO-006 — Convert BTUCOIN → LUMENAR

Section titled “FS-ECO-006 — Convert BTUCOIN → LUMENAR”

The player may convert any portion of their 49% BTUCOIN into LUMENAR whenever they want. Confirm on Marketplace Wallet. LUMENAR writes to the EOS PUID ledger (FS-ECO-009).

[ \text{LUMENAR} = \big\lfloor B_{49} \times P \times R \big\rfloor ]

  • (B_{49}) — player BTUCOIN converted
  • (P) — settlement at confirm time (FS-ECO-005)
  • (R) — LUMENAR-per-fiat (TBD-036)

Grant/cash sizing and convert must use this same (P) formula so a mint sized as (M = V / P) converts to stable LUMENAR for that (V) (player share (0.49V \times R)). Irreversible. Fail closed: Solo with no EOS session, zero balance, Online ledger reject.

BTUCOIN does not buy Marketplace SKUs or listings directly. Convert first, then spend LUMENAR. There is no convert BTUCOIN → Credits.

Command Deck Marketplace panes: Storefront · Listings · Wallet. Wallet needs EOS (same rule as Storefront). Shows: LUMENAR (primary), BTUCOIN (player 49%), floor, live market, settlement, Convert BTUCOIN → LUMENAR, cash → BTUCOIN mint entry (FS-ECO-003). Credits may echo for context but are not a Marketplace spend. Listings prices are LUMENAR. Fiat SKUs mint BTUCOIN; LUMENAR SKUs debit FS-ECO-009.

Looks only. Seasons never vault. FE spec §11 owns chrome.

FS-ECO-008 — Play BTUCOIN (daily / weekly / hard objectives)

Section titled “FS-ECO-008 — Play BTUCOIN (daily / weekly / hard objectives)”

Completing these awards a BTUCOIN mint. Not Credits. Not LUMENAR. TBD-039 authors each row as a fiat value (V) (and the Hard Objective catalog) — not a fixed BTUCOIN count. At completion, settlement (P) = FS-ECO-005; total mint (M = V / P); then FS-ECO-004 (51% treasury / 49% player). When market is above the marketplace floor, the objective mints fewer BTUCOIN; converting that mint at the same (P) yields the same LUMENAR for that (V).

Do not invent a board. Do not invent a Command Deck tab — they use the same objective chrome as story / sub-missions on every Tab map (W_TFA_LocalMap and W_TFA_WorldMap; FS-CMP-007 / FS-CMP-009). Daily / Weekly / Hard rows + Tasks filter on both drawers. Globe markers on World Map. Local Objects stay on Local Map.

Online service only. Solo never lists, spawns, tracks, or completes them. Store login on a Solo character does not grant them. EOS Wallet convert is a different gate.

Source Notes
Daily tasks Online only. Reset daily. Fiat (V) from TBD-039. (M = V / P). Mint runs FS-ECO-004.
Weekly tasks Online only. Reset weekly. Fiat (V) from TBD-039. (M = V / P). Mint runs FS-ECO-004.
Hard objectives Online only. Distinct from dailies / weeklies. Fiat (V) from TBD-039. (M = V / P). Mint runs FS-ECO-004.

Mint writes to the EOS PUID of the Online character. Fail closed off the Online pool. DT_TFA_CryptoPlayGrants stays empty until TBD-039 (columns: objective id, fiat (V), reset — not raw BTUCOIN).

Soft marketplace currency. Not crypto. int64 (or fixed-point table TBD-036) on the EOS PUID. Never a bag tile. Never an I title-bar chip. Marketplace Wallet is the home surface. Acquire only via BTUCOIN convert (FS-ECO-006) — not from cash SKUs. Solo: local unlock cache after convert + spend. Online: server-authoritative; fail closed. Reset Campaign does not wipe LUMENAR (account field).

Spend: Marketplace storefront and player listings only. Does not spend at in-world vendors. Does not replace craft mats.

Storefront and listings debit LUMENAR only. Credits cannot pay. BTUCOIN cannot pay without FS-ECO-006 convert first. Fail closed on insufficient LUMENAR.

FS-ECO-011 — Season Pass (Basic / Advanced)

Section titled “FS-ECO-011 — Season Pass (Basic / Advanced)”

GDD: Season Pass — Basic & Advanced. One shared XP ladder; Basic free; Advanced unlocked by LUMENAR spend (FS-ECO-010). Fund LUMENAR by converting BTUCOIN from fiat mint (FS-ECO-003) and/or play mint (FS-ECO-008) — cash does not grant LUMENAR directly. Rewards are cosmetics / presentation and soft-currency drips only — never frames, cadence, trees, gems power, RAID access, or ladder MMR. Mid-season Advanced purchase grants all Advanced rewards for tiers already reached. Pass XP from Online objectives / match complete (Solo rate 0 until locked). Progress on Online / IMonetaryHost identity. UI: Command Deck W_TFA_SeasonPass — not Character I. Ledgers / purchase / claim currency grants live in MonetaryPlatform; Frontend presents; Online feeds XP. CF / Founding Club exclusives are a separate entitlement track (FS-ECO-012), not Season Pass tiers.

FS-ECO-012 — Founding Clubs & CF cosmetics (in-game)

Section titled “FS-ECO-012 — Founding Clubs & CF cosmetics (in-game)”

GDD: Founding Clubs & CF Cosmetics — In-Game (founding-clubs-cf-cosmetics). Crowdfunding ladder exclusives and Apex-band Founding Clubs (Seal Circle → Founding Apex Enclave) grant EOS PUID entitlement flags consumed by the game client as looks / presentation only (FS-PRD-006). Working catalog (materials, FX, body props including wings) is design-locked in that GDD chapter and marketing Store Plan Ch. 5.

Rule Contract
Host EOS / Online account (IMonetaryHost / MonetaryPlatform entitlement store). Not a Combat GE. Not a bag tile.
Write path External pledge resolve (website / CF backend) → signed entitlement upsert on PUID. Game client reads; it does not invent CF flags from local fiat.
Flag kinds title_*, fx_*, mat_*, prop_*, club_*, hangar / nameplate / VISION-chip chrome, emote, weapon-wrap, decal ids. Formal strings: TBD-055.
Layers Three stackable equip layers: Material (surface finish), Armor FX (overlay / shader), Body prop (silhouette — wings, mantle, trails, shoulder pips). Toggleable in hangar / loadout.
Club model Studio-owned Founding Clubs only (Year 1). Membership = resolved Apex-band tier — not a second in-game SKU and not player-created brand clubs.
Stack Lower cosmetics (materials, FX, props) stay unlocked when the player climbs. One primary club representation = highest resolved Apex club; badge visibility toggle does not revoke entitlement. Cosmetics start at Founder; Witness–Benefactor = thank-you + title only.
In-game surface Materials, Armor FX, Body props, titles / title trim, emotes, hangar banner / trim / pedestal, nameplate frame + club tag, Founding / club VISION chip chrome (under the Terra Firma mark, never on it), prestige ranks (cosmetic / roster labels only), armor/weapon decals.
Plate lock Materials / FX / props never change light/heavy plate size or underarmor joint / visible underarmor scale. Body props never grant flight, glide, hitbox, or mobility buffs.
Forbidden Power, frames, cadence, trees, gem/jewel power, RAID keys, ladder MMR, Credits or LUMENAR grants as pay-to-win from club membership, MLM recruiting trees, flight from wings.
Out of FS runtime Site club page, Discord channels / voice, charter copy, ops ambassador roles, studio line, playtest seat priority — marketing / community ops, not Combat or MonetaryPlatform spend.

Presentation: Character I / Collections / hangar / nameplate / Match Results chrome / OmniVisor VISION-chip tint. TFAEconomy may route entitlement apply into MonetaryPlatform; TFACombat / TFAWeapons never read CF flags for damage, cadence, or kit unlocks. Solo with EOS may cache unlocks locally after account sync; Online is server-authoritative and fails closed.

FS-ECO-013 — BTUCOIN PoS hybrid (deposit / withdraw / stake)

Section titled “FS-ECO-013 — BTUCOIN PoS hybrid (deposit / withdraw / stake)”

GDD: BTUCOIN — PoS Hybrid. Year 1 remains studio ledger + price feed (FS-PRD-007). When TBD-038 lands, BTUCOIN may settle on a Proof of Stake host (existing PoS L1 / L2 preferred; custom PoS L1 not required).

Rule Contract
Play authority Match / objectives / fiat→BTUCOIN mint / convert / Marketplace spend stay on MonetaryPlatform studio ledger — fail-closed. UE5 never runs validators or PoW miners.
Fiat Cash SKUs mint BTUCOIN 51/49 (FS-ECO-003); they do not credit PoS directly and do not grant LUMENAR.
Withdraw Player may withdraw only the 49% player BTUCOIN lane. Studio 51% treasury never withdrawable. Server freezes/debits ledger, then bridge mints/releases on-chain. AntiCheat / fraud hold → reject. Min amount / delay: TBD-038-A / TBD-038-B.
Deposit On-chain send → after N confirmations (TBD-038-C) credit EOS PUID ledger. Client cannot invent deposit credit. Deposit alone does not grant LUMENAR, Credits, frames, or Season Pass tiers.
Stake Optional on-chain only. Rewards never grant Combat power, cadence, trees, RAID access, Ladder MMR, or Trust rank. Wallet chrome only — not Character I / OmniVisor combat. Bonding/unstake delay is expected.
Mint Play mints still FS-ECO-004. Stake/chain inflation (TBD-038-D) is separate from play grant tables.
Tender BTUCOIN still never buys storefront / listings — convert → LUMENAR (FS-ECO-006 / FS-ECO-010).

Owners: MonetaryPlatform (ledger + bridge jobs + gates), Frontend Wallet (presentation), Online (identity). Not required for Demo exit.

Open I: title bar shows Credits and BTUCOIN on Inventory, Combat, Tentacles, Ordnance, and Channels. Kill a dummy tagged as a credit source: Credits tick up without a bag slot. Switch to a second character on the same account: Credits chip shows the same balance. Dismantle does not spend Credits. LUMENAR is not on the I bar.

With EOS: buy a $100 EXAMPLE Marketplace cash pack (numbers are the test harness, not TBD-036). Ledger mints BTUCOIN at 51/49 — player BTUCOIN ticks by the 49% share only; no LUMENAR grant and no Credits grant from that SKU. Wallet Convert of player BTUCOIN increases LUMENAR and zeros that converted BTUCOIN amount. Then a LUMENAR storefront buy succeeds. Attempt to buy a storefront SKU with Credits or raw BTUCOIN (no convert) fails. Repeat on Solo: BTUCOIN mint / convert / unlocks land on the account path; character stays in the Solo pool.

Online pool: a dummy Daily appears on Local Map and World Map Missions & Objects / Operations (filter Tasks) and as a world / globe marker (TFA.World.OnlineTask). Set as Primary from either map drives FE30. Completing it mints (M = V / P) at settlement (FS-ECO-005 / FS-ECO-008): test harness may use floor = market = $1 and (V = $1) → (M = 1.00) total, then 51% treasury / 49% player. Raise harness market above floor with the same (V): fewer BTUCOIN mint; convert at that (P) yields the same LUMENAR as the floor case. Character I BTUCOIN ticks by the player share only. Repeat a Weekly and a Hard Objective. Solo: neither map lists Daily / Weekly / Hard; world has none of those markers; a dummy tagged that way does not complete and does not mint.

Online: Command Deck Season Pass shows Basic and Advanced lanes on one XP bar. Claim a Basic cosmetic without LUMENAR. Buy Advanced with LUMENAR only — Credits and raw BTUCOIN fail. After earning tiers on Basic alone, purchase Advanced mid-season and receive Advanced rewards for those reached tiers. No pass tier grants a gun frame, cadence change, or skill-tree node. Solo-only identity does not advance pass XP (until Solo rate is locked).

With an EOS PUID seeded with Founder cosmetics (fx_visor_cyan_glow, mat_founding_plate_matte, prop_hardlight_vanes or harness equivalents) and Seal Circle club (club_seal + Seal Lacquer / Seal Span): Character I / Collections / hangar / nameplate show Material + Armor FX + Body prop stacked; Match Results may show the club tag when badge visible. Toggle badge hide: tag hidden, entitlement still present. Climb harness to Primus: Seal cosmetics remain unlocked and Primus material / FX appear. Equip materials / FX / props on light and heavy sets: plate silhouette and underarmor joint scale unchanged; wings grant no flight. Attempt to map any CF / club flag to a gun frame, cadence scalar, skill-tree node, Credits grant, or LUMENAR grant fails closed. Without EOS sync, client cannot invent CF entitlements from local fiat.

With PoS hybrid harness enabled: Wallet shows deposit / withdraw. Withdraw of player BTUCOIN debits only the 49% lane; attempt to withdraw studio treasury share fails. Fraud / AntiCheat hold blocks withdraw. Deposit credits ledger only after configured confirmations — a client-spoofed “deposit complete” does not credit. Stake summary (if shown) cannot be spent as Marketplace tender and does not alter gun cadence or Ladder standing. With hybrid disabled (Year 1 default): play mint, convert, and LUMENAR spend still pass AC-ECO-002 / AC-ECO-003.


Main Story (Val & Dea) is fixed and discovered. Game Story is the player’s HAVOC-unit journey. Year 1 is linear, single ending. Player is a soldier in the unit, present for the Kailashia opening, then playable.

  • Indra: quest-giver from Indra’s Ring (briefings).
  • Dea: persistent comms handler (W_TFA_Comms). Not an alliance portrait.
  • Val: unit commander; sprinkled cinematics and missions.

Playable Earth + Indra’s Ring. Tutorial off-world (Moon station or Ring). Opening cinematic on Kailashia. Other planets are Year 2–5.

Campaign: 4 Parts × ~30 hours. Each part culminates in a Raid Online or matching SOLO OPS dungeon Solo. Sub-mission target ~1 hour. Exact mission table lives in GDD_Storyline_and_Game_Progression.txt.

  1. Corp security
  2. Corrupted human military
  3. Mutants / abominations
  4. Mek-Shivs (late)

MEKs are soul-transfer vessels under a Hive Mind. EXOs are elite MEKs. Ghost MEKs are DLC-reserved (survive Hive Mind destruction).

FS-CMP-005 — Ability unlock fiction vs systems

Section titled “FS-CMP-005 — Ability unlock fiction vs systems”

Narrative unlocks (double jump, Wall Walk, Heat vision, Mechanical Arms) must call the same movement / vision / tentacle systems as the baseline kit. If a verb is baseline kit in the combat GDD, the campaign may tutorialize it rather than grant it for the first time — TBD-026 (resolve per verb so tutorial and GDD do not fight).

Space Rule
Open world / most dungeons Monster level = that operative’s character level, even in a shared instance
Raids / specialty / SOLO OPS pinnacle Authored set level. Under-level allowed (harder). No hard lockout unless later asked

Difficulty tier and Recommended Level (ARL) for the same space are also area-authored (FS-PRD-005 · FS-DMG-009) — not a separate player menu. An area row owns encounter level policy, Difficulty.Operative / Veteran / ApexThreat, and RecommendedLevel. Open-world ARL = expected sector entry band (not live alvl). PowerΔ uses ARL + MobOffset; CtH still uses alvl vs dlvl.

How to even per-player monster level in coop so it feels fair: TBD-027. Do not implement highest / average / owner as a silent default.

Implementation sketch (until TBD-027 locks): each pawn applies FS-DMG-009 PowerΔ from own alvl vs shared ARL (plus personal MobOffset vs that monster’s dlvl) so two players can share one actor. Do not spawn two hidden copies of the same grunt.

FS-CMP-007 — Contextual Map System (Local Map & World Map)

Section titled “FS-CMP-007 — Contextual Map System (Local Map & World Map)”

The map interface is activated contextually and toggled via Tab:

  1. Context-Aware Activation (Hold / Press Tab):
    • On Planet Surface / Combat Sector: Opens Local Map (W_TFA_LocalMap), centered on current player coordinates.
    • In Orbit / Station (Indra’s Ring / Dropship): Opens World Map (W_TFA_WorldMap), displaying the global planetary view.
  2. Local Map (W_TFA_LocalMap) & Missions / Objects Hub:
    • Map Canvas: Displays sector topology, elevation layers, fog of war, player coordinates/heading, and local world tags (TFA.World.*).
    • Integrated Missions & Objects Drawer:
      • Filters: All | Campaign | Sub | Tasks | Objects. Tasks is Online only (hidden Solo). Objects = Local POIs (this map only).
      • Left panel hosting active Story Missions, Sub-Missions / Bounties, Local POIs / Objects (Fabricators, Weapon Caches, Terminals, Extraction Beacons), and — Online pool only — Daily / Weekly / Hard Objectives (FS-CMP-009). Same Online-task rows and Tasks filter as World Map.
      • Online only: if LastMatchRecap is set, a Last match row sits above Operations / Missions (activity name + outcome). Opens frozen W_TFA_MatchResults (FS-MCH-003). Not a Tasks filter. Empty: no row. Solo never shows it.
      • Each entry shows status, objectives, distance, and rewards.
      • Set as Primary works on Online tasks the same as on story / objects.
    • Set as Primary Action:
      • Player can select any mission, Online task, or world object and click [Set as Primary].
      • Exactly one target can be Primary at any time (shared across Local Map and World Map).
      • The Primary target receives an ember/gold pulse on the open map (Local or World) and registers with UTFAObjectiveSubsystem. That subsystem drives the GUI locator on the OmniVisor: quiet world pip (W_TFA_3DWaypoint), heading-tape pip (W_TFA_HeadingTape), and gold blip on W_TFA_TrackerDisc. It does not spawn an FE26 nameplate on the reticle.
    • World Map Transition: A prominent [ < World Map (Tab) ] button on the top-left lets players ascend to the planetary view.
  3. World Map (W_TFA_WorldMap) & Bi-directional Drilldown:
    • Displays Earth globe, orbital stations (Indra’s Ring), and macro mission nodes.
    • Operations / Missions & Objects drawer: same Online-task rows as Local Map — Daily / Weekly / Hard Objectives — plus Tasks filter (FS-CMP-009). Local Objects / POIs stay on Local Map. Set as Primary works here too.
    • Online only: Last match row above Operations when LastMatchRecap is set (FS-MCH-003). Same frozen Results sheet as Local Map. Not RAID/VAULT launch; not Tasks.
    • Filters: All | Story | Tasks | Raids | Vaults. Tasks / Raids / Vaults are Online only (hidden Solo). No Objects tab.
    • Globe markers: amber task diamonds at the task’s sector (not RAID hexes). Solo never draws them.
    • Selecting a sector displays operational summary, threat rating, and a [ View Local Map (Tab) ] button that transitions down into that sector’s W_TFA_LocalMap.
  4. Bi-Directional Tab Toggle:
    • Pressing Tab while in Local Map swaps to World Map.
    • Pressing Tab while in World Map swaps to Local Map (defaulting to the player’s current sector).
    • Pressing Esc or clicking [ Close ] returns directly to gameplay.
  5. GUI locator (play HUD, after Set as Primary):
    • Primary (FE30): 8–12 px gold world pip off the reticle + heading-tape gold pip + tracker gold diamond. No name, no meters.
    • Secondary options: FE28 (world pip only) or FE29 (heading tape as the heading cue). Not the default ship.
    • Tap Tab / M: 4 s ping — name + {dist} m + elevation chevron beside the world pip; tape and tracker brighten.
    • Off-FOV: world pip hides; tape pip parks at the end; tracker blip remains; tiny visor rim tick only.
    • One Primary. Clearing Primary hides the locator. Fast travel: TBD-002.

TFA.World.Vaultable · TFA.World.WallRunnable (migrate/alias WallWalkable) · TFA.World.Fabricator · TFA.World.MissionVolume · TFA.World.SafeHub · TFA.World.ObjectivePOI · TFA.World.OnlineTask (daily / weekly / hard; Online pool only).

FS-CMP-009 — Online tasks (daily / weekly / hard)

Section titled “FS-CMP-009 — Online tasks (daily / weekly / hard)”

Daily tasks, weekly tasks, and hard objectives only exist on the Online service. They are game objectives, not a Marketplace pane and not a Character I tab.

Seat Behavior
World (play) Tagged TFA.World.OnlineTask. Visible in the sector like other objectives.
Local Map Rows in Missions & Objects. Filter Tasks. Online only (hidden Solo). Local Objects stay on this map.
World Map Same Daily / Weekly / Hard rows in Operations / Missions & Objects. Same Tasks filter. Globe markers at the task’s sector. Online only.
Track Set as Primary from either map → UTFAObjectiveSubsystem → FE30 GUI locator. One Primary.
Solo No rows on any map, no world markers, no complete, no BTUCOIN mint from these sources.

Catalog and grant amounts: TBD-039. Completing one mints BTUCOIN (FS-ECO-008).

ATFACharacter (shared vitality / channels) with ATFAAIController. Grunt / Elite / Boss data assets set TTK band, plate size, and immunities. Do not fork a second damage pipeline for AI.

AI behavior (Logic Driver, fuzzy scores, Squad / Agent) lives in GFP TFAAI (FS-AI-001–FS-AI-005). This requirement only locks the shared pawn / damage line. Multiplayer bot brains, monster pack brains, and campaign / world patrol brains are separate LD asset families on that substrate — not one reused Deathmatch graph.

Design authority: docs/superpowers/specs/2026-10-26-ai-substrate-logic-driver-fuzzy-design.md.

Logical module TFAAI packs as GFP TFAAI (Runtime). Depends on TFACore (downward only). Not Boot Active — Experiences enable it (world encounters, campaign patrol, MP bot fill, Demo sandbox C). TFACombat / TFAWeapons stay damage and gunfeel; AI never forks a second kinetic pipeline (FS-WLD-001).

Key types: ATFAAIController, UTFAAISquadCoordinator, Agent LD host on the controller, fuzzy membership helper, DA_TFA_AIDifficultyProfile.

FS-AI-002 — Logic Driver as fuzzy system

Section titled “FS-AI-002 — Logic Driver as fuzzy system”

Logic Driver Pro is the fuzzy decision layer. Pipeline:

  1. Sensors / world queries → raw metrics.
  2. Membership curves → continuous desirability scores [0, 1] on the LD blackboard.
  3. Soft selection among intents / tactics using those scores plus hysteresis (enter/exit thresholds or dwell) so states do not thrash.
  4. DA_TFA_AIDifficultyProfile remaps curve steepness, reaction delay, aim cone, aggression bias without replacing soft selection with boolean-only high-level goals.

Forbidden as the sole high-level path: hard boolean SM with an outer Goal picker that bypasses LD soft scores.

Every coordinated AI group uses one Squad / Team Logic Driver graph (coordinator) plus per-pawn Agent Logic Driver graphs. The squad writes shared soft intents and role assignments; agents fuzzy-pick local tactics under those intents. Same structural pattern for MP bot teams, monster packs, and patrol cells; different graph assets and intent vocabularies per product brain.

Three product brains on TFAAI (full catalogs in Tracks A / B / C):

Brain Track Difficulty semantics
MP bots A UT2004-style ladder (exact table in Track A spec)
Monster groups B Area Difficulty / ARL / Grunt·Elite·Boss (FS-CMP-006, FS-WLD-001)
Campaign / world patrol C Mission / sector authored — not UT2004 labels

Do not share LD graphs, intent names, or difficulty label feel across brains. Outline stubs: docs/superpowers/specs/2026-10-26-ai-track-*-outline.md.

Solo: local authority runs Squad / Agent selection. Online: server owns fuzzy scores, squad intents, and agent tactic selection; clients may predict presentation only. AI fire / move still validates through the same combat auth path as players (FS-ARCH-013 / damage pipeline).

An engineer names GFP TFAAI, ATFAAIController, and states that MP bots, monster packs, and campaign patrol use separate LD asset families on a shared fuzzy Squad+Agent substrate — and that AI does not fork the damage pipeline.

Given a high-level AI goal change, the design path writes continuous blackboard desirability scores and soft-selects with hysteresis inside Logic Driver — not a boolean-only outer brain that only teleports LD into named states.

Solo map has no Raid marker, no Vault marker, and no Daily / Weekly / Hard Objective rows or pips on Local Map or World Map. Online Local Map and World Map list a dummy Daily / Weekly / Hard Objective; Tasks filter is on both; Set as Primary can track from either. Online map shows RAID pip 2/4/8. Two Online players at different levels in an open-world volume both receive XP; monster level handling matches the locked rule or the explicit TBD-027 note in the build changelog — never an undocumented party average.

Operative on a planetary surface holds Tab: W_TFA_LocalMap opens centered on player. Player selects an extraction terminal object in the left Missions & Objects drawer and clicks [Set as Primary]. Player presses Tab: view smoothly transitions to W_TFA_WorldMap. Online: Operations still lists Daily / Weekly / Hard; Tasks filter works; globe shows amber task diamonds; [Set as Primary] on a Daily tracks FE30. If LastMatchRecap is set, Last match sits above Operations on both maps and opens frozen Results (FS-MCH-003). Solo: World Map has none of those rows, no Tasks filter, no task diamonds, no Last match. Player presses Tab again: transitions back to W_TFA_LocalMap. Player presses Esc: returns to gameplay. Visor ships FE30: quiet gold pip on the terminal (off the reticle), gold pip on the heading tape, gold diamond on the tracker. Tapping Tab or M reveals name + meters + elevation for 4 s beside the world pip — not on the reticle. When facing away, the world pip hides; tape + tracker remain; only a tiny rim tick. FE28 (pip only) and FE29 (tape as heading cue) are secondary options, not the acceptance default. FE26 nameplate-on-reticle fails this test.


Frame sockets own muzzle, mag eject, ADS optic offset. Singularity bursts are grounded radial Niagara + Kinetic impulse. Vision modes are post-process first; Niagara is extra (Heat bloom, Motion trails, Sonar ping).

  • FPP arms and TPP body are both driven; melee equipped hides FPP arms.
  • Vault: random clip, shared notify windows (AnimNotify_VaultApex).
  • Melee Drive: Motion Warping to a point along stick, not to an actor homing target.
  • 2H and dual stances use dedicated anim layers (Lyra-style link layers).

Dea comms = voice + subtitle. Ultimate flame-on at 100% has a sting. Flow Overclocked and Singularity have distinct stings. Options expose master / music / SFX / dialogue (FE spec).

Light / Medium / Heavy change plates only. Underarmor, joints, and visible body scale stay that character’s size (Create Character sex + appearance). Corps C1–C5 are finishes on the same envelopes.

FS-MESH-001 — Mesh attach naming (Full game)

Section titled “FS-MESH-001 — Mesh attach naming (Full game)”

Not Demo — Demo stays placeholders + fake-modular dials. Full cheat sheet + stub alias table: docs/inventory/mesh-naming.md. Product stack: FS-APP-002. Guns: FS-GUN-004 / FS-GUN-006. Armor weight: FS-FX-004.

Grammar

{domain}_{role}_{slot}[_{host}][_{corp}_{auth}_{id}]
Token Values
domain a armor · w weapon
role socket · spine · receiver · module · plate · under · flare
slot Armor: helm chest gloves belt boots scapula_l … · Guns: barrel barreltip mag optic counterweight stock brace grip frontgrip underlug + keyed · Melee: head guard haft pommel core + family aliases
host Meshes only — guns Class/share + Receiver when keyed; armor mass light med heavy
corp Meshes only — c1…c5
auth Meshes only — kit | hand
id kit → v1…v5 · hand → stable slug

Rules

  • Sockets never encode corp/auth (a_socket_chest, w_socket_barrel). Meshes do (a_plate_chest_heavy_c3_kit_v1, w_module_barrel_kinetic_c1_kit_v3).
  • Armor corp = mesh language (different silhouettes, same sockets). Gun modular corp = finish family on shared kit geometry.
  • hand = Legendary / Unique / Apex (outside Refit five-packs).
  • Bone name = Soft Object Path stem.
  • Legacy a_<slot> / a_<slot>_armor → a_socket_<slot> / a_plate_<slot>_….

Attach order (guns): Spine → Receiver → Barrel (+ tip) → Mag / Optic|Counterweight / Stock|Brace / Grip / FrontGrip|Underlug.
Attach order (melee): Spine → Head → Guard → Haft → Pommel → Core. Wrist Razors/Claws = Wrist Melee slot only (hotkey 1) — same five parent sockets; not a Weapon 1–4 family.

Author a Rifle Auto kit: sockets have no c#; module Soft Object Paths include c1…c5 + kit/hand. Equip Heavy chest plate: a_plate_chest_heavy_* swaps; a_socket_chest name unchanged; underarmor scale unchanged (FS-FX-004).


Online path requires an EOS Product User ID (PUID). Username / password (TFA if enabled) and Continue with Discord (FS-ID-001–FS-ID-005) both produce that PUID. Store login for Marketplace does not move a Solo character into the Online pool. FE spec owns the screens.

Stance tag, vitality, Flow combo (server), active vision (cosmetic; server may ignore for gameplay reveals that must be anti-cheat authoritative — TBD-028), equipped item IDs, ActiveSetIDs (Name array; server-validated against ASBP — FS-ITM-004), Ultimate charge, Energy, grenade charges.

Equipped Set piece counts are server-derived from equipped Unique / Apex SetID fields; threshold power applies only for IDs in ActiveSetIDs under ASBP (FS-ITM-004). Do not replicate chip Set tags as membership. Legendary has no Artifact socket.

Do not replicate full bag contents to other clients. Other players see cosmetics + stance + IFF. Do not replicate Credits, BTUCOIN, or LUMENAR balances to other clients. Player chat (FS-HUD-010) is server-routed by channel: fireteam members, online clan members, match activity roster, current instance, proximity set, or whisper target.

Same gunfeel baseline. Strip or cap affix deltas. Frames remain readable. Crit % off.

Matchmaking by activity size 2 / 4 / 8. That is instance size, not the Social fireteam cap. A fireteam may hold 8; a story coop instance still caps at 4. Set monster level. Campaign-complete Online characters use the endgame hub. Solo characters cannot enter these instances.

Command Deck tab Social (W_TFA_Social). Replaces Clan on the bar. Panes: Fireteam, Clan, Friends, Discord. Fireteam pane lists everyone else in the current instance with a row Invite. Clan pane lists the full roster and keeps clan org invites. Friends pane lists EOS Friends. Favorites (FS-SOC-008) on Clan and Friends. Solo: tab visible and locked — “Social is Online only.” Online overlay; does not pause (FS-SES-005). Character screen I still has no social tabs.

Session group. Cap 8. Distinct from ClanId. Online in-world starts as a fireteam of 1. Leader invites and removes. Mixed clans allowed. Accepting a fireteam invite or Joining leaves the previous fireteam. Leader leave: oldest remaining member becomes leader. Fireteam invites are session-scoped and die if that fireteam dissolves. Privacy: FS-SOC-005.

Persistent. Create only if ClanId is empty. One clan at a time. Server-authoritative; fail closed. Founder / leader invites and kicks. Reset Campaign keeps membership. Leave (confirm) before creating another. Roster is the full member list (online and offline) on this pane. Clan org invite sheet stays here. Row Invite is a fireteam Send to that member (FS-SOC-004), not a clan org invite. Favorites: FS-SOC-008. Roster cap and extra ranks: TBD-031. Solo cannot create or join.

OAuth-link Discord to the live EOS PUID (FS-ID-004 scenario C / EOS_Connect_LinkAccount). Not a second game account. Not voice. Not a friends list. Cold login from the EOS screen is FS-ID-004 A/B (EOS_Connect_Login / CreateUser).

Game server issues clan and fireteam invite tokens. W_TFA_InviteSheet has one Send. Row Invite on Instance, Friends, and Clan roster is the same fireteam Send, pre-filled to that PUID. Fireteam Send lands only if the target’s Accept fireteam invites from includes the sender (FS-SOC-005); then Accept is automatic. That press also delivers on Discord if sender and target are linked. Discord miss does not fail Send. Unlinked sender: in-game still lands when Accept allows it. Clan org invites ignore fireteam privacy. Accept for clan org is always in Terra Firma. Discord deep link opens the game / EOS session; fireteam follows privacy, clan org presents Accept. Invite expiry: TBD-032. Fail closed: Solo, fireteam at 8, already in that clan, target not in the Online pool, target Accept excludes you, target offline (fireteam Invite). Do not ship a second Discord-only send.

Settings → Social (W_TFA_Settings / UTFAGameSettingRegistry). Same Options screen. Online only. Solo: tab visible, rows locked.

Setting Options Server rule
Accept fireteam invites from Anyone / Friends or clan / Friends / Clan / Nobody Send to this PUID fails closed outside the set. Inside: auto-accept. Clan = same ClanId on the live character. Friends = EOS Friends on this PUID.
Who can join my fireteam Invite only / Friends or clan / Friends / Clan / Anyone Eligible players Join without an invite while roster < 8. Invite only = no Join. Leader may still kick.

Default for the HAVOC example: both Friends or clan. Per PUID. Clan check uses current character ClanId. Discord friends are not this list.

W_TFA_Friends. EOS Friends on this PUID. Full list on the pane. Add / remove by Online display name / EOS. Not Discord. Not voice. Not a second account. Used as the Friends set for FS-SOC-005. Each online friend has row Invite (fireteam Send). Offline: no fireteam Invite. Favorites: FS-SOC-008. In-game text chat is OmniVisor FS-HUD-010, not this pane.

Fireteam pane section In this instance (W_TFA_InstanceList). Lists every other Online player in the current instance (hub, story, RAID, Vault). Omits you. Already on your fireteam: On fireteam, no Invite. Everyone else: row Invite (same Send as FS-SOC-004). Row Report opens W_TFA_Report (FS-TRS-002). Ghost spectators are omitted. No favorite control on this list — star lives on Clan and Friends. Not a friends list. Not Discord. Empty instance besides you: show the empty state, keep the fireteam slots.

Per PUID, not per character. One favorite flag per target PUID. Clan roster and Friends list share that flag. Toggle is a diamond on the row. Favorites sort first, then this instance, then online, then name. Persist on the Online account. Reset Campaign keeps favorites. Not a privacy set — Accept / Join still use EOS Friends and ClanId. I-screen has no favorite list.

Online: Social opens Fireteam (1 of 8) with In this instance rows and Invite. Clan shows the full HAVOC roster plus clan org Send. Friends shows the EOS list with Invite. Settings → Social shows Accept / Join. Create clan HAVOC on an empty ClanId. Invite sheet has one Send. Solo: Social shows the locked string; create, invite, Join, favorite writes, and privacy writes are rejected.

Fireteam at 8: further fireteam invites and Joins fail closed. Unlinked Discord: Send still lands in-game when Accept allows it; Discord delivery is skipped, not a failed invite. Accepting a fireteam invite or Joining removes the pawn from the old fireteam. A Discord click with a dead token does not join. Two send buttons on the sheet fails this test.

Ash Cantor (HAVOC): Accept = Friends or clan, Join = Friends or clan. A clanmate Joins without Send. A stranger Send fails closed. Invite only: Join is hidden / rejected. Nobody: all fireteam Sends fail closed; clan org invite still lands. Discord friends who are not EOS Friends do not pass the Friends set.

Online Social, Ash Cantor in HAVOC on Ring Approach. Fireteam pane lists Tess Ward, Juno Pike, Rex Dalton with Invite. Clan pane lists Ash (you), Tess, Mara Voss, Len Sato; Len is offline with no Invite; clan org Send is on the pane. Friends pane lists Tess, Cal Renn, Nia Brooks. Diamond on Tess sorts her first on Clan and Friends. Toggling Tess’s diamond updates both panes. Juno has Invite and no diamond. Offline Nia has no Invite. Row Invite uses the same Send as the sheet. No favorite control on the instance list.

Session-lost screen (FE thin screen). Online inventory mutations fail closed. Solo writes a backup until the next successful save (FE spec).

Two clients in a Raid: both see the same takedown on a shared elite (server Flow). A client cannot socket an Artifact by RPC without server validation.

Command Deck tab Trust (W_TFA_Trust). Online only. Visible when the PUID has a studio or volunteer staff flag. Solo: hidden, or visible and locked. Overlay policy FS-SES-005. Character I has no Trust tab. No CREDITS / BTUCOIN chips on this window. Queue states: New / Watching / Needs studio / Closed. Volunteers cannot open studio-only cases. Web/admin console is later and must use the same case IDs — not required for P9b.

W_TFA_Report. One Send. Open from In this instance Report, from a chat-line Report this player (FS-HUD-010), from a Match Results row click (FS-MCH-001 / FS-MCH-002; RAID / Vault / Ladder only), or optional IFF-pip hold. Target is PUID + character name. Pre-fill match instance ID when opened from Results. Category chips only (combat feel, movement, vision, chat, economy / marketplace, other). Optional last-view clip (TBD-043). Server stamps instance, activity, map, time, reporter, target. Fail closed: Solo, empty target, cooldown (TBD-044), target not Online, self row. Combat / downed may still Send. Reporter sees “Report received.” Never told whether a ghost joined. Frozen recap after the instance is gone still opens this sheet (spectate stays disabled). Do not document exploit steps on the sheet. Do not invent a second report form.

Worker HTTP webhook after the case writes (FS-ARCH-012). Volunteer channel vs studio-only channel (TBD-046). Payload: case ID, category, instance, target display name, deep link. No bags, no Credits / BTUCOIN / LUMENAR, no packet dumps. Discord miss does not drop the case. Discord role alone does not grant spectate — EOS staff flag does.

Server store owned by MonetaryPlatform AntiCheat (case-log hooks). Game Trust UI writes and reads through that API. Merge window for same target + instance is data. Fields: who / what / when / where, report text, clip IDs, cheap-reject counts, spectate join/leave, notes (volunteer vs studio), outcome. Retention TBD-045. Players never read another player’s case. Heuristics and replay never delay damage GEs (FS-ARCH-013).

Spectate RPC places the staff client in that dedicated instance as a ghost. Not a player pawn. Does not consume RAID / Vault 2 / 4 / 8 or fireteam 8. Omitted from instance list, Match Results roster, IFF, chat, fireteam, clan-in-activity. Target is not notified. Full instance relevancy may apply to the ghost; bags and wallets still do not replicate (FS-NET-002). Camera: free fly + Follow (W_TFA_GhostHud). No combat OmniVisor chrome. No loot / damage / interact / spend. Do not SetGamePaused. Instance gone: Spectate disabled, case remains. Leave returns to Trust overlay or hub.

Volunteer: notes + Needs studio only. Studio: kick dumps the target per FS-NET-005; fireteam members stay. Restrict / ban is EOS / Online pool, studio only. Volunteer roster and flag source: TBD-047.

Online staff-flagged PUID: Trust tab lists a new player report; Spectate joins the live instance with no extra player slot; other clients do not see the ghost on In this instance or Match Results. Volunteer Send on Kick is rejected. Studio Kick dumps the target; fireteam remains. Solo: Trust Send / Spectate / Kick fail closed.

W_TFA_MatchResults. Match = RAID 2 / 4 / 8, Vaults, Competitive Ladder only. Hidden in hubs, open world, story coop, Solo. GFP: TFAOnline (snapshot) + TFAFrontend (chrome). Overlay policy FS-SES-005 — LIVE, does not pause, hit does not close it. Not Character I. No CREDITS / BTUCOIN. Ghosts omitted.

Open: Command Deck chip Results while the activity is RAID / Vault / Ladder; also Esc session menu. Visor bind TBD-048 — do not steal Tab (Tab stays Local / World map). Roster: every player pawn in the activity, including you. Ghosts omitted.

Match header (not per row): activity name, RAID / Vault / Ladder tag, size 2 / 4 / 8, duration, outcome copy (TBD-050), completion reason when abnormal, map / sector ID, match instance ID (Trust path only — not on public board).

Team strip when the activity authors teams (FS-MCH-004): team name / side, team score, team standing. Ladder always draws it. RAID / Vault omit when single-outcome.

Row columns (live + frozen): Name; Order (Enforcer / Arcwarden / Phantom); Standing (Ladder + scored activities); Score (hide when activity has no score); Kills; Assists; Deaths; K/D; KDA; Efficiency = (Kills + Assists) ÷ (Deaths + 1); Precision kills; Precision % = precision kills ÷ gun kills (hide when gun kills = 0); Ultimate kills; Peak Flow (1 / Overclocked / Singularity); Time played (seconds present); Completed (Y finished in roster at stamp / N left early). Ladder sorts Standing then Score. K/D / KDA / Efficiency are allowed but never the sole Ladder identity.

Expand row (this match only): gun / melee / tentacle / ordnance / skill kills; Singularity takedowns; Defeats; best kill streak; average life; best weapon Receiver (Type) badge; per-equipped-slot (W1–W4 + Wrist) kills + precision kills + damage dealt; Triumph IDs earned this match; left-early flag; completion reason when Completed = N.

Ladder score panel (expand, not main column): base score, objective bonus, multiplier stack, reward score — server snapshot scoreboardValues; clients do not recompute (FS-MCH-005).

Server-owned; clients display the snapshot. Click another player → W_TFA_Report (FS-TRS-002) pre-filled to that PUID + this match instance ID. No Report on self. Combat / downed can still Send. Disconnect mid-match: row marks left; recap still freezeable for those who finish.

FS-MCH-002 — Freeze + persist last recap

Section titled “FS-MCH-002 — Freeze + persist last recap”

At match end the server stamps the recap: all row columns, header, team strip, expand payloads, and scoreboard values. The same widget freezes. Recap auto-opens once (Close allowed). Continue dumps to the post-activity seat (hub / orbit) per existing disconnect-safe Online rules. Do not SetGamePaused. Report still works on frozen rows after the instance is gone. Frozen payload is stored for LastMatchRecap, Match History (FS-MCH-006), and career rollups (FS-CAR-001).

Persist one LastMatchRecap on the Online character. Overwrite only when the next RAID / Vault / Ladder ends. Starting a new match clears live Results and does not wipe Last match until that new match finishes. Reset Campaign keeps it (FS-SES-003). Solo never has one. Lifetime if they never queue again: TBD-051 (recommended: no TTL; overwrite only on next finished match).

FS-MCH-003 — World / Local Map Last match

Section titled “FS-MCH-003 — World / Local Map Last match”

GFP: TFAFrontend (map chip / open frozen widget). World Map Operations drawer: row Last match (activity name + outcome) opens frozen W_TFA_MatchResults. Same row on Local Map Missions & Objects so the player is not forced into orbit. Filters: not Tasks; row sits above Operations, Online only. Empty LastMatchRecap: no row. Same Report path as FS-MCH-001.

Online RAID / Vault / Ladder: Results overlay opens from Command Deck / Esc; world keeps running; click another player opens W_TFA_Report; self has no Report. Match end freezes the same widget and auto-opens once; Continue does not pause. After return, World Map and Local Map show Last match and open the frozen recap. Starting a new match does not wipe Last match until that match ends. Hub / open world / story coop / Solo: Results chip hidden; no Last match row. Ghost omitted from the roster. Row columns match FS-MCH-001 including Standing, K/D, KDA, Efficiency, Precision %, Time played, Completed; expand row and Ladder score panel per FS-MCH-005.

When DA_TFA_Mission or Ladder rules author teams: draw team strip on W_TFA_MatchResults — team label, team score, team standing. Ladder always. RAID / Vault omit when single shared outcome. GFP: TFAOnline snapshot + TFAFrontend chrome.

Expand-only panel on Ladder recaps: base score, objective bonus, multiplier stack, reward score. Server fields scoreboardValues on the frozen payload. Clients display only. GFP: TFAOnline.

W_TFA_MatchHistory. Online only. Journey → Match History tab and Social → Recent matches shortcut open the same widget. List columns: date/time, activity name + tag, size, outcome, duration, your standing, your score, your K/D. Click row → frozen W_TFA_MatchResults for that instance. Retain at least 50 finished matches per Online character (TBD-053 may raise); oldest drops at cap. Reset Campaign keeps rows (FS-SES-003). Solo: no history widget. GFP: TFAOnline store + TFAFrontend chrome.

When expand row is open, show Triumph IDs earned in that instance only. Lifetime Triumph catalog and counts live in FS-CAR-003. Triumph chips do not open Report.

W_TFA_JourneyCareer. Command Deck Journey → Career. All-time character totals (Online server / Solo local): matches played; wins / losses; time played; kills / assists / deaths; K/D / KDA / Efficiency; precision kills / precision %; ultimate kills; Peak Flow tier counts; best kill streak; average life; gun / melee / tentacle / ordnance / skill kills; Singularity takedowns; Triumphs earned count. Updated when a RAID / Vault / Ladder match freezes (FS-MCH-002). Not live Results. GFP: TFAOnline + TFAFrontend.

W_TFA_CollectionsMastery. Command Deck Collections → Weapons. Per DA_TFA_GunReceiver (Type; Class derived) and DA_TFA_MeleeFamily: career kills, precision kills, assists, damage dealt, time equipped, precision %, matches as primary Receiver / melee family, favorite badge when top career kills. Instance Inspect trackers roll into Receiver / melee-family totals server-side. Not per item hash. Cadence never tracked. GFP: TFAOnline + TFAFrontend.

W_TFA_Triumphs. Journey → Triumphs. Catalog rows: Triumph ID, name, icon, flavor copy, lifetime count, category (match feat, objective, Flow / Singularity, Ladder placement, no-death segment). No power grants unless a future Online task references the ID. GFP: TFAOnline + TFAFrontend.

W_TFA_ModeAggregates. Journey → Modes. Per RAID, Vault, Ladder blocks: matches, wins, kills, deaths, average score when scored, best standing; Ladder also wins / losses, average standing, current season rank snapshot. Open world and story coop do not feed. GFP: TFAOnline.

W_TFA_LadderBoard. Journey → Ladder and read-only on Ladder queue UI. Season or window ID (TBD-054). Rows: place, character name, optional clan tag, score, wins, losses, K/D, Efficiency. Pin viewer row when ranked. Normalized Ladder stats (FS-NET-003). Career window board — not per-match Standing on Results. GFP: TFAOnline + TFAFrontend.

FS-API-001 — Companion Player API product boundary

Section titled “FS-API-001 — Companion Player API product boundary”

Ship a read-only public HTTP API so a separate companion Discord bot, the website BenchMark Leaderboard, and third-party apps can look up Online player info (app-key + component-profile). Not a second career store inside UE. Not the invite-delivery Discord app (FS-SOC-004 / FS-ID-*).

Layer Owns
TFAOnline Authoritative Online career / Match History / Ladder writes (FS-MCH / FS-CAR)
Companion API gateway Read HTTP v1 in front of that store + CDN manifest (Architecture P9c)
Invite Discord Client SDK → EOS_Connect_LinkAccount + invite deep links — different Discord application
Companion Discord bot Separate Discord app; X-API-Key only; slash commands / embeds; no invite Send
MonetaryPlatform AntiCheat Trust / fraud only — not profile stats

Solo pool never appears. Design map: docs/31-companion-player-api.md · docs/superpowers/specs/2026-11-12-companion-player-api-map.md.

Concept Lock
Membership ID EOS PUID
Character ID Online character GUID
Display name Online display name
Discord → PUID GET /v1/memberships/by-discord/{id} when linked (FS-ID-004 C); opaque Discord id only
  • X-API-Key required on every call (studio-registered, revocable).
  • Optional later: player OAuth Bearer for Friends / Private components.
  • Per-key rate limits; display-name search stricter than profile GETs.

FS-API-004 — Profile components (reuse §19 — do not invent stats)

Section titled “FS-API-004 — Profile components (reuse §19 — do not invent stats)”
Component Source Default
Profiles PUID, display name, opaque Discord id, clan tag Public
Characters Name, Order / Faction, level, subclass unlocks Public
CharacterEquipment Equipped cosmetics only (FS-NET-002) Public (lockable)
Career FS-CAR-001 Public (lockable)
CollectionsMastery FS-CAR-002 Public (lockable)
Triumphs FS-CAR-003 Public (lockable)
ModeAggregates FS-CAR-004 Public (lockable)
LadderStanding FS-CAR-005 Public when ranked
MatchHistory / LastMatchRecap FS-MCH-006 / FS-MCH-002 Friends (lockable)

Hard deny: bags / Secure Locker; Credits / BTUCOIN / LUMENAR; marketplace listings; Case / mystery / OV clues; Trust / reports / ghost; chat; Solo; secrets / Discord tokens; others’ fireteam Accept / Join; any write / mutate.

FS-API-005 — HTTP surface (v1 path contract)

Section titled “FS-API-005 — HTTP surface (v1 path contract)”

Host is ops. Path shape is the lock:

  • GET /v1/memberships/search?displayname=
  • GET /v1/memberships/by-discord/{discordUserId}
  • GET /v1/profiles/{puid}?components=
  • GET /v1/profiles/{puid}/characters/{characterId}?components=
  • GET /v1/leaderboards/ladder?season=
  • GET /v1/manifest/{entityType}/{hash}

Locked components → privacy: locked (prefer over bare 404 on an otherwise visible profile).

Settings → Social (same Options as fireteam privacy — FS-SOC-005). Defaults: Career / Equipment / Collections / Triumphs / Modes = Public; Match History = Friends. Ladder standing stays public when ranked. App-key-only callers see Public components; Friends needs player OAuth.

FS-API-007 — Two Discord products (hard split)

Section titled “FS-API-007 — Two Discord products (hard split)”
Invite Discord Companion Discord bot
Discord application Game client / invite delivery Separate app
Purpose Link account + deliver invite deep links /stats, /ladder, profile cards
Auth Discord OAuth → EOS_Connect_LinkAccount Companion API X-API-Key (+ optional player OAuth later)
Writes game state Invite tokens via game server None (read-only)
FS FS-ID-* · FS-SOC-004 FS-API-*

Linked Discord on a PUID enables by-discord membership bridge only — not invite authority.

Out of scope (v1): loadout writes, presence / instance join from the bot, Case / Pre-CF mystery, replacing EOS Friends with Discord friends, building the Discord bot repo itself.

App-key search returns public Characters / Career / Ladder. Match History locked without OAuth under default Friends. Hard deny bags / wallets. Discord-id membership only when linked. Companion Discord application ≠ invite Discord application. Solo PUID never appears in search.

Finish Online Ladder match: Journey Career increments matches and combat totals; Collections Weapons row for the credited Receiver (Type) / melee family updates; Triumph earned in match appears in expand and in Triumphs lifetime count; Match History appends a row; Ladder board updates when season rules say so. Solo RAID has no Results / History / Career Online widgets — local Solo character may still accumulate local career if a future Solo competitive activity authors it (default: no).

FS-TRK-001 — Weapon instance trackers on Inspect

Section titled “FS-TRK-001 — Weapon instance trackers on Inspect”

GDD lock: lock_weapon_trackers.svg. Guns and melee only — not armor, jewelry, shields, Mechanical Arms, or ammo.

W_TFA_Inspect_Trackers is a child strip on W_TFA_Inspect, below the stat plate. Tracks this item instance (item GUID), not career aggregates across all weapons and not Match Results main columns.

Tracker Meaning
Kills Defeats credited to this weapon while equipped / fired
Precision kills Headshot connects with this weapon
Precision % Precision kills ÷ kills when kills > 0
Assists Assist credit while this weapon was active (TBD-052 window)
Damage dealt Server-summed kinetic + elemental damage
Time equipped Seconds this instance was in a loadout slot
Best kill streak Longest uninterrupted defeat chain with this instance

Online: server-owned; replicate to owning client on Inspect open. Solo: local instance store. Trade / mail keeps counts on that instance. Refit preview ghosts stat plate deltas — trackers do not ghost. Dismantle or Apex Invoke break destroys the instance and clears trackers with it.

Match Results expand row may show per-equipped-slot kills + precision kills for that match only (FS-MCH-001). Inspect trackers are lifetime on the item.

GFP: TFACharacterI (presentation) + TFAOnline (Online persistence) / Solo inventory subsystem.

Inspect a gun with prior kills: trackers draw below the stat plate. Refit preview changes stat ghosts; tracker numbers stay fixed until a new kill with that instance. Inspect armor: no tracker strip. Dismantle the gun: instance gone; a new craft of the same Receiver starts at zero. Online: counts survive logout and return on reopen Inspect.


Precision / slide / air / hip / multi-kill flags on kill credit also feed Familiarity XP on that instance (FS-ITM-013) — weighted, soft-capped per minute (anti-farm).

FS-TRK-002 — Armor / jewelry / ES worn-performance trackers

Section titled “FS-TRK-002 — Armor / jewelry / ES worn-performance trackers”

Armor, jewelry, and Energy Shield instances track worn performance while equipped (not kill attribution): combatSeconds, damageMitigated, shieldEvents, parkourCount, abilitySpend, teamUtility, objectiveTicks. These feed Familiarity XP (FS-ITM-013). Dismantle clears. Refit does not reset.

Equip armor into combat: combatSeconds increments; Familiarity XP drips. Holstered armor earns nothing. Dismantle clears trackers + Familiarity.

Create these as Primary Data Assets / tables before content fill. Empty rows are fine; missing types are not.

Asset Purpose
DA_TFA_GunReceiver Keyed Class × Receiver (Type). FireMode, CadenceUnit, DefaultBurst, AA Mag/Stick/Rot/Strafe bands (FS-GUN-008), ReticleFamily, Stance (1H/2H/Handheld2H), ammo brick, accessory socket layout (FS-GUN-004). Gatling has one row per legal Class. Legacy name DA_TFA_GunFamily maps here
DA_TFA_GunFrame Class × Receiver × Frame (Class required when Receiver is multi-Class) or Receiver × Frame: core / specialty dials, cadence number, recoil pattern, Impact / Mag / Range bands (FS-GUN-009), RangeStat 0–100 (FS-GUN-011), allowlist. Must not rewrite FireMode or AA baseline. Salvage key with Class + Receiver + Frame + rarity (FS-CRF-005, FS-GUN-007)
DA_TFA_GunPart Class × Receiver × Socket × Variant (accessory sockets); owned variables; C1–C5 meshes; salvage unlock (FS-CRF-008). Never writes cadence / Fire Mode / AA. Receiver structural finish unlock is separate from accessory Install
DA_TFA_MeleeFamily Family, 1H/2H, attribute scaling
DA_TFA_MeleePart Family × Socket × Variant (Head / Guard / Haft / Weight / Core); C1–C5 meshes; salvage unlock (FS-CRF-008)
DA_TFA_MeleeBase Normal/Exceptional/Elite name triple
DA_TFA_ArmorBase Slot × Light/Med/Heavy triples. Salvage Blueprint key with type + rarity (FS-CRF-005)
DA_TFA_ShieldBase Phys vs Energy (Barrier)
DT_TFA_Affixes Group, prefix/suffix, alvl, illegal stacks
DT_TFA_Gems 11 × 5 × 4
DT_TFA_PhononShards A→Ma
DT_TFA_PhononChords Word, sequence, legal bases
DA_TFA_Artifact Chip power only. Optional flavor Set tag is ignored for piece count.
DA_TFA_LegendaryItem Fixed package. SetID always none. Cook / spawn fail-closed if a row authors one.
DA_TFA_UniqueItem Fixed package. Optional Set ID + piece index. Standalone Unique has none.
DA_TFA_ApexItem Fixed package. Optional Set ID + piece index. May feed Sets. InvokeEligible is instance, not this row.
DA_TFA_Set Set ID, named piece indices, bonus ladders 2 / 3 / 4 / 5 / 6. Catalog fill is data; the type is required.
DA_TFA_AbilityNode Tree, Energy/charge, Customizable tags
DA_TFA_Ordnance Twelve types + three mods
DA_TFA_SingularityBursts Ten varieties
DA_TFA_Subclass Order / Faction / roster T1–T5 / Ultimate seats. Create does not pick a row.
DT_TFA_SubclassUnlock Class level → UnlockedSubclassCount 1–5 (TBD-029). Empty until that lock.
DT_TFA_XPCurve TBD fill
DA_TFA_Mission Part, markers, Solo vs Online delivery. Daily / weekly / hard rows are Online-only and list on Local Map and World Map (FS-CMP-009)
DA_TFA_AIDifficultyProfile Fuzzy curve multipliers + reaction / accuracy / aggression hooks (FS-AI-002). Row semantics differ per product brain (UT2004 ladder = Track A only; area / role = Track B; mission = Track C)
DA_TFA_AIEnemyTier Grunt / Elite / Boss: TTK band, plate size, immunities (FS-WLD-001). Combat data — not LD graphs
DA_TFA_MapSector Sector topology, bounds, fog texture, sub-regions
DA_TFA_SectorObject POI tag, world coordinate, category (Story/POI/Cache/Extract/OnlineTask)
DT_TFA_AmmoCaps Field / Specialist / Siege reserve caps (TBD-040). Not bag stacks
DT_TFA_CryptoPlayGrants Daily / weekly / hard-objective fiat (V) rows (TBD-039); runtime mints (M = V / P). Online only
DA_TFA_CryptoConfig Token display name BTUCOIN, floor fiat (TBD-035), market feed hook, 51/49 split (locked), LUMENAR-per-fiat (R) (TBD-036)
DT_TFA_LumenarCashPacks Marketplace cash → BTUCOIN mint sizing table (fiat (V); TBD-036) — cash never grants LUMENAR directly (FS-ECO-003)
DA_TFA_TrustRole PUID staff flag: volunteer vs studio. Ban power is studio only.
DT_TFA_TrustCase Case store type (reporter, target, instance, category, notes, outcome). Schema may live in TFA Content; authoritative store / API is MonetaryPlatform AntiCheat. Empty rows until fill.
DT_TFA_ItemCombatStats Per item-instance weapon trackers (FS-TRK-001). Keyed by item GUID.
DT_TFA_MatchRecap Frozen match payloads for History + Last match (FS-MCH-002, FS-MCH-006)
DT_TFA_CareerCombat Journey Career + mode aggregate rollups per character (FS-CAR-001, FS-CAR-004)
DT_TFA_WeaponFamilyStats Collections weapon mastery per Receiver (Type) / melee family (FS-CAR-002). Legacy name kept; gun rows key on Receiver
DT_TFA_Triumph Triumph catalog + per-character counts (FS-CAR-003)
DT_TFA_LadderSeason Leaderboard window / season rows (FS-CAR-005, TBD-054)

Not a schedule — a dependency order so systems are not built against missing contracts.

Phase Ships Blocked on
P0 Lyra remap FE (existing spec), character pool, Create Character with no subclass picker (FE17 / FS-PRD-004), empty Earth hub, EOS login + Discord Connect identity (FS-ID) —
P1 Camera director, loadout state machine, movement verbs, OmniVisor chrome + GUI locator (FE30) — TFACombat spine + TFAOmniVisor (Plugify) P0
P2 GAS vitality + kinetic/elemental pipeline + TFAMelee + TFASingularity (Flow climax; Plugify) P1
P3 Gunfeel Firehand Bus + one Receiver × two Frames with distinct cadence (FS-GUN-007) — TFAWeapons (Plugify) P2
P4 Inventory 15 + bags (no ammo tiles) + Inspect + salvage + I-wallet chips P2
P4b Economy ledger: play Credits (vendors, account-shared), Online play BTUCOIN (daily / weekly / hard obj on Local Map and World Map), Marketplace cash → BTUCOIN mint 51/49, Wallet convert BTUCOIN → LUMENAR P4, P0
P5 Trees + Customizable + Mechanical Arms → tentacles + Ordnance P4
P6 Crafting Page on I — Forge fills except doll (FS-GUI-008, OV18); Gear bag hides; bag-space gate; dual scrollbars; typed Frames / Blueprints (FS-CRF-005) + gems / Phonons / Artifacts; Unique / Apex Set ID on the item (FS-ITM-003, FS-ITM-004) P4
P7 Vision modes + Dea comms + Tab Map (Local & World bi-directional + Missions/Objects + Operations drawers; Online tasks on both; Set Primary → GUI locator); TFAAI substrate when Experiences need AI (FS-AI-001) P1
P8 Mission flags + Part 1 slice + Solo vs Online marker split (RAID / VAULT / Online tasks); monster / patrol product brains on TFAAI (MP bots when match Experiences enable) P0, P7
P9 EOS raids / Ladder normalization / Social (fireteam 8, clan, Discord invite delivery) / Match Results live + freeze + Last match (FS-MCH) P2, P8
P9b Trust: player report (including Results row), Discord pager, case log, ghost spectate (FS-TRS) P9
P9c Companion Player API gateway (read memberships / profiles / Ladder / manifest) — FS-API-001–007 P9

Expose as data or leave a ensureMsgf stub. Do not pick silent defaults that become lore.

ID Lock
TBD-001 Area → Difficulty tier + RecommendedLevel (ARL) table rows / transition edge cases (model locked: area-authored — FS-PRD-005 · FS-DMG-009)
TBD-002 Fast travel
TBD-003 Wall Walk hold key — superseded 2026-10-27: Space contextual enter Wall Run. Remaining: default MaxWallDashDistance meters
TBD-004 Ultimate spend binding → locked via combat hotbar slots (FS-INP-001, FS-GUI-005)
TBD-005 Grenade throw binding → locked G (FS-INP-001)
TBD-006 Hold threshold → locked 200 ms on UTFAInputConfig (Demo / lab default; Mod-tunable)
TBD-007 Dodge / Roll stamina or Energy cost
TBD-008 PvP global scalar
TBD-009 Tentacle mirror vs crit step
TBD-010 Mechanical Arms damage coefficient
TBD-011 Energy pickup form
TBD-012 Aether Sight vs Spiritus Sight name
TBD-013 Combat hotbar slot count → locked 6 (Q/E/Z/X/C/F); V stays Vision
TBD-014 Done — Frame × Receiver Impact / Mag / Range qualitative bands locked in FS-GUN-009 (2026-10-20). Float map → TBD-IMR-FLOAT
TBD-AA-FLOAT Map AA Mag/Stick/Rot/Strafe bands → engine floats
TBD-IMR-FLOAT Map Impact / Mag bands → numeric frame kit values. Range closed by FS-GUN-011 + docs/inventory/weapon-range-falloff.md
TBD-015 Support Frame ally-heal rules
TBD-016 Named Ultimates per subclass
TBD-017 Level cap, XP curve, task vs kill XP
TBD-018 Stat points per level
TBD-019 Stat respec
TBD-020 Skill points per level
TBD-021 Combat node lists per subclass
TBD-022 Tentacle Set 1 / 2 / 3 levels
TBD-023 Fission Cap Siege-brick cook
TBD-024 Customizable tag → Ultimate modifiers
TBD-025 Artifact socket material cost
TBD-026 Campaign grant vs baseline-kit tutorial per verb
TBD-027 Coop fairness for per-player monster level
TBD-028 Vision-mode anti-cheat authority. TFAVision GFP: server owns unlock + relevancy; client overlay is presentation only (§2.4, §2.5)
TBD-029 Character levels that open subclass T1–T5 in roster order (DT_TFA_SubclassUnlock)
TBD-030 Apex Invoke Power break chance (after a successful class grant)
TBD-031 Clan roster cap and extra ranks (founder / leader is enough to ship invites)
TBD-032 Clan and fireteam invite expiry
TBD-033 Chat message limit (there is a limit; number is TBA), flood rate, and gamepad chat binds
TBD-034 Closed: crypto token display name = BTUCOIN
TBD-035 BTUCOIN floor price (fiat). Settlement (P) = max(floor, free market). Shared by mint sizing and convert
TBD-036 Cash-pack fiat values (V) (FS-ECO-003); LUMENAR-per-fiat (R) for convert. Mint amount is (M = V / P), not a fixed BTU count
TBD-037 Credit reward table: stash, trash, elite, boss, side mission
TBD-038 Legal / custody / listing path for BTUCOIN on a PoS hybrid (GDD BTUCOIN — PoS Hybrid · FS-ECO-013). Year 1 ships studio ledger + price feed until this lands. Sub-TBDs: TBD-038-A min withdraw · TBD-038-B withdraw delay · TBD-038-C deposit confirmations · TBD-038-D stake inflation table · host chain choice
TBD-039 Play BTUCOIN grant table as fiat (V) per daily / weekly / hard objective (not fixed BTU counts). (M = V / P) at settlement. Hard Objective catalog. Online-only. Live on Local Map and World Map (Tasks filter) plus world markers. Do not invent a board
TBD-040 Field / Specialist / Siege reserve caps. Ammo never a bag tile (FS-AMMO-001)
TBD-041 Lag-compensation rewind window (ms of pose history) for hitscan and Melee Drive auth (FS-ARCH-013). Past the window = miss, not a teleport kill
TBD-042 Well Tap + Dual Stack Cells counts per Bore (next well index). Lab floor 1 Well Tap + 8 Cells × next well
TBD-043 Reporter last-view clip length (seconds) attached to a Trust report
TBD-044 Per-target per-instance player-report cooldown
TBD-045 Trust case log retention
TBD-046 Discord volunteer vs studio Trust channel mapping (pager only; not in-game chat)
TBD-047 Volunteer roster source / how the EOS staff flag is granted and revoked
TBD-048 Match Results visor shortcut bind. Do not steal Tab
TBD-049 Match Results live/frozen row stat columns beyond Name and Order. Do not invent K/D as the sole Ladder identity
TBD-050 Match-end outcome strings (win / fail / extract and activity copy)
TBD-051 Last match lifetime if they never queue again. Recommended: no TTL; overwrite only on next finished RAID / Vault / Ladder
TBD-052 Assist credit window for Match Results Assists, weapon-instance Assist tracker, and family mastery assists (FS-MCH-001, FS-TRK-001, FS-CAR-002)
TBD-053 Match History retention cap per Online character (minimum 50)
TBD-054 Ladder leaderboard season / rolling window ID and refresh rules
TBD-055 Formal CF / Founding Club entitlement string table (title_*, fx_*, mat_*, prop_*, club_*, hangar / nameplate / emote / decal ids). Working names locked in GDD founding-clubs-cf-cosmetics; do not invent ids in C++ (FS-ECO-012)
TBD-056 Kinetic Flow damage-break without freeflow Block — when a hit dumps Flow to Tier 1 (Health-only vs Shield/Armor forgiven vs Health damage budget vs soft decay / combo-armor). Interim: any damage. Spec: docs/superpowers/specs/2026-10-26-singularity-one-flow-two-verbs-design.md (FS-CMB-004)
TBD-072 Closed: Year 1 ships ASBP=6 multi-active Sets (ActiveSetIDs[]; worn unlimited; cost = equipped count; refuse <2; independent ladders). No single-Set Year-1 clamp. FS-ITM-004 · FS-GUI-010

Also still TBD in GDD (track, do not fill): WSM / Def / block % / ES bands, grenade throw feel, multiclass UI, New Game+ vs Reset Campaign relationship on Solo (Reset is locked; NG+ is story-doc only).


23. Acceptance pack (playable vertical slice)

Section titled “23. Acceptance pack (playable vertical slice)”

A P3 slice is accepted when all of the following pass on PIE and a packaged Solo build:

  1. AC-SES-001 / AC-SES-002 / AC-SES-003 / AC-ID-001 / AC-ID-002 / AC-ID-003 — Solo pool persists; invisible to Online select. Create has no subclass picker; new slot is main class only (UnlockedSubclassCount = 0). Online Command Deck does not pause the world; Solo Deck does. Discord Continue uses EOS Connect; Social link uses LinkAccount on the live PUID. Stay signed in silent-logs in; Log Out clears persist; Discord AccessToken is never written to disk.
  2. AC-CAM-001 — Gun FPP, melee TPP, Shift-Out 0.2 s, no ADS/Shift-Out with Phys Shield in-hand, Phonons do not move the camera.
  3. AC-INP-001 / AC-MOV-001 — Four mobility verbs, non-overlapping.
  4. AC-LOD-001 — Full 1–7 stance matrix + 2H lockouts + no ADS with Phys Shield in-hand.
  5. AC-CMB-001 — Flow 30 → grounded TPP storm → reset; damage-break resets Flow per interim any-damage until TBD-056 locks.
  6. AC-DMG-001 — Pipeline unit tests; Story crit absent under Ladder.
  7. AC-HUD-001 / AC-HUD-002 / AC-AMMO-001 — Visor seats match OV lock; no 1–7 strip; no XP bar. Ammo bricks fill the reserve counter, never the bag. Online chat: Enter / Tab / Shift+Enter per FS-HUD-010.
  8. AC-GUN-001 / AC-GUN-002 / AC-GUN-003 — Part deltas vs AA baseline; Ladder flattens affixes. Fire Mode + AA on Receiver (FS-GUN-008); cadence number is Receiver × Frame; Class derived from Receiver; parts never change Fire Mode / RPM / charge / draw / AA.
  9. AC-GUI-001 / AC-GUI-003 / AC-ECO-001 — I-screen persistence + dismantle chip return. Forge maximize is OV18 (fills except doll; Gear bag hides; occupancy; dual scrollbars). Credits + BTUCOIN are two non-overlapping title-bar chips across tabs. Gear bag has no ammo.
  10. AC-PRG-001 / AC-PRG-002 / AC-PRG-003 — Arms gate, Energy vs Ordnance charges, grenades out of dock. Subclasses open T1→T5 in roster order from TBD-029; create never writes a starting subclass. World-found Apex Invoke grants missing classes at highest class level with equal Combat points, then TBD-030 break. Crafted Apex cannot Invoke.
  11. AC-ITM-001 / AC-ITM-002 / AC-CRF-001 / AC-CRF-002 / AC-CRF-007 / AC-CRF-008 / AC-CRF-009 / AC-CRF-010 / AC-GUI-003 / AC-ECO-002 / AC-ECO-003 — Quality socket rules; Legendary never a Set piece; Unique / Apex Set ID on the item, not the chip; Crafting is a station; Frames / Blueprints stack only same Receiver (or melee family) + rarity; Rewrite on Inspect (Reroll / Change / Etch); Bore on Inspect (Well Tap, cap 6); Forge catalog search + Armor / Weapons + Ranged / Melee + rarity; Forge fills except doll (OV18), Gear bag hides, Forge needs empty Gear slots, mat rail and recipe list each scroll. Marketplace cash → BTUCOIN mint 51/49 (no direct LUMENAR); every BTUCOIN mint 51/49 (including daily / weekly / hard objectives); Wallet convert BTUCOIN → LUMENAR; Marketplace spend is LUMENAR only.
  12. AC-VIS-001 — Seven modes, readable chrome.
  13. AC-CMP-001 / AC-CMP-002 / AC-ECO-003 — Marker split Solo / Online (no Raid / Vault / Online tasks on Solo); Local ↔ World Map Tab toggle; Daily / Weekly / Hard + Tasks filter on both maps; Set Primary from either including a dummy Online Daily; FE30 GUI locator (pip + tape + tracker); Tap Tab / M ping 4 s; off-FOV is tape + tracker + rim tick. FE28 / FE29 are secondary options. FE26 fails.
  14. AC-NET-001 — Server-authoritative sockets in a listen-server smoke (can wait for P9).
  15. AC-SOC-001 / AC-SOC-002 / AC-SOC-003 / AC-SOC-004 — Social replaces Clan on the Deck. Fireteam cap 8. Instance list + Friends + Clan roster. Row Invite. Favorites on Clan and Friends. One Send. Fireteam privacy (Accept / Join) is Settings → Social. Friends are EOS Friends, not Discord. Solo Social stays locked.
  16. AC-TRS-001 — Staff Trust overlay + ghost spectate (can wait for P9b). Volunteer cannot Kick. Studio Kick dumps the target. Solo Trust fail-closed.
  17. AC-MCH-001 — RAID / Vault / Ladder Results overlay live + freeze + Last match on World / Local Map; Report from a Results row (can wait for P9). Hidden hub / open world / story coop / Solo.

GDD Spec
1b Hybrid Perspective / vol. 02 §4, §5, §8
Movement H7 §6
Weapon loadout O10c §7
Damage bible vol. 03 §9
Vision H8 / OV9 §10
OmniVisor vol. 15 §11, §13
Character I Forge maximize (OV18) FS-GUI-008, FS-CRF-001, FS-CRF-003, AC-GUI-003, AC-CRF-010
Gunfeel / AA vol. 02 / 05 §12
Gun Receiver × Frame cadence + Fire Mode / AA (G2–G5) FS-GUN-004, FS-GUN-007, FS-GUN-008, DA_TFA_GunFrame / DA_TFA_GunReceiver
Character level vol. 16 §14
Trees vol. 11 §14
Orders / Factions / Subclasses vol. 10 / GDD §5b FS-PRD-004, FS-SES-006, FS-PRG-004, FS-PRG-009. Create = main class; subclasses unlock T1→T5. World-found Apex Invoke grants missing classes; crafted Apex cannot Invoke.
Affix / gems / Phonons vol. 04 / 08 §15–16
Legendary vs Unique Sets (HTML GDD lock) FS-ITM-003, FS-ITM-004, FS-GUI-003, FS-GUI-004, AC-ITM-002, DA_TFA_LegendaryItem / UniqueItem / ApexItem / Set
Marketplace Economy (Credits + BTUCOIN + LUMENAR) FS-PRD-007, FS-ECO, FE spec §11
Founding Clubs & CF Cosmetics — In-Game FS-PRD-006, FS-ECO-012, AC-ECO-005, Architecture Map §7
Modes vol. 07 + FE spec §1, §3, §19
Story progression doc §17
Five corps vol. 09 §12, §18
Front-End UI FE spec (not duplicated)
Online Trust & Safety (HTML GDD) FS-TRS, FS-TRS-002 report open paths
Online Match Results (HTML GDD) FS-MCH, FS-TRS-002 Results → Report
Online Match History (HTML GDD) FS-MCH-006
Command Deck Career Records (HTML GDD) FS-CAR-001–005, AC-CAR-001
Character I weapon trackers (HTML GDD) FS-TRK-001, FS-GUI-004, DT_TFA_ItemCombatStats
Secure Locker hub (HTML GDD) FS-GUI-009, FS-ECO-014, AC-GUI-004
Item footprints / bag grids (HTML GDD) FS-GUI-010, FS-AMMO-001
In-game Chat (HTML GDD) FS-HUD-010, AC-HUD-002

Terra Firma: Awakening — Functional Specification. Unreal Engine 5. Design numbers live in data sheets; this file locks behavior.