Update upstream master (2026-09-22): !36-!45 wave — reps pipeline, votes, plugin-gated migrations
Supersedes !1 (closed) (its content is fully included). Brings upstream master (028ab66a + !45 fixes cherry-picked) into palestine/risefor-lobbying:
- !36-!41: import hardening, exclude-party/representatives, scrutins models + votes, perf fixes
- !42-!44: reps data pipeline (AN downloads, senat.fr harvest, photos), fresh-by-default + multi-row ADD semantics
- !45: s.law runtime gate in vote-history + plugin-gated 0276 + 0269 placeHemicycle dedup
Fork-specific migration graph fixes (fresh clones of the fork failed before AND after the upstream merge):
-
0277_post_update_merges: no-op node joining the 5 leaves (fork drift 0235/0250/0260 + 0269_import_fields + 0276) - redundant upstream
0277_post_master_mergesremoved (same join, superset stays) -
0240: pinned0233_autochain as dependency — Django's plan could reach 0240 via 0250_merge before the orphan chain that re-addsrepresentativeFunction.name_en(FieldDoesNotExist on fresh clones)
Tested (isolated /tmp env, flag OFF = palestine's prod config): fresh migrate exit 0 (was broken pre-merge AND pre-existing before this wave); schema asserted: no targetLaw/titleRelatedLaw/scrutin.law, placeHemicycle+birthDate present; pages 200; flag-ON fresh cell also green (guard vs accidental flip). Existing instance DB unaffected (all these migrations already applied; Django tracks by name).
Conflict resolution: import_elected_gouv.py → upstream version (eb1c4a65 supersedes the fork's broken 7cebe66f --exclude-party).