You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit be84d4a
Browse filesBrowse the repository at this point in the historyBrowse files
-**Every spool in a back row was unranked on launch.** A two-deep rack came back with only its front row filled and the rest sitting in "Not stored" — written straight to Firestore, so the arrangement was gone for good. `healDuplicateSlots` finds two spools sharing one slot and evicts the extras, and its slot key was `rackId | level | position` — **without the depth**. A spool behind therefore shared a key with the spool in front of it, so a full two-deep column read as a pile of duplicates and everything but the front one was written back to `rack: null`. Caught in the app's own log: `[racks] self-heal: 57 spool(s) in already-occupied slots → unranked`. The depth is part of the key now: two rows deep is not a collision, it is the feature. It fired ~2 s after launch, behind the "What's New" window, so the damage only surfaced when that window was dismissed — which made it look like closing it was the cause — `renderer/inventory.js`.
13
+
-**One half of a twin pair was unranked on launch, at random.** A twin pair is ONE physical spool wearing two chips, so both halves legitimately share a slot, and the heal groups them before it counts. But only one of the two documents carries `twin_tag_uid` — which is exactly why `_markTwinPairs` flags both sides rather than trusting the field — while `twinSpoolIdOf` only ever read that one direction. The pair therefore read as a legitimate couple or as two rivals depending on which half the heal visited first. The lookup now resolves both ways. This was never confined to the heal: **nine** call sites resolve a twin, including `assignSpoolToSlot`'s twin mirror, which reached only one of the two documents depending on the direction — the asymmetry predates rack depth and was merely surfaced by it — `renderer/inventory.js`.
14
+
-**Two heuristics that write `rack: null` on real spools now refuse to run when they would clear a large share of the stock.** The duplicate-slot heal and the orphan-reference sweep both act on a guess — "you are on top of someone" / "your rack no longer exists" — and a guess that erases where a user put a quarter of their collection has misread something rather than found that much genuine mess. Both step aside and say so in the log instead of writing the mistake to every document they can reach. The orphan sweep additionally waits for a racks snapshot **confirmed by the server** (`!snap.metadata.fromCache`): a cold start is served from a local cache that may name fewer racks than exist, and acting on it would unrank everything living in the racks it forgot — `renderer/inventory.js`.
Copy file name to clipboardExpand all lines: FEATURES.md
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Tiger Studio Manager — Feature Catalogue
2
2
3
-
Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem: a filament-inventory manager built around RFID/NFC-tagged spools ("TigerTag" chips), a fully-digital "TigerData" tier (and its catalogue-identified "TigerData+" rung), live 3D-printer integration across six brands, physical storage/rack management, a Firebase-backed social layer (friends, shareable wishlists, public profiles), and companion hardware (TD1S color sensor, TigerScale, TigerPOD dual-reader stand). This document catalogues every **shipped** feature, grouped by domain, current as of **v2.21.0**. Per-version release detail lives in `CHANGELOG.md`; forward-looking / in-progress work lives in `ROADMAP.md`.
3
+
Tiger Studio Manager is the Electron desktop companion to the TigerTag ecosystem: a filament-inventory manager built around RFID/NFC-tagged spools ("TigerTag" chips), a fully-digital "TigerData" tier (and its catalogue-identified "TigerData+" rung), live 3D-printer integration across six brands, physical storage/rack management, a Firebase-backed social layer (friends, shareable wishlists, public profiles), and companion hardware (TD1S color sensor, TigerScale, TigerPOD dual-reader stand). This document catalogues every **shipped** feature, grouped by domain, current as of **v2.21.1**. Per-version release detail lives in `CHANGELOG.md`; forward-looking / in-progress work lives in `ROADMAP.md`.
Emergency fix for anyone using the new **rack depth**. Please update.
4
+
5
+
## Fixed
6
+
7
+
- Fixed spools being thrown out of their racks on launch. If a rack held spools two or three rows deep, everything behind the front row came back as "not stored" a couple of seconds after the app opened — and because that happened behind the *What's New* window, it looked as though closing that window had caused it. Your arrangement was being erased for real, not just on screen.
8
+
- Fixed one half of a twin-tagged spool (one spool, two chips) being thrown out of its slot at random on launch. This one predates rack depth; depth simply made it show.
9
+
- Added a safety net behind both: the checks that tidy up spools sharing a slot, or pointing at a deleted rack, now refuse to act when they would empty a large part of your storage, and say so instead. A tidy-up is a handful of spools — never half your collection.
10
+
11
+
---
12
+
13
+
📖 **[Full changelog](https://github.com/TigerTag-Project/TigerTag-Studio-Manager/blob/main/CHANGELOG.md)** · ⬇️ Grab the installer for your OS from the **Assets** below (macOS `.dmg`, Windows `Setup .exe` or `portable .exe`, Linux `.AppImage`).
0 commit comments