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 rawrating, thetotal(rating plus every bonus instance granted by linked stunts and extras), the total's name on the Ladder, and asourcesline listing each bonus with its circumstance. The raw value is what the player edits; the total is what everyone reads. refreshisbaseRefreshminus 1 per stunt past three, floored at 1. Link a fourth stunt and it drops by itself.stressBoxesis the FAE track: exactly three boxes worth 1, 2, and 3 shifts, read from the checked flags instressState(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.skillBonusListis the aggregation underneath: it flat-mapsskillBonusesout of every linked stunt and extra. Write a stunt with askillBonusesentry (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.