Audit follow-up: correctness fixes, usability upgrades, and cleanup - #6
Merged
Merged
Conversation
Correctness: objective ids are now stable slugs of the objective title instead of per-block obj_N indexes, so spaced repetition mastery and feedback anchors no longer cross-contaminate objectives that happened to share a position in different plan blocks. Error repair decks and previews are scoped to the session's course. The final-attempt path guards its ACTIVE to COMPLETED transition so a race with End Session cannot run post-completion effects twice. AI prompt difficulty is sanitized to an integer between 1 and 5. Plan page: loads your existing plan on every visit with delete, reschedule, and calendar export always available, replaces same-course plans with confirmation instead of silently stacking duplicates, and shows per-session focus lines, real calendar dates with a today marker, an exam day row, and a days-until-exam header. Availability inputs prefill from settings. Session runner: an empty materials search now persists an explicit no-sources state and the review panel says so honestly instead of spinning forever; free-recall prompts reveal the model answer and key points at self-score time; confidence is only recorded when actually rated so calibration reflects real data; typed answers and error-log drafts survive a mid-session refresh. End screen: follow-up recommendations are one deterministic function of the run's results and no longer change across a refresh, and a schedule button inserts the recommended spaced sessions into the active plan idempotently. Start New Run is now Practice this session again. First run: signup signs you in automatically when email verification is off, a small badge shows when the AI provider is the mock, the app has a favicon, and the timezone field gains a detect button with a live clock preview. Cleanup: notification preferences route and model dropped with a migration that also removes the dead display_name and leaderboard_visible columns, orphan reminder email templates and practice-set and evidence schemas deleted, sw.js header block and @types/web-push removed, phantom CRON_SECRET removed from setup, env example, compose, and README.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Implements everything from the second full audit (code bug hunt, leftovers sweep, and a live browser walkthrough of the whole user journey).
Correctness
obj_0,obj_1, ...), so plans with more than 6 objectives had colliding ids across blocks, cross-contaminating spaced-repetition mastery and keying feedback anchors to the wrong topic. Ids are now deterministic slugs of the objective title, identical wherever the objective appears.Usability (from the live walkthrough)
Cleanup
display_nameandleaderboard_visiblecolumns; validated withmigrate deployfrom history plus an emptymigrate diff).@types/web-push, the asset-manifest orphan, and the phantomCRON_SECRETfrom setup, env example, compose, and README.getOrCreateUserIdis gone.Verification
tsc --noEmitcleanGenerated by Claude Code