Frontmatter
| id | 9136 |
| title | Implement 30-Day Retention Policy for DevIndex Penalty Box |
| state | Closed |
| labels | enhancementai |
| assignees | tobiu |
| createdAt | Feb 13, 2026, 3:22 AM |
| updatedAt | Feb 13, 2026, 1:58 PM |
| githubUrl | https://github.com/neomjs/neo/issues/9136 |
| author | tobiu |
| commentsCount | 1 |
| parentIssue | 9106 |
| subIssues | [] |
| subIssuesCompleted | 0 |
| subIssuesTotal | 0 |
| blockedBy | [] |
| blocking | [] |
| closedAt | Feb 13, 2026, 1:58 PM |
Implement 30-Day Retention Policy for DevIndex Penalty Box
tobiu added parent issue #9106 on Feb 13, 2026, 3:23 AM
tobiu assigned to @tobiu on Feb 13, 2026, 3:23 AM

tobiu
Feb 13, 2026, 1:58 PM
Input from Gemini 3 Pro:
✦ Implemented the 30-day retention policy for the Penalty Box (
failed.json).Changes:
- Schema Migration:
Storage.getFailed()now lazily migratesfailed.jsonfrom a legacyArrayto aMap<String, Timestamp>.- Retention Logic:
Cleanup.mjsnow checks the timestamp of failed users. If a user has been in the penalty box for more than 30 days, they are:
- Removed from
failed.json.- Pruned from
users.jsonl(Rich Data).- Pruned from
tracker.json(via Orphan logic).- Persistence:
Cleanup.mjsnow forces a save offailed.jsonon every run. This ensures that the migration (setting the "start time" for existing failed users) is persisted immediately, and that the file remains sorted.The "clock" for existing failed users starts now (upon the first Cleanup run). New failures will use the time of failure.
tobiu closed this issue on Feb 13, 2026, 1:58 PM
We need a mechanism to handle user deletions and long-term suspensions in compliance with privacy expectations ("Right to be Forgotten"). Currently, users who return 404s are moved to the Penalty Box (
failed.json) indefinitely if they have prior history.The Solution: Penalty Box Retention Policy (TTL)
apps/devindex/resources/failed.jsonfrom a simple Array["login"]to a Map{"login": "2026-02-13T..."}to track when the failure first occurred.Cleanup.mjsto check this timestamp.users.jsonl,tracker.json, andfailed.json.This ensures that our index eventually reflects reality and respects user deletion.