--- id: capability title: Forces and doctrines map to each other status: blocked dependsOn: [tactics] exitCriterion: > Selecting a lance for a doctrine and inferring a doctrine from that lance round-trips. --- # capability Both directions are the same projection. Give each design a capability vector in the **same basis** as the behavioural features, and then: - doctrine -> lance is a knapsack under BV, C-bill or availability constraints - lance -> doctrine is a constrained least squares over the simplex helm already computes most of it: `max_range`, `heat_efficiency`, `damage_at_6/7/9/18`, `single_damage_at_15/18` are the range profile, the sustain-fire signal and the punch-versus-sandblast axis. - [ ] Capability vector as a pure function of stats and equipment, in the feature basis - no hand-labelled unit tiers - [ ] Selection under multiple constraints: BV, C-bills, faction, era - [ ] Inference from a lance - [ ] **Round-trip test**: `infer(select(lens)) ~= lens`, at zero noise. If it does not round-trip, the basis is wrong or the capability model is lossy - [ ] Mismatch score surfaced at authoring time - "this doctrine and this lance disagree". Same computation as the runtime `role_conflict`, different input - [ ] A green commander should select a slightly mismatched lance; run the same bias through selection