13 KiB
Generated Recruit Authority
Contract: every recruit is a run-scoped composition, not an authored story identity. Many recruits may share a profession. Generation must remain deterministic from the saved run seed and offer index.
Revision: recruit-line-design-r3 / 2026-08-11
1. Recruit Record
recruit_instance_id, generation_seed, offer_index, source_offer_id
source_draft_id or Market_id, canonical_output_hash
display_name_tokens, pronoun_set, voice_effort_set
body_frame, face_shape, skin_palette, hair_shape, hair_palette
garment_cut, garment_palette, profession_overlay, detail_mark
base_profession_id, attribute_vector, trait_id
starting_equipment_id, level, xp, mastery_by_profession
quality_band, shop_cost_tier, duplicate_signature
survival_battles, knockouts, scars[], acquired_tick
recruit_instance_id is unique even when two offers have the same visible
composition. duplicate_signature hashes name tokens, visual parts,
profession, trait, and attribute grade pattern; equipment and level are not
part of it. Survival history changes the run record and optional scar overlay,
never the recruit's rules invisibly.
2. Deterministic Generation Order
Generation consumes substreams in this fixed order so a presentation change cannot reroll combat power:
- choose base profession from the shop's visible role-weight table;
- roll attribute grade pattern from the profession's legal templates;
- choose one legal trait after profession exclusions;
- choose quality band from the offer's disclosed band weights;
- choose starting level from region depth and recovery pressure;
- choose starting equipment from the profession's starter tags and quality;
- assemble display-name tokens and pronoun set;
- assemble modular body, face, hair, garment, palette, overlay, and detail;
- run duplicate protection and, if rejected, reroll only presentation tokens;
- derive cost tier from level, quality, equipment, and scarcity using the product economy formula.
The combat substream ends after step 6. Steps 7-9 can never alter profession, attributes, trait, level, equipment, or price tier.
2.1 Opening Four-Offer Binding
Opening generation is legal only from a validated, read-back
run_creation_draft created by an applied seed-reservation operation. The
generator cannot reserve a seed, read wall clock, consume an ambient
random stream, or run speculatively before that boundary. For each unsigned
opening index i in the closed set 0..3, derive:
opening_offer_id_i = low128(sha256(run_seed || "opening-offer-id" || u8(i)))
generation_seed_i = low128(sha256(run_seed || "opening-recruit" || u8(i)))
recruit_instance_id_i = low128(
sha256(run_seed || "opening-recruit-instance" || u8(i)))
canonical_output_hash_i = sha256(canonical_bytes(complete Recruit record_i,
excluding this hash))
The draft's saved Contract, difficulty, ruleset, content revision, and opening
role-weight snapshot are immutable inputs to the generation procedure. They may
affect the generated record but cannot change the ID/seed mapping above. All
four complete records, their ordered indices, offer IDs, and output hashes enter
one materialization commit; a partial array is invalid. Re-running generation
after interruption must reproduce byte-equivalent canonical records and all
four hashes or fail OPENING_OFFER_HASH_MISMATCH without replacing the seed.
The accepted opening choice is an unordered set of exactly two distinct saved
offer IDs. Selecting or revising that set consumes no random draw and never
mutates any Recruit record. Run commit transfers the two records with their
existing recruit_instance_id, generation seed, index, offer ID, and output
hash. The two unchosen records remain in the draft until that commit applies;
only the applied commit discards them.
3. Display-Name Pool
Names use one given token plus one byname token. Localizers may substitute a curated culturally coherent pool rather than transliterate combinatorial fragments; the saved identity stores message IDs, not rendered strings.
| Pool | Independently authored tokens |
|---|---|
| Given A | Aven, Brin, Cassa, Dorel, Eiren, Fara, Gannet, Hessa, Iven, Jora, Kelm, Lio |
| Given B | Marn, Neris, Orra, Pella, Quin, Rusk, Sella, Tavin, Ulan, Vessa, Wren, Yori |
| Byname A | Amberfield, Bellwake, Coldmere, Dawnreed, Emberstep, Faircurrent, Glassfern, Highspoke |
| Byname B | Ironleaf, Juniper, Kindler, Larkfall, Mossward, Northcoil, Oatbridge, Pineglass |
| Byname C | Quillwater, Rill, Stonebloom, Tidewell, Umberlane, Valehook, Windrow, Yarrow |
The base pool yields 576 visible combinations before localization. A run may reuse a given token or byname, but not the exact pair until every legal pair in the current language pool has appeared. The name is never used as a combat seed, target key, unlock key, or uniqueness restriction.
4. Modular Visual Grammar
| Part | Options | Production and readability rule |
|---|---|---|
| Body frame | 8 | Four height bands by two mass bands; identical collision and timing |
| Face shape | 12 | Must read at portrait scale without encoding combat quality |
| Skin palette | 12 | Hand-authored values checked across daylight, dusk, and status overlays |
| Hair/head shape | 24 | Includes bald, covered, braided, curled, straight, and textured families |
| Hair palette | 10 | Natural and aether-touched options; no rarity coding |
| Garment cut | 12 | Shared neutral underlayers compatible with every profession overlay |
| Garment palette | 16 | Contrast-paired main/accent sets with color-blind luminance separation |
| Profession overlay | 42 | One modular silhouette cue per PF-*; it communicates active ruleset |
| Detail mark | 20 | Scar, freckle, paint, jewelry, patch, or tool token; cosmetic only |
| Voice effort set | 8 | Nonverbal effort/death/confirmation sets shared broadly; no personal scenes |
The assembler rejects combinations that obscure face, weapon action, front/rear orientation, status halo, or profession silhouette. Pronoun sets are selected independently of body and voice options. Critical information is always text, shape, and timing readable; color and sound are supplemental.
5. Attribute Roll
Every recruit has five displayed grades: Vigor, Force, Finesse, Focus,
and Resolve. The core system maps grades to numbers. Content generation owns
only grade allocation.
| Template | Grade multiset | Decision meaning | Quality availability |
|---|---|---|---|
| Even | B, B, B, C, C | Flexible, no extreme liability | Common and above |
| Pointed | A, B, C, C, D | Strong thesis with one exposed failure | Common and above |
| Twin | A, A, C, D, D | Two-role spike with expensive protection needs | Uncommon and above |
| Durable | A in Vigor or Resolve; B, B, C, D elsewhere | Survival consistency, slower payoff | Common and above |
| Precise | A in Finesse or Focus; B, B, C, D elsewhere | Target/timing consistency, fragile edge | Common and above |
| Volatile | S, B, D, D, D | Build-around extreme; never an opening forced buy | Rare only |
Each base profession declares two preferred attributes. A legal template places
at least one A or B in a preferred attribute and never places both preferred
attributes at D. Grades do not improve with recruit quality; quality changes
how pointed a legal pattern may be, starting gear breadth, and price pressure.
No hidden luck, growth-rate, or personality stat exists.
6. Trait Selection
Exactly one TR-* row is attached at generation. Selection procedure:
- remove traits whose prohibited profession, action, or equipment tag matches;
- weight remaining traits toward an exposed cost the preview can explain;
- suppress any trait already held by two living owned recruits when at least twelve other legal traits remain;
- show both benefit and cost in the offer before purchase;
- preserve the trait through profession advancement and switching.
Traits are never upgraded, stacked, inherited, or secretly paired. An artifact that references traits changes a run-wide selection rule; it does not give a recruit a second trait.
7. Starting Profession And Advancement
Opening and ordinary offers use one of PF-B01..PF-B12. Regular advanced
professions are learned only through the parent mapping in
PROFESSION_CATALOG.md. Hidden hybrids require mastery of both listed bases,
the row's run deed, and an explicit conversion choice; they never appear as
random shop offers.
Shop role weights use visible unmet-demand tags: front-hold, single-pressure,
reach, reorder, projectile, area, restore, enable, construct,
impair, tempo, and supply. A reroll may change offers but cannot change
the advertised weight table until the next battle result.
8. Starting Equipment
Starting equipment is drawn only from these disclosed pools. The item catalog owns each actual rule and eligibility condition.
| Offer depth | Legal IDs | Count equipped | Constraint |
|---|---|---|---|
| Opening | EQ-001..EQ-040 |
1 | Must be legal for the rolled profession and cannot repeat another opening offer's item while alternatives exist |
| Early | EQ-001..EQ-080 |
1 | At least one offer per shop has a behavior-class B item |
| Middle | EQ-041..EQ-200 |
1 | Item must expose its behavior hook and wearer tradeoff in preview |
| Late | EQ-121..EQ-280 |
1 | Item must be legal for the rolled Profession and current ruleset |
| Mastery/postgame | EQ-161..EQ-320 |
1 | EQ-281..EQ-320 appear only after their visible unlock deed |
Starting gear is part of the displayed price. Removing it before purchase is not allowed; after purchase, normal equip and salvage rules apply.
9. Level, Quality, Cost, And Rarity Boundaries
| Quality | Visible mark | Generation boundary | Cost consequence | Duplicate boundary |
|---|---|---|---|---|
| Common | one notch | Even, Pointed, Durable, or Precise; one starter item from the common eligible band | baseline cost tier | exact combat signature may recur after three other offers |
| Uncommon | two notches | Any non-Volatile template; one starter item with a disclosed behavior hook | +1 tier | same profession+trait suppressed while a legal alternative exists |
| Rare | three notches | Includes Volatile; one behavior-class B starter item from the rare eligible band |
+2 tiers | exact combat signature once per run unless pool exhaustion is shown |
There are no higher recruit rarities. Quality does not grant a universal stat
multiplier. Starting level is max(1, region_floor - 1) through
region_floor + 1, bounded by the product progression cap. A death-recovery
shop guarantees at least one recruit at or below the player's current recovery
cost tier; content never sets the currency value itself.
10. Duplicate And Exhaustion Rules
- Same profession is always legal and strategically expected.
- Same name pair is presentation-only and blocked until name-pool exhaustion.
- Same profession+trait is blocked in a single shop while another legal trait exists; it may recur across shops.
- Exact combat signature is suppressed according to quality in Section 9.
- Same visual assembly is blocked for the whole run; on exhaustion, reroll the detail mark, then garment palette, then hair palette, in that order.
- Locked shop offers retain their complete saved record. Refreshing, loading, localization changes, or clock changes cannot reroll them.
- Opening provisional offers retain their complete saved records in the
run_creation_draft. Back, Cancel, retry, restart, selection revision, and clock changes return the same IDs and hashes and cannot invoke refresh logic. - Pool exhaustion is visible and deterministic. It relaxes presentation uniqueness before combat uniqueness and never invents an unavailable ID.
11. Offer Preview And Production Handoff
Every recruit offer exposes: profession responsibility and band preference;
attribute grades; trait benefit and cost; starting equipment behavior; current
level; total product-calculated cost; quality boundaries; predicted first
basic target; and one sentence explaining the roster decision the recruit
adds. Modular production needs are P/O/A/V/S: portrait parts, profession
overlay, shared action timing, profession feedback, and shared effort events.
An opening provisional preview additionally binds its displayed card to
source_draft_id, offer_index, source_offer_id, and
canonical_output_hash. Those identifiers are semantic state, not player-facing
technical copy; presentation may expose a short recovery/reference code when an
integrity error must be reported.
No generated recruit requires authored biography, social progression, romantic content, personal quest, unique dialogue, or individual casting. The run history may record purchase, battles survived, knockouts, equipment, profession changes, and death as factual events without generating narrative claims.