Standing Constraint — Applies to Every Deliverable
Hard diegetic information. All information presented to the player in Milestone 1 must be information the head of the family would plausibly have at that time, delivered as they would receive it — through a steward's briefing, a letter, a ledger entry, or a servant's report. No mechanical labels, score readouts, or system names are ever shown to the player. Qualitative language in ordinary English sentences is the default. Ledger documents (coin totals, grain quantities, troop counts) are acceptable where a real document of that type would contain numbers.
Summary layer first. The primary information delivery mechanism is a prose summary — a steward's or secretary's briefing assembled each turn. Ledger detail is available on request where additional clarity is needed. Raw documents do not appear unsolicited.
Implementation Notes — Cross-Cutting, This Session
Model for the rewrite now. M1 prototypes in Python for fast iteration; the plan is a Haskell rewrite once the design validates. Write the M1 model so the rewrite is translation, not redesign: frozen records + pure functions — a tick takes state in and returns new state, no in-place mutation. At ~500 people the copying is free. Use str in Python but think Text (never String/[Char]) for the Haskell side. A "set of X" is almost always a list, not a set — scores change every tick, so the elements aren't frozen/hashable.
IDs are monotonic and never reused. The diffusion log points at the dead — that is its whole purpose — so recycling a dead node's id silently corrupts every log entry and derived obligation that referenced it. Full nodes draw from one ever-increasing counter (Int32, not Int16 — the battle tier spikes the count sixfold and would exhaust 16 bits across a generation). Combatant/scratch nodes are weather: nothing logs against them, so they may live in a separate reusable pool.
Store narrow, compute wide. Persist scores/magnitudes as integers; promote to float for any decay, diffusion weight, or feedback-loop integration, then write back. Integer-only decay rounds small forces to zero and the loop sits dead. This rule recurs on every quantity that moves over time.
Two shared primitives surfaced — build each once, feed both. (1) A decay/relaxation primitive: a value relaxing toward a set-point at a strength-driven rate — used by bond drift, element stabilisation (toward natal), and mitigation hold-off. (2) A saturation/brake primitive: a positive-feedback ceiling with falloff near the cap — used by element runaway, drive-weight reinforcement, and bond cap-vs-drift. Writing either curve twice guarantees they disagree.
The graph owns edges; adjacency is derived. Edges live in one canonical store, not denormalised onto the Person. Fast neighbour access is an adjacency: dict[NodeId, list[EdgeKey]] index computed from that store and rebuilt as a pure function of it — correct by construction, never a second home to keep in sync. No pointers/addresses on the Person; a NodeId looked up in the graph is the access.
Group 1 — Foundation · Data Model & World State
Nothing else can be built until these exist. No player-facing output at this stage.
Description
The data structure that represents a single character — the atomic unit of the simulation. Every person in the world is a node. This schema defines what a node knows about itself: identity, family membership, house affiliation, age, health, current role, its elemental temperament, and the hooks that other systems (bonds, drives, events) attach to. Elemental temperament is stored as six independent magnitudes (Salt, Yeast, Desert, Lake, Stars, Moon), each carrying a natal value (set at birth, immutable — the "born a Cancer" fact) and an expressed value (the live, operative number the drive evaluator reads). Six independent magnitudes, not three signed axes: one signed number per axis cannot tell the chasm-straddler (high on both poles) from the indifferent (zero), and the cosmology says those are different people. The schema also carries a node tier — a full graph node versus a lightweight combatant node spawned for a battle and culled afterward — and admits non-person node classes: faction pseudo-nodes, and idea-nodes (totemic / Jinn-class targets that carry a signature rather than a definition).
Acceptance Criteria
- A character can be instantiated with a unique identity, family name, house affiliation, age, sex, and role.
- The schema supports at minimum: lay characters, saints (with expanded eusebia channels), and the player-character (head of house).
- Characters can be flagged as alive, dead, exiled, or imprisoned without breaking other systems.
- The schema distinguishes node tiers: full nodes carried in the relationship graph, and lightweight combatant/scratch nodes spawned for a battle and culled when it ends — with a defined (if deferred) path to promote a scratch node into a full node.
- Non-person node classes are supported: faction pseudo-nodes, and idea-nodes that hold a signature (a borrowed drive-stack plus bond-disposition) and can be the target of drives and bonds like any other node.
- Elemental temperament is stored as six independent magnitudes, each a (natal, expressed) pair: natal is written once at instantiation and never mutated; expressed is the value other systems read and update. The representation can express a straddler (both poles of an axis high at once) and distinguish it from indifference (both low).
- The data model can be serialised and loaded without data loss.
Implementation Note
- Person is a record, not an array:
name: str, id: Int32 (monotonic, never reused), elements: dict[Element, (natal, expressed)], relationships: list[Relationship], drives: list[Drive], plus tier/status flags. Frozen; ticks return a new Person.
- The hexagram topology (who opposes/triangulates/agrees with whom) is world-constant — one shared table, never copied onto the 500 records. A magnitude means nothing until read against it, the same way a bond score means nothing until read against the graph.
- Expressed elements are operative: they are an input to the drive evaluator (D-04), and they move under the temperament loops (D-04b). Natal is the fixed set-point those loops relax toward — keep it truly immutable or the restoring force has nothing to aim at.
Description
The directed graph that connects character nodes. Each edge holds one of four bond types (eusebia, agape, philos, eros), a signed score, a floor, and a ceiling. A pair of characters may hold multiple edge types simultaneously. Saints hold four distinct eusebia edges (superior, inducer, lineage, family) scored independently.
Acceptance Criteria
- Edges can be created, read, updated, and removed between any two character nodes.
- Each edge stores: type (one of four), current score on a signed 8-bit scale (−128…127), floor and ceiling as their own independent fields (not folded into the type), and last-modified turn.
- Score cannot move below floor or above ceiling without an explicit system call that also updates the floor or ceiling.
- Score is stored narrow (integer) but promoted to floating point for any decay or diffusion calculation, with the result written back — integer-only decay produces chunky, untrue curves.
- Saint eusebia channels are stored as four distinct edges to four distinct target nodes, not as a single aggregated value.
- The graph can be serialised and loaded without data loss.
Resolved Decision
- B-05: bond score is a signed 8-bit value (−128…127). The range is internal-only and chosen for cheapness — the player never sees the number, so the scale is pure convenience. Floor and ceiling are separate fields; history moves them inside the range. Store narrow, compute wide.
- Still open — cap vs. drift: does a relationship plateau at its ceiling, or drift slowly upward forever? Chained to turn cadence (B-03): at weekly ticks many small nudges accumulate, so this decides whether int8 has enough headroom. This is now known to be one instance of the shared saturation/brake primitive (see D-04b) — the same question asked of element runaway and drive-weight reinforcement. Solve the primitive once; this falls out. Not blocking the schema — build the brake hook even if you default it.
Implementation Note
- Edge record:
Relationship{ type: BondType, target: NodeId, score: int8, floor: int8, ceiling: int8, last_modified: turn }. Floor and ceiling are their own fields, not encoded in the type. A pair may hold several edges of different types at once; saints hold four distinct eusebia edges to four distinct targets.
- The graph is the canonical home for edges. Store each directed edge once; derive the reverse view and the per-node adjacency index from it. Do not also hang the edge list on the Person as truth — two homes drift, and there is no compiler to catch the miss.
- Edge decay uses the shared decay/relaxation primitive (relax toward a set-point at a strength-driven rate), computed in float off the narrow stored score. Build that primitive here, reusably — element stabilisation and mitigation hold-off (D-04b) will call the same curve.
- Negative valence is a negative score on an existing edge (a resented debt, an exploitative philos), never a fifth edge type.
Description
The container that holds everything outside individual characters: noble houses (with their member rosters, reputations, and titles), holdings (land, Jinn relationship state, productivity, security), faction records (orders and secular groups as graph participants), and the calendar that advances the simulation turn by turn.
Acceptance Criteria
- A house record holds: name, member list, titles held, treasury value, and reputation (stored as a text descriptor, not a score — e.g. "well-regarded in the north").
- A holding record holds: name, controlling house, material productivity value, Jinn relationship state (text descriptor), security state, and trade connection list.
- The calendar advances on a sub-weekly internal tick but surfaces to the player on a weekly briefing cycle; stretches in which nothing worth reporting occurs are auto-compressed rather than stepped through one tick at a time. It tracks the current tick, the current week, and the year (a year being no fewer than its number of weeks); no specific historical calendar is locked.
- Time compression is a first-class mechanic, not a convenience: generational play spans thousands of weeks (≈60 years ≈ 3,000 weeks), and the auto-skip of quiet stretches is what keeps a dynasty playable. It is built in from the start, not retrofitted.
- Faction records exist as pseudo-nodes in the graph — capable of holding bond edges to and from character nodes.
- Full world state can be serialised and loaded.
Resolved Decision
- B-03: the turn unit is split — a sub-weekly tick drives the simulation, a weekly briefing surfaces it, and dead stretches auto-skip. Year ≥ weeks; no calendar locked. The real question was never season-vs-month but hop-time: how long a diffusion hop takes in game-time sets the only cadence that matters, and weekly reporting over sub-weekly ticks keeps a multi-hop chain from collapsing the warning and the knife into one paragraph.
Group 2 — Simulation Core · Drives, Diffusion & Events
Depends on Group 1. The engine that makes characters behave and news travel.
Description
Each character holds a ranked list of drives, and each drive is a predicate over a target node: Ambition(Throne), Loyalty(Father), Fear(Father). A character can hold several drives at one target, and they need not agree — Loyalty(Father) and Fear(Father) on the same man is the ordinary engine of inner conflict. Drives are the engine of autonomous behaviour: given a situation, a character's drive-stack resolves to a weighted distribution over actions. The player issues no orders to other characters; they create conditions, and the drive system draws the conclusion. One predicate, Embody, takes an archetypal target — a person, a Jinn, or an idea-node — and resolves by running that target's signature stack against the present situation: an action "fits" to the degree the embodied thing would have chosen it here.
Acceptance Criteria
- Each character is assigned a ranked drive list at generation, each drive expressed as predicate(target-node), with at least one primary and one secondary drive.
- A character may hold multiple drives toward the same target; conflicting drives at one target (e.g. Loyalty and Fear toward a parent) resolve through the stack rather than cancelling.
- Given an identical situation, two characters with different drive-stacks produce observably different decisions.
- Drive behaviour is deterministic given the same seeded inputs — testable and reproducible.
- A drive's target is a node, so its resolution reads that node's edges: the same drive pointed at a node the character has soured on (negative edge) produces visibly different behaviour from one pointed at a node held in high agape. ("Resentment" lives here — it is a drive disagreeing with its edge, not a separate drive.)
- Embody resolves by borrowing the target's signature stack and scoring the candidate action against the distribution that stack would produce in the current situation; the same embodied target yields different verdicts in different situations (the trickster's prank fits the funeral and not the war council). For person and Jinn targets the stack is the target's own drives; for idea-node targets the signature is supplied by D-04a.
- The predicate set is closed and authored (Ambition, Loyalty, Fear, Embody, …); the target vocabulary is open and never defined — targets are nodes, including idea-nodes, whose meaning is positional, not stipulated.
- The evaluator takes the actor's expressed elements as part of its input (temperament tilts resolution), and its output is not just the chosen action but the resolved contest: the winning drive (its predicate and object — this is the actor's intent) and the weighted contender stack. D-04b consumes all three to select the deed and split its stamp.
Implementation Note
- Drive record:
Drive{ predicate: Predicate, object: NodeId | None, strength: int }. object is None only for the structural operators (target-less). Model as a sum type if you can (node-drive vs. operator-drive) — this is the one spot Haskell's sum type is flatly cleaner than Python's tagged union.
- Resolution is stochastic with a seeded draw: the stack yields a weighted distribution over actions, a recorded seed resolves it, replayable for debugging. A loyal character is almost always loyal, with rare deviation — not a coin flip.
- The evaluator's richer return (winner + contenders, not just the pick) is the channel D-04b's deed-stamp depends on. Build the return shape to carry it now; retrofitting it later means touching every call site.
Resolved Decision
- B-02: the drive vocabulary is a predicate(node) grammar plus Embody, not a flat list. The six-drive floor is superseded. "Resentment" is emergent (drive vs. edge); "devotion" is a cull candidate — likely Embody(sacred node) or Loyalty in vestments — confirm during build. Adding one predicate (Embody) is the cue to cull, not to keep all seven.
- Still open — structural operators: a small closed set of target-less predicates (rupture, conceal, stabilize, reveal) that read a graph-topology delta instead of a node, needed for archetypes whose stance is toward an outcome-shape rather than a person (the trickster's "generative-through-rupture," the influencer's reveal/conceal command). A deliberate grammar extension, eyes open — not a free reuse. Spec pending.
- Idea-node packaging — resolved: the totemic/idea-node signature system is split out as its own deliverable, D-04a (Idea-Node Signature System), rather than staying distributed across D-01 and D-17. The grounding rule lives there: a signature must terminate in concrete nodes, or the engine rejects it as vapor.
Depends on: D-01 (character model), D-02 (edge model)
Description
An idea-node is a target with no body — Justice, the Return, Coyote, a memetic persona — that other characters can Embody. It carries no definition; it carries a signature: a drive-stack plus a bond-disposition, the same shape a character's own drives take. Embody(idea-node) resolves by running that signature against the present situation (see D-04), so the engine never stores what Coyote means — only how he moves, computed fresh at the moment of judgment. A signature comes from one of two sources on a single dial. Authored: hand it a stack the way you hand a character one — a Form, charged before anyone wears it. Emergent: its stack is the running aggregate of every node currently holding Embody toward it — the god is what his worshippers do. A crystallize/decay slider sits between the two: a hard Form holds its stack against its adherents; a soft one drifts toward them. This is the same current that runs the Empress question — authored Word versus crystallized longing — so the system holds both ends and the slide between them rather than choosing.
Acceptance Criteria
- An idea-node holds a signature (drive-stack + bond-disposition) and can be the target of Embody; resolution runs the signature through the drive evaluator (D-04) against the current situation, and fit is read off the resulting distribution.
- The verdict is computed live every time, never cached — the same idea-node fits an action in one situation and opposes it in another (the prank at the funeral, not the war council).
- Authored signatures are supported: an idea-node can be hand-given a stack at authoring time, independent of any adherents.
- A signature must ground in concrete nodes — real characters, faction/Throne pseudo-nodes, or a graph-topology delta. A signature spelled purely from other idea-nodes is rejected; every reference chain must terminate in concrete ground.
- Emergent signatures are derivable: the system can compute an idea-node's stack as the aggregate of all nodes currently holding Embody toward it. An idea with no adherents has an inert signature and steers no one.
- The crystallize/decay position is a per-idea-node parameter governing how far an authored signature drifts toward its emergent aggregate over time — settable at both extremes (pure Form, pure cluster) and between.
Scope Decision
- Split out from D-04 (the former "idea-node packaging" question). M1 scope is the authored-signature path: idea-nodes with hand-given signatures, Embody resolution, and the grounding/vapor rule. This is the half that makes archetypes playable now.
- Still open — the emergent half: the emergent aggregate needs a live query over Embody-holders, and the crystallize/decay slider is where the Empress ambiguity lives. The authored path is M1; how much of the emergent/slide machinery lands in M1 versus M2 is undecided. Note: this slider may be the same concept as D-04b's world-temperament brake — the stickiness of identity, asked of ideas here and of people there. Decide jointly, not separately.
- Still open — outcome-shape archetypes: trickster- and influencer-class signatures (stance toward rupture, reveal/conceal) need the structural-operator predicates flagged on D-04. Until that extension lands, node-pointed signatures work and outcome-shape ones are partial.
Depends on: D-01 (idea-node class), D-02 (bond-disposition edges), D-04 (the evaluator the signature runs through)
Description
The layer that makes elements operative rather than decorative: how a character's expressed temperament moves over time, and how their acts move it back. Astrological realism — you are born a Cancer (natal, fixed) but run more or less Cancer-like (expressed, live). Two feedback terms act on each expressed magnitude: a stabiliser pulling it back toward natal (the cosmos wanting you to stay as born), and an accelerator pushing it further the way it already leans (habit deepening the rut). Near natal the stabiliser wins and you sit still; push expression far enough that the accelerator overpowers it and you break orbit into something birth did not assign. That is the cultivation thesis dropped into the temperament layer — and tribulation gets a mechanical meaning for free: the work done against the restoring force.
What feeds the accelerator is what you do. Action verbs carry intrinsic element stamps (to kill is Salt — the cull of the unnecessary); the lexicon is closed, authored, and hardcoded grammar (a deed is a primitive, like a predicate — only ideas must stay relational and undefined). And intent selects the deed: the winning drive that drove the act names which deed fired — a kill out of Eros resolves as a different deed, with a different stamp, than a kill out of survival. The stamp then splits: the winner takes half (all, while testing), the remainder distributes across the other hot drives by weight — and that remainder is signed by the hexagram. A runner-up concordant with the deed aggravates (deepens the stamp); one opposed mitigates — and mitigation decays, so the act's full weight lands later, after the resistance that held it off wears thin. The man who killed against his own screaming conscience feels clean for a season and curdles slowly.
The same act re-weights the drives that argued over it. A concordant loser ("this isn't why, but it helped") is reinforced — fast and shallow, because nothing resists greasing a wheel that agreed. A mitigating loser ("uncertain, but not enough to stop me") is eroded — slow and deep, because wearing down a no is hard and, once done, does not come back the way it was. So a strong action against resistance pulls every lever at once: it stamps you, eases the next like act, greases the drive that helped, and quiets the drive that objected. Three coupled positive loops — element, drive-reinforcement, resistance-erosion — compounding into a snowball with an unstable tipping point: below it you drift back to nature, above it you are captured and only a kenotic rupture gets you out. A strong action is genuinely dangerous, because the danger is the slope it leaves behind.
Acceptance Criteria
- Each expressed magnitude integrates two terms per tick: a stabiliser relaxing it toward its natal set-point, and an accelerator pushing it further along its current lean. Near natal the system rests; past a threshold the accelerator dominates and expression runs away.
- A closed, authored deed-lexicon maps action verbs to intrinsic element stamps. It is a sparse table with a plain default (an unlisted act stamps lightly or not at all), not a total function over every verb × motive.
- Intent selects the deed: the deed that fires is
f(physical act, winning drive), read straight from the evaluator's output (D-04). The winning predicate-object names the deed; no separate situational classifier is needed.
- The stamp splits: the winning drive's element takes a fixed share (one-half; configurable to all for testing), and the remainder distributes across the hot contender drives, thresholded (only drives above a heat cutoff) and renormalised, so the residue does not dust a trace of six elements onto every act.
- The remainder is signed by hexagram agreement: a contender concordant with the deed's element aggravates (adds), one opposed mitigates (resists). A drive pointing at the chosen act with a negative sign and losing the resolution is maximal mitigation — the overridden conscience.
- Mitigation decays over time ("for a time"): the deed's true stamp is fixed; the mitigation hold relaxes toward zero, so accrued expression is (true stamp − current hold) and the deferred weight lands as the hold fades. Half-life derives from the mitigating drive's strength — stronger resistance defers longer and lands harder.
- Acts re-weight the contender drives: concordant losers are reinforced (fast, shallow rate); mitigating losers are eroded (slow, deep rate). Eroded resistance is floored, never deleted — a worn-down no still fires, still costs a flicker, forever.
- The feedback loops leak in small per act and integrate across many ticks — never resolve in full within a single resolution. The ground tilts gradually; the slide is felt before it is a cliff, and can be chosen against for a while.
- A world-temperament dial is exposed at setup as a legible genre selector (Realism ↔ Opera), not as raw coefficients; it derives the underlying constants. It governs at least two distinct knobs — the per-act leak (how much an ordinary act tilts the slope) and the runaway threshold (how large an act still redirects a life) — so a high-stability world can still be moved by something great rather than frozen solid.
Scope Decision
- M1 ships the deterministic spine: winner-takes-all deed selection (the deed is one named thing), the stamp split with mitigation present, and mitigation-decays-only. Selection stays winner-take-all forever; only the stamp ever goes fractional. Run this version legibly at 500 nodes before letting the blends in.
- Still open — M2 richness tails: concordant-decay symmetry (relished acts settling the way resisted ones land); mixed-motive selection (reading the whole hot stack, not just the winner, for tangled killings); and per-character brake deviation (one opera-villain in a realist world). All deferred, none blocking.
- Still open — is this the same knob as D-04a? The world-temperament brake (stickiness of a self against its acts) and the crystallise/decay slider (stickiness of a Form against its adherents) may be one concept — the stickiness of identity — asked once of people and once of ideas. Decide deliberately whether they are one exposed handle with two applications or two separate dials; if they are the same and ship as two, players will set them to disagree and the world feels incoherent in a way no one can name.
Implementation Note
- Every loop integrates in float and writes back narrow. A small restoring or eroding force that rounds to zero in int math leaves the loop dead — this is the single likeliest "the system is broken" bug, and it is only rounding.
- The accelerator and the drive-reinforcement loop are positive feedback; both need the shared saturation/brake primitive (ceiling with falloff), not just the element magnitudes — drive weights need their own cap too, or every character collapses to one screaming attractor by year ten. This is cap-vs-drift (D-02), third appearance: solve the primitive once.
- Mitigation hold-off and element stabilisation are the shared decay/relaxation primitive (D-02) — relax toward a set-point at a strength-driven rate. Decay the hold, not the stamp; keep the deed's true element fixed as the target the accrual climbs to.
- Deed-stamp accrual is a post-resolution lookup:
expressed += deed.elements × share, with the deed chosen by (act, winning drive). No new evaluator channel beyond the richer return D-04 already specifies.
- Authoring the lexicon is authoring moral physics, not filling a table: each row is a doctrinal claim (kill = the preservative cut, not Yeast-rupture or Stars-judgment). Split a deed into two rows only when the split changes the stamp or the resolution — never for prose register (the narrator can say "slay" over a
kill row for free).
- Self-deception falls out for free and need not be built: the deed is named by the actual winning drive, so a doer who tells himself it was survival when Eros topped the stack is simply wrong, and the true row exists underneath to be concealed. Whether the player ever sees the true deed or only the doer's account is a reveal-layer choice.
Depends on: D-01 (natal/expressed magnitudes), D-04 (evaluator I/O: expressed-in, winner+contenders-out), the deed-lexicon (authored content), and the world-constant hexagram topology (for remainder signing). Feeds back into D-04 resolution.
Description
When an event occurs, knowledge of it enters the graph at the witnessing node and propagates outward along edges. Each hop applies distortion — omission, framing, emotional overlay — weighted by the bond type of the edge being traversed. Philos edges carry practical content fastest; agape edges add emotional coloring; eusebia edges attach status weight. Information does not travel through edges with deeply negative scores without transformation.
Acceptance Criteria
- An event injected at node A propagates to nodes B, C, D in the correct hop sequence based on edge weights.
- Information arriving at a node six or more hops from the source is observably different from the original event — at minimum one factual element is missing, reframed, or emotionally colored.
- Propagation stops or degrades significantly across edges with scores at or below a defined negative threshold.
- The diffusion trace is logged internally (not shown to player) — auditable for testing.
- Diffusion is bounded: information does not propagate infinitely; there is a defined maximum hop count or decay function.
Resolved Decision
- B-05 (see D-02): the scoring scale is signed 8-bit. The negative-threshold cutoff for propagation blockage is set as a point on that scale during diffusion-weight calibration. Weights compute in floating point off the narrow stored score.
Depends on: D-02 (edge model), D-04 (drives, for distortion coloring)
Description
The mechanism by which things happen in the world — and by which the player finds out. Events are generated by character drive behavior, by world-state conditions (a poor harvest, a death, a marriage), and by player orders. Each event is injected into the diffusion engine at the relevant node. Some events are public (a declaration of war); most travel through the graph and arrive at the player transformed.
Acceptance Criteria
- Events have a type, an origin node, a turn timestamp, and a payload (what happened).
- Events can be flagged as public (known immediately to all nodes) or private (enters diffusion at origin).
- A library of at minimum 20 base event types covers: deaths, births, marriages, harvests, military movements, diplomatic exchanges, covert actions, and rumor arrivals.
- Events that reach the player node are formatted as diegetic prose — the steward mentions it in a briefing, a letter arrives, a servant whispers — never as a system notification.
- Events that have not yet reached the player node do not appear in any player-facing output.
Depends on: D-01, D-02, D-03, D-05
Group 3 — Dynasty Layer · Family, Succession & Marriage
Depends on Groups 1–2. The generational machinery that gives the simulation its time depth.
Description
When the head of house dies or is incapacitated, control passes to the next eligible character according to the house's succession rules. The new head inherits the house's assets, its bond edges (modified by their personal history with each node), its debts, and its reputation — for better and worse. Succession is the primary mechanism by which past choices haunt future generations.
Acceptance Criteria
- The house maintains a succession order that updates automatically when members die, are born, or change status.
- When a head of house dies, the next in succession becomes the new player-character without requiring a new game.
- The new head's existing bond scores toward all nodes are preserved from before succession; house-level bonds are inherited with a defined modifier reflecting their relationship with their predecessor.
- Inherited debts (financial and social) are visible to the player via the steward's briefing in the first turn after succession.
- If no eligible heir exists, a house extinction event is triggered.
Depends on: D-01, D-02, D-03, D-06
Description
Marriages are political instruments that create new bond edges between houses and generate heirs. They can be arranged by the player or emerge from NPC drive behavior. A marriage event produces: a new family link between two houses, new eusebia edges between the married characters and their respective families, and a relationship between the houses that other characters observe and respond to.
Acceptance Criteria
- A marriage can be arranged by player order or triggered by NPC drive resolution.
- A completed marriage creates the appropriate kinship links in the character model and the relevant bond edges.
- Other characters with existing bonds to either party update their assessments in the turn following the marriage event.
- Children born of a marriage are added to the succession order of the appropriate house and inherit initial bond scores derived from their parents' scores.
- A marriage that crosses houses with deeply negative existing bonds generates a tension event that enters the diffusion engine.
Depends on: D-01, D-02, D-06, D-07
Group 4 — Economy & Land · Holdings, Jinn & Trade
Depends on Groups 1–2. Can be built in parallel with Group 3.
Description
Each holding produces output each turn based on its material productivity and its Jinn relationship state. Material productivity responds to investment, infrastructure, and security. Jinn relationship state responds to propitiation practices maintained by the people living on the land — maintained or undermined by the character the player appoints as steward, and by orders that affect local custom. The player never sees a Jinn score. They hear, in the steward's briefing, that "the harvest was thin again this season" or that "the tenants in the eastern quarter seem more settled."
Acceptance Criteria
- Each holding produces a grain and coin output each turn, derived from material productivity and Jinn state combined.
- Jinn state is stored internally as a scored value but presented to the player only as a qualitative descriptor in diegetic prose (e.g. "uneasy," "settled," "generous").
- Appointing a steward who is sympathetic to local practices improves Jinn state over time. Appointing a rationalist steward degrades it.
- A holding whose Jinn state falls to a critical level generates a crop failure event that surfaces in the steward's briefing as a plain report of poor harvest — no cause is named unless the player investigates.
- Investment orders (build a mill, repair a road) improve material productivity after a defined number of turns, reported on completion in diegetic prose.
Depends on: D-01, D-03, D-06
Description
The house treasury receives income from holdings and trade connections and pays out costs (garrison, staff, debt service). Trade connections are relationships — merchants are characters with bond scores, not abstract flow values. A trade route is active while the merchant relationship is sufficiently healthy; it degrades or breaks when the relationship does. The treasury ledger is a diegetic document the player can request.
Acceptance Criteria
- The treasury updates each turn: income from holdings and trade, outgoings from costs, net change reported in the steward's briefing as a plain sentence ("The house accounts are healthy this quarter" or "We are spending beyond our means").
- When the player requests a ledger, they receive a formatted text document with line-item coin values — a diegetic document, not a UI panel.
- At least two trade connection types are modelled: a local merchant and a guild factor, each as a character node with bond scores.
- When a merchant's philos score falls below a defined threshold, the trade income from that connection decreases and eventually stops, with the change reported diegetically.
- The treasury can go into deficit; an extended deficit generates a debt event with appropriate consequences.
Depends on: D-01, D-02, D-03, D-09
Group 5 — Conflict · Overt War & Covert Action
Depends on Groups 1–4. Both tracks must be present for M1 to be complete.
Description
The player can raise, deploy, and supply military forces; war is seasonal and supply is a first-class mechanic. Resolution is detailed internally and abstracted in presentation. A battle is simulated as an agent engagement — on the order of a thousand-plus combatant nodes per side under heuristic commander orders — but the player never sees the field. What reaches the house is a dispatch, and the detail in that dispatch is filtered by relationship: the flank is abstracted ("the eastern line was lost"); a node the house holds an edge to is legible ("your sister's boy held when the men beside him ran; he took a horseman off his saddle before the line bent"). Commanders run their own drive-stacks against the battle state; named combatants are tracked and logged in full; their deaths are deaths like any other — they enter diffusion and trigger succession. The battle is opaque except for the people in it, and what the player learns of those people arrives secondhand, coloured by whoever carried it home.
Acceptance Criteria
- The player can order: raise a unit, disband a unit, assign a commander, set a campaign objective, and withdraw.
- A battle resolves as an agent simulation: two forces of combatant nodes engage under commander-issued heuristic orders, and commanders select those orders by running their own drive-stacks against the battle state (a commander whose Ambition outranks his Loyalty may hold his reserve at the hinge and let the line buckle — emergent, not scripted).
- Two node tiers are honoured: nodes already in the relationship graph fight in full and are tracked for the whole engagement (every morale check, exchange, kill, wound, and death logged); anonymous combatant nodes resolve coarsely and are culled when the campaign ends. The line between tiers is "does anyone at home hold an edge to this man" — if yes, simulate in full and keep the tape; if no, he is weather.
- Player-facing reporting is filtered by edge: the engagement as a whole is reported abstractly, but the conduct and fate of any node the house holds an edge to is reported specifically — and rides diffusion, so the account may be incomplete, flattering, or wrong.
- A combatant's death enters the diffusion engine, and for a node in the succession line it triggers inheritance — a battle is one of the ordinary ways a house loses its people.
- Supply consumption is tracked per unit per turn; a unit without supply degrades regardless of field performance and is reported as "the men are hungry and the road behind us is long."
- A declaration of war is a public event — it enters the graph as a known fact and other characters respond to it according to their drives.
Resolved Decision
- B-01: resolution is detailed, presentation is abstracted-except-by-edge. The original three-option choice (abstracted / intermediate / detailed) is superseded — it assumed sim-depth and report-depth move together. They are unbound: the sim runs full, the report runs abstract, and the named people in the line are the exception that earns the cost. A corpse has to be earned by the sim or the grief is fake.
- Still open — node promotion: whether an anonymous combatant who distinguishes himself (holds the line alone and lives; carries the field after his commander folds) can graduate into the full relationship graph mid-battle. Allowed in principle — this world should not structurally forbid a nobody becoming someone — but threshold and mechanism deferred until the battle has run at least once. Decide the floor first; the Cinderella case waits for evidence.
Depends on: D-01, D-03, D-04, D-05, D-06, D-07, D-10 — commanders run drive-stacks (D-04); battle news and casualty threads ride diffusion (D-05); battle deaths feed succession (D-07); treasury funds armies (D-10). Still within Groups 1–4; the group placement holds but the intra-dependencies grew.
Description
The player assigns characters to covert roles and issues covert orders. Actions — rumor seeding, bribery, blackmail, sabotage, assassination, defection handling — interact directly with the relationship graph. A planted rumor enters diffusion at the target's neighborhood; a bribed official becomes a compromised node; an assassination removes a node and triggers cascades. All of this surfaces to the player only through diegetic channels — a nervous letter, a servant's whisper, a report that something went wrong.
Acceptance Criteria
- All six covert action types are implemented: rumor seeding, bribery, blackmail, sabotage, assassination, defection handling.
- Each action modifies the relationship graph in the defined way (see GDD) and injects an event into the diffusion engine.
- Each action has a blowback resolution — if detected, the originating house receives a consequence that itself enters the diffusion engine.
- Covert actions are never announced to the player as "success" or "failure" directly — they learn through subsequent events and character behavior.
- Assassination of a node correctly cascades fear and suspicion events through that node's edge network according to bond type and score.
Depends on: D-01, D-02, D-04, D-05, D-06
Group 6 — Player Interface · Briefing, Orders & Watcher Mode
Depends on all prior groups. The layer the player actually touches.
Description
The primary information delivery mechanism. At the start of each turn, the player's steward (or secretary, or most trusted household officer) presents a prose summary of the house's current situation — what happened last turn, what is pressing now, and what requires the head of house's attention. All game state the player needs to make decisions is channelled through this briefing, in ordinary English sentences, as this person would actually report it. Ledger detail is available on request.
Acceptance Criteria
- A briefing is generated each turn drawing from: events that reached the player node via diffusion, holding productivity reports, treasury state, active military situations, and any flagged character changes (deaths, arrivals, departures).
- The briefing contains no mechanical labels, score values, or system names. Every piece of information is in ordinary English prose.
- The briefing is appropriately filtered — the steward only reports what they would know. Events that have not reached the house do not appear.
- Information that arrives distorted through diffusion is presented as the distorted version — the briefing is diegetically honest about what the house actually knows, not what is objectively true.
- A ledger can be requested as a follow-up; it appears as a formatted text document with numerical entries as appropriate for a real household ledger.
Depends on: All prior deliverables
Description
After receiving the briefing, the player issues orders for the turn. In Milestone 1 this is a text-based menu of available actions — what the head of house could plausibly do. Orders are grouped by domain: household (staff assignments, estate decisions), diplomatic (letters, visits, negotiations), military (campaign orders), and covert (agent assignments). The available action list is filtered by what the house currently has the capacity and knowledge to do.
Acceptance Criteria
- The order menu presents available actions in plain language — "Send a letter to House Valdris" not "Initiate diplomatic event #4."
- Actions that are unavailable (insufficient treasury, no available agent, etc.) are either absent from the menu or clearly marked as unavailable with a plain-English reason.
- The player can issue multiple orders per turn up to a defined capacity limit.
- Each order submitted generates an event injected into the appropriate system for resolution at turn end.
- The player can choose to issue no orders and advance the turn — valid in both active play and Watcher Mode.
Depends on: D-06, D-09, D-10, D-11, D-12, D-13
Description
The player sets the house's standing values — priorities across bond types, disposition toward the throne question, economic and military posture — and then steps back. The simulation runs turn by turn automatically. The player still receives the steward's briefing each turn but issues no orders. Characters behave according to their drives against the value framework the player established. The player can re-engage at any turn.
Acceptance Criteria
- Watcher Mode can be entered and exited at any turn boundary without loss of state.
- When active, the simulation advances automatically and the briefing is generated as normal — the player observes, does not intervene.
- The house's standing values (set before entering Watcher Mode) correctly influence NPC character behavior toward the house during automated turns.
- The briefing in Watcher Mode is no less detailed than in active play — the steward still reports fully.
- At least one run of 10 consecutive automated turns can complete without simulation error.
Depends on: D-04, D-13, D-14
Description
At game start, the player selects a legacy goal or chooses to play without one. The simulation tracks progress toward that goal silently. If the house is extinguished — no eligible heir, no recoverable title — a loss state is reached and described to the player in diegetic prose. There is no win screen; reaching a legacy goal is acknowledged in the next steward's briefing as a historical note.
Acceptance Criteria
- At least three legacy goal types are playable at M1: Dynastic Endurance, Interregnum Defender, and Throne Bid.
- Goal progress is tracked internally and never displayed as a percentage or progress bar.
- When a goal is achieved, the steward mentions it in ordinary prose in the following briefing. Play continues.
- When the last eligible heir dies with no recovery path, a house extinction event fires and the game ends with a diegetic account of the house's fall.
- The player can choose "no goal" at game start; the simulation runs indefinitely until loss or the player stops.
Depends on: D-07, D-13
Group 7 — Starting Scenario · The Playable Build
Depends on all prior groups. The scenario is the integration test. It proves M1 is complete.
Description
A fully authored starting configuration: a named region, a political situation, a player house with defined members and initial bond scores, rival and allied houses, faction presences, at least one saint in the world (not necessarily recruitable), a set of anchor characters oriented toward each idea-node the scenario uses (so those idea-nodes have adherents and can actually steer behaviour), and a set of opening events ready to enter the diffusion engine at turn one. No particular premise is mandated; the deliverable authors content to a shape, not to a fixed scenario.
Acceptance Criteria
- The scenario instantiates without error using the completed data model.
- The player house has at minimum: a head of house, one spouse or sibling, one heir, and one household officer (the steward).
- At least three rival or allied houses exist with their own character rosters and initial bond scores toward the player house.
- At least two holdings exist with defined initial productivity and Jinn states.
- At least one opening event is queued for turn one that enters diffusion and surfaces in the first steward's briefing.
- For every idea-node the scenario references, at least a few anchor characters are authored holding Embody toward it, so the idea-node's emergent signature is non-empty at turn one — a new idea with no adherents cannot steer anyone. (Seeding the cluster is authoring content, not hardcoding a definition.)
- The scenario's political situation creates at least one natural path toward each of the three M1 legacy goal types.
Resolved Decision
- B-04: the Rasul copper-mine fixation is dropped. It was an unconfirmed candidate that gained gravity only by being retyped across snapshots — never canon, never load-bearing. Author a fresh scenario to the shape it needs to test: a minor house, a holding under Jinn stress, a small cast, one buried secret worth distorting, and a natural path toward each M1 legacy goal. The lost campaign notes are not the blocker; the shape is the keeper, not the premise.
- Still open — authoring: no scenario is written yet. "Resolved" means the mandate is lifted and the shape is set; the content itself is the remaining work, and it now inherits idea-node anchor seeding.
Depends on: All prior deliverables
Description
A structured test run of the starting scenario through at least 10 turns in active play and 10 turns in Watcher Mode, verifying that every prior deliverable functions correctly end-to-end. This is not a playtest for fun — it is an integration proof. Every system must produce coherent, diegetically correct output with no mechanical leakage into player-facing text.
Acceptance Criteria
- The game runs for 10 active turns and 10 Watcher Mode turns without a simulation error or crash.
- No player-facing text in any briefing, ledger, or event description contains a mechanical label, score value, or system name.
- At least one piece of information that entered the graph at a distant node arrives at the player transformed — the distortion is coherent and traceable in the internal log.
- At least one character death triggers a succession and the new head of house receives an accurate briefing on inherited debts in the following turn.
- At least one battle resolves with a named node's conduct and fate reported to the player by edge (specifically, while the engagement as a whole stays abstract), and at least one battle death feeds a succession.
- At least one covert action is issued, resolved, and produces a downstream event that the player learns about diegetically — not as a direct result notification.
Depends on: D-01 through D-17 — all deliverables complete
20
Total Deliverables
0
Blockers Remaining
7
Groups / Build Stages
1
Standing Constraint
All five original blocking questions (B-01–B-05) are resolved. This did not leave the design clean — resolving them opened non-blocking questions carried on their cards: cap-vs-drift on bond scores (D-02), the structural-operator predicate set (D-04), and node promotion mid-battle (D-11). Two systems have been split out as their own deliverables this session: D-04a (idea-node signatures) and D-04b (temperament & element dynamics — the operative loops, the deed-lexicon, intent-as-deed-selector, and the world-temperament brake). One question now spans both splits and should be decided jointly: whether D-04a's crystallise/decay slider and D-04b's brake are a single concept — the stickiness of identity. D-11 also scoped up: B-01 bought a detailed battle simulation the original doc was not sized for — the one decision worth looking at twice before building. D-17 is unblocked but unauthored. Cross-cutting build decisions are recorded in the Implementation Notes banner above and per-card where specific.