After #31 the three producer archetypes are behaviorally identical, surviving only as
hand-maintained wiring identity. Collapse them — and the place-named transport/sea-lane
roles — into one generic set differentiated only by PDL entity id, so a new entity wires
itself with no topology.py edit.
Archetypes are declared in data (sidecar until the PDL carries the field), not inferred
from (type, sector). Wholesalers become one per producer. Fertilizer binds all producers,
derived from dependencies — behavior change, needs re-baseline.
Producer list names are the output schema, including DB table names in tick_writer.py.
Two silent traps. _peer_list() is an if/elif over the 8 place-named roles: rename the
roles first and every peer count is wrong, silently corrupting every volume division.
And origin switching came from the wholesaler's demand target, not the price sort — a
greedy sort at Rotterdam without one changes nothing.
Acceptance staged: byte-for-byte pure refactor first, behavior changes after. Supersedes #19.
After #31 the three producer archetypes are behaviorally identical, surviving only as
hand-maintained wiring identity. Collapse them — and the place-named transport/sea-lane
roles — into one generic set differentiated only by PDL entity id, so a new entity wires
itself with no topology.py edit.
Archetypes are declared in data (sidecar until the PDL carries the field), not inferred
from (type, sector). Wholesalers become one per producer. Fertilizer binds all producers,
derived from dependencies — behavior change, needs re-baseline.
Producer list names are the output schema, including DB table names in tick_writer.py.
Two silent traps.
_peer_list()is an if/elif over the 8 place-named roles: rename theroles first and every peer count is wrong, silently corrupting every volume division.
And origin switching came from the wholesaler's demand target, not the price sort — a
greedy sort at Rotterdam without one changes nothing.
Acceptance staged: byte-for-byte pure refactor first, behavior changes after. Supersedes #19.