pdf-quiz-generator/backend/alembic/versions
Daniel 809ac2fca6 feat: figures are thumbnails that open into a viewer, with source and overlay
A 2,000px radiograph written into an article rendered at whatever width it
happened to be — a wall of greyscale in the middle of a sentence, four
megabytes to draw it, and no way to look at it properly. Every image in prose
is now a 256px thumbnail with the author's label under it, and a click gives it
the screen.

The viewer puts what is known about the figure beside it: its title, what it
shows, and where it came from. `media_assets` gains `source` and `source_url`
for that — a citation belongs to the file, because the same figure used in
three articles is cited the same way in all three, and a licence that turns out
to be wrong is one row to fix rather than three paragraphs to find. Asked for
when the figure is opened, not when the page is drawn.

And `overlay`: the regions an educator has marked, as vector shapes in
normalised coordinates on the unit square, so one drawing is correct in a
thumbnail, in the viewer and on a projector. Off until the learner turns it on
— marks shown before they have looked answer the question for them. Vectors
rather than a second burnt-in picture, for four reasons written down in
docs/image-overlays.md. The tool that draws them is next; this is the storage,
the contract and the reader's half.

On a narrow screen the description stacks above the image rather than beside
it, where it can be read before scrolling to the picture.

Also here: `classify_question_difficulty`, which labelled all 2,924 questions
in batches of twenty-five against a written rubric — 622 easy, 1,634 medium,
668 hard, no failed batches. The column had been NULL on every row since it
existed. Migration l2c3d4e5f6a7.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TqXevQJhxFrM7jJg82cgZN
2026-09-12 20:33:00 +02:00
..
5f8c1c2a9d40_add_classification_snapshots.py chore: preserve pre-revamp local changes 2026-09-07 00:50:35 +02:00
9bac7bf02e38_add_reminders_disabled_to_users.py Persist reminders_disabled in Postgres and harden reminder scheduler 2026-04-14 04:31:03 +02:00
97ef9b957a02_initial_tables.py Initial commit: PDF Quiz Generator app 2026-03-30 20:04:53 +00:00
a1b2c3d4e5f6_drop_reminders.py feat: cross-link the articles, and strip what the analysis page replaced 2026-09-11 03:44:44 +02:00
a3b4c5d6e7f8_category_system.py feat: an organ system is a fact about a topic, not about a keyword 2026-09-12 04:32:25 +02:00
a5b6c7d8e9f0_conversations.py feat: AI Mode — a chat that cannot cite what it did not find 2026-09-10 15:19:24 +02:00
a7b8c9d0e1f2_exam_groups_and_blueprints.py feat: exams are a group you can build, with the board's own blueprint 2026-09-11 20:27:48 +02:00
a9b0c1d2e3f4_question_versions.py feat: question version history with restore; TODO list 2026-09-10 02:27:44 +02:00
b0c1d2e3f4a5_exam_scoped_tags.py feat: exam-scoped disciplines and exam-scoped facet counts 2026-09-10 02:48:34 +02:00
b2c3d4e5f6a7_plan_origin.py fix: one sessions list, at /sessions, with plan material out of it 2026-09-11 04:10:25 +02:00
b4c5d6e7f809_drop_question_is_shared.py refactor: remove per-question sharing 2026-09-12 08:42:51 +02:00
b6c7d8e9f0a1_article_cms.py feat: article CMS, three reading views, and articles written from the library 2026-09-10 17:13:07 +02:00
b8c9d0e1f2a3_fix_question_quiz_fk.py fix: the reading browser counted the wrong thing, and the hover card fled 2026-09-11 21:24:04 +02:00
b71a4e2d6c90_add_explanation_image_path.py chore: preserve pre-revamp local changes 2026-09-07 00:50:35 +02:00
c1d2e3f4a5b6_grant_dimensions.py feat: grants can name an exam and a discipline, not only a category 2026-09-10 04:02:36 +02:00
c3aafcd58735_add_roles_images_modes_models.py Initial commit: PDF Quiz Generator app 2026-03-30 20:04:53 +00:00
c3d4e5f6a7b8_question_feedback.py feat: feedback replaces comments; Qbank is a landing page; one question page 2026-09-11 18:50:57 +02:00
c5d6e7f8091a_collectible_articles.py feat: articles are collectible, and Summary is a toggle 2026-09-12 14:52:20 +02:00
c7d8e9f0a1b2_exam_objectives.py feat: a study objective that changes what you see; purge unused figures 2026-09-11 02:47:01 +02:00
c9d0e1f2a3b4_draft_questions.py feat: extracted questions are staged, and only acceptance takes an id 2026-09-11 22:57:08 +02:00
c82d19e4a601_category_hierarchy.py fix: close custom-test review gaps and verify grading 2026-09-07 02:07:58 +02:00
d0e1f2a3b4c5_repetition.py feat: a repetition does not raise your score; no more deleting a session 2026-09-12 01:08:42 +02:00
d2e3f4a5b6c7_media_libraries.py feat: MinIO-backed media libraries, and file the last 316 questions 2026-09-10 06:45:22 +02:00
d4e5f6a7b8c9_invite_codes.py feat: the player is a box; sharing and sign-up are the administrator's 2026-09-11 19:17:35 +02:00
d6e7f8091a2b_search_the_article_body.py fix: search the article body, and cap an upload at what it is for 2026-09-12 15:23:32 +02:00
d8e9f0a1b2c3_question_tips_and_notes.py feat: attending tip, per-question notes, save to folder, session clock 2026-09-11 02:59:32 +02:00
d94a26b8f302_study_tools.py feat: redesign quiz runner and add study tools 2026-09-07 03:10:23 +02:00
e1f2a3b4c5d6_used_hint.py feat: right after a tip is its own slice 2026-09-12 01:51:03 +02:00
e3f4a5b6c7d8_tag_hierarchy.py feat: real organ systems, symptoms grouped by system, and admin taxonomy CRUD 2026-09-10 10:44:39 +02:00
e4c7b2a9d6f1_add_user_notes.py Add persistent MyNote for quizzes 2026-05-12 17:51:23 +02:00
e5f6a7b8c9d0_drop_comments.py feat: one settings page, and comments removed 2026-09-11 19:40:24 +02:00
e7f8091a2b3c_user_voice_preference.py feat: a reading voice in Settings, and a tutor that reads every figure 2026-09-12 16:48:09 +02:00
e8d4f1a27c93_articles_cards.py feat: linked topic articles and card associations 2026-09-07 15:16:48 +02:00
e9f0a1b2c3d4_answer_timing.py feat: session analysis after a quiz, and a merged TODO for the rest 2026-09-11 03:07:05 +02:00
f0a1b2c3d4e5_question_figures.py feat: figures as records, question-centred dashboard, fewer hints mid-quiz 2026-09-11 03:18:49 +02:00
f2a1c9d4e801_comments.py feat: shareable quiz links, moderated comments and AI authoring 2026-09-07 17:10:08 +02:00
f2a3b4c5d6e7_collection_last_used.py feat: a collections page 2026-09-12 03:33:37 +02:00
f4a5b6c7d8e9_study_plan_articles.py feat: study plans you can open, work through, and edit 2026-09-10 12:10:39 +02:00
f6a7b8c9d0e1_question_soft_delete.py feat: questions are soft-deleted, and the trash holds them 2026-09-11 20:12:58 +02:00
f8091a2b3c4d_login_links.py fix: WebP figures, the openai SDK removed, and a voice a site can add to 2026-09-12 17:13:05 +02:00
g4b7e2f5a903_share_tokens.py feat: shareable quiz links, moderated comments and AI authoring 2026-09-07 17:10:08 +02:00
g9a1b2c3d4e5_login_codes.py feat: sign in with a code sent by email 2026-09-12 17:29:28 +02:00
h1b2c3d4e5f6_password_optional.py feat: an account may have no password, and may set one later 2026-09-12 17:39:29 +02:00
h1c2d3e4f506_question_category_links.py feat: multi-subcategory questions, statistics hardening, seeded lab values 2026-09-08 14:43:22 +02:00
i2d3e4f5a607_lab_links.py feat: Orthobullets-style lab panel with source deep links and card links 2026-09-08 16:20:55 +02:00
i9f0a1b2c3d4_folders_notes_article_feedback.py feat: question folders, per-section notes, and two feedback paths 2026-09-12 18:37:43 +02:00
j0a1b2c3d4e5_article_trash.py feat: delete an article, and a trash for the ones that were published 2026-09-12 19:31:28 +02:00
j3e4f5a6b708_option_explanations.py feat: per-option explanations 2026-09-08 19:29:21 +02:00
k1b2c3d4e5f6_article_topic_claims.py feat: an article follows a topic, rather than copying it once 2026-09-12 19:57:06 +02:00
k4f5a6b7c819_quiz_origin.py feat: key points smart links, difficulty tags, adaptive sessions, educator-only question management 2026-09-09 02:26:45 +02:00
l2c3d4e5f6a7_media_source.py feat: figures are thumbnails that open into a viewer, with source and overlay 2026-09-12 20:33:00 +02:00
l5a6b7c8d920_key_points.py feat: key points smart links, difficulty tags, adaptive sessions, educator-only question management 2026-09-09 02:26:45 +02:00
m6a7b8c9d031_question_difficulty.py feat: key points smart links, difficulty tags, adaptive sessions, educator-only question management 2026-09-09 02:26:45 +02:00
n7a8b9c0d142_collections.py feat: facet filters, personal libraries, adaptive shortcuts, restart, rename support 2026-09-09 04:31:40 +02:00
p8b9c0d1e253_category_grants.py feat: analysis recommendations, category grants, compact question header 2026-09-09 18:47:32 +02:00
q9c0d1e2f364_question_fulltext.py feat: hybrid search on BGE-M3, with embedding provenance and a retry job 2026-09-09 23:45:33 +02:00
r0d1e2f3a475_embedding_provenance.py feat: hybrid search on BGE-M3, with embedding provenance and a retry job 2026-09-09 23:45:33 +02:00
s1e2f3a4b586_bge_m3_embeddings.py feat: hybrid search on BGE-M3, with embedding provenance and a retry job 2026-09-09 23:45:33 +02:00
t2f3a4b5c697_shared_category.py feat: flashcard decks share the question and article category tree 2026-09-10 01:40:03 +02:00
u3a4b5c6d7e8_embed_articles_cards.py feat: hybrid search for articles and cards; full-page question editor 2026-09-10 02:01:35 +02:00
v4b5c6d7e8f9_exams.py feat: exams as real data, AI-mode matching, and a continue-study panel 2026-09-10 02:08:38 +02:00
w5c6d7e8f9a0_article_views.py feat: exams as real data, AI-mode matching, and a continue-study panel 2026-09-10 02:08:38 +02:00
x6d7e8f9a0b1_section_index.py feat: section-level index so retrieval can cite a section, not a whole article 2026-09-10 02:18:53 +02:00
y7e8f9a0b1c2_media_assets.py feat: media as a searchable corpus, ready for a vision embedder 2026-09-10 02:22:52 +02:00
z8f9a0b1c2d3_study_plans.py feat: PREP study plans of numbered blocks 2026-09-10 02:25:29 +02:00