Builder's Manual · Chapter 2

How the Character Sheet Thinks

The character schema has one design rule: store what the player decided; derive everything else.

A character file stores its aspects (as references), its approach ratings in skillRatings, its linked stunts and extras, its current fatePoints, and its stress state — which boxes are checked. Everything else is a computed field:

  • The approach block (schema field skills, a Core-era name the UI retitles "Approaches") is the whole visible list, built by expression: for each of the six approaches — careful, clever, flashy, forceful, quick, sneaky — the raw rating, the total (rating plus every bonus instance granted by linked stunts and extras), the total's name on the Ladder, and a sources line listing each bonus with its circumstance. The raw value is what the player edits; the total is what everyone reads.
  • refresh is baseRefresh minus 1 per stunt past three, floored at 1. Link a fourth stunt and it drops by itself.
  • stressBoxes is the FAE track: exactly three boxes worth 1, 2, and 3 shifts, read from the checked flags in stressState (box1, box2, box3). One track for everyone — physical and mental harm both draw on it. Nothing derives from approach ratings; there is no Physique or Will anymore.
  • skillBonusList is the aggregation underneath: it flat-maps skillBonuses out of every linked stunt and extra. Write a stunt with a skillBonuses entry (approach, bonus, label, circumstance) and every holder's sheet updates with the bonus attributed by name.

Storing a derivable number is the classic way these systems rot: two fields disagree and nobody knows which one lied. Here the stored values are the single source of truth, and a rules change is a one-expression edit that updates every sheet in the project at once.

References, not copies

An aspect on a sheet is the Aspect file — highConcept and trouble are references, and free invokes live on the aspect's own freeInvokes field, where every invoker can see them. The mirror rule: per-character state lives on the character, never on the shared record. Stunts and approaches are shared; which stress boxes are checked (stressState) and which consequence fills which slot (mildConsequence, moderateConsequence, severeConsequence) belong to the character alone. Consequences are files because they are aspects — created when the hit lands, linked on the slot, recovered on their own recoveryStatus clock.

Where the skill files went

The old Fate Core build stored an eighteen-skill list, each skill a file with a four-action description, and sized the sheet's stress tracks off Physique and Will. FAE replaces the whole list with six approaches. Those six files live in Approaches/, each still describing how the approach reads on the four actions (what it can overcome, what it can attack, and so on) — but the character schema keys ratings by approach name only, so there is no pyramid, no 20-point budget, and no per-skill stress thresholds to maintain.

Changing the schema

Schema edits push with craft push --include-types, which validates the new schema against every existing file of that type — run craft check first. When you add a mechanic, the order of preference is: a computed field, if it is arithmetic on existing data; a stored field, only for a genuinely new player decision; and never a second copy of something derivable. One hard-won rule: give every numeric stepper field a maximum — the app's stepper control misrenders without one.

Manual updated Aug 8, 2026.