CHANGELOG.md
Rama main · réplica de lectura del repositorio original.
# Changelog
## [0.9.1](https://github.com/oldmoldycake/Snagr/compare/v0.9.0...v0.9.1) (2026-10-02)
### Bug Fixes
* **frontend:** keep masthead tabs and hunt pill on one line ([4a8dbdf](https://github.com/oldmoldycake/Snagr/commit/4a8dbdf6b9f6c27c6d16b00ea1a051f8ba993ce1))
* **frontend:** keep masthead tabs and hunt pill on one line ([125bd3e](https://github.com/oldmoldycake/Snagr/commit/125bd3ed627edc475ec2c3224c1d3809badd8587))
## [0.9.0](https://github.com/oldmoldycake/Snagr/compare/v0.8.0...v0.9.0) (2026-10-02)
### Features
* send a test from the Add channel dialog before saving ([96fff97](https://github.com/oldmoldycake/Snagr/commit/96fff975d7f32c5a279382be564fff526aa627a5))
* **settings:** send a test from the Add channel dialog before saving ([60a800d](https://github.com/oldmoldycake/Snagr/commit/60a800d651d8341f4f8ff205bd38bf3354ff3ffe))
* **users:** let an admin change a user's role and issue a password-reset link ([a1fa458](https://github.com/oldmoldycake/Snagr/commit/a1fa45871999577a8b975ac9c7ace776adecd66f))
* **users:** let an admin change a user's role and issue a password-reset link ([b00852b](https://github.com/oldmoldycake/Snagr/commit/b00852b2433d73dbe023e0dc5e29cba17d7e1be9))
### Bug Fixes
* **activity:** label job tokens and pause countdown, and count every rejected candidate ([69e5a09](https://github.com/oldmoldycake/Snagr/commit/69e5a0937813239d64479971f0ea2a748381f0c0))
* **activity:** label job tokens and pause countdown, and count every rejected candidate ([575c02c](https://github.com/oldmoldycake/Snagr/commit/575c02c5a4d8212879502e9457ff63f2e06f2332))
* **backend:** deleting a user takes their items with them instead of refusing ([42f187e](https://github.com/oldmoldycake/Snagr/commit/42f187e173558bf84067329b13daafa525f8d5ba))
* **backend:** deleting a user takes their items with them instead of refusing ([ef37e57](https://github.com/oldmoldycake/Snagr/commit/ef37e57dac33dfe3badb3e71db54fbd6eabfa12d))
* **categories:** count only your items on category chips, the drawer and the ⋯ menu ([4a8a7b9](https://github.com/oldmoldycake/Snagr/commit/4a8a7b9bb133ddfe15cefec34869a1d46d9e2f6b))
* **categories:** count only your items on category chips, the drawer and the ⋯ menu ([e022948](https://github.com/oldmoldycake/Snagr/commit/e022948cd5c2fa66d12793501f3a1a27c7fd0d74))
* **frontend:** ask before a hunt press queues more than ten hunts ([ce7ba2f](https://github.com/oldmoldycake/Snagr/commit/ce7ba2ff0b4568c1d7cd78af243e47bf5627ff6f))
* **frontend:** ask before a hunt press queues more than ten hunts ([414986d](https://github.com/oldmoldycake/Snagr/commit/414986db829d4539eca10bdb6cd853f066d33025))
* **frontend:** ask before discarding a photo from the review queue ([f697628](https://github.com/oldmoldycake/Snagr/commit/f6976283f4bcbc01b6d175603161c4c221104279))
* **frontend:** ask before discarding a photo from the review queue ([4fbd4aa](https://github.com/oldmoldycake/Snagr/commit/4fbd4aab5806c43ded17c393f8f7f96a19a9e6f0))
* **frontend:** ask before leaving unsaved settings, and show thresholds in percent ([3b9246a](https://github.com/oldmoldycake/Snagr/commit/3b9246af6b98391ab7dd8dee3223e10eaa5c0245))
* **frontend:** ask before leaving unsaved settings, and show thresholds in percent ([58bf36a](https://github.com/oldmoldycake/Snagr/commit/58bf36a6e59abf159b09b84cc077ef5eadb12251))
* **frontend:** branded route error screen instead of the router's stack trace ([0c96b0d](https://github.com/oldmoldycake/Snagr/commit/0c96b0d6ff057c3dd6024403ff673ef066600714))
* **frontend:** branded route error screen instead of the router's stack trace ([08e8a82](https://github.com/oldmoldycake/Snagr/commit/08e8a8245b7765dac47b43ac98f10a9e55602b1b))
* **frontend:** call the background worker Snagr in the last two places that didn't ([eddf4ba](https://github.com/oldmoldycake/Snagr/commit/eddf4ba06ef9e98e4dfbaff84541cd10a9599e50))
* **frontend:** call the background worker Snagr in the last two places that didn't ([d1d6bab](https://github.com/oldmoldycake/Snagr/commit/d1d6babde0e3974f1940883feebfdaf5bfd49f28))
* **frontend:** confirm a new item with a toast that links to it ([720bd8f](https://github.com/oldmoldycake/Snagr/commit/720bd8f02a373fe4944b414ff61ddf7bec7dc8cc))
* **frontend:** confirm a new item with a toast that links to it ([721104b](https://github.com/oldmoldycake/Snagr/commit/721104b1fd342c3d06917d09fb41fa8a060edd08))
* **frontend:** confirm before deactivating a user, and say what it did ([a2f8bae](https://github.com/oldmoldycake/Snagr/commit/a2f8baee3fc2674e5c54bf0cae7ab523a6d073eb))
* **frontend:** confirm before deactivating a user, and say what it did ([a41baec](https://github.com/oldmoldycake/Snagr/commit/a41baec790042aa235fbeb293d5ed08c11b2ca51))
* **frontend:** confirm invite revokes and show the invite list loading ([cfac75b](https://github.com/oldmoldycake/Snagr/commit/cfac75b8b0b2b10f0b54c18b6529f13b5bd4b286))
* **frontend:** confirm invite revokes and show the invite list loading ([a597ef2](https://github.com/oldmoldycake/Snagr/commit/a597ef2bb3bd2dafbdaa6a0f2a4d59fcb7265c13))
* **frontend:** count Accept replicas as an unsaved item edit ([c904fd9](https://github.com/oldmoldycake/Snagr/commit/c904fd9bac8e2809e83d2a730d52769c07473317))
* **frontend:** count Accept replicas as an unsaved item edit ([6b1790b](https://github.com/oldmoldycake/Snagr/commit/6b1790b0d86774c779fbe9b2b918a5ca18754ca0))
* **frontend:** date the drop chip so it can't pass for the trend ([662cd3b](https://github.com/oldmoldycake/Snagr/commit/662cd3b5fa4ce39032a8729172926785253f227d))
* **frontend:** date the drop chip so it can't pass for the trend ([44536e7](https://github.com/oldmoldycake/Snagr/commit/44536e772aed52e8d99cb6a5031123569839e16a))
* **frontend:** explain the listing Track switch and keep its row in place ([b601aaf](https://github.com/oldmoldycake/Snagr/commit/b601aaff78d4cb07cf9596e75aa93f2ee4907384))
* **frontend:** explain the listing Track switch and keep its row in place ([0f41971](https://github.com/oldmoldycake/Snagr/commit/0f41971d54abd0170f0a77b1b2803d97172ef22f))
* **frontend:** explain the photo review queue and show its count on the tab ([0d98f0d](https://github.com/oldmoldycake/Snagr/commit/0d98f0dcf52a8036181e37f90f177e70948c648d))
* **frontend:** explain the photo review queue and show its count on the tab ([3319fc1](https://github.com/oldmoldycake/Snagr/commit/3319fc126756d6507f4ee9dcffa4467c2afbfea4))
* **frontend:** give job pages a way back and links to the item and its listings ([455f5cf](https://github.com/oldmoldycake/Snagr/commit/455f5cf2d153bb72102b59350b6a2008701c978e))
* **frontend:** give job pages a way back and links to the item and its listings ([44c45b9](https://github.com/oldmoldycake/Snagr/commit/44c45b9f87c312e56700f21b3dcc4ff4038d452c))
* **frontend:** give not-found pages a way back ([560405e](https://github.com/oldmoldycake/Snagr/commit/560405eed39c9e20483ed67d0fbb80c34d216443))
* **frontend:** give not-found pages a way back ([8b91f0b](https://github.com/oldmoldycake/Snagr/commit/8b91f0b10ceb2c139c3c62d7472d3eb1053eea3d))
* **frontend:** give price charts a text alternative, keyboard scan and touch scrolling ([a1cbd29](https://github.com/oldmoldycake/Snagr/commit/a1cbd299e5d252d703ed1dd60a8b543460723eff))
* **frontend:** give price charts a text alternative, keyboard scan and touch scrolling ([5071530](https://github.com/oldmoldycake/Snagr/commit/5071530a00fbe77055e9ccaf7fdf2b9f17992d7a))
* **frontend:** give small controls a 44px hit area on touch ([d711c4f](https://github.com/oldmoldycake/Snagr/commit/d711c4ffa465339c68e1f7d0b6261fbcb035bb28))
* **frontend:** give small controls a 44px hit area on touch ([521d0b5](https://github.com/oldmoldycake/Snagr/commit/521d0b5e1d849075ca245349dd37ddd8c1e1a2f6))
* **frontend:** hold Retry on a failed hunt while its site is paused ([423f1bd](https://github.com/oldmoldycake/Snagr/commit/423f1bd7d5f2d4a4b8b1b22bddf09994705d57b5))
* **frontend:** hold Retry on a failed hunt while its site is paused ([922dba1](https://github.com/oldmoldycake/Snagr/commit/922dba10a5f5154c4babd3f1585eb69ebc0c153f))
* **frontend:** keep a category's filters when you come back from an item ([442b301](https://github.com/oldmoldycake/Snagr/commit/442b301bec4e97e3207b8762fcecee9c50f36363))
* **frontend:** keep a category's filters when you come back from an item ([cdef55d](https://github.com/oldmoldycake/Snagr/commit/cdef55db1c7c9d4544342bfde5439707671e049f))
* **frontend:** keep a new API token or signing secret on screen until it's saved ([fccb2a0](https://github.com/oldmoldycake/Snagr/commit/fccb2a019a1c3374ddd89103557e56329429ed72))
* **frontend:** keep a new API token or signing secret on screen until it's saved ([fe48a2d](https://github.com/oldmoldycake/Snagr/commit/fe48a2d0074f51134c9dccf78df4d7f2340f3368))
* **frontend:** keep an item's last site ticked instead of re-picking every site ([9c3aa44](https://github.com/oldmoldycake/Snagr/commit/9c3aa44624ddc5431f948127385423eb84a2cf4b))
* **frontend:** keep an item's last site ticked instead of re-picking every site ([a128dfa](https://github.com/oldmoldycake/Snagr/commit/a128dfacf9d935755a5c9e000a63236b4f99b31c))
* **frontend:** keep how a price was read out of the way, and stop ticking out-of-stock checks ([7f4bb31](https://github.com/oldmoldycake/Snagr/commit/7f4bb31013825aead07f832528f62f738a8c5348))
* **frontend:** keep how a price was read out of the way, and stop ticking out-of-stock checks ([0d77ca5](https://github.com/oldmoldycake/Snagr/commit/0d77ca56b3634a8fcf5489920781ce314e2a7289))
* **frontend:** keep price-change labels off item names and chart the biggest rises ([8bd83b2](https://github.com/oldmoldycake/Snagr/commit/8bd83b2fb31d95b5ada6f5da8afebc5d3f9de74a))
* **frontend:** keep price-change labels off item names and chart the biggest rises ([e075cca](https://github.com/oldmoldycake/Snagr/commit/e075ccaf510f7c026d0daecc4df8ec1bd513c58b))
* **frontend:** keep the category menu open while a delete runs and show why it failed ([a42f0a2](https://github.com/oldmoldycake/Snagr/commit/a42f0a2b404bca3d88535ee21804e224bb22b0c9))
* **frontend:** keep the category menu open while a delete runs and show why it failed ([3d32b22](https://github.com/oldmoldycake/Snagr/commit/3d32b228f1d3b3f6d0a647b2b9d736d84e4ae0dc))
* **frontend:** keep the page bottom clear of Safari's toolbar ([fb9e865](https://github.com/oldmoldycake/Snagr/commit/fb9e865861167dcb870198da9686a1cce1fd0beb))
* **frontend:** keep the page bottom clear of Safari's toolbar ([9247282](https://github.com/oldmoldycake/Snagr/commit/9247282461185d09dc74abdcf47de0a4da0f5af3))
* **frontend:** keep the target labels off the chart lines and the range high ([30d44c0](https://github.com/oldmoldycake/Snagr/commit/30d44c0fdee5d6870f39184f0588d9a7bbbd5eb0))
* **frontend:** keep the target labels off the chart lines and the range high ([148a4fc](https://github.com/oldmoldycake/Snagr/commit/148a4fcf04cf668d55e938101fdbce7e33d2bd52))
* **frontend:** lead each listing row with its site and what sets it apart ([7aa0f2a](https://github.com/oldmoldycake/Snagr/commit/7aa0f2a6e58a21e2115938f7670ab13caace0f0f))
* **frontend:** lead each listing row with its site and what sets it apart ([0e2a1aa](https://github.com/oldmoldycake/Snagr/commit/0e2a1aa3340867b93706733fe328463c2c8d7c67))
* **frontend:** let a category with none of your items be opened and managed from its row ([945e6f4](https://github.com/oldmoldycake/Snagr/commit/945e6f4b3f71031b0775768888560d33497ffb7d))
* **frontend:** let a category with none of your items be opened and managed from its row ([50f1ec2](https://github.com/oldmoldycake/Snagr/commit/50f1ec286413af57b2c3c8867b0292e1091c71f1))
* **frontend:** let a queued hunt be cancelled and keep the activity sheet following ([49e56e0](https://github.com/oldmoldycake/Snagr/commit/49e56e0f1003f14bb5b4ed6122c2e57604e0c821))
* **frontend:** let a queued hunt be cancelled and keep the activity sheet following ([3a9177c](https://github.com/oldmoldycake/Snagr/commit/3a9177c8e34720f829a2683e0c52ff78730857b9))
* **frontend:** let Add site take a plain domain and name the site after it ([e116dad](https://github.com/oldmoldycake/Snagr/commit/e116dadcd4e2efb266c40d85b45668a33e625591))
* **frontend:** let Add site take a plain domain and name the site after it ([b335218](https://github.com/oldmoldycake/Snagr/commit/b33521846b9b828c14b50cebac7673e199349977))
* **frontend:** let an item's replicas setting be changed ([e83213c](https://github.com/oldmoldycake/Snagr/commit/e83213c92c6c1cceebd1313bf29eb18ae8f9dfc4))
* **frontend:** let an item's replicas setting be changed ([225fc24](https://github.com/oldmoldycake/Snagr/commit/225fc24cd9c0fa03b1dfa263691260cd5d75e41d))
* **frontend:** let Edit category rename a category that has no sites ([b80aecf](https://github.com/oldmoldycake/Snagr/commit/b80aecf56c2fee3286f324f5bf39c9b54a6e01a6))
* **frontend:** let site chips filter a category and category chips open it ([e793ba3](https://github.com/oldmoldycake/Snagr/commit/e793ba3949597940925d9acddf964f51701b0574))
* **frontend:** let site chips filter a category and category chips open it ([ad7a103](https://github.com/oldmoldycake/Snagr/commit/ad7a1037e81f77e00f482c6befb1bb550c32ee59))
* **frontend:** list upcoming jobs soonest first and fold the rest ([d2316cc](https://github.com/oldmoldycake/Snagr/commit/d2316cca8e73178c7183dc264dcf401a0408c3df))
* **frontend:** list upcoming jobs soonest first and fold the rest ([28aa002](https://github.com/oldmoldycake/Snagr/commit/28aa002dc4543fa536d4d71208815066e4154bda))
* **frontend:** look closely at a review photo beside its references ([29e8c58](https://github.com/oldmoldycake/Snagr/commit/29e8c5839307b205f43ab522e42207a932586219))
* **frontend:** look closely at a review photo beside its references ([8836c17](https://github.com/oldmoldycake/Snagr/commit/8836c17b405d15d45763f13804875fca4c99ddbb))
* **frontend:** make each watch-list item name a real link to its page ([beb47da](https://github.com/oldmoldycake/Snagr/commit/beb47da56510894ce9914b80bef204f10c17b321))
* **frontend:** make each watch-list item name a real link to its page ([0bcf26a](https://github.com/oldmoldycake/Snagr/commit/0bcf26ad4c2aea4b0e56a10fbe5a771480dad7ff))
* **frontend:** make field placeholders read as examples, not typed values ([ee47a68](https://github.com/oldmoldycake/Snagr/commit/ee47a6852e6dfe402f0f2a928b107f4ee9291be3))
* **frontend:** make field placeholders read as examples, not typed values ([2056b41](https://github.com/oldmoldycake/Snagr/commit/2056b414d814720ad38963509aa9dab7a7643249))
* **frontend:** make the dashboard's activity ticker readable on phones ([03245ed](https://github.com/oldmoldycake/Snagr/commit/03245ed8e65da931eaf45ba51c7fa0515531d0c3))
* **frontend:** make the dashboard's activity ticker readable on phones ([a870560](https://github.com/oldmoldycake/Snagr/commit/a87056032a4f5ccb8a0e105d241006f79502bb38))
* **frontend:** make the photo-review call an explicit real or fake choice ([c945cf2](https://github.com/oldmoldycake/Snagr/commit/c945cf2698ec0b402b2ade992d0e70eb08c68de9))
* **frontend:** make the photo-review call an explicit real or fake choice ([da2d273](https://github.com/oldmoldycake/Snagr/commit/da2d273b1854b7f613d7c01f66bae06c028ac6d9))
* **frontend:** mask webhook URLs in the channel list until revealed ([34c7d97](https://github.com/oldmoldycake/Snagr/commit/34c7d977980599073de221df809018ad22ee4469))
* **frontend:** mask webhook URLs in the channel list until revealed ([054c132](https://github.com/oldmoldycake/Snagr/commit/054c1326bb220893e7893336310a8e3dd249b8e7))
* **frontend:** name chart lines site first, like the listing rows ([2bbbc10](https://github.com/oldmoldycake/Snagr/commit/2bbbc10b0a66ffdb78983de23125d1422fd019f8))
* **frontend:** name chart lines site first, like the listing rows ([fed1a0f](https://github.com/oldmoldycake/Snagr/commit/fed1a0ff9c56dcefdf9a5f023a64b0bf821d5d2d))
* **frontend:** name the items at target in the dashboard headline ([d8dc8f2](https://github.com/oldmoldycake/Snagr/commit/d8dc8f2a06b68baa59dcddf90502369fa95ba2b0))
* **frontend:** name the items at target in the dashboard headline ([bad210a](https://github.com/oldmoldycake/Snagr/commit/bad210a2112d61830032fe0626fefe5694302666))
* **frontend:** number the agent setup steps and wrap the config ([f5e3cfc](https://github.com/oldmoldycake/Snagr/commit/f5e3cfc12b0558eea51c7874e57ef1fe2ae99bb0))
* **frontend:** number the agent setup steps and wrap the config ([8b6b701](https://github.com/oldmoldycake/Snagr/commit/8b6b701e4c089f341bb186d2d137cafbffaf8340))
* **frontend:** open Edit tracking with the tracking options expanded and in view ([7919de1](https://github.com/oldmoldycake/Snagr/commit/7919de11c564c847fdc8333f980656fa262a7b2c))
* **frontend:** open Edit tracking with the tracking options expanded and in view ([0a984ed](https://github.com/oldmoldycake/Snagr/commit/0a984ed71ae8e62296037a67a94bfc4f75a3899a))
* **frontend:** open tooltips on tap and focus, show hunt hints inline ([7005af5](https://github.com/oldmoldycake/Snagr/commit/7005af5269809cc98e6eb6a2cdfa32b87194cb36))
* **frontend:** open tooltips on tap and focus, show hunt hints inline ([83245eb](https://github.com/oldmoldycake/Snagr/commit/83245eb86bea5ffcf01ee1d62f3419e1b63a3561))
* **frontend:** print every date and time in the viewer's locale, one clock everywhere ([b8794b2](https://github.com/oldmoldycake/Snagr/commit/b8794b23d62417997540c31e4ada548781c711ef))
* **frontend:** put the settings tabs under the title and hold the page width ([5e23e75](https://github.com/oldmoldycake/Snagr/commit/5e23e7529452a504421cdcda672f7e36e80240e1))
* **frontend:** put the settings tabs under the title and hold the page width ([c5f1f89](https://github.com/oldmoldycake/Snagr/commit/c5f1f89324207df41a2c9d77c9f5d07c02fa98ad))
* **frontend:** raise secondary text and control borders to WCAG AA contrast ([8417d48](https://github.com/oldmoldycake/Snagr/commit/8417d48e108c68cc5797e4b475e498b51b19da59))
* **frontend:** raise secondary text and control borders to WCAG AA contrast ([bb2757f](https://github.com/oldmoldycake/Snagr/commit/bb2757ffa55311c2e350acf405e9d6ca608fd90b))
* **frontend:** raise text to a 12px floor and 14px body, sentence-case small labels ([f78e1d0](https://github.com/oldmoldycake/Snagr/commit/f78e1d08790c6000dbc8a890cc745d45f6f95011))
* **frontend:** raise text to a 12px floor and 14px body, sentence-case small labels ([85675c3](https://github.com/oldmoldycake/Snagr/commit/85675c3cd01b203ae4745d21170f1f676867a68b))
* **frontend:** read target prices as people type them and refuse zero in words ([0394a6a](https://github.com/oldmoldycake/Snagr/commit/0394a6ade42332154b7e753fa6497d3626a04cb9))
* **frontend:** read target prices as people type them and refuse zero in words ([0ab012e](https://github.com/oldmoldycake/Snagr/commit/0ab012e34009f37c9181f313fece43e059549a65))
* **frontend:** restore declarations lost in merges so main builds and tests ([06c711d](https://github.com/oldmoldycake/Snagr/commit/06c711d829db07d2c04ddd3ccd430c17dc163754))
* **frontend:** restore declarations lost in merges so main builds and tests ([2bf108c](https://github.com/oldmoldycake/Snagr/commit/2bf108c78e8564350060e76ced33308b0ec7453c))
* **frontend:** restore scroll position on Back and start new pages at the top ([c655c44](https://github.com/oldmoldycake/Snagr/commit/c655c44653b0e1a1e2a30261e1df13b901691a3d))
* **frontend:** restore scroll position on Back and start new pages at the top ([80001ae](https://github.com/oldmoldycake/Snagr/commit/80001aea67c118673fdd60525f47f334f000632d))
* **frontend:** restore SitesPage imports lost when [#223](https://github.com/oldmoldycake/Snagr/issues/223) and [#227](https://github.com/oldmoldycake/Snagr/issues/227) merged ([d8926f7](https://github.com/oldmoldycake/Snagr/commit/d8926f737b0cd1a1bcd090ca7415547509e21fbd))
* **frontend:** restore SitesPage imports lost when [#223](https://github.com/oldmoldycake/Snagr/issues/223) and [#227](https://github.com/oldmoldycake/Snagr/issues/227) merged ([da6f0b7](https://github.com/oldmoldycake/Snagr/commit/da6f0b7a0145daf9ec08befca7ccd6f561ef96f4))
* **frontend:** run the listing price rail low to high, like the charts ([3e9869d](https://github.com/oldmoldycake/Snagr/commit/3e9869dc614336f0706f8768890dbbca1b4f0892))
* **frontend:** run the listing price rail low to high, like the charts ([d1eb064](https://github.com/oldmoldycake/Snagr/commit/d1eb064065e98513c15ee1778b16c305915e1feb))
* **frontend:** save Edit category with Enter, and keep its edits from Escape ([a34f727](https://github.com/oldmoldycake/Snagr/commit/a34f727975998756d62f8c85331ef7f4f8f13385))
* **frontend:** save Edit category with Enter, and keep its edits from Escape ([457e972](https://github.com/oldmoldycake/Snagr/commit/457e97245bb026849a4685920c5af773b3c21f91))
* **frontend:** save the settings email on Enter and say why it was refused ([ff27557](https://github.com/oldmoldycake/Snagr/commit/ff27557abd9acdb6b8676f674fc7e80905cf46ac))
* **frontend:** save the settings email on Enter and say why it was refused ([da7c0cd](https://github.com/oldmoldycake/Snagr/commit/da7c0cd24c1de84c1b0841d0280683c165580412))
* **frontend:** say in the site dialog that sites are shared with everyone ([a2a28ab](https://github.com/oldmoldycake/Snagr/commit/a2a28ab68fe0186defcd9d05c976f30c8af6f728))
* **frontend:** say in the site dialog that sites are shared with everyone ([eda21c4](https://github.com/oldmoldycake/Snagr/commit/eda21c45a5db0307361d4f0274c4f1973de20b81))
* **frontend:** say so when typing criteria switches an item to Best match ([e030a4e](https://github.com/oldmoldycake/Snagr/commit/e030a4e462ff1758095a66dd3842a8f1b52627bb))
* **frontend:** say so when typing criteria switches an item to Best match ([7e04ea8](https://github.com/oldmoldycake/Snagr/commit/7e04ea87df9eb18137e13a43bb9e969eb6404283))
* **frontend:** say that Full API token access can add to the AI bill ([bd89642](https://github.com/oldmoldycake/Snagr/commit/bd8964227d03c66747f981c3a1e724204544b8a6))
* **frontend:** say that Full API token access can add to the AI bill ([4e254b9](https://github.com/oldmoldycake/Snagr/commit/4e254b9eee5e1bc4e8c875911aeb8dfd2115e0bd))
* **frontend:** say under Hunt for better what it swaps, and only if it finds better ([440bdab](https://github.com/oldmoldycake/Snagr/commit/440bdab10b1b0320d8f0388e78b74055efb35fcc))
* **frontend:** say under Hunt for better what it swaps, and only if it finds better ([7f631c5](https://github.com/oldmoldycake/Snagr/commit/7f631c524619d16234f97ce2752db0811c323dbf))
* **frontend:** say what an item loses without a target price ([11902cf](https://github.com/oldmoldycake/Snagr/commit/11902cfa104b63763aecdb49d8f42fba024bac79))
* **frontend:** say what an item loses without a target price ([8352ef2](https://github.com/oldmoldycake/Snagr/commit/8352ef256f53621cd3d2f947e013e1a3037ee9c5))
* **frontend:** say what Hunt now queued and count only hunts as hunts ([1759521](https://github.com/oldmoldycake/Snagr/commit/17595211c9febd1d5dbb75383d43b9233d28d369))
* **frontend:** say what Hunt now queued and count only hunts as hunts ([af387c1](https://github.com/oldmoldycake/Snagr/commit/af387c1ae02fdcc17bcc7ff66b45fbddfcd0e9a6))
* **frontend:** say when an invite couldn't be checked instead of calling it not valid ([4905c7a](https://github.com/oldmoldycake/Snagr/commit/4905c7a42e8de2019007802e1542da762270caf6))
* **frontend:** say when an invite couldn't be checked instead of calling it not valid ([2c68caf](https://github.com/oldmoldycake/Snagr/commit/2c68cafa9d8df85d067367169c0fe5b745cfa25f))
* **frontend:** say when live updates have stalled and offer a reload ([17e68ec](https://github.com/oldmoldycake/Snagr/commit/17e68ec480e2fa1930b1b0bef721c45c0b22e617))
* **frontend:** say when live updates have stalled and offer a reload ([71e12ce](https://github.com/oldmoldycake/Snagr/commit/71e12ce4b311a60fb0c3e37aacbfa18bfaa63b3d))
* **frontend:** say when prices may be stale and keep the lists current ([d606b31](https://github.com/oldmoldycake/Snagr/commit/d606b3158873d3239f77b70a0b97c1daeb1c30c3))
* **frontend:** say when prices may be stale and keep the lists current ([93afbce](https://github.com/oldmoldycake/Snagr/commit/93afbce21ced9e331d82f517ca21f7d9954590f9))
* **frontend:** say why queued work hasn't started instead of calling it idle ([e26329d](https://github.com/oldmoldycake/Snagr/commit/e26329d55cbc2a3c939eeb0acbce05bcdb3df08f))
* **frontend:** say why queued work hasn't started instead of calling it idle ([c8897af](https://github.com/oldmoldycake/Snagr/commit/c8897afad4b34405c0bba3bf0cd665d4c765c349))
* **frontend:** search from phones, and keep the search box in step with ?search ([b66f728](https://github.com/oldmoldycake/Snagr/commit/b66f7285979b87bb899a1272d476731945a4d9ed))
* **frontend:** search from phones, and keep the search box in step with ?search ([eefc562](https://github.com/oldmoldycake/Snagr/commit/eefc5625a0b7433a2987b07a4e819a60e492b2c1))
* **frontend:** send a visitor whose session expired to sign in ([c8ec889](https://github.com/oldmoldycake/Snagr/commit/c8ec889b839fc31a7b8c97749290ffd7fe5fd2bf))
* **frontend:** send a visitor whose session expired to sign in ([714b0a0](https://github.com/oldmoldycake/Snagr/commit/714b0a065def5f75a3a9dbf3d103b13b46e9c7a7))
* **frontend:** show a failed auto-reference revoke inside its dialog ([47bb2c8](https://github.com/oldmoldycake/Snagr/commit/47bb2c8f139b8a37c9a034ffcc9d4051a6959a31))
* **frontend:** show a failed token or reference revoke inside its dialog ([e7ff3bb](https://github.com/oldmoldycake/Snagr/commit/e7ff3bbb51b3a8a947c861b743532ee30c3c386f))
* **frontend:** show a paused site as paused on the Sites page ([98ee177](https://github.com/oldmoldycake/Snagr/commit/98ee1774d7a913b6a92791f356997afeada50d5c))
* **frontend:** show a paused site as paused on the Sites page ([4276506](https://github.com/oldmoldycake/Snagr/commit/42765066b269e61c2d83bbd9325d3546c5cdc8dd))
* **frontend:** show a visible focus ring on inputs, textareas and selects ([040f000](https://github.com/oldmoldycake/Snagr/commit/040f000436a1256520b7f80484aea301aa4be63c))
* **frontend:** show a visible focus ring on inputs, textareas and selects ([e6270a8](https://github.com/oldmoldycake/Snagr/commit/e6270a8e55a765d8c02f70d135ec522d9e7c9ae5))
* **frontend:** show dates and times in the viewer's locale, with one clock everywhere ([1af43cb](https://github.com/oldmoldycake/Snagr/commit/1af43cb29c6465b71824e90ef035758f8d790254))
* **frontend:** show failed revokes inside their confirm dialogs ([e4f1fa6](https://github.com/oldmoldycake/Snagr/commit/e4f1fa67af01e6aa9339681debe862c8549df24b))
* **frontend:** show one Add photo button on an empty reference photos card ([5222086](https://github.com/oldmoldycake/Snagr/commit/52220861910f0a9d3bf522af95f6a9b7bd2ed836))
* **frontend:** show one Add photo button on an empty reference photos card ([9ad3f5f](https://github.com/oldmoldycake/Snagr/commit/9ad3f5f2555f4fefbfc11d3faa5f4eb8d7f95663))
* **frontend:** show the default check interval as picked in "Check every" ([d924983](https://github.com/oldmoldycake/Snagr/commit/d924983af056c047baa6c31ac906393a2600589d))
* **frontend:** show the default check interval as picked in "Check every" ([3d99963](https://github.com/oldmoldycake/Snagr/commit/3d9996361b8d8fabc49ddde621bf5e137d47f97e))
* **frontend:** show whole site names on the dashboard ([710740e](https://github.com/oldmoldycake/Snagr/commit/710740eefe1ee1cbdf54b86c64f3e88259471878))
* **frontend:** show whole site names on the dashboard ([320626b](https://github.com/oldmoldycake/Snagr/commit/320626bf256f4d8d5d83d72f166529f091460d9e))
* **frontend:** skip the removed item's page on Back after removing it ([2897a70](https://github.com/oldmoldycake/Snagr/commit/2897a7086b8c4feedfe7d5036d7b05d87aa34565))
* **frontend:** skip the removed item's page on Back after removing it ([a0655cc](https://github.com/oldmoldycake/Snagr/commit/a0655cc53c583fbaa06134675858868eb7b12308))
* **frontend:** split the item's status into a price-check line and a tracking line ([26b6f2b](https://github.com/oldmoldycake/Snagr/commit/26b6f2bdd2ea982b3f26cc60b032671ca07a7ab5))
* **frontend:** split the item's status into a price-check line and a tracking line ([ed9e0db](https://github.com/oldmoldycake/Snagr/commit/ed9e0dbbde396bb84d275727cdf4ef029dd724e7))
* **frontend:** stack the drop chip under the item name on phones ([3dc5786](https://github.com/oldmoldycake/Snagr/commit/3dc5786ba00880485f3e30051baa0b7ce22b7ad4))
* **frontend:** stack the drop chip under the item name on phones ([8b8320f](https://github.com/oldmoldycake/Snagr/commit/8b8320f09904ac538e859eedeca8c56a62bfa5b6))
* **frontend:** state the password rule and let a new password be shown ([1215a6f](https://github.com/oldmoldycake/Snagr/commit/1215a6fbdbb1de79fddbb3a82b2d7c6a91a2a570))
* **frontend:** state the password rule and let a new password be shown ([f855e0a](https://github.com/oldmoldycake/Snagr/commit/f855e0afcca58a79f325d14cf6c5ed3c510b4a61))
* **frontend:** step back from an emptied review page and start the photo upload fresh ([2ce47bb](https://github.com/oldmoldycake/Snagr/commit/2ce47bb292c59ef27b3b5b23436a390c2c2e32c1))
* **frontend:** step back from an emptied review page and start the photo upload fresh ([83c3576](https://github.com/oldmoldycake/Snagr/commit/83c35760632e536e4997a872ce4c39814e879ced))
* **frontend:** stop "Track up to" jumping while you type ([d069d03](https://github.com/oldmoldycake/Snagr/commit/d069d0390c466799ed42d513fbbb20eac369a1d5))
* **frontend:** stop "Track up to" jumping while you type ([339966e](https://github.com/oldmoldycake/Snagr/commit/339966e9750eeff76010cdd63adbed6a0a61d1c2))
* **frontend:** stop a category rename from unlinking its sites, and reopen Edit category fresh ([27a1faf](https://github.com/oldmoldycake/Snagr/commit/27a1faf1d98f015ca6fd5aa0af98abd4070caac1))
* **frontend:** stop a category rename from unlinking its sites, and reopen Edit category fresh ([dabd9d9](https://github.com/oldmoldycake/Snagr/commit/dabd9d9c54042a35ecadf5495ab987d2f3440bac))
* **frontend:** stop carrying status by color alone ([e8469da](https://github.com/oldmoldycake/Snagr/commit/e8469daebc4d611bae3811f8553ea273c6aa03a3))
* **frontend:** stop carrying status by color alone ([00883ea](https://github.com/oldmoldycake/Snagr/commit/00883ea1ccaa292c290c21029bc315769f2ab346))
* **frontend:** stop flagging panels busy on background refreshes ([6bd43af](https://github.com/oldmoldycake/Snagr/commit/6bd43af1eb97ed245f7341bbfd93d0b8dc7e5b59))
* **frontend:** stop flagging panels busy on background refreshes ([1adb687](https://github.com/oldmoldycake/Snagr/commit/1adb68701115aec7de08f6c3561057228c40b5c8))
* **frontend:** stop iOS Safari zooming into focused text fields ([6a3e06d](https://github.com/oldmoldycake/Snagr/commit/6a3e06d7fb6b31ac62fe9f644c28c95ce7c7ee6e))
* **frontend:** stop iOS Safari zooming into focused text fields ([7db91f1](https://github.com/oldmoldycake/Snagr/commit/7db91f143280a0117413534fc31203ce6b3568e8))
* **frontend:** stop the dashboard claiming no prices when items only lack a target ([3b3e02e](https://github.com/oldmoldycake/Snagr/commit/3b3e02eb4085d095f7d660bc736efe16ed285762))
* **frontend:** stop the dashboard claiming no prices when items only lack a target ([7b94912](https://github.com/oldmoldycake/Snagr/commit/7b94912cfe2f6b410c96a6c48e56242ffbd9e573))
* **frontend:** stop the dashboard strip reading "Idle" beside a due check ([779cad1](https://github.com/oldmoldycake/Snagr/commit/779cad1bc30208000aa726c75088a2ab8cf48d3b))
* **frontend:** stop the dashboard strip reading "Idle" beside a due check ([67f1cce](https://github.com/oldmoldycake/Snagr/commit/67f1ccedabbe68a57e7e186aba014391343f51cc))
* **frontend:** stop treating a server outage as being signed out ([326cfb2](https://github.com/oldmoldycake/Snagr/commit/326cfb2f3229632d5e179822f925af9a50158654))
* **frontend:** stop treating a server outage as being signed out ([8c67d61](https://github.com/oldmoldycake/Snagr/commit/8c67d61833201746a7047dc03180ad813edfbba6))
* **frontend:** swap internal jargon for plain words and add a glossary ([1770ef1](https://github.com/oldmoldycake/Snagr/commit/1770ef1dda7d96139c4b6275fe67a6c3ab9a64b2))
* **frontend:** swipe dialogs closed by their grab handle on phones ([0dbf9e4](https://github.com/oldmoldycake/Snagr/commit/0dbf9e49dfb198a991dcfce587d067e70541f51c))
* **frontend:** swipe dialogs closed by their grab handle on phones ([0d2120a](https://github.com/oldmoldycake/Snagr/commit/0d2120ae0c21d11c4c1bb6419176e45df24209d6))
* **frontend:** title each tab after its page and focus the heading on navigation ([ec4048a](https://github.com/oldmoldycake/Snagr/commit/ec4048af47969968ecc498f8ee5d280da33eeb7c))
* **frontend:** title each tab after its page and focus the heading on navigation ([4977e6b](https://github.com/oldmoldycake/Snagr/commit/4977e6b53cc5838ff8ebaeb63589eae0a180c1af))
* **frontend:** walk new users to alert channels and warn while alerts go nowhere ([d779628](https://github.com/oldmoldycake/Snagr/commit/d779628e6e2cc879bac0d03217fc643af39da176))
* **frontend:** walk new users to alert channels and warn while alerts go nowhere ([91f3ecb](https://github.com/oldmoldycake/Snagr/commit/91f3ecb895b0fd53a3a0b9dbc3781b50417c8790))
* keep half-filled item dialogs open and show save errors beside their field ([d9ccdc7](https://github.com/oldmoldycake/Snagr/commit/d9ccdc7a85cf92bd06913ed068dc897cdd1f850e))
* keep half-filled item dialogs open and show save errors beside their field ([698f21c](https://github.com/oldmoldycake/Snagr/commit/698f21cbb56d381cd1bc1abf8c43deea0ce1f225))
* return to the deep link after signing in with SSO ([89cdb1c](https://github.com/oldmoldycake/Snagr/commit/89cdb1ce2993627012dd2cda5f6a919d16604c11))
* return to the deep link after signing in with SSO ([4d3270d](https://github.com/oldmoldycake/Snagr/commit/4d3270dc8132665f1f54dcc6b8f8be4d95792ec1))
* say in Edit item whether a rename changes the name for anyone else ([0fb4947](https://github.com/oldmoldycake/Snagr/commit/0fb494723cf8b1ba214d0fae1f08a8a60f54a2c4))
* say in Edit item whether a rename changes the name for anyone else ([f8fd285](https://github.com/oldmoldycake/Snagr/commit/f8fd28557035d6ea8e035a5f3574113a5f8d4ab4))
* say why a job failed in plain words and keep the raw error behind Details ([82d717e](https://github.com/oldmoldycake/Snagr/commit/82d717e0c18643a5a8d72beb762a9bd36cd9c0a1))
* say why a job failed in plain words and keep the raw error behind Details ([c3082b4](https://github.com/oldmoldycake/Snagr/commit/c3082b4676a8cf1b2e515b43d51ad147c7015e17))
* swap internal jargon for plain words and add a glossary ([b056fa1](https://github.com/oldmoldycake/Snagr/commit/b056fa15d66b0bc376b94f81565a72e9b7e5d45f))
## [0.8.0](https://github.com/oldmoldycake/Snagr/compare/v0.7.0...v0.8.0) (2026-10-01)
### Features
* **frontend:** give the tracking site chips the segmented plate look ([6cbccac](https://github.com/oldmoldycake/Snagr/commit/6cbccac81e34f4bac36a6e7ac1d1534cfecc5f63))
* **frontend:** track the active category link with one sliding lume bar ([439bc5b](https://github.com/oldmoldycake/Snagr/commit/439bc5b15d1ead116c0634265e5d1aaa1bcd9305))
* **frontend:** track the active category link with one sliding lume bar ([44ab249](https://github.com/oldmoldycake/Snagr/commit/44ab249688f34abb801d335f093bf5b3cd699a4b))
* **frontend:** track the checked segment with one sliding plate ([c477bfc](https://github.com/oldmoldycake/Snagr/commit/c477bfc695d4fc6f377ca495614aae1c1150a184))
* **frontend:** track the checked segment with one sliding plate ([a541936](https://github.com/oldmoldycake/Snagr/commit/a541936f987a4276a370cb38c2bad4d262108aab))
### Bug Fixes
* accept reference photos up to 10 MB through nginx ([2a0b0a2](https://github.com/oldmoldycake/Snagr/commit/2a0b0a2a7489001632eea91ad2ae61796f2e998d))
* **agent:** anchor the listing-URL guard on the site's own host ([6b436e9](https://github.com/oldmoldycake/Snagr/commit/6b436e988e21581a1f6b0ac8c86f9ba769114f15))
* **agent:** anchor the listing-URL guard on the site's own host ([badc589](https://github.com/oldmoldycake/Snagr/commit/badc58965d781bd657e403d0482503edaa034894))
* **agent:** count the tokens a ground job's model calls spend ([8b5248b](https://github.com/oldmoldycake/Snagr/commit/8b5248b13b15fdac26e6ea07863d81261579e5ef))
* **agent:** count the tokens a ground job's model calls spend ([f06875d](https://github.com/oldmoldycake/Snagr/commit/f06875d2b5daf0b26b5c214bfe0264ad09684210))
* **agent:** keep worker pools alive through database errors and exit non-zero on failure ([559f453](https://github.com/oldmoldycake/Snagr/commit/559f453ab6ffe3b9e624a5e0aba4a1c285f90e7f))
* **agent:** keep worker pools alive through database errors and exit non-zero on failure ([3b3a263](https://github.com/oldmoldycake/Snagr/commit/3b3a263925941b825632f68a081549cda4ada9fe))
* **agent:** let SITE_BREAKER_ERRORS=0 switch the breaker off and stop a reaped worker ending a job it lost ([940a5bc](https://github.com/oldmoldycake/Snagr/commit/940a5bc716cac8ae3743b9153de7f2cc36b6bf82))
* **agent:** let SITE_BREAKER_ERRORS=0 switch the breaker off and stop a reaped worker ending a job it lost ([b5d43bb](https://github.com/oldmoldycake/Snagr/commit/b5d43bb6a903365fedb2f8e8c0d8ea26c558f1ad))
* **agent:** parse grounding prices like page prices and refuse non-positive ones ([e6a3997](https://github.com/oldmoldycake/Snagr/commit/e6a39971b574a089ea3f253e605c4a44dbbb8bdf))
* **agent:** parse grounding prices like page prices and refuse non-positive ones ([6b57c93](https://github.com/oldmoldycake/Snagr/commit/6b57c93f56b8b791ee7be34133e9fd7e247d9a3d))
* **agent:** read a lowercase currency code ahead of a minus sign ([c6b1627](https://github.com/oldmoldycake/Snagr/commit/c6b1627c7153ef3dfe1500199a979e2817af1eb4))
* **agent:** read space- and apostrophe-grouped prices and refuse negatives ([522fe6f](https://github.com/oldmoldycake/Snagr/commit/522fe6ffad9ee4febf6998e6cb43f57c27c4324c))
* **agent:** read space- and apostrophe-grouped prices and refuse negatives ([e512f50](https://github.com/oldmoldycake/Snagr/commit/e512f50bf921137c3e013f3628d6cc76bb38b1eb))
* **agent:** refuse a digit group that runs into more digits ([948f22f](https://github.com/oldmoldycake/Snagr/commit/948f22f873cf4d74c966b3fca37b90f4ec000a3d))
* **agent:** stop a SearXNG suspension from blocking hunts for 15 minutes ([f56c47a](https://github.com/oldmoldycake/Snagr/commit/f56c47a62c886d776267ac0e457544521d28a1e1))
* **agent:** stop a SearXNG suspension from blocking hunts for 15 minutes ([32cc4ab](https://github.com/oldmoldycake/Snagr/commit/32cc4ab3374fe1c60a730c0bdb5c31ed4e6df168))
* **agent:** stop blaming sites for the hunter's own failures ([f7c2466](https://github.com/oldmoldycake/Snagr/commit/f7c2466662b26608d26104c5eee11eeb19f9333a))
* **agent:** stop blaming sites for the hunter's own failures ([2839aaa](https://github.com/oldmoldycake/Snagr/commit/2839aaa6e0a8d84ce8ac8f0e81fb4818649f17f7))
* **agent:** stop new items' hunts from starving the rest of the queue ([465448a](https://github.com/oldmoldycake/Snagr/commit/465448ae88a3eb6e6f21b0a34ab237eb43a5caf7))
* **backend:** answer a lost race for a category or site name with 422 duplicate ([3465edc](https://github.com/oldmoldycake/Snagr/commit/3465edce4f3b4fd5bb56336a8491c5524bd97ab6))
* **backend:** answer bad input with 422 or 409, not db_unavailable or a 500 ([33d62ec](https://github.com/oldmoldycake/Snagr/commit/33d62ecdcd0d465487a96ddf3ca94a06cdfdae00))
* **backend:** answer bad input with 422 or 409, not db_unavailable or a 500 ([4738880](https://github.com/oldmoldycake/Snagr/commit/47388805bf83a39255b2dd172b74926a677520e3))
* **backend:** close SSE streams whose viewer is deactivated, demoted or signed out ([b96bb0d](https://github.com/oldmoldycake/Snagr/commit/b96bb0dd6a7faade3e75029068979f02f7ec5ca8))
* **backend:** close the sign-up races on invites and the first admin ([6d75728](https://github.com/oldmoldycake/Snagr/commit/6d7572888dc4a8e52a449cf3a3e67e7381fcce91))
* **backend:** close the sign-up races on invites and the first admin ([9217886](https://github.com/oldmoldycake/Snagr/commit/921788609fafeede406e6de44f4133a68ce43b85))
* **backend:** delete a site that categories, watches or listings still point at ([432d9ac](https://github.com/oldmoldycake/Snagr/commit/432d9ac7ddf3c757e86254bd99886d4562f76796))
* **backend:** delete market prices with their category's items ([cb93061](https://github.com/oldmoldycake/Snagr/commit/cb930613a513a06a8323dab76fed225f2be4e0b2))
* **backend:** delete market prices with their category's items ([906c50d](https://github.com/oldmoldycake/Snagr/commit/906c50d4332d37915660f6213b6e9f34d67b23f4))
* **backend:** end other sessions on password change and detect refresh-token reuse ([106bd0f](https://github.com/oldmoldycake/Snagr/commit/106bd0f41e77b5c0f1f8becd84b75a8763e5218a))
* **backend:** end other sessions on password change and detect refresh-token reuse ([a376eb9](https://github.com/oldmoldycake/Snagr/commit/a376eb9b62a85cf3c9ea801dac8d7b2012ec10f5))
* **backend:** enforce password length, limit sign-in attempts, hash off the event loop ([42b84c9](https://github.com/oldmoldycake/Snagr/commit/42b84c92a6f3a3d45247c251ab4b7b9ed4a40201))
* **backend:** enforce password length, limit sign-in attempts, hash off the event loop ([c484a3a](https://github.com/oldmoldycake/Snagr/commit/c484a3a21bb9ec96f70b6af5993b7e3b357e0668))
* **backend:** escape search wildcards, keep the last admin, and gate MCP tools by scope ([f55a9bc](https://github.com/oldmoldycake/Snagr/commit/f55a9bc87cadde894c981ed897323dff2d0c5484))
* **backend:** hold category and site names to one rule on create and rename, and never make an empty slug ([95b46d4](https://github.com/oldmoldycake/Snagr/commit/95b46d4c9573d352d96ddbe81016468df41eee7e))
* **backend:** hold category and site names to one rule, and let a site with listings be deleted ([6e55e94](https://github.com/oldmoldycake/Snagr/commit/6e55e94023f96510aeb003158a51755873bb28dc))
* **backend:** keep live updates and notifications alive through a DB drop ([c49c5a9](https://github.com/oldmoldycake/Snagr/commit/c49c5a9e789401130a97bbae234da9806e3c49a2))
* **backend:** keep live updates and notifications alive through a DB drop ([f8b3819](https://github.com/oldmoldycake/Snagr/commit/f8b3819b7f12f1bbe14e7f23348d169f6577b0f0))
* **backend:** keep notification channels off the internal network ([ddb152b](https://github.com/oldmoldycake/Snagr/commit/ddb152bf5e2ab318679db5913da61ae98304820b))
* **backend:** keep notification channels off the internal network ([7266ffb](https://github.com/oldmoldycake/Snagr/commit/7266ffb82a99c0a3f524f42d6f78324a54ab5af2))
* **backend:** keep the instance's last admin and make a first SSO user admin ([847f233](https://github.com/oldmoldycake/Snagr/commit/847f23351cdbe8d87cee8fb6f4e4e0d7c6a634e1))
* **backend:** keep the latest check when thinning price history ([5b47981](https://github.com/oldmoldycake/Snagr/commit/5b47981f23286b8e54c610981eb007864af940e5))
* **backend:** keep the latest check when thinning price history ([d42bec3](https://github.com/oldmoldycake/Snagr/commit/d42bec30584de8d14772352c117fc0a762d4622e))
* **backend:** leave undescribable job events out of the events backfill ([6fe4704](https://github.com/oldmoldycake/Snagr/commit/6fe47042e4d2d54def5d47781686c7ec793bc6af))
* **backend:** let editing an item clear its target and criteria and change its sites ([a3d40b3](https://github.com/oldmoldycake/Snagr/commit/a3d40b3931f9b463cd443895210504dc58881aee))
* **backend:** lock the owner's row before counting channels ([7143867](https://github.com/oldmoldycake/Snagr/commit/71438670b4dd0f4d8b3e91d491e96232d7e9eeca))
* **backend:** make category and site writes admin-only ([593e163](https://github.com/oldmoldycake/Snagr/commit/593e163a1145e92e5e173c3ee3f1c56ad3d7fe99))
* **backend:** match email addresses case-insensitively ([a6b9899](https://github.com/oldmoldycake/Snagr/commit/a6b989973d88b9702cccdc4ce0b0cedaf4d9aaa7))
* **backend:** match email addresses case-insensitively ([339bb78](https://github.com/oldmoldycake/Snagr/commit/339bb7800069dfb15724a1c7661c8e37205d55d4))
* **backend:** match item search wildcards literally ([76fa96e](https://github.com/oldmoldycake/Snagr/commit/76fa96e86c47b293c93de91abcef0fb6a67b41c4))
* **backend:** percent-encode the listing URL in ntfy's Click header ([845064d](https://github.com/oldmoldycake/Snagr/commit/845064d7af486fcea3365bcfb99e6f9da437f1dd))
* **backend:** percent-encode the listing URL in ntfy's Click header ([c449e01](https://github.com/oldmoldycake/Snagr/commit/c449e011724883e23891d29b06a974210371ecef))
* **backend:** refuse target prices that are not an amount in cents ([f2efdc3](https://github.com/oldmoldycake/Snagr/commit/f2efdc3df34e00d7c425f0bf5f70f1e4baa70a0a))
* **backend:** refuse to start on a placeholder or short JWT_SECRET ([bd6325e](https://github.com/oldmoldycake/Snagr/commit/bd6325ea7be522d5c26da6f763d691b757df100f))
* **backend:** refuse to start on a placeholder or short JWT_SECRET ([e908091](https://github.com/oldmoldycake/Snagr/commit/e9080912ac9ed3f74388ea63f902ee6d1d5ad38f))
* **backend:** send notifications concurrently, capped per host and per user ([5792a2e](https://github.com/oldmoldycake/Snagr/commit/5792a2e1d07717ec52d802eabf2b53e56eabd15b))
* **backend:** send notifications concurrently, capped per host and per user ([64b0435](https://github.com/oldmoldycake/Snagr/commit/64b0435b07fff9f0ebe3c458fc7447c57e163c13))
* **backend:** stop a self-chosen email capturing someone else's first SSO login ([62fcc9e](https://github.com/oldmoldycake/Snagr/commit/62fcc9e83c26ab2cd9d189f122c7b3d40b1e47ad))
* **backend:** stop a self-chosen email capturing someone else's first SSO login ([ced43aa](https://github.com/oldmoldycake/Snagr/commit/ced43aad39a1211fd9428581dbe058f5618d680b))
* **backend:** stop one watcher's rename changing a shared item, and keep item names unique ([9617d39](https://github.com/oldmoldycake/Snagr/commit/9617d39dbff331ffd09b3e9cf39562b3a40ca3fe))
* **backend:** stop one watcher's rename changing a shared item, and keep item names unique ([d698fd5](https://github.com/oldmoldycake/Snagr/commit/d698fd53b5b67130c9693914a25a9dfd131d7c0c))
* **backend:** take the next free slug when a concurrent create takes this one ([8895483](https://github.com/oldmoldycake/Snagr/commit/88954832941b5ee0e8ce51f25ef33ba1edc9b0c9))
* **deps:** require sqlalchemy's asyncio extra in agent and backend ([a4fb8a8](https://github.com/oldmoldycake/Snagr/commit/a4fb8a8497e3661c030adfd514582a0d3eee5682))
* **deps:** require sqlalchemy's asyncio extra in agent and backend ([494633d](https://github.com/oldmoldycake/Snagr/commit/494633dd0ff8dce546476885412c170842a1d978))
* **frontend:** allow 10 MB reference uploads through nginx ([245fa75](https://github.com/oldmoldycake/Snagr/commit/245fa7568f742de116aebce91fc7271b35cb7c8f))
* **frontend:** copy buttons fall back to selection on plain HTTP ([9414a72](https://github.com/oldmoldycake/Snagr/commit/9414a72615db2427a89dd4275d0b5627c346edc8))
* **frontend:** copy buttons fall back to selection on plain HTTP ([3fad269](https://github.com/oldmoldycake/Snagr/commit/3fad269800d6099810a9057912454be7f1dcee57))
* **frontend:** correct five small copy bugs ([18ef947](https://github.com/oldmoldycake/Snagr/commit/18ef947ea762124732f61d80a6dc786d6d8a7c80))
* **frontend:** count a hunt as live only in its own item's category ([e98bbd1](https://github.com/oldmoldycake/Snagr/commit/e98bbd1b4fce577a62544c72dd0669bde0b72a01))
* **frontend:** count a hunt as live only in its own item's category ([2f0083a](https://github.com/oldmoldycake/Snagr/commit/2f0083acb08bd501eb94d414143d72c37a32c462))
* **frontend:** drop a hunt's held log once it stops running ([c64ab06](https://github.com/oldmoldycake/Snagr/commit/c64ab06621b760f9924503b30189ce5da5a2ec68))
* **frontend:** drop a hunt's held log once it stops running ([22250b3](https://github.com/oldmoldycake/Snagr/commit/22250b356930e60f2d630b203867aa46a1b8345a))
* **frontend:** encode the invite token in its API paths ([8b446e7](https://github.com/oldmoldycake/Snagr/commit/8b446e7eef6f75dd72907d51302a3f8334362bf5))
* **frontend:** encode the invite token in its API paths ([feef8d1](https://github.com/oldmoldycake/Snagr/commit/feef8d1af786ae0a0494dee99f43d023a3ea98dd))
* **frontend:** keep the price chart and rulers usable with a very large target ([cdb819d](https://github.com/oldmoldycake/Snagr/commit/cdb819d226ee94ff080c3c6252f07a5d15bf8143))
* **frontend:** keep the price chart's ruler to a handful of ticks at any span ([1cdf382](https://github.com/oldmoldycake/Snagr/commit/1cdf382a4541e897fc8d808d20145a51d31ed1a5))
* **frontend:** keep the price rulers' target label off its neighbours ([c36de27](https://github.com/oldmoldycake/Snagr/commit/c36de27dfa33cc036e667d0d43a98e2124213f27))
* **frontend:** label a price chart's large y axis compactly so it isn't clipped ([5c65c83](https://github.com/oldmoldycake/Snagr/commit/5c65c837f62a111263984b705c4b21024a23c3c8))
* **frontend:** let the price history header wrap on phones ([d279a5a](https://github.com/oldmoldycake/Snagr/commit/d279a5a0cf001198714a745fed2fd99ec525fa46))
* **frontend:** load every page of items on the dashboard and category pages ([3a31844](https://github.com/oldmoldycake/Snagr/commit/3a31844b1cb5852568eac72473f235d3451c883f))
* **frontend:** load every page of items on the dashboard and category pages ([d9760ff](https://github.com/oldmoldycake/Snagr/commit/d9760ff41e5ecd9c2f9cfb5a3569ec259dbf8cb6))
* **frontend:** refresh dependent queries after renames, deletes and listing toggles ([3aac561](https://github.com/oldmoldycake/Snagr/commit/3aac561221c2e30b3c477f6e98be9efd42873eee))
* **frontend:** refresh stale queries after renames, deletes and listing toggles ([610706c](https://github.com/oldmoldycake/Snagr/commit/610706c96b1cc6b8b3e9ebcacf72ffdf41a24b0f))
* **frontend:** refresh the dashboard after category and site deletes, jobs after listing toggles ([36fd233](https://github.com/oldmoldycake/Snagr/commit/36fd233912edcb38a73b3f684fc8b9b4eefff00f))
* **frontend:** refresh the session on a 401 from /api/auth/me ([94f20f0](https://github.com/oldmoldycake/Snagr/commit/94f20f0a2bcee8ee28e4ca59b99c0386746fb361))
* **frontend:** refresh the session on a 401 from /api/auth/me ([5a8c134](https://github.com/oldmoldycake/Snagr/commit/5a8c1349980a294d46d5fa06c0f72e7ed1558d6c))
* **frontend:** reopen the live feed after the browser gives up on it ([12296ab](https://github.com/oldmoldycake/Snagr/commit/12296ab74fb1c75a2ec708a013f301e8fb5abbf2))
* **frontend:** reopen the live feed after the browser gives up on it ([e82fde6](https://github.com/oldmoldycake/Snagr/commit/e82fde64ad027cd6dcda86dec3fe7e88577ef069))
* **frontend:** reset category page filters when the category changes ([bb199be](https://github.com/oldmoldycake/Snagr/commit/bb199beec505ee992501803e33435c70c65a6021))
* **frontend:** reset category page filters when the category changes ([63b786c](https://github.com/oldmoldycake/Snagr/commit/63b786c8f15fec282d51e1b6e715a8069ce91aef))
* **frontend:** return to the deep link after signing in ([d8b741d](https://github.com/oldmoldycake/Snagr/commit/d8b741de9aad704ab51a649d7629b975f7e798d8))
* **frontend:** return to the deep link after signing in ([def3a53](https://github.com/oldmoldycake/Snagr/commit/def3a532d37c7a84e71ba7add0b363f4e0fe67b5))
* **frontend:** say when a save fails, and show a failed chart as an error ([20c0997](https://github.com/oldmoldycake/Snagr/commit/20c099779bf7a7f41c57244878acbe914f744d23))
* **frontend:** say when a save fails, and show a failed chart as an error ([3f8ba0d](https://github.com/oldmoldycake/Snagr/commit/3f8ba0db799261e456556c31c982920042343e7a))
* **frontend:** show failed loads as errors with Retry, not empty or not-found states ([53ac6c5](https://github.com/oldmoldycake/Snagr/commit/53ac6c5a39d5559be220f2cc68d29094d5460b5a))
* **frontend:** show failed loads as errors with Retry, not empty or not-found states ([62166fe](https://github.com/oldmoldycake/Snagr/commit/62166fe86e8b674c808a24c8e890ef83d5820636))
* **frontend:** show not-found on Back after deleting an item ([9ffaee2](https://github.com/oldmoldycake/Snagr/commit/9ffaee2aea8bbc314240f0ceda223347fe945c4b))
* **frontend:** show not-found on Back after deleting an item ([6dbb00e](https://github.com/oldmoldycake/Snagr/commit/6dbb00ecd81c3a4e6be186a4c9394a65e13f606e))
* **frontend:** show not-found on Back after deleting an item ([7bbad90](https://github.com/oldmoldycake/Snagr/commit/7bbad905d25812e0d850d06e7f784316e9459b5d))
* **frontend:** sort unpriced watches by name ([b6e93b4](https://github.com/oldmoldycake/Snagr/commit/b6e93b49394d3a0b6b69d13dbc09d9c6daf3fabb))
* **frontend:** stack the sites table into cards and wrap long names on narrow screens ([b7a632a](https://github.com/oldmoldycake/Snagr/commit/b7a632a47f65a413144335243c5805c344275e7d))
* **frontend:** stack the sites table into cards and wrap long names on narrow screens ([83135e9](https://github.com/oldmoldycake/Snagr/commit/83135e9a68b3b98b2decc5d2d2f98378e032f9cd))
* **frontend:** stack the struck-through old price so it can't overrun the Site column ([f6f1c2f](https://github.com/oldmoldycake/Snagr/commit/f6f1c2fc7be84a3ccde635a97be68546d5c29d73))
* **frontend:** stack the struck-through old price so it can't overrun the Site column ([ffa8c32](https://github.com/oldmoldycake/Snagr/commit/ffa8c32b6d6ad04c1b485d739000a8db9279ad62))
* **frontend:** stop the login redirect loop on a stale session ([2b0f31f](https://github.com/oldmoldycake/Snagr/commit/2b0f31f81fd2b1e8b9ad63e3ddd30ae6116cf8dc))
* **frontend:** stop the login redirect loop on a stale session ([d721e67](https://github.com/oldmoldycake/Snagr/commit/d721e67ef93404b2fb857f92e41dcc69ec482ec1))
* **frontend:** use one clear vocabulary for the app's wording ([9071c5f](https://github.com/oldmoldycake/Snagr/commit/9071c5fa6f696d9621b6fba7be8a91f905f9a598))
* **frontend:** wrap long site names in the category site badges ([1d4bba7](https://github.com/oldmoldycake/Snagr/commit/1d4bba7d8d01ffaed8b47d4bb5fa846232d95d85))
* **mcp:** gate tools on the same scopes REST requires ([679b217](https://github.com/oldmoldycake/Snagr/commit/679b217af0825f576392930331e78f9d3277de56))
* refuse target prices that are not an amount in cents and wrap the price history header on phones ([ef64d11](https://github.com/oldmoldycake/Snagr/commit/ef64d11f82628de174afe94856ae148efe30c84d))
* stop "next check" and "next hunt" counting down to times already passed ([b909bca](https://github.com/oldmoldycake/Snagr/commit/b909bca386200842769eb4131604b7df16ca6dce))
* stop grounding and counting items nobody watches ([8463e13](https://github.com/oldmoldycake/Snagr/commit/8463e13fe0e6ae08cde2ede97e4f6eb182bd3a22))
* stop grounding and counting items nobody watches ([16deadf](https://github.com/oldmoldycake/Snagr/commit/16deadf062e42f84d26b476f961c8d35807572fb))
* stop new hunts starving the queue and countdowns showing passed times ([0bfefef](https://github.com/oldmoldycake/Snagr/commit/0bfefef9d972d3a00344c2a9bedb72ec3accb50d))
* use one clear vocabulary in the app and make catalog writes admin-only ([84b41b6](https://github.com/oldmoldycake/Snagr/commit/84b41b6f5063999ece826923f480a9338411de85))
## [0.7.0](https://github.com/oldmoldycake/Snagr/compare/v0.6.1...v0.7.0) (2026-09-25)
### Features
* **frontend:** animate listing detail rows ([7be4535](https://github.com/oldmoldycake/Snagr/commit/7be4535a6c502aec312f38077d4c37ea264954fa))
* **frontend:** animate the listings panel's show-more fold and detail rows ([4f87685](https://github.com/oldmoldycake/Snagr/commit/4f876856379c06433a592e669a3537cc5765c6be))
* **frontend:** animate the listings panel's show-more reveal ([166bd44](https://github.com/oldmoldycake/Snagr/commit/166bd4458297e56a00c15c51711c8260888b2e15))
* **frontend:** give every dropdown menu a header and a tracking highlight ([d7725f1](https://github.com/oldmoldycake/Snagr/commit/d7725f159416105a11be763ea87401583a296ac0))
* **frontend:** give every dropdown menu a header and a tracking highlight ([f0354ad](https://github.com/oldmoldycake/Snagr/commit/f0354ade0c669f3ba42d1b9a4e815ed79ac4b28b))
* **frontend:** track the active nav tab with one lume bar ([3d83071](https://github.com/oldmoldycake/Snagr/commit/3d8307103de3f07818fc246350f83578aa6b5145))
* **frontend:** track the active nav tab with one lume bar ([f0c68c7](https://github.com/oldmoldycake/Snagr/commit/f0c68c77964411e825b430ae3785a3d33b7ba370))
### Bug Fixes
* **frontend:** drop the to-target bar on phones so it stops overlapping the price ([bb998d5](https://github.com/oldmoldycake/Snagr/commit/bb998d5d8ec54850e230975dcbc3616b081863b2))
* **frontend:** drop the to-target bar on phones so it stops overlapping the price ([2bbdcf8](https://github.com/oldmoldycake/Snagr/commit/2bbdcf8a4d5b2b4c06924b4049feb55b17ad412f))
* **frontend:** line up the Activity history result column ([8336c2d](https://github.com/oldmoldycake/Snagr/commit/8336c2d9af0a964632e0b24e96aef97d14a29aa7))
* **frontend:** line up the Activity history result column ([ea7fe7b](https://github.com/oldmoldycake/Snagr/commit/ea7fe7b9051ff3a6eacb714ca3f741692e23157a))
## [0.6.1](https://github.com/oldmoldycake/Snagr/compare/v0.6.0...v0.6.1) (2026-09-25)
### Bug Fixes
* **frontend:** keep a past job's time and tokens on one line ([8f3c640](https://github.com/oldmoldycake/Snagr/commit/8f3c6407e60ae60b4cbf23a4a09bb37885adaa8b))
* **frontend:** keep a past job's time and tokens on one line ([f18ae91](https://github.com/oldmoldycake/Snagr/commit/f18ae91e5377192c93cbfb38c1bedb60ee27af33))
## [0.6.0](https://github.com/oldmoldycake/Snagr/compare/v0.5.0...v0.6.0) (2026-09-25)
### Features
* **frontend:** Activity as one timeline with a needs-you rail ([5358eb6](https://github.com/oldmoldycake/Snagr/commit/5358eb6e3e7e8ffd2b0489886f9df94dca161eba))
* **frontend:** Activity as one timeline with a needs-you rail ([f4b89cc](https://github.com/oldmoldycake/Snagr/commit/f4b89cc4ea2701d7007b8638df5c7beb7d5882cb))
## [0.5.0](https://github.com/oldmoldycake/Snagr/compare/v0.4.1...v0.5.0) (2026-09-25)
### Features
* **frontend:** category shelves and a guided first run on the dashboard ([ea2005d](https://github.com/oldmoldycake/Snagr/commit/ea2005d9a0328b21f732bf49a87deb402f2adcd8))
* **frontend:** category shelves and a guided first run on the dashboard ([16649e2](https://github.com/oldmoldycake/Snagr/commit/16649e272baa17ff15f84352a7a6b809147e3339))
* **frontend:** field-card dialogs with enter and exit motion ([703fa69](https://github.com/oldmoldycake/Snagr/commit/703fa6935db3312c068aaca9a2dfc7bd3cee1eab))
* **frontend:** field-card dialogs with enter and exit motion ([be4ceb8](https://github.com/oldmoldycake/Snagr/commit/be4ceb8247ceca013b7d3ab4538a1b6782ab52da))
* **frontend:** pick or add sites while creating a category ([a69ce25](https://github.com/oldmoldycake/Snagr/commit/a69ce2512e92251a053b610689cf6e1fa47233bc))
* **frontend:** pick or add sites while creating a category ([25b2b46](https://github.com/oldmoldycake/Snagr/commit/25b2b46c1a65b8bc82412f758e3eeae210144989))
## [0.4.1](https://github.com/oldmoldycake/Snagr/compare/v0.4.0...v0.4.1) (2026-09-24)
### Bug Fixes
* **agent:** let every queued site trade into a full watch, trim hunt context, read each listing once ([6ab512f](https://github.com/oldmoldycake/Snagr/commit/6ab512f5dd29f9947f34c6e422edf43b7b9df8b2))
* **agent:** let every queued site trade into a full watch, trim hunt context, read each listing once ([ed1270b](https://github.com/oldmoldycake/Snagr/commit/ed1270bc82b68c1b8ae2926edc195bcd32310c36))
## [0.4.0](https://github.com/oldmoldycake/Snagr/compare/v0.3.0...v0.4.0) (2026-09-24)
### Features
* **agent:** group Langfuse traces by watch and tag them by kind, site and category ([7ca88ff](https://github.com/oldmoldycake/Snagr/commit/7ca88ffcd8ab6f2e93f2b03e03e18aa73fcba541))
* **agent:** group Langfuse traces by watch and tag them by kind, site and category ([025a329](https://github.com/oldmoldycake/Snagr/commit/025a329ff15bd8d260f8fb79df9d1d40f96756ab))
## [0.3.0](https://github.com/oldmoldycake/Snagr/compare/v0.2.1...v0.3.0) (2026-09-24)
### Features
* **agent:** derive and replay per-listing price locators ([c585ccb](https://github.com/oldmoldycake/Snagr/commit/c585ccb37e624d9271cb1eed81a3e1fcf5ecaeb6))
* **agent:** disable_listing records why a listing ended ([dad7c9c](https://github.com/oldmoldycake/Snagr/commit/dad7c9c7e06332b8fd9d2d39dbf63695e0498d6d))
* **agent:** learned price locators and deterministic rechecks ([952d45a](https://github.com/oldmoldycake/Snagr/commit/952d45abc2438ea4d66b343c8ddfaea8be8422ea))
* **agent:** per-site circuit breaker ([4ca58d1](https://github.com/oldmoldycake/Snagr/commit/4ca58d1293a437cc65ddf0c982b70cb4be8be25a))
* **agent:** perpetual hunting — backoff chain, hourly sweep, freed-slot wakes, kill switch ([bbe0ed8](https://github.com/oldmoldycake/Snagr/commit/bbe0ed89b09739a507dce4d16456b8d560ebf308))
* **agent:** perpetual hunting with backoff ([9f13b2a](https://github.com/oldmoldycake/Snagr/commit/9f13b2a0e6bb055abc8779ea672674e4c6c0358c))
* **agent:** read a price from raw HTML without a browser ([0a68639](https://github.com/oldmoldycake/Snagr/commit/0a6863951c139de4e1871159eda6e797c411a34d))
* **agent:** recheck tracked listings without the model ([35f7007](https://github.com/oldmoldycake/Snagr/commit/35f700710320647d3356af766403e6bd8724ef0a))
* **agent:** schedule each recheck on the watch's own interval ([9aaf9d9](https://github.com/oldmoldycake/Snagr/commit/9aaf9d99826eaa831604e9d70eb0aa74fa0e5e2f))
* **agent:** swap hunts on a full watch ([8c9b0ae](https://github.com/oldmoldycake/Snagr/commit/8c9b0aedde162527d09a97cfe3e8e2fe90d95c4d))
* **agent:** swap hunts on a full watch ([5ecbf1c](https://github.com/oldmoldycake/Snagr/commit/5ecbf1cc84ca7a90be08d230166b46709354ae11))
* **agent:** the hunter daemon — serve, the two pools, the scheduler ([1112183](https://github.com/oldmoldycake/Snagr/commit/1112183efe0dbdd1de2cd257005a889351934b05))
* **agent:** the jobs queue ([bdc24e0](https://github.com/oldmoldycake/Snagr/commit/bdc24e0b11adc662dc9425b1156cc76ffd015a43))
* **agent:** validate prices, URLs and model-typed text ([ab4c74a](https://github.com/oldmoldycake/Snagr/commit/ab4c74a4dbd5a4f33075dcb7eb9ce62a890a3a1e))
* **agent:** validate tool arguments and refuse cross-listing writes ([ebd9762](https://github.com/oldmoldycake/Snagr/commit/ebd97624be240d91b631195eb7d9626bd045a61f))
* **agent:** validate tool arguments and refuse cross-listing writes ([4563221](https://github.com/oldmoldycake/Snagr/commit/4563221406f42c9e0392f6ac4b71ac3cfadd08e1))
* **api:** expose how each price was read, and ignore unbelieved readings ([9f9b70f](https://github.com/oldmoldycake/Snagr/commit/9f9b70fadbd9fbacfea6289bccd1d05c881a4d1f))
* **api:** the jobs API replaces runs ([029f39c](https://github.com/oldmoldycake/Snagr/commit/029f39cf2b3db74fc747987fdae50bbc36a1bb73))
* **backend:** a user hunt on a full watch queues a swap hunt ([093b7b3](https://github.com/oldmoldycake/Snagr/commit/093b7b3358bbd10a24b80657c207423a99e2d3fc))
* **backend:** hunt switch, backoff facts and the hunting kill switch ([fcef19d](https://github.com/oldmoldycake/Snagr/commit/fcef19d7cb1ed67f6434b991f454d041340d9c60))
* **backend:** migration 017 — watch check interval and listing inactive_reason ([478c4c1](https://github.com/oldmoldycake/Snagr/commit/478c4c1395f80a67e81c117fd491c3eea01d1700))
* **backend:** migration 018 — the hunting switch and job payload ([e17cf35](https://github.com/oldmoldycake/Snagr/commit/e17cf3537a8fb6ff43c23a1b0dc3ff7f52c41167))
* **backend:** per-watch check interval on items, MCP and InstanceInfo ([2c13f2d](https://github.com/oldmoldycake/Snagr/commit/2c13f2d85d10d87b45c182088079cd35e9429efb))
* **backend:** untracking a listing records inactive_reason 'untracked' ([25b75d4](https://github.com/oldmoldycake/Snagr/commit/25b75d4d89341d514489296289a41fef233d8b4f))
* **db:** migration 015 — the job queue replaces the run tables ([671e7cb](https://github.com/oldmoldycake/Snagr/commit/671e7cb0bb48592a5624967a466f4c89886a9213))
* **db:** price locators on listings, method and confirmed on checks ([c403d6f](https://github.com/oldmoldycake/Snagr/commit/c403d6faf0566fcca2160de2e030d59e17db1d19))
* **frontend:** Check every control and interval in the facts line ([c81e920](https://github.com/oldmoldycake/Snagr/commit/c81e9209abd93214dace3ce1c0e94c37888e9d1d))
* **frontend:** contract for perpetual hunting ([f3791b4](https://github.com/oldmoldycake/Snagr/commit/f3791b44621ad2124f3d75ffd1ee6c0838fb28c4))
* **frontend:** contract for the per-watch check interval ([1e982f5](https://github.com/oldmoldycake/Snagr/commit/1e982f5384fc0da9c4096e1722a7ec88a8d5b468))
* **frontend:** extract the listings rail math to a log scale, with tests ([33e3658](https://github.com/oldmoldycake/Snagr/commit/33e3658fdccda9f66d361c1c1f18ecfb9d872c8d))
* **frontend:** Hunt for better on a full watch ([17a0b85](https://github.com/oldmoldycake/Snagr/commit/17a0b8518a4b6e46d931c9a9c25f33a8b78a0940))
* **frontend:** Hunting switch, facts-line states and the HUNTING OFF ticker ([83a6f61](https://github.com/oldmoldycake/Snagr/commit/83a6f615c94177126426decb8e5b4c70565c532a))
* **frontend:** log-scale listings rail with per-row target notch ([4360df2](https://github.com/oldmoldycake/Snagr/commit/4360df23e283b3f4deee5f5f83250ca9ee4a64ad))
* **frontend:** per-row target notch, labeled ruler and label flip on the listings board ([31cbdbe](https://github.com/oldmoldycake/Snagr/commit/31cbdbe6f1eb465b9c7836b3efece1ea8a77af0d))
* **frontend:** show how each price was read ([6aa75a2](https://github.com/oldmoldycake/Snagr/commit/6aa75a2435eb67dc9303b0cd3f8f2261fc2d3aa7))
* **frontend:** the Activity page replaces Runs ([df3bcf5](https://github.com/oldmoldycake/Snagr/commit/df3bcf5fe73f3d25fa55ad84a3e115bb090ab8b0))
* **frontend:** the jobs contract — types, endpoints, queries and the mock ([b5fa06e](https://github.com/oldmoldycake/Snagr/commit/b5fa06e37d352f2544f7c540974bd47b3ccd6d79))
* per-watch check interval ([a90520d](https://github.com/oldmoldycake/Snagr/commit/a90520d6f94cd474024841bcaa47fc61e4fda14f))
### Bug Fixes
* **agent:** a breaker trip keeps a person's hunt labelled theirs ([d958826](https://github.com/oldmoldycake/Snagr/commit/d958826444ad239d6bea04ba72a1cdc8c321ee1c))
* **agent:** a check queued during a pause waits for the pause to lift ([4acbac2](https://github.com/oldmoldycake/Snagr/commit/4acbac20343a2b5409f85607af1a6aac14e82622))
* **agent:** deactivate_listing refuses a reason the CHECK would reject ([f40c165](https://github.com/oldmoldycake/Snagr/commit/f40c165cdde5211f5a2c7d34ab17dc3e6a1710a0))
* **agent:** disable_listing commits the ending before waking hunts ([721aa0a](https://github.com/oldmoldycake/Snagr/commit/721aa0ae12513e2fc306a487d4fea908f2be4465))
* **agent:** record an ending before waking hunts, and skip deactivated accounts ([5391917](https://github.com/oldmoldycake/Snagr/commit/5391917ad7deecf2102fda8596078aa1e2a123e7))
* **agent:** skip known inactive listings instead of resurrecting them ([602df94](https://github.com/oldmoldycake/Snagr/commit/602df946fc4746aa14bd2331c2812de81892900b))
* **agent:** skip known inactive listings instead of resurrecting them ([7cbdd7a](https://github.com/oldmoldycake/Snagr/commit/7cbdd7a72ffa1ef2d6721789df0f04fe7d82d536))
* **agent:** the breaker hears a site that answers nothing ([5127328](https://github.com/oldmoldycake/Snagr/commit/5127328f59dd15d3205a90c13d730646b298d3ae))
* **backend:** a shorter interval only brings tracked listings' checks forward ([58fa263](https://github.com/oldmoldycake/Snagr/commit/58fa263a1306f33021c59490137cca2a1beb7e34))
* **backend:** queue a first check for listings that predate the jobs table ([585dd32](https://github.com/oldmoldycake/Snagr/commit/585dd326378c3c7ad372151a1844776a439ad536))
* **backend:** queue a first check for listings that predate the jobs table ([01aa4af](https://github.com/oldmoldycake/Snagr/commit/01aa4afb89bddce7e5d06c6d63af07d319ba819e))
* **backend:** switching hunting off drops creation hunts; more room hunts now ([798ddfc](https://github.com/oldmoldycake/Snagr/commit/798ddfca93832a641179f75354a7470e9c7968b9))
* **frontend:** a fractional custom check interval is refused, not rounded ([41bfa6c](https://github.com/oldmoldycake/Snagr/commit/41bfa6c63ef870440f1f1118e5e5d1fa62a0f69a))
* **frontend:** only running hunts are live ([da278bd](https://github.com/oldmoldycake/Snagr/commit/da278bdf893b4dee9e63d97504bbdac8267b8134))
## [0.2.1](https://github.com/oldmoldycake/Snagr/compare/v0.2.0...v0.2.1) (2026-09-14)
### Bug Fixes
* **agent:** notify toggle no longer pauses discovery ([08107be](https://github.com/oldmoldycake/Snagr/commit/08107beaf121f72707900cf7807db434b1b885d7))
## [0.2.0](https://github.com/oldmoldycake/Snagr/compare/v0.1.0...v0.2.0) (2026-09-14)
### Features
* **agent:** add DB layer for market-price grounding ([06d3131](https://github.com/oldmoldycake/Snagr/commit/06d3131b90212ac92869ccc39b4b6a490cc3b24e))
* **agent:** add grounding config (SearXNG, currency, TTL, refresh cap) ([01d5415](https://github.com/oldmoldycake/Snagr/commit/01d541507fd0179d337f98c5b672adc727da924e))
* **agent:** add optional Langfuse/LangSmith tracing ([bb28800](https://github.com/oldmoldycake/Snagr/commit/bb288004989181fd2c38dd2a6b3382c0c1540607))
* **agent:** check_images — the vision second opinion in the discovery pass ([373191a](https://github.com/oldmoldycake/Snagr/commit/373191a54556e8b841d90d18310dc829f24eb54a))
* **agent:** consume queued runs and record sweeps ([a4c030e](https://github.com/oldmoldycake/Snagr/commit/a4c030e74541475be5042158075b97cddb9ad285))
* **agent:** docker packaging + compose run-queue ticker ([0da2b54](https://github.com/oldmoldycake/Snagr/commit/0da2b546abd48c5b3f1157eeee127f759a2d08d6))
* **agent:** enqueue notifications to the outbox and announce new listings ([2759e3e](https://github.com/oldmoldycake/Snagr/commit/2759e3ea94dccaa5178ffa1975848c49fd7f95a1))
* **agent:** fire due schedules when the consume tick finds an empty queue ([d5351ac](https://github.com/oldmoldycake/Snagr/commit/d5351ac15fb0d81d1153cf516b4cab885bfbd622))
* **agent:** heartbeat, stale-run reaper, and clean shutdown ([5fa19a2](https://github.com/oldmoldycake/Snagr/commit/5fa19a20e6a74936c90d8ab436a20220817b0ec2))
* **agent:** implement guide-first market-price grounding pipeline ([adfeb3b](https://github.com/oldmoldycake/Snagr/commit/adfeb3b2a22f848da6c8fe98684fa89c159ded52))
* **agent:** listing.new — announce genuinely new listings ([4368cc9](https://github.com/oldmoldycake/Snagr/commit/4368cc950ac231e8d0a02bb5274bd988468e5acd))
* **agent:** package the agent as the compose run-queue ticker ([a4e13bf](https://github.com/oldmoldycake/Snagr/commit/a4e13bf8db6765e2cacbd69b6b6a1190652f5a94))
* **agent:** per-unit step and wall-clock budgets ([1ee62f8](https://github.com/oldmoldycake/Snagr/commit/1ee62f8a7ac1f618ad35e2024bb1b7e3a680afbc))
* **agent:** push an ntfy notification when a watch crosses its target ([4c80890](https://github.com/oldmoldycake/Snagr/commit/4c808903e80c545f8c8e4a5f3f035885b602ed14))
* **agent:** push an ntfy notification when a watch crosses its target ([b9d1552](https://github.com/oldmoldycake/Snagr/commit/b9d1552ee9382a8987b42849aba33240ad7ac7cc))
* **agent:** run heartbeat, stale-run reaper, clean shutdown, per-unit budgets ([ac6918a](https://github.com/oldmoldycake/Snagr/commit/ac6918adf4bc083c706941f42d2b559a963eb728))
* **agent:** run-queue DB layer and stats tally ([496cce8](https://github.com/oldmoldycake/Snagr/commit/496cce8226415b168ff8afc71f4a5fcad6e6f797))
* **agent:** schedule-claim DB layer (claim_due_schedule + roll_forward) ([978b673](https://github.com/oldmoldycake/Snagr/commit/978b6732fdbf2e030916753c4adc4463c11310f2))
* **agent:** scope traces by run session and watch owner ([bda0b07](https://github.com/oldmoldycake/Snagr/commit/bda0b07ab3b1778cdda12b23f9ab8e51625119cc))
* **agent:** surface market-price context in scrape and recheck prompts ([cf70cb2](https://github.com/oldmoldycake/Snagr/commit/cf70cb2b5837d38a218e77a933e00936719fe025))
* **agent:** target-hit notifications enqueue to the outbox ([bd8a9df](https://github.com/oldmoldycake/Snagr/commit/bd8a9dfc1e1359241e642ed7f2ebf0714cde197d))
* **agent:** wire grounding pre-pass into the run loop, add --ground-only ([86587b4](https://github.com/oldmoldycake/Snagr/commit/86587b4c4e046cad2903aa39c095c9652f099a3f))
* **aggregates:** bucketed best-price sparkline for item rows ([97741b1](https://github.com/oldmoldycake/Snagr/commit/97741b18f45f934b734089f8242b833f79448bcd))
* **aggregates:** price history and summary series ([99ccb91](https://github.com/oldmoldycake/Snagr/commit/99ccb91ac88ae4e18669c1f2bcc0c9f334101d20))
* API tokens and the MCP layer ([6c0fb68](https://github.com/oldmoldycake/Snagr/commit/6c0fb689bcf1bb1fbebc126e557900ab1296a6c5))
* **api:** /api/me/channels CRUD + per-channel test sends ([3e2d32b](https://github.com/oldmoldycake/Snagr/commit/3e2d32bb5495291509f6ca0b21af197ff7be8b58))
* **api:** agent_runs.heartbeat_at for the agent's stale-run reaper ([924c9d3](https://github.com/oldmoldycake/Snagr/commit/924c9d36d0047b2f7494033da71e6370db2e436f))
* **api:** personal access tokens as bearer auth ([683ad4f](https://github.com/oldmoldycake/Snagr/commit/683ad4ff35d8e3e7afe752287d8b0a01f5c353c5))
* **backend:** add category condition-tier and price-source columns ([2b0243b](https://github.com/oldmoldycake/Snagr/commit/2b0243b056970816c0ce975c88bcc2561e53c7e7))
* **backend:** add market-price grounding schema ([401492e](https://github.com/oldmoldycake/Snagr/commit/401492e9bbcb9a73ee8eeb2a68e034855c29efbc))
* **backend:** add run_schedules schema ([08828d8](https://github.com/oldmoldycake/Snagr/commit/08828d83a643d00f9348159041535f002ac7a52b))
* **backend:** enforce run visibility on the REST surface ([bfa7f1d](https://github.com/oldmoldycake/Snagr/commit/bfa7f1d6e947e2cfcdf26927962a860a56517d8b))
* **backend:** implement run enqueue (trigger_run) ([60f624f](https://github.com/oldmoldycake/Snagr/commit/60f624f5498dee8cba3f24ac9ed2e2e106161fa1))
* **backend:** per-viewer SSE — identity-aware hub, filtered fan-out, per-client snapshots ([b37d2f0](https://github.com/oldmoldycake/Snagr/commit/b37d2f0ab58f2e0477ae6b3a1299d8b09d7f1aae))
* **backend:** run ownership — user_id on agent_runs + run_schedules ([e09dd9a](https://github.com/oldmoldycake/Snagr/commit/e09dd9acb679994c930473bb952d47d6847a88cc))
* **backend:** stream run activity over SSE (pg_notify triggers + LISTEN hub) ([094a1a2](https://github.com/oldmoldycake/Snagr/commit/094a1a2422564812678f391910b0cfd4a5c8e789))
* **backend:** the notification dispatcher ([6659689](https://github.com/oldmoldycake/Snagr/commit/6659689584696c83df4d58042a852b5036412a26))
* **backend:** vision authenticity schema — reference library, scans, listing images, user thresholds ([f73c2eb](https://github.com/oldmoldycake/Snagr/commit/f73c2ebe38bf2dc7d93c1481f7ec5a608db52a2c))
* **backend:** vision surfaces — review queue, library, image proxy, thresholds ([2c2f846](https://github.com/oldmoldycake/Snagr/commit/2c2f8464eacba3419c3a2f08545a5a6442b5dffe))
* **backend:** vision surfaces — review queue, library, image proxy, thresholds ([d535d6a](https://github.com/oldmoldycake/Snagr/commit/d535d6a8929a4aa45adbc9aa25b7e68c32dc1ef8))
* **charts:** category price change endpoint ([2fdf1cc](https://github.com/oldmoldycake/Snagr/commit/2fdf1cc2775942379c3ada50dbc1d2109b7333af))
* **charts:** price-history and price-summary endpoints ([5be7f05](https://github.com/oldmoldycake/Snagr/commit/5be7f0501c7a612a1a4a4fe9c9bfa33ad59a3608))
* **charts:** recent price drops endpoint ([0cbc4df](https://github.com/oldmoldycake/Snagr/commit/0cbc4df13d52b77058519f6c2e0201db44fc177e))
* **CLAUDE:** Updated cluade md to start establishing proper conventions ([b01e40b](https://github.com/oldmoldycake/Snagr/commit/b01e40b19e8edf55e1a46dc2039c9b1e7ba51942))
* **compose:** opt-in vision profile — minio + sidecar services ([f120bf4](https://github.com/oldmoldycake/Snagr/commit/f120bf45c8c79af9cf3466a4343ff1438311b731))
* **contract:** API tokens in types, endpoints, and mocks ([e37a721](https://github.com/oldmoldycake/Snagr/commit/e37a721d5357b0dc01ffeb162e618afd5b030084))
* **contract:** per-user notification channels in types, endpoints, and mocks ([629f565](https://github.com/oldmoldycake/Snagr/commit/629f56536e2cf606a69b6212f656c6ed5bc5b354))
* **contract:** per-user run privacy — types, mock oracle, D-P5 catch-up ([6441faa](https://github.com/oldmoldycake/Snagr/commit/6441faace5ea2b4f746a85d30d02beee0d69cb1b))
* **contract:** vision endpoints + FormData-aware client ([49b2b05](https://github.com/oldmoldycake/Snagr/commit/49b2b055c3068899bbdfab2dc6842d7d1e10ae69))
* **contract:** vision types + the mock oracle ([2297422](https://github.com/oldmoldycake/Snagr/commit/2297422911545c191083218a4c95456d02090a23))
* **dashboard:** stats tiles with drop counting and snagged items ([4101760](https://github.com/oldmoldycake/Snagr/commit/4101760d63c0c3f232131d60cc31073dc9843901))
* **db:** drop users.ntfy_topic (migration 011) + ownership docs ([f920814](https://github.com/oldmoldycake/Snagr/commit/f9208141965289bbc9d946ce3d7ac5063101d771))
* **db:** notification channels, outbox, and deliveries (migration 010) ([b780007](https://github.com/oldmoldycake/Snagr/commit/b780007d55d8024bb432bc952106723d5e9fcc73))
* **frontend:** add hand-rolled price-plot primitives ([d1fde8f](https://github.com/oldmoldycake/Snagr/commit/d1fde8f4716233972b5138c3bf062a67865c1711))
* **frontend:** dashboard redesign — every fact once, in the table ([8c257b0](https://github.com/oldmoldycake/Snagr/commit/8c257b04d852142f380d6402549500e1924538c5))
* **frontend:** dashboard rewrite — verdict hero, agent ticker, unified watch list ([38f957f](https://github.com/oldmoldycake/Snagr/commit/38f957fc409388ad8264424a093cee94e54e0104))
* **frontend:** flag photo-fake listings on the target board ([bbb7c00](https://github.com/oldmoldycake/Snagr/commit/bbb7c0035fc1203c202ab9d3db158105e76c945a))
* **frontend:** fold overnight events into the watch table ([069098e](https://github.com/oldmoldycake/Snagr/commit/069098ecdb80aa73d0ea497c2745dee16c4159ab))
* **frontend:** item detail rewrite — verdict block, ladder, tabbed chart panel ([af1a63b](https://github.com/oldmoldycake/Snagr/commit/af1a63b01ca03925d9804384dc297f575224d141))
* **frontend:** masthead shell replaces the sidebar; reticle auth screens ([fd66624](https://github.com/oldmoldycake/Snagr/commit/fd666243e853c21acf1a8f42c0171f382069e039))
* **frontend:** Night Hunt redesign ([02c40ab](https://github.com/oldmoldycake/Snagr/commit/02c40abfae78882e059b98709d7872acb223b372))
* **frontend:** night-hunt design tokens, fonts, and primitive restyle ([736cd2e](https://github.com/oldmoldycake/Snagr/commit/736cd2eb980ce119f98d7cd57cd7823d8c51cea9))
* **frontend:** notification channels contract, mocks, and settings UI ([1c99039](https://github.com/oldmoldycake/Snagr/commit/1c990393441e7ec12dc8a4652d4fa924dc936834))
* **frontend:** photo review queue page ([9080832](https://github.com/oldmoldycake/Snagr/commit/9080832f4dff4bb14e9f6c4245ed7ff770074170))
* **frontend:** redesign the item page's listings as a target-rail board ([3900fc2](https://github.com/oldmoldycake/Snagr/commit/3900fc2343ffd7fdd4f60b479fe73f41b0d19b52))
* **frontend:** redesign the price history charts ([539c61e](https://github.com/oldmoldycake/Snagr/commit/539c61e702a5b7d52ed70cfda384260cfbee669a))
* **frontend:** reference library on the item detail page ([bc65c5c](https://github.com/oldmoldycake/Snagr/commit/bc65c5c2d5d0e783786a9f601dfa488b676250c3))
* **frontend:** replace dashboard action cards with the pulse line ([8a4d4c0](https://github.com/oldmoldycake/Snagr/commit/8a4d4c08916153bc4cf028dd137e7f2c9dcd4377))
* **frontend:** replace the listings table with the target-rail board ([8a03b2d](https://github.com/oldmoldycake/Snagr/commit/8a03b2d2f9a12209f419b96d5c91919066df65e0))
* **frontend:** rewrite price charts as hand-rolled SVG ([04ecfb7](https://github.com/oldmoldycake/Snagr/commit/04ecfb7b94de3ea4b33c045dcfe3a2651f31bc15))
* **frontend:** runs in the terminal voice — live sweep hero, glyph statuses ([882f47c](https://github.com/oldmoldycake/Snagr/commit/882f47c2ce22aafd9bce47895112efd4336aacaf))
* **frontend:** sites, settings, and admin on the night-hunt system; docs ([4a941a7](https://github.com/oldmoldycake/Snagr/commit/4a941a7c96086ff628ba2cb4a385232c711f64e2))
* **frontend:** swap chart series palette to Embers ([12bfa03](https://github.com/oldmoldycake/Snagr/commit/12bfa03ee310e3f612207c4c3e8996714b80dd3c))
* **frontend:** vision review queue, reference library, and listing authenticity UI ([f6fe5dc](https://github.com/oldmoldycake/Snagr/commit/f6fe5dc683533d852bf9be7311c7e63d37ad230f))
* **frontend:** vision thresholds in settings ([a64db5e](https://github.com/oldmoldycake/Snagr/commit/a64db5e5619155764a2de836a5b2988ed2b08737))
* **items:** compute price rollups for item list rows ([b73072e](https://github.com/oldmoldycake/Snagr/commit/b73072e5611fe9fa93bef58fc677bd2000f039f9))
* **mcp:** the MCP endpoint with the read-only tool surface ([73973c3](https://github.com/oldmoldycake/Snagr/commit/73973c3f559c860900ac11af25326493da3195b9))
* **mcp:** write, run and vision tools ([421f171](https://github.com/oldmoldycake/Snagr/commit/421f1718ba458c7a21abcd9ee99f27d54fc97533))
* **notifications:** outbox dispatcher, channels API, and agent port ([5b7b364](https://github.com/oldmoldycake/Snagr/commit/5b7b364ff445479fe14234e1c9f06b017df3b549))
* **oidc:** code exchange, ID-token validation, /api/auth/oidc/callback ([2ce7c3f](https://github.com/oldmoldycake/Snagr/commit/2ce7c3f9aafc29e8b9ac9a50c26c69a0533e04cf))
* **oidc:** discovery, PKCE flow helpers, /api/auth/oidc/login ([355c3c3](https://github.com/oldmoldycake/Snagr/commit/355c3c376fe32a65b25cc87c7c26724902275840))
* **oidc:** expose oidc_provider_name in InstanceInfo ([1f4deba](https://github.com/oldmoldycake/Snagr/commit/1f4deba776d2b6edb32980e38ba8b566f11fba70))
* **oidc:** OIDC settings + users.oidc_sub column ([40b3bf7](https://github.com/oldmoldycake/Snagr/commit/40b3bf787e81800c06ed53901b867de5b69c3298))
* **oidc:** resolve_oidc_user account-linking service ([9493000](https://github.com/oldmoldycake/Snagr/commit/949300052532e67977ab172476813d997c77d14b))
* **oidc:** SSO sign-in button + failure banner on the login page ([90de7e3](https://github.com/oldmoldycake/Snagr/commit/90de7e3f43027f315bd97f9a5d95c85e5fbced1d))
* **oidc:** SSO-specific message when changing a nonexistent password ([a634496](https://github.com/oldmoldycake/Snagr/commit/a6344964c82b21bec6dd72b4e139efb43b9c6e6d))
* **runs:** implement list, get, events backfill, and cancel endpoints ([d980e2a](https://github.com/oldmoldycake/Snagr/commit/d980e2a40f7a94e98e380c521c4988f6d2cc9d07))
* **settings:** channels card replaces the ntfy topic UI ([e681f76](https://github.com/oldmoldycake/Snagr/commit/e681f767b1821e75bc20eaa5895a7b8f50a0591e))
* **settings:** MCP & API tab with tokens and client config ([eb3c0fb](https://github.com/oldmoldycake/Snagr/commit/eb3c0fbc4cde82de5d538023d1d2433ce6db3a36))
* **vision:** DINOv3 authenticity sidecar — embed, score, promote, GC ([2a99552](https://github.com/oldmoldycake/Snagr/commit/2a99552b44a9fce1691473bd0d25a0c038c31d60))
### Bug Fixes
* **agent:** hold one MCP session per run and fail units that never browsed ([4e9806b](https://github.com/oldmoldycake/Snagr/commit/4e9806b57be0863ed909260a75fa36154166177a))
* **agent:** honor per-watch site selection ([da859c7](https://github.com/oldmoldycake/Snagr/commit/da859c7b79128486e03f6d32a3260048e7a4e820))
* **agent:** honor per-watch site selection ([24a8cd7](https://github.com/oldmoldycake/Snagr/commit/24a8cd7d45e75915f5c6015662be30c9fe4b85fc))
* **agent:** keep the unknown bucket out of published market prices ([1835783](https://github.com/oldmoldycake/Snagr/commit/1835783b6bdaab20d109592e566a8ba6a1b6d746))
* **agent:** meter max_listings per watch, not per site scan ([f0a9859](https://github.com/oldmoldycake/Snagr/commit/f0a9859e23b6364d56455d5ed3fae45f59fb89b8))
* **agent:** meter max_listings per watch, not per site scan ([4c4d9be](https://github.com/oldmoldycake/Snagr/commit/4c4d9be45f6c33231feef0281e309fe303738d21))
* **agent:** never record auction bids as prices — Buy It Now is the exception ([f9fd12b](https://github.com/oldmoldycake/Snagr/commit/f9fd12b2237dfd179c95f62b77eeeb344822b9e5))
* **agent:** never record auction bids as prices — Buy It Now is the exception ([0382fb6](https://github.com/oldmoldycake/Snagr/commit/0382fb62b947c7039f1e88fbedd58c6b2546cb2f))
* **agent:** quarantine implausible prices, publish the basis count ([796d4b5](https://github.com/oldmoldycake/Snagr/commit/796d4b526d174daf17f7b9e8fa280e2b54278c19))
* **agent:** stamp price and listing checks in UTC ([f7f50e4](https://github.com/oldmoldycake/Snagr/commit/f7f50e4dd49636be2dfd959d38c3232d6ba133f1))
* **aggregates:** skip unpriced checks and guard degenerate points ([7044de1](https://github.com/oldmoldycake/Snagr/commit/7044de1c67c202e162d58a2bf613f9f9384ae319))
* **api:** answer db_unavailable when a site delete fails ([4cedc2e](https://github.com/oldmoldycake/Snagr/commit/4cedc2e71cac329c337467528c684895c3bc6ebc))
* **api:** declare the enabled server defaults on the models ([b36795c](https://github.com/oldmoldycake/Snagr/commit/b36795c3911a87c450348c1e2c27b98d86b54556))
* **api:** match the mock's category name validation ([a961cf6](https://github.com/oldmoldycake/Snagr/commit/a961cf642dfb62884104084d2cbef1c333704a19))
* **api:** scope snagged_count to the caller's own live targets ([42c4410](https://github.com/oldmoldycake/Snagr/commit/42c44107e78d4ded2dd60620ce43381b37ca06c8))
* **contract:** apply allow_reproductions on item create and update ([0c789c6](https://github.com/oldmoldycake/Snagr/commit/0c789c63dbceddd028fa8fc519b41f0800f7c3bd))
* **frontend:** don't flash the no-sweeps copy while the ticker loads the last run ([e1bbee2](https://github.com/oldmoldycake/Snagr/commit/e1bbee249ba9a01ea313f72fa84c742420a0dba8))
* **frontend:** merge ladder labels near the right edge so now/target can't overprint ([20d0820](https://github.com/oldmoldycake/Snagr/commit/20d0820b65094a3b81af15e4e31b5f44deb76733))
* **frontend:** navigate to the slug the rename returned ([6358a73](https://github.com/oldmoldycake/Snagr/commit/6358a7356b713b9e69935df2c3fa692c50fd638f))
* **frontend:** no-cache the SPA shell so deploys take effect on reload ([7abd10a](https://github.com/oldmoldycake/Snagr/commit/7abd10adaa2b749c1be2d23d691d0a1cb72f708f))
* **frontend:** render category chips on the dashboard before any items exist ([d7128c2](https://github.com/oldmoldycake/Snagr/commit/d7128c24136b70d9fee0515666894ea94c40a0f2))
* **mocks:** deactivate over-cap seeded listings so slots read 5 of 5 ([fe28f58](https://github.com/oldmoldycake/Snagr/commit/fe28f58bebea30c33491434844c4d8e116601db4))
* **mocks:** pluralize the seeded run-complete log line ([9ccd090](https://github.com/oldmoldycake/Snagr/commit/9ccd090fd9860c8f0b4e50fd70eff345db9fac25))
* **oidc:** final-review fixes — pin authlib, normalize IdP email, harden flow cookie ([7de44b0](https://github.com/oldmoldycake/Snagr/commit/7de44b0c69984842b3c0ece3a9b803d061dd7322))
* **oidc:** guarded case-insensitive email marriage per final review ([e9cb13a](https://github.com/oldmoldycake/Snagr/commit/e9cb13afbc45dcfc3cf9c013eb1fecf608abebac))
* **oidc:** name the oidc_sub unique constraint so downgrade works ([3fdbb43](https://github.com/oldmoldycake/Snagr/commit/3fdbb43468cd26d82ca0d798bde03357697b0b53))
* **sites:** match mock parity on create_site validation and response ([f41d7c6](https://github.com/oldmoldycake/Snagr/commit/f41d7c6659f341a730199d1e8da1a0051a45e341))
* **sites:** return real aggregates from update_site ([1e17e18](https://github.com/oldmoldycake/Snagr/commit/1e17e1867da92c6d81722a7fcc3190090eaa69b7))
* **sites:** syntax typo in update_site guard clause ([9bd3fc0](https://github.com/oldmoldycake/Snagr/commit/9bd3fc0e6fb8204538284adb687fa4009b5c3d74))
* the code bugs the comment audit left behind ([d265bef](https://github.com/oldmoldycake/Snagr/commit/d265bef5bcb3c32e3053ddfa70e7a00b7037d953))
* **vision:** add torchvision — transformers v5 image processors require it ([2d0abea](https://github.com/oldmoldycake/Snagr/commit/2d0abeaeb9c8eefc658f4ed8b815a8cc4e8aa104))
* **vision:** create the HF cache dir before the weights volume mounts ([cc496cc](https://github.com/oldmoldycake/Snagr/commit/cc496cc0c1f5e05528d4824316c637d4e99add3f))
* **vision:** make the first real weights load actually work ([6a51b83](https://github.com/oldmoldycake/Snagr/commit/6a51b8320bf185189415ea022d134e19130c0859))