Version 0.38
July 16, 2026
Bulk changes only for the cards you selected
Bulk archive, restore, and transfer now stay tied to the exact cards and student destination David saw; if anything changed, SimDeck rejects the entire action instead of overwriting newer classroom work.
Why it matters
- - A stale game-desk tab cannot archive, restore, or transfer a card after another classroom action changed it.
- - One changed or missing card stops every selected update and the activity record, preserving all-or-nothing classroom state.
- - A changed transfer destination also stops the action, and the 95-card limit keeps each batch within the atomic Appwrite boundary.
Verification
- - All 312 unit tests pass across 32 files, including malformed and duplicated selections, the 95-card limit, stale rendered cards, in-transaction changes, compare-and-set misses, destination changes, rollback, and activity metadata.
- - Critical-source coverage is 84.95% statements, 71.18% branches, 95.97% functions, and 93.14% lines; the new bulk-selection helper is 100% covered for statements, branches, functions, and lines.
- - All 465 public smoke and accessibility cases pass across Chromium, Firefox, WebKit, Mobile Chrome, and Mobile Safari, including the Version 0.38 release entry.
- - Typecheck, full lint, zero-warning static security lint, production build, backendless demo, 10 skeleton states, theme contrast, npm audit with zero vulnerabilities, and git diff validation pass.
- - The protected bulk-action notice and the public Version 0.38 release card were inspected at desktop and 390px mobile widths with no horizontal overflow.
- - Read-only Appwrite schema, production health, integrity, and backup/restore planning checks pass without classroom writes.
- - The Linear release ledger was updated before this public page entry.
Source: Linear release ledger document, PI-213
- Bound every checkbox and student destination option to the exact version rendered on the game desk, with malformed, duplicate, cross-game, and oversized submissions rejected before writes.
- Repeated the full card and destination review inside the transaction, then updated version groups with exact game, ID, and version compare-and-set filters.
- Recorded ordered card snapshots and the optional destination snapshot in activity metadata without an Appwrite schema migration.