Follow-up from PR #1359 QA-2 (PASS, non-blocking; report: #1359 (comment)).
- IMP-1 (arch-qa ARCH-001, rust-qa-agent QA-003): the collision-narrowing glue around the shared
roster_write_delta helper is still duplicated in crates/atm-core/src/team_admin/member_mutation.rs (~470-486) and crates/atm-storage-rusqlite/src/roster_store.rs (~284-299), and preflight calls roster_unique_name_collisions() twice. Extract the narrowing into the shared contract helper so each site is one call.
- IMP-2 (arch-qa ARCH-002, ruthless-boundary-qa RBQA-F002): no test proves
preflight_roster_unique_names and a real SqliteRosterStore agree on an identical fixture; unique_name_i01 exercises only SQL, unique_name_a31 only preflight against TestRosterStore, whose replace_roster is a non-validating seed. Add a parity test that runs both layers against the same seed/write fixtures (legacy collision + metadata-only update, changed name, new name) asserting identical accept/reject.
- Minor:
docs/plans/phase-ay/herdr-naming-test-matrix.md row text typos (a26 "but" -> "and", a27 "reuses" -> "creates").
Cipher-sized; batch with the next roster change rather than its own CI cycle. Refs #1356.
Follow-up from PR #1359 QA-2 (PASS, non-blocking; report: #1359 (comment)).
roster_write_deltahelper is still duplicated incrates/atm-core/src/team_admin/member_mutation.rs(~470-486) andcrates/atm-storage-rusqlite/src/roster_store.rs(~284-299), and preflight callsroster_unique_name_collisions()twice. Extract the narrowing into the shared contract helper so each site is one call.preflight_roster_unique_namesand a realSqliteRosterStoreagree on an identical fixture;unique_name_i01exercises only SQL,unique_name_a31only preflight againstTestRosterStore, whosereplace_rosteris a non-validating seed. Add a parity test that runs both layers against the same seed/write fixtures (legacy collision + metadata-only update, changed name, new name) asserting identical accept/reject.docs/plans/phase-ay/herdr-naming-test-matrix.mdrow text typos (a26 "but" -> "and", a27 "reuses" -> "creates").Cipher-sized; batch with the next roster change rather than its own CI cycle. Refs #1356.