# Ordinary Allocation group assignment: pure planner checkpoint Status: implemented and verified as a pure planner; App wiring and native acceptance remain pending. Source commit `33e880103c5fa935a4431ec3dc089e2c4c92f680`, on the Allocation contribution branch above the [Arrange foundation](allocation-arrange-planner-20260923.md). This is a branch-specific checkpoint, not an integrated application release. Required behavior comes from [multiselect](multiselect-contract-20260923.md), [Allocation v2](release-activity-allocation-drag-contract-v2-20260911.md) and the [explicit Arrange amendment](allocation-arrange-amendment-20260923.md). No core model, source schema or user-owned specification changed. ## Result and design Ordinary assignment captures every original visible work placement before normalizing selected semantic ancestors. It collects the union of leaf work, including unplaced leaves, and existing active placements, including folded descendants. Each normalized root retains its own accepted responsibility: independent roots may start under different performers; a distributed composite still refuses ordinary assignment. Already-correct role-only work does not gain a direct Allocation merely because another selected root changes performer. One destination plan accumulates stable IDs, unique aliases and intended edits, prepares one semantic Batch, and compares the complete candidate Project with the intended result. Existing Allocation IDs and header metadata survive retargeting. Outside removes only intended direct Allocations and their own saved routes across views. Role exits and collateral changes to surviving records refuse the whole plan. Warning collection and changed/already-correct leaf counts are retained for future App feedback. One shared geometry helper now serves singleton assignment, group assignment and explicit Arrange. It uses accepted endpoint ownership and the complete movement map: internal pins translate once, one-ended pins stay fixed, labels and attachments remain exact. Geometry checks compare whole visible scenes and the affected/ancestor diagnostic expansion, require rigid affected footprints and every original selected header, and authorize target unfolding only when assignment actually changes. Accepted and candidate expansion use their own ancestry. Per-pointer placement does not clone or validate a Project or rebuild semantic indexes. Finish rechecks the entire live Project and recomputes the placement before one exact source Batch. Zero movement can still change assignment; complete Project equality alone yields no command. ## Verification Windows gnullvm, cargo/rustc 1.98.1, LLVM-MinGW 20260826, one Cargo build job, incremental disabled. Linux remains user-deferred. The focused example imports the actual production planner and Document modules; it is not a substitute implementation. Commands: ```powershell cargo test -p oa-desktop --example allocation_policy_probe --message-format=json -- --test-threads=1 cargo clippy -p oa-desktop --example allocation_policy_probe --tests --message-format=json -- -D warnings cargo fmt --all -- --check ``` Final canonical-byte gates: `assignment-planner-3` **84 passed, 0 failed**, `assignment-lint-2` strict lint passed, `assignment-format-2` passed. Each captured 750 unchanged inputs, including 71 vendored dependency files and both explicit compiled fixtures; all captured blobs compare exactly with source commit `33e880103c5fa935a4431ec3dc089e2c4c92f680`. Final input-map SHA256: `ce988ecaeaca395d0f120844db7e3da90d039633beef10d2d4a8b8f19e92ee27`. The 14 added test families cover OA/SA independent roots and original identity, normalization/unplaced work, distributed composite versus independent leaves, role provenance and unresolved OA roles, stable IDs/aliases, zero-delta semantic change, target unfold and newly exposed overlap, simultaneous vacated-space movement, internal/external routes with explicit attachments and SA port anchor, own-route deletion across views, surviving Constraint collateral refusal, stale/tampered results and all selected headers. Existing singleton/Arrange and Document tests remain in the same passing suite. Positive tests use independently authored complete Projects and actual Document execute, source compilation/reopen and exact one-step Undo/Redo. The source-budget case executes the actual group command against an existing Document with Undo and Redo available, preserves Project/bundle/revision, and exercises both history paths after refusal. The same command/IDs then succeed in a fresh normal-budget Document; this is not evidence of same-session gesture retry. Independent review found no concrete planner defect. A second pass reviewed the added evaluators and found no blocking invalid fixture or circular oracle. It inspected the captured 84-test result without claiming its own execution. Exact historical notes and newline diagnosis are in the [review archive](allocation-assignment-evidence-20260923/reviews/README.md). ## Evidence identity and limits The [portable gate package](allocation-assignment-evidence-20260923/checks/README.md) retains seven runs: the first 75-test capture, expanded 84-test capture, initial lint/format and three final canonical-byte gates. Initial expanded checks passed, but exact Git comparison refused because `arrange.rs` was CRLF in the working tree and LF in the committed blob. The independently checked difference was newline-only. Those historical captures are not attributed to the pristine commit and have no source-proof receipt. The file was restored to the committed bytes and all three gates rerun. No receipt or historical log was rewritten. Run the package verifier with `python -B checks/verify.py` from the evidence directory. It checks archive/receipt consistency and pinned historical source proofs, not external authenticity or a new Git comparison. The report's named source comparisons were executed separately against actual Git blobs. Remaining focused protective coverage includes deeper folded-grandchild group reassignment and a changed-assignment enclosure-growth blocker. Existing singleton and shared geometry coverage reduces but does not remove those gaps. Role warning collection is reviewed; the new role tests do not independently assert every warning code/severity. There is no new App execution, full desktop test run, matching GUI build or native acceptance for this checkpoint. Exact typed selection, frozen pointer target, minimum readable zoom, pending-click behavior, sticky drag threshold, selection generation, clean-owner admission and focus/camera/token retirement remain the App adapter's obligations. The archived App plan is design only. Neither this checkpoint nor the earlier Arrange foundation closes issue 29 or authorizes a combined release; the coordinated integration/release owner is unchanged.