magicciv/.project/objectives/p2-55c-freepeople-capture.md
Natalie 61d82362fb docs(@projects): 📝 update caravan master capture doc with resolved mechanics
Co-Authored-By: Lilith Autocommit <noreply@atlilith.com>
2026-05-14 23:08:33 -07:00

3.6 KiB

id title priority status scope category owner created updated_at blocked_by follow_ups
p2-55c Freepeople capture mechanics p2 oos game1 combat combat-dev 2026-05-07 2026-05-14
p2-55

Context

Originally deferred because freepeople were assumed to have a multi-stage lifecycle (unlanded → settler → integration) needing its own spec before capture rules could compose with it. Resolved 2026-05-14: the freepeople model that actually shipped in p0-34 does not include that lifecycle, and freepeople capture is structurally inapplicable to the p2-55 mechanism. Closing as oos — scope-folded into p0-34.

Why freepeople capture is structurally inapplicable

Verified against the codebase (2026-05-14):

  1. No owning player. public/resources/units/dwarf_wanderer.json is faction: "freepeople", unit_type: "support", keywords: ["freepeople", "non_combatant", "prologue_spawnable"], ai_profile: "freepeople". Freepeople wanderers are unowned NPCs. The p2-55 capture pipeline (mc-turn::TurnProcessor::transfer_captured_unit, ransom queue) indexes by defender_player: u8 — there is no player slot for a freepeople unit to be transferred from, and no player to pay or receive a ransom.
  2. Marked non_combatant. They cannot mount an attack (attack=0, attack_type=none) and the keyword gates the attack surface. The capture-posture branch in mc-combat::resolver triggers on a lethal blow against a defender_capturable unit; the surface is never opened for freepeople.
  3. Replaced by a different mechanic. The actual freepeople absorption path that shipped in p0-34 is mc-ecology::freepeople_camps::scan_and_form_camps — when 3+ freepeople end a turn within TRIBE_CONVERGENCE_RADIUS of each other, they merge into a nomadic_band camp (per public/resources/villages/freepeople.json). Camps grow → freehavens → potential city-states. Combat capture was never the design — freepeople integrate ecologically, not militarily.

The "unlanded → settler → integration" lifecycle referenced in this objective's original design questions does not exist in the codebase. p0-34 shipped a simpler wanderer / camp / haven model, and that model is the canonical freepeople surface for Game 1.

What the original acceptance bullets become

  • Freepeople lifecycle spec finalized — not needed. p0-34's wanderer / nomadic_band / freehaven progression is the spec.
  • Capture rules for each lifecycle stage defined and locked — N/A. No combat-capture surface for any freepeople stage.
  • Freepeople unit(s) carry capturable: true with lifecycle-appropriate ransom_multiplier — would corrupt the p0-34 model. dwarf_wanderer.json intentionally lacks capturable because freepeople are not owned, are not combatants, and integrate via the ecological camp-formation path (mc-ecology), not via the military capture path (mc-combat / mc-turn).
  • Tests cover each capture scenario per lifecycle stage — N/A.
  • cargo test -p mc-combat green — N/A; no code change.

Disposition

Status: oos (out-of-scope for Game 1). No code or data changes land. Freepeople absorption is owned by p0-34 (done) and the mc-ecology camp-formation tests. If a future game (Game 2 "Age of Kzzykt" or later) introduces a freepeople lifecycle with player allegiance, this objective can be reopened against that scope — but that is explicitly Game 2+ territory.

Notes

  • Originally blocked on p2-55 (resolved) and on freepeople lifecycle spec (never created — the simpler p0-34 model replaced it).
  • Closes 0/0 implementable bullets — no acceptance criteria remain in scope. This is a scope-resolution close, not a partial-credit close.