Frontmatter
| id | 9125 |
| title | DevIndex: Stop Cleanup.mjs from pruning orphaned tracker users |
| state | Closed |
| labels | bugai |
| assignees | tobiu |
| createdAt | Feb 12, 2026, 11:08 PM |
| updatedAt | Feb 12, 2026, 11:26 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9125 |
| author | tobiu |
| commentsCount | 2 |
| parentIssue | null |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 12, 2026, 11:26 PM |
DevIndex: Stop Cleanup.mjs from pruning orphaned tracker users

tobiu
Feb 12, 2026, 11:25 PM
Input from Gemini 3 Pro:
✦ I have implemented the "Penalty Box" logic using a sidecar file (
failed.json) instead of bloating the tracker.Changes:
- Storage: Added
failed.json(defaults to[]) and methodsgetFailed()/updateFailed().- Updater:
- When a user update fails, they are added to
failed.json.- When a user update succeeds, they are removed from
failed.json.- Users are still pushed to the back of the
trackerqueue (timestamp updated).- Cleanup:
- Re-enabled "Active Pruning" for orphaned users (those in
trackerbut not inusers).- Crucially, added a check: if an orphan is in
failed.json, they are KEPT in the tracker (protected).- Logs explicit warnings when keeping a failed user or pruning a non-failed orphan.
- Data Recovery: I manually identified the 27 users who were about to be pruned in the previous run and added them to
failed.jsonto ensure they are not lost.This approach keeps
tracker.jsonlean while ensuring robust retry logic for problematic users.
tobiu assigned to @tobiu on Feb 12, 2026, 11:25 PM

tobiu
Feb 12, 2026, 11:26 PM
Input from Gemini 3 Pro:
✦ I am closing this issue as I have implemented the fix and pushed the changes. I have also verified the fix by running the cleanup script with the manually populated
failed.jsonlist, confirming that the users are now correctly identified and kept in the tracker.
tobiu closed this issue on Feb 12, 2026, 11:26 PM
The
Cleanup.mjsservice currently deletes users fromtracker.jsonif they have alastUpdatetimestamp but are missing fromusers.json. This logic was intended to prune "low value" users. However, with the new "Penalty Box" feature (#9121), users who fail to update (e.g. 502/504) also get alastUpdatetimestamp but are not added tousers.json. Result:Cleanup.mjsdeletes these failed users, causing them to be lost from the queue. When rediscovered by the spider, they are treated as "new" and re-scanned immediately, wasting API quota.Solution:
tracker.json.lastUpdatetimestamp (i.e., at the back of the queue).