contract_id and contract_product_id to pl_plan_load_product and pl_plan_delivery_product (models, docs/sql/, migration script) and verify SQLAlchemy metadata and DDL comments match_validate_contract_product_package_specs and validateContractProductPackageSpecs while keeping ≥1 spec per line; verify a unit/frontend-equivalent test saves two lines with the same product and packagecrm-contract-multi-package-shared-qty that require global package uniqueness; verify remaining shared-pool tests still passpl_contract_plan_qty.py aggregation and match to prefer contract_product_id, with product+package fallback only when id is missing; verify tests that two same-package lines do not share remainingcontractProductId and return that line's pool remaining; verify query with two duplicate-package lines returns distinct remainingassert_contract_qty (or equivalent) testsassert_at_most_one_contract for load/delivery (keep or parameterize supplier/demander); verify test_pl_plan_single_contract_rules.py allows two load/delivery contracts and still rejects missing contract on external stopscontractId/contractProductId on create/update and validate product+package against that line and stop contract set; verify API save round-tripContractFormDialog (and form.vue if still used); verify save no longer toasts 「同一产品的包装规格不能重复」PlPlanFormDialog; replace add-product with contract-line picker (contract no, package, price, remaining); verify two rows of the same SKU can be addedconfirmOverage; verify without flag 422 and with flag posts only to named linespython scripts/check_field_consistency.py for touched entities; verify CI-relevant tests passdocs/superpowers/demos/2026-10-05-contract-plan-line-qty-demo.html for UI parity (picker, overage dialog, driver card)