pdf-quiz-generator/backend/alembic/versions
Daniel 7cd2fa5cf4
Some checks failed
Tests / backend (push) Failing after 4s
Tests / frontend (push) Successful in 26s
Tests / e2e (push) Failing after 28s
feat: AI Mode gives the same answer twice, and a typo no longer empties the library
Measured first, by the ped-ai session, fifteen runs of five prompts with
the gateway cache bypassed. Retrieval was already deterministic:
identical shortlist and identical scores every time, and the citation
checker stripped none of the 45 markers written — invented citations are
not the problem here. Generation was the whole variance. At temperature
0.3 the same sources and the same prompt gave answers differing by
15-70% of their text; one differential swung between a 35-word uncited
paraphrase and a 180-word cited list.

So temperature 0 and a seed. Temperature 0 alone was not enough — three
runs still differed — and temperature 0 with a fixed seed came back
byte-identical. The seed is derived from the question, normalised for
case and spacing, so two people asking the same thing get the same
answer and a different question is not pinned to the same sample.

An empty reply is asked once more before it becomes a 502. One in
fifteen came back empty from a healthy model in 4.9 seconds — not a
refusal, not an error, just nothing.

A short query that finds almost nothing is retried against the nearest
article title. "kawasaki criteria" finds fourteen sources; "kawasaki
critera" found none — the lexical ranker cannot match a token that is in
no index, and the embedding of a misspelling is not near the embedding
of the word. Trigrams do not care: that typo scores 0.36 against
"Kawasaki disease" with the next article at 0.11, and the gap is what
makes it safe to act on. pg_trgm is created at startup beside vector,
with a migration for the record.

And an answer drawn from the library must cite it. Not a hallucination
guard — nothing was stripped in fifteen runs — but one answer used the
sources and cited none of them, which leaves the learner an assertion
and nowhere to check it.

Also, article drafts are weighted towards mechanism, in the wording the
ped-ai rewriter is using, so the two lanes read alike: why the body does
what it does, with features and management explained through it rather
than listed. Figure lines and cross-references survive a refine.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TqXevQJhxFrM7jJg82cgZN
2026-09-13 16:24:48 +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
m3d4e5f6a7b8_flashcard_reviews.py feat: cards remember, render as prose, and are reachable from a question 2026-09-12 21:50:31 +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
n4e5f6a7b8c9_drop_courses.py refactor: remove the LMS 2026-09-12 23:27:51 +02:00
n7a8b9c0d142_collections.py feat: facet filters, personal libraries, adaptive shortcuts, restart, rename support 2026-09-09 04:31:40 +02:00
p5f6a7b8c9d0_refresh_tokens.py feat: a versioned API, refresh tokens, and an end-to-end stack that found four bugs 2026-09-13 01:23:38 +02:00
p8b9c0d1e253_category_grants.py feat: analysis recommendations, category grants, compact question header 2026-09-09 18:47:32 +02:00
q6a7b8c9d0e1_ownership_is_a_role.py feat: the bank belongs to a role, not to a person 2026-09-13 13:26:25 +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
r7b8c9d0e1f2_drop_code_tables.py feat: no invite codes and no email sign-in codes — that is the provider's job 2026-09-13 13:56:48 +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
s8c9d0e1f2a3_pg_trgm.py feat: AI Mode gives the same answer twice, and a typo no longer empties the library 2026-09-13 16:24:48 +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