My stack The stack · Python

Python

Python where the work is numbers, a model, or a script somebody has to read a year from now.

938questions honestly drillable in MB3 Prepbot — not the 2,864 elsewhere in the repo
4,420individually markable limbs, which is 442 days at ten a day
2packages on PyPI: context8 and swarmtorch
01The number I had to argue with myself about

MB3 Prepbot drills medical students for MB BS Part III. The archive behind it holds 6,828 records, of which 3,939 are multiple-choice. An internal status file put the usable question count at 2,864.

The real number is 938. A question is only drillable if it has a full answer key, because a limb that cannot be auto-marked cannot be marked at all — build_pool.py drops it. 2,761 questions have no key whatsoever and 240 are partially keyed. The README says so in those words, correcting its own status file.

02What survives the filter Every drop is a question a student would otherwise have been marked wrongly on.
From archive to drillable

938 is the honest number, not the 2,864 in the status file.

6,828 recordsthe archive
3,939 MCQsof those
2,761 droppedno answer key at all
240 droppedpartially keyed
938 drillablefully keyed
6,828records in the archive
938fully keyed and drillable
4,420markable limbs

The temptation is to count the archive, because it is the bigger number and it is true in a narrow sense. But a question with no key produces a drill that cannot be marked, and a drill that cannot be marked is worse than no drill — it teaches a student something unverified. So the pool is the fully-keyed subset. That is 4,420 individually markable limbs, or 442 days at ten a day, which is the full year-out runway the bot is actually for.

03How it serves A drill that marks itself, every morning.
A quiz poll each morning

Posted to Telegram, marked automatically, with a leaderboard at close of play. Solo spaced repetition is a solved problem; doing it alone at six in the morning is not.

Negative marking is −0.5

Because that is what the exam uses. A practice tool that scores differently from the real paper is training the wrong instinct.

Picture stations

596 of them — 240 Paediatrics, 356 O&G — as photo cards, because a chunk of the exam is recognising an image.

Answer keys, earned back

Where the strongest students consistently agree against the recorded key, that is signal. It is how the 2,761 unkeyed questions can be recovered without inventing answers.

The 938 is the honest number, not the 2,864 in QUESTION-BANK-STATUS.md.

mb3prepbot/README.md, correcting its own status file
04The rest of the Python
pyzheimer

The analysis service inside Voxtar: recorded speech in, acoustic measures out, compared against that person’s own baseline rather than a population average — which is the only comparison that means anything for a voice.

context8

Reached 1.0.0 on PyPI in 18 days across 52 commits.

swarmtorch

120 metaheuristic optimisation algorithms brought to PyTorch, with GPU-batched fitness evaluation.

Why Python for these

Numerical work, a model in the loop, or a script that has to still be legible when I come back to it after six months on something else.

05The repository
The case study

mb3prepbot

The README is the document to read — it opens by correcting its own status file, which tells you more about how the project is run than the code would.

The smaller number was the one worth publishing.

Nothing else on this page matters as much as that. A question bank counted generously is a question bank that marks a student wrongly, and the student has an exam.