docs(p9.1): define arbitrary-party first session

This commit is contained in:
2026-08-13 09:13:27 +08:00
parent c86df18359
commit f68ce15776
@@ -0,0 +1,585 @@
# P9.1 Arbitrary-Party Gameplay Experience Specification
> Status: expert candidate for P9.1 contract reconciliation
> Authority: game-design output only; UX/visual and runtime architecture remain
> separate expert inputs
> Baseline: P9.0R10 pair adaptation plus the preserved P9.0R5-R7 first-session
> continuation
> Review language: Chinese first
> Scope: one deterministic, non-authoritative five-battle first-session fixture
## 1. Outcome And Boundary
Every unordered selection of two different Recruits must complete this same
player arc:
```text
choose any two -> automatic formation -> battle 1 -> pair diagnosis
-> choose one loan adaptation -> battle 2 -> choose one Guild response
-> battle 3 -> choose and review one route -> battle 4
-> choose and review one member growth -> battle 5 -> first-session result
```
P9.1 proves that the current four-Recruit fixture supports arbitrary starting
pairs. It does not create authoritative combat, economy, XP, inventory,
casualty, recovery, save, difficulty, chapter, Market or promotion systems.
All battles below are deterministic presentation fixtures. A fixture victory
must not be described as proof of balance outside this session.
The implementation must preserve P9.0R3 action pacing and event-bound feedback,
P9.0R8 entry behavior, P9.0R9A automatic formation, and every accepted standard
pair value explicitly marked as a regression anchor below.
## 2. Stable Terms And State
### 2.1 Identity, formation and origins
Stable profession IDs and automatic priority remain:
```text
Hearthguard -> Wayrunner -> Farstring -> Kindhand
```
The lower priority index is placed nearer the threat. Selection order never
changes formation. P9.1 uses these identity terms instead of inferring behavior
from a visual slot:
| Term | Exact meaning |
|---|---|
| `starting_pair` | The two selected Recruit IDs, normalized by automatic priority. |
| `lead_id` | The first current member after automatic formation. |
| `initial_second_id` | The second member of the committed two-Recruit formation; this origin identity never changes. |
| `added_id` | The one Recruit added by the Guild response, or empty. |
| `field_order` | Current member IDs sorted by automatic priority after a legal addition. |
| `marked_id` | `initial_second_id`; battles 4 and 5 must target this identity, even if adding a Recruit moved its visible position. |
| `member_origin` | `starting` or `guild_added`; it is independent of current field position. |
If a Guild addition changes field order, the Guild commit result must name the
move before battle 3. In particular, adding Hearthguard to Farstring + Kindhand
changes the lead from Farstring to Hearthguard. This is a system re-formation,
not a player-selected front/rear decision.
### 2.2 Profession actions
No branch may use `else = Kindhand` or derive an action from `front`, `rear`,
`second` or `added`. It must resolve the actual profession ID:
| Profession | Lv.1 battle response | Fifth-battle Lv.2 change |
|---|---|---|
| Hearthguard | Leads with guard/contact when first in field order. | If lead, removes `20` more damage from the lead pressure after item mitigation. |
| Wayrunner | If lead, evades part of contact; otherwise makes one `-30` flank counter. | If lead, removes `20` more lead damage; if `marked_id`, removes `20` from its own split damage. |
| Farstring | Makes one ranged hit (`-36` in battle 3; `-30` in battles 4-5). | Moves that one battle-5 shot before pressure and changes time `7.40 -> 6.40`; never adds an attack. |
| Kindhand | Makes one recovery action on the member damaged by the current pressure. | Changes its battle-5 recovery from `+12` to `+25`; never adds a heal. |
Damage and recovery clamp to `[0, 100]` for Recruit HP and to `[0, enemy_max]`
for enemy HP. Each non-zero mutation emits exactly one number/VFX payload on
the actual target. A member acts at most once in each scripted role-action
window.
### 2.3 Required run state
The domain snapshot must be able to express these values without reading a
Control tree or render clock:
```text
starting_pair: [member_id, member_id]
lead_id: member_id
initial_second_id: member_id
field_order: [member_id, member_id] | [member_id, member_id, member_id]
added_id: empty | member_id
adaptation_id: empty | EQ-002 | EQ-061
guild_response_id: empty | retain_loan | add_recruit
retained_item_id: empty | EQ-002 | EQ-061
coin: integer
company_size: 2 | 3
route_id: empty | R6-01 | R6-02 | R6-03
trained_member_id: empty | one current member_id
member_level(member_id): 1 | 2
formation_commit_count: 0 | 1
first_reward_committed: bool
adaptation_committed: bool
guild_committed: bool
route_committed: bool
route_reward_committed: bool
training_committed: bool
fifth_reward_committed: bool
```
One run cannot contain duplicate member IDs or duplicate professions in this
bounded fixture.
## 3. Battles 1 And 2: Preserved Pair Foundation
### 3.1 All six starting pairs
Battle 1 resets both members to `100 HP`, the enemy to `100 HP`, and runs for
`7.25 s`. The existing first reward commits `+20 Coin` once after enemy HP is
zero. These are the required results:
| Pair key | Lead response | Second response | Battle-1 lead HP | Diagnosis fact |
|---|---|---|---:|---|
| `HG-WR` | Hearthguard blocks `-18` (`100 -> 82`) | Wayrunner flank counter | `82` | 防住首击;第二位以侧翼反击补伤害。 |
| `HG-FS` | Hearthguard blocks `-18` (`100 -> 82`) | Farstring ranged hit | `82` | 防住首击;第二位以远射打开终结线。 |
| `HG-KH` | Hearthguard `100 -> 82` | Kindhand `+12` | `94` | 防住首击;第二位恢复先行者。 |
| `WR-FS` | Wayrunner evades to `88` | Farstring ranged hit | `88` | 闪避减伤;第二位以远射补伤害。 |
| `WR-KH` | Wayrunner `100 -> 88` | Kindhand `+12`, capped | `100` | 闪避减伤;第二位把先行者恢复至满值。 |
| `FS-KH` | Farstring exposed lead `100 -> 58` | Kindhand `+12` | `70` | 远程成员先行而高暴露;治疗只补回部分损失。 |
The diagnosis names both actual Recruits and their actual actions. The accepted
first-battle qualifier `后排命中` remains unchanged where P9.0R3 uses it; later
pages say `第二位` or the Recruit name.
### 3.2 Unselected adaptation and battle 2
The adaptation page always opens with no selection. Both options name the
actual `lead_id` and the same exact counterfactual:
| ID | Chinese-first option consequence | Battle-2 time |
|---|---|---:|
| `EQ-002` | `钉阵胫甲:先行者只承受 -10;放弃先手。` | `7.05 s` |
| `EQ-061` | `先鸣铃:敌人先失去 28 生命;先行者承受完整 -30。` | `6.00 s` |
Selection and revision mutate only the pending ID. `BeginSecondBattle` is the
single commit. It records one loan, cannot be repeated, and resets battle HP;
it never spends Coin. Battle 2 gives no additional Coin.
| Pair group | `EQ-002` final lead HP | `EQ-061` final lead HP | Reason |
|---|---:|---:|---|
| no Kindhand: `HG-WR`, `HG-FS`, `WR-FS` | `90` | `70` | No recovery follows the veteran hit. |
| has Kindhand: `HG-KH`, `WR-KH`, `FS-KH` | `100` | `82` | Kindhand restores `+12` after the hit. |
Enemy HP reaches zero on every row. Coin remains `20`; the first reward count
remains one. Wayrunner in second position always counters, Farstring always
shoots, and Kindhand always heals.
### 3.3 Six-pair continuation registry
This registry makes the complete path entitlement explicit. Every row may take
either adaptation, either mapped Guild branch, every R6 route, every current
member as the one growth target, and must then reach the first-session result.
| Starting pair | Battle-1 lead HP | Battle-2 `EQ-002 / EQ-061` HP | Retain growth candidates | Add growth candidates |
|---|---:|---:|---|---|
| `HG-WR` | `82` | `90 / 70` | `HG, WR` | after `EQ-002`: `HG, WR, FS`; after `EQ-061`: `HG, WR, KH` |
| `HG-FS` | `82` | `90 / 70` | `HG, FS` | `HG, FS, KH` |
| `HG-KH` | `94` | `100 / 82` | `HG, KH` | `HG, FS, KH` |
| `WR-FS` | `88` | `90 / 70` | `WR, FS` | `WR, FS, KH` |
| `WR-KH` | `100` | `100 / 82` | `WR, KH` | `WR, FS, KH` |
| `FS-KH` | `70` | `100 / 82` | `FS, KH` | `HG, FS, KH`; HG becomes lead |
For each cell, routes `R6-01`, `R6-02` and `R6-03` are legal. The final result
uses the exact HP/time function in section 6.2 and the exact Coin/Company table
in section 6.4; no row stops at an earlier preview boundary.
## 4. Guild Response And Battle 3
### 4.1 Transaction and unselected state
The Guild page inherits the actual pair, field order, selected loan, `20 Coin`
and the battle-2 facts. It opens with neither response selected.
The exact unselected guidance template is:
```text
尚未选择。花 12 金币保留【{loan_name}】,继续使用{loan_effect};
或花 14 金币招募【{added_name}】,{addition_effect}。
选择不会扣款;确认出发后才结算,出发前可更改。
```
The two stable responses are:
| ID | Atomic commit | Persistent consequence in this session |
|---|---|---|
| `retain_loan` | `coin 20 -> 8`; keep the selected loan; Company remains 2. | `EQ-002` remains a lead-pressure brace; `EQ-061` remains a tempo opener. |
| `add_recruit` | `coin 20 -> 6`; return the loan; add exactly the mapped Recruit; Company becomes 3. | Gains one role action, one later training candidate, and state-dependent route coverage. |
The addition is deterministic and must not use the old `missing rear` fallback:
| Starting pair | Prior loan | `added_id` | `field_order` after commit | `addition_effect` |
|---|---|---|---|---|
| `HG-WR` | `EQ-002` | Farstring | `HG, WR, FS` | 增加远射,弥补只有近身回应的阵线;仍没有治疗。 |
| `HG-WR` | `EQ-061` | Kindhand | `HG, WR, KH` | 增加治疗,补回先手装备接受的完整重击;仍没有远射。 |
| `HG-FS` | either | Kindhand | `HG, FS, KH` | 增加受击后恢复,形成远射与治疗两种支援。 |
| `HG-KH` | either | Farstring | `HG, FS, KH` | 增加远射;原 Kindhand 保留 `starting` 身份。 |
| `WR-FS` | either | Kindhand | `WR, FS, KH` | 增加恢复,保护闪避失败后的阵线。 |
| `WR-KH` | either | Farstring | `WR, FS, KH` | 增加远射,换取更稳定的击破节奏。 |
| `FS-KH` | either | Hearthguard | `HG, FS, KH` | Hearthguard 接替先行,修复 Farstring 的高暴露;两名原成员保留身份。 |
This table is both the offer matrix and the duplicate-prevention allowlist.
Any unmapped pair/item, already-present Recruit, insufficient Coin, stale
selection or repeated commit is rejected with zero partial mutation.
### 4.2 Battle-3 event contract
Battle 3 starts all present members at `100 HP` and the captain at `130 HP`.
The deterministic order is:
1. Retained `EQ-061` changes enemy `130 -> 102`; otherwise telegraph only.
2. Captain pressure changes lead to `90` with retained `EQ-002`, otherwise
`70`.
3. Each non-lead profession acts once in field order: Wayrunner `-30` enemy,
Farstring `-36` enemy, Kindhand `+12` lead.
4. A retained two-member build follows up and clamps enemy to at most `44`;
a three-member build proceeds directly to coordination.
5. Coordination clamps enemy to `26` for two members or `32` for three.
6. The finisher changes enemy to `0`. Battle 3 gives no Coin.
The accepted durations remain `7.60 s` for retained `EQ-002`, `6.60 s` for
retained `EQ-061`, and `7.00 s` for an added Recruit.
### 4.3 Complete battle-3 branch table
Each row represents two legal Guild branches for one pair/adaptation state.
`HP/time/coin/company` are the exact battle-3 result.
| Pair | Loan | Retain result | Add result |
|---|---|---|---|
| `HG-WR` | `EQ-002` | `90 / 7.60 / 8 / 2` | add FS; `70 / 7.00 / 6 / 3` |
| `HG-WR` | `EQ-061` | `70 / 6.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` |
| `HG-FS` | `EQ-002` | `90 / 7.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` |
| `HG-FS` | `EQ-061` | `70 / 6.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` |
| `HG-KH` | `EQ-002` | `100 / 7.60 / 8 / 2` | add FS; `82 / 7.00 / 6 / 3` |
| `HG-KH` | `EQ-061` | `82 / 6.60 / 8 / 2` | add FS; `82 / 7.00 / 6 / 3` |
| `WR-FS` | `EQ-002` | `90 / 7.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` |
| `WR-FS` | `EQ-061` | `70 / 6.60 / 8 / 2` | add KH; `82 / 7.00 / 6 / 3` |
| `WR-KH` | `EQ-002` | `100 / 7.60 / 8 / 2` | add FS; `82 / 7.00 / 6 / 3` |
| `WR-KH` | `EQ-061` | `82 / 6.60 / 8 / 2` | add FS; `82 / 7.00 / 6 / 3` |
| `FS-KH` | `EQ-002` | `100 / 7.60 / 8 / 2` | add HG and reform; `82 / 7.00 / 6 / 3` |
| `FS-KH` | `EQ-061` | `82 / 6.60 / 8 / 2` | add HG and reform; `82 / 7.00 / 6 / 3` |
## 5. Route Choice And Battle 4
### 5.1 Offers and state-derived coverage
The route board opens unselected and displays current Company, retained item or
added Recruit, known pressure, exposure, reward, coverage state and a causal
reason. It never displays future exact HP or marks a recommendation.
Exact unselected guidance:
```text
尚未选择路线。比较已知压力、当前应对与胜利奖励;
选择只会打开复核,确认出发前仍可返回更换。
```
Each option uses this exact fact order:
```text
【{route_name}】|{pressure_name}|{exposure_label}|胜利 +{reward} 金币
{coverage_label}:{coverage_reason_zh}
```
| ID | Pressure | Reward |
|---|---|---:|
| `R6-01` 风墙长堤 | 正面粉碎 | `+4 Coin` |
| `R6-02` 钟晶疾道 | 速度爆发 | `+7 Coin` |
| `R6-03` 双辉裂谷 | 标记并分击 `marked_id` | `+10 Coin` |
Coverage is evaluated from actual state:
| Route | `covered` | `partial` | `gap` |
|---|---|---|---|
| `R6-01` | retained `EQ-002` directly braces the crush | Company 3 with Kindhand recovers after impact | all other states |
| `R6-02` | retained `EQ-061` acts before the burst | any Company 3 responds with an extra action after the burst | retained two-member state without `EQ-061` |
| `R6-03` | Company 3 contains both Farstring and Kindhand | Company 3 lacks one of those roles | every two-member state |
The reason must name the actual item/member and limitation. Example:
`部分应对:赛布尔能在爆发后恢复先行者,但不能打断首次伤害。`
Selection mutates only `route_id`. Review mutates nothing and can return to the
same selection. `commit_route` is the single lock/start boundary and costs no
Coin. Reward commits once only after enemy HP is zero.
### 5.2 Complete battle-4 result function
Battle 4 resets all members to `100 HP` and the enemy to `120 HP`. The result
uses one of these mutually exclusive build rows. `KH?` means Kindhand is
present. `FS+KH?` means both are present.
| Build state | R6-01 lead / marked / time | R6-02 lead / marked / time | R6-03 lead / marked / time |
|---|---|---|---|
| retained `EQ-002`, no KH | `90 / 100 / 7.40` | `70 / 100 / 8.00` | `100 / 65 / 7.80` |
| retained `EQ-002`, KH | `100 / 100 / 7.40` | `82 / 100 / 8.00` | `100 / 77 / 7.80` |
| retained `EQ-061`, no KH | `60 / 100 / 6.40` | `70 / 100 / 6.00` | `100 / 65 / 6.70` |
| retained `EQ-061`, KH | `72 / 100 / 6.40` | `82 / 100 / 6.00` | `100 / 77 / 6.70` |
| Company 3, no KH | `70 / 100 / 7.00` | `70 / 100 / 6.80` | `100 / 65 / 7.00` |
| Company 3, KH but not FS | `82 / 100 / 7.00` | `82 / 100 / 6.80` | `100 / 77 / 7.00` |
| Company 3, FS + KH | `82 / 100 / 7.00` | `82 / 100 / 6.80` | `100 / 88 / 7.00` |
Battle-4 pressure is exact:
- R6-01: retained `EQ-002` deals `-10`; a three-member line deals `-30`;
retained `EQ-061` deals `-40`. Kindhand then restores `+12` to lead.
- R6-02: pressure deals `-30`. Kindhand then restores `+12` to lead. Retained
`EQ-061` changes enemy `120 -> 90` before pressure.
- R6-03: pressure deals `-35` to `marked_id`. Kindhand restores `+12`; a
three-member Farstring + Kindhand line instead performs one combined `+23`
recovery, preserving the accepted `65 -> 88` anchor.
- Every non-lead Wayrunner/Farstring performs one actual attack. A closer
clamps enemy to `28`, then the finisher changes it to `0`.
Coin after the once-only route reward is:
| Guild branch | R6-01 | R6-02 | R6-03 |
|---|---:|---:|---:|
| retained loan | `12` | `15` | `18` |
| added Recruit | `10` | `13` | `16` |
Company size and membership never change at the route boundary.
## 6. Individual Growth And Battle 5
### 6.1 Offer contract
Training opens only from a verified battle-4 result with route reward committed.
It shows every current member, current field position, origin, profession,
current level and exact next-event change. No member is selected initially.
An absent member never renders and is illegal.
Exact unselected guidance:
```text
尚未选择历练成员。比较先行承压、标记者生存、射击节奏与恢复;
唯一印记只能让一名当前成员升至 Lv.2,确认前可换人。
```
Selection mutates only the pending member ID. Review names the same member and
one exact counterfactual. `commit_training` consumes the one bounded veteran
mark, changes exactly that member to `Lv.2`, locks once and starts battle 5.
Every other member remains `Lv.1`.
The Chinese option templates are:
| State | Exact template |
|---|---|
| Hearthguard lead | `历练【{name}】:正面重压再减少 20;先行者生命 {base_lead} -> {trained_lead}。` |
| Wayrunner lead | `历练【{name}】:闪避再减少 20 正面伤害;先行者生命 {base_lead} -> {trained_lead}。` |
| Wayrunner is `marked_id` | `历练【{name}】:自身分裂伤害减少 20;受击后生命 60 -> 80(治疗另行结算)。` |
| Farstring | `历练【{name}】:唯一射击提前;不增加次数;用时 7.40 -> 6.40 秒。` |
| Kindhand | `历练【{name}】:对受伤标记者的恢复 +12 -> +25。` |
### 6.2 Battle-5 calculation
Battle 5 resets each present member to `100 HP` and the enemy to `140 HP`.
The deterministic sequence is:
1. A trained Farstring performs its only `-30` shot (`140 -> 110`) before
pressure.
2. Lead pressure is `-30` with retained `EQ-002`, otherwise `-45`.
A trained lead Hearthguard/Wayrunner removes another `20`.
3. Split pressure is `-40` to `marked_id`; a trained marked Wayrunner removes
`20` from its own hit.
4. Unspent member actions resolve once. Farstring deals `-30`; Wayrunner deals
`-30`; Kindhand restores `+25` when trained, otherwise `+12`, to `marked_id`.
5. The Company/retained-build closer and finisher change enemy to `0`.
6. Verified victory commits `+8 Coin` exactly once.
The result functions are therefore:
```text
base_lead_hp = 70 when retained_item_id == EQ-002, otherwise 55
lead_hp = base_lead_hp + 20 only when trained member is current lead
and profession is Hearthguard or Wayrunner
marked_hp_after_split = 80 only when trained member == marked_id
and profession == Wayrunner;
otherwise 60
marked_hp = clamp(marked_hp_after_split + kindhand_heal, 0, 100)
kindhand_heal = 25 when Kindhand is trained, 12 when Kindhand is present,
otherwise 0
time = 6.40 when Farstring is trained, otherwise 7.40
enemy_hp = 0
```
Route changes inherited Coin and the causal recap, but does not secretly alter
this fixed encounter.
### 6.3 Complete growth-state matrix
Cells use `trained member: lead HP / marked HP / time`. This table enumerates
every distinct state reachable from all six pair paths. Route choice adds Coin
per section 6.4 but does not change a cell.
| Starting/Guild state | Legal training results |
|---|---|
| `HG-WR`, retain `EQ-002` | `HG: 90/60/7.40`; `WR: 70/80/7.40` |
| `HG-WR`, retain `EQ-061` | `HG: 75/60/7.40`; `WR: 55/80/7.40` |
| `HG-WR`, add FS after `EQ-002` | `HG: 75/60/7.40`; `WR: 55/80/7.40`; `FS: 55/60/6.40` |
| `HG-WR`, add KH after `EQ-061` | `HG: 75/72/7.40`; `WR: 55/92/7.40`; `KH: 55/85/7.40` |
| `HG-FS`, retain `EQ-002` | `HG: 90/60/7.40`; `FS: 70/60/6.40` |
| `HG-FS`, retain `EQ-061` | `HG: 75/60/7.40`; `FS: 55/60/6.40` |
| `HG-FS`, add KH | `HG: 75/72/7.40`; `FS: 55/72/6.40`; `KH: 55/85/7.40` |
| `HG-KH`, retain `EQ-002` | `HG: 90/72/7.40`; `KH: 70/85/7.40` |
| `HG-KH`, retain `EQ-061` | `HG: 75/72/7.40`; `KH: 55/85/7.40` |
| `HG-KH`, add FS | `HG: 75/72/7.40`; `KH: 55/85/7.40`; `FS: 55/72/6.40` |
| `WR-FS`, retain `EQ-002` | `WR: 90/60/7.40`; `FS: 70/60/6.40` |
| `WR-FS`, retain `EQ-061` | `WR: 75/60/7.40`; `FS: 55/60/6.40` |
| `WR-FS`, add KH | `WR: 75/72/7.40`; `FS: 55/72/6.40`; `KH: 55/85/7.40` |
| `WR-KH`, retain `EQ-002` | `WR: 90/72/7.40`; `KH: 70/85/7.40` |
| `WR-KH`, retain `EQ-061` | `WR: 75/72/7.40`; `KH: 55/85/7.40` |
| `WR-KH`, add FS | `WR: 75/72/7.40`; `KH: 55/85/7.40`; `FS: 55/72/6.40` |
| `FS-KH`, retain `EQ-002` | `FS: 70/72/6.40`; `KH: 70/85/7.40` |
| `FS-KH`, retain `EQ-061` | `FS: 55/72/6.40`; `KH: 55/85/7.40` |
| `FS-KH`, add HG and reform | `HG: 75/72/7.40`; `FS: 55/72/6.40`; `KH: 55/85/7.40` |
For `add` rows shared by both prior loans, the returned loan has no battle-5
effect, but the result history must still retain which adaptation was returned.
### 6.4 Final resources
| Guild branch | R6-01 final Coin | R6-02 final Coin | R6-03 final Coin | Company |
|---|---:|---:|---:|---:|
| retained loan | `20` | `23` | `26` | `2` |
| added Recruit | `18` | `21` | `24` | `3` |
The final Company has exactly one Lv.2 member, enemy HP `0`, and no persistent
item/inventory claim beyond the current in-memory session.
## 7. Result Causality And Next Action
Every result presents action, cause, changed state and next action in that
order. Values are substituted from the committed snapshot; UI code must not
recompute pair logic.
### 7.1 Chinese-first result templates
**Battle 1 / pair diagnosis**
```text
发生了什么:系统让【{lead_name}】先行;{lead_action_zh}。
为什么:【{second_name}】随后{second_action_zh}。
状态变化:先行者 {lead_hp}/100;获得 20 金币(仅一次)。
下一步:比较钉阵胫甲与先鸣铃,选择本队下一战的安全或节奏。
```
**Battle 2 / adaptation result**
```text
发生了什么:【{loan_name}】让{loan_action_zh}。
为什么:【{lead_name}】{lead_consequence_zh};【{second_name}】{second_action_zh}。
状态变化:先行者 {lead_hp}/100;用时 {time} 秒;金币仍为 20。
下一步:返回公会,在保留这件装备与招募【{mapped_recruit_name}】之间选择。
```
**Battle 3 / Guild result**
```text
发生了什么:你选择了【{guild_response_name}】;{guild_action_zh}。
为什么:{battle3_cause_zh}。
状态变化:先行者 {lead_hp}/100;金币 {coin};小队 {company_size} 人;用时 {time} 秒。
下一步:打开路线板,比较三条路线对当前【{build_summary_zh}】的覆盖与奖励。
```
**Battle 4 / route result**
```text
发生了什么:小队通过【{route_name}】,获得 {route_reward} 金币。
为什么:路线压力是【{pressure_name}】;当前构筑为【{coverage_label}】,因为{coverage_reason_zh}。
状态变化:先行者 {lead_hp}/100;【{marked_name}】{marked_hp}/100;金币 {coin};用时 {time} 秒。
下一步:用唯一历练印记选择一名当前成员升至 Lv.2;确认前可返回换人。
```
**Battle 5 / first-session result**
```text
发生了什么:【{trained_name}】升至 Lv.2;{training_effect_zh}。
为什么:{battle5_cause_zh};此前【{guild_response_name}】与【{route_name}】分别决定了小队结构和金币。
状态变化:先行者 {lead_hp}/100;【{marked_name}】{marked_hp}/100;金币 {coin};小队 {company_size} 人;用时 {time} 秒。
决定链:{pair_names} -> {loan_name} -> {guild_response_name} -> {route_name} -> 历练 {trained_name}。
下一步:本次首局已结束。可重新开始尝试另一组搭配,或返回主菜单;后续章节尚未开放。
```
English follows the same fact order and substitutes the same IDs/numbers. It
must not shorten away the cause, choice or next action. At 130% text, the copy
may wrap but no fact may be removed.
### 7.2 Unsupported-state truthfulness
If a committed snapshot violates any allowlist or exactly-once precondition,
the game must not fabricate a battle or result. It remains on the last valid
decision state and exposes a bounded recovery message:
```text
当前选择与小队状态不一致,未进行结算。请返回并重新选择。
```
No route may enter an old `front + rear` fallback, label Wayrunner/FS as
Kindhand, recruit a duplicate, train an absent member, pay twice, grant a
reward before enemy defeat, or navigate to an unimplemented next chapter.
## 8. Transaction And Exactly-Once Boundaries
| Boundary | Preconditions | Atomic mutations | Duplicate/out-of-state behavior |
|---|---|---|---|
| formation commit | exactly two distinct allowlisted members; valid automatic order | set pair/origins/order; count `0 -> 1`; start battle 1 | inert |
| first reward | battle-1 enemy `0`; not committed | `coin += 20`; flag true | inert |
| adaptation commit | adaptation page; one legal loan; not committed | lock loan; flag true; start battle 2 | inert |
| Guild commit | Guild page; mapped response; enough Coin; not committed | revalidate; spend once; retain or add/reform; update Company; flag true; start battle 3 | reject with zero partial mutation |
| route commit | review page; legal route; not committed | lock state snapshot; flag true; start battle 4 | inert |
| route reward | route committed; enemy `0`; reward not committed | add `4/7/10`; flag true | inert |
| training commit | review page; member currently present; mark available; not committed | consume mark; set that member Lv.2; flag true; start battle 5 | reject with zero partial mutation |
| fifth reward | training committed; enemy `0`; not committed | `coin += 8`; flag true | inert |
Selection/revision/review/back never spends, rewards, recruits, levels or starts
a battle. Home and confirmed Restart clear the complete transient snapshot,
all selections, origins, members, levels, items, Coin and commit flags. Cancel
Restart changes none of them.
## 9. Decision-Density And Non-Dominance Audit
No option dominates across every pair/state and all visible outcomes:
| Decision | Option with a rational best case | Counter-option with a rational best case | Proof of tradeoff |
|---|---|---|---|
| Adaptation | `EQ-002` maximizes battle-2 lead HP and later covers R6-01 if retained. | `EQ-061` is `1.05 s` faster in battle 2 and later covers/accelerates R6-02 if retained. | Safety and tempo move in opposite directions. |
| Guild | Retain leaves `2` more final Coin and preserves brace or tempo. | Add supplies a third action/training candidate and can cover R6-03 with FS+KH. | Equipment/wealth versus roster breadth; neither contains the other. |
| R6-01 | Best lead survival for retained `EQ-002`. | R6-02 is fastest with `EQ-061`; R6-03 pays `3-6` more Coin. | Survival, time and reward have different maxima. |
| R6-02 | Best time for retained `EQ-061`. | R6-01 protects brace builds; R6-03 rewards full FS+KH coverage. | Its value changes with retained item and Company. |
| R6-03 | Highest reward and covered by a three-member FS+KH line. | Two-member/no-heal states preserve only `65` marked HP, making safer routes legible alternatives. | Reward rises with targeted-member exposure. |
| Growth | Lead HG/WR maximizes lead HP. | Marked WR maximizes its own split survival; FS minimizes time; KH maximizes recovery. | One mark cannot improve all three metrics. |
State changes visibly alter value rather than only wording:
- `HG-WR + EQ-002` offers Farstring at the Guild; `HG-WR + EQ-061` offers
Kindhand, so the prior adaptation changes the roster opportunity.
- Adding Hearthguard to `FS-KH` changes the lead and removes the unsupported
fragile-lead continuation.
- R6-03 changes from `gap/65 marked HP` in a two-person build to
`covered/88` only for a three-person FS+KH support line.
- Training a second-position Wayrunner changes its own marked HP `60 -> 80`
instead of incorrectly improving another member because of an old slot
assumption.
## 10. Deterministic Coverage Required For Implementation
The implementation contract and tests must expand the compact functions above
into these complete products:
```text
formation: 6 unordered pairs x 2 click orders
battle 2: 6 pairs x 2 adaptations = 12
battle 3: 12 pair/adaptation states x 2 Guild responses = 24
battle 4: all 24 prior branches x 3 routes = 72
battle 5: each of those 72 branches x every present member (2 or 3)
```
For every row, assert identities/origins, field order, actual role events,
lead/marked/enemy HP, time, Coin, Company, retained/returned item, route
coverage/reward, exactly one Lv.2 member, all commit flags, Chinese causal facts
and the two legal final actions. Counterfactual tests must include:
- Wayrunner as second member (`HG-WR`) and as lead (`WR-FS`, `WR-KH`);
- exposed Farstring lead before and after `FS-KH` adds Hearthguard;
- `HG-WR` adding different Recruits from the two prior loans;
- original Kindhand moving behind an added Farstring while remaining
`marked_id`;
- Company 3 without Kindhand (`HG-WR-FS`), without Farstring (`HG-WR-KH`),
and with both (`HG-FS-KH`, `WR-FS-KH`);
- every invalid ID, duplicate/stale commit, insufficient-Coin commit, absent
training member and premature reward.
This matrix is the game-design authority for P9.1 reconciliation. UX may choose
layout and architecture may choose representation, but neither may change the
IDs, state dependency, mutations, exact numeric results, decision meaning or
result causality without returning to the game-design boundary.