A single offline HTML file that turns seven official syllabuses — Pearson 4MA1, 4SD0, 4EC1 and Cambridge 0500, 0509, 0445, 0457 — into dated blocks from 26 Oct 2026 to 30 Apr 2028. The bar was not "cover the topics". It was every named part of every topic, each one with the syllabus reference it came from, and a way to prove none had been quietly dropped.
Topic headings are useless for revision. "States of matter" is not a study session — gas pressure, diffusion and changes of state are. So the plan is built from the lowest named unit in each syllabus, and every block carries the reference it came from, so a weak answer can be traced back to a spec point instead of a vague topic.
Papers, durations, marks, weights, option rules — read off the official PDF, not a revision site. This is the check that catches "Edexcel Economics has a Paper 2 that was never scheduled".
Every sub-topic in the syllabus must appear inside a dated block. The build asserts
unscheduled == 0; the app then re-derives it live from the rendered data, so the claim
is visible rather than promised.
Coverage is worthless if it is one block per topic. Each unit gets a learn block plus at least one spaced re-touch: 1,422 blocks for 185 units ≈ 7.7 touches per unit.
| Subject | Code | Papers | Duration · marks | Weight | Version naming 2028 |
|---|---|---|---|---|---|
| Chemistry | 4SD0 | 1B / 1C / 1P | 2 h · 110 each | 33.3 % each | Issue 4 (first exam June 2019, still current) |
| Physics | 4SD0 | 1B / 1C / 1P | 2 h · 110 each | 33.3 % each | Issue 4 |
| Biology | 4SD0 | 1B / 1C / 1P | 2 h · 110 each | 33.3 % each | Issue 4 |
| Mathematics A | 4MA1 | Paper 1H / 2H | 2 h · 100 each | 50 % each | Issue 2 (first exam June 2018) |
| Economics | 4EC1 | Paper 1 / Paper 2 | 1 h 30 · 80 each | 50 % each | Issue 3 (Feb 2026) |
| English (FLE) | 0500 | Paper 1 / Paper 2 | 2 h · 80 each | 50 % each | 2027–2029 |
| Chinese (First Lang.) | 0509 | Paper 1 / Paper 2 | 2 h 15 · 60 / 2 h · 50 | 60 / 40 | 2028–2029 |
| Design & Technology | 0445 | Paper 1 / Paper 3 / Component 2 | 1 h 50 · 50 marks each paper | 25 / 25 / 50 | 2028–2030 |
| Global Perspectives | 0457 | Paper 1 / C2 / C3 | 1 h 25 · 70 marks | 35 / 30 / 35 | 2028 |
Two traps this table exists to catch: 4EC1 Paper 2 (macro + global economy) is a whole paper the first draft of the plan never scheduled, and 0445 has no Paper 5 from 2028 — what the school calls "Paper 5" is Component 2, the 100-mark portfolio, which has to be built across eighteen months rather than revised in April.
| Subject | Units | Reference span | Blocks touching each unit |
|---|---|---|---|
| Chemistry | 21 | 1.1–1.4 … 4.44–4.47 | 2–7 |
| Physics | 26 | 1.1 … 8.7–8.10 | 2–7 |
| Biology | 21 | 1.1 … 5.12–5.16 | 2–7 |
| Mathematics | 36 | 1.1 … 6.3 | 2–5 |
| Economics | 18 | 1.1.1 … 2.2.3 | 3–5 |
| Design & Technology | 29 | 1.1 … 2.5 + C2 criteria 1a–4 | 2–3 |
| English (FLE) | 12 | P1 Q1–Q4, P2 1(a)/1(b)/B | 3–5 |
| Chinese | 12 | P1 S1–S3, P2 S1–S2 | 3–5 |
| Global Perspectives | 10 | P1, C2, C3 | 2–3 |
Hand-writing 1,422 blocks would have been both slow and unverifiable. Generating them from 185 units and a slot grid means the coverage claim is arithmetic: the build fails loudly if any unit never appears, and the app recomputes "0 / 185 complete, 185 scheduled" from the same data the user clicks.
| Phase | Weeks | Dates | What a block is | Why |
|---|---|---|---|---|
| 第一輪 · 打底 | 1–30 | 26 Oct 2026 → 23 May 2027 | New unit, then the same unit two weeks later | First pass while school is still teaching it |
| 第二輪 · 分類真題 | 31–66 | 24 May 2027 → 30 Jan 2028 | Same unit again, as real past-paper questions marked against the scheme | Recall is not marks; the second pass is where mark-scheme wording gets learned |
| 第三輪 · 全卷計時 | 67–79 | 31 Jan 2028 → 30 Apr 2028 | Two subjects a week sit a full timed paper; the rest rework weak topics | 25 full papers across the phase, without scheduling more past papers than exist |
Phase 3 rotates the paper subjects instead of making all nine sit a paper in the same week — the first draft did exactly that and produced an eight-paper week, which is not a study plan, it is a punishment.
Seven fields, no free text: the key drives the checkbox, the reference drives the audit, the task text is generated from the subject so it always says what to do (read → produce → practise → log errors) rather than what to think about. The Chinese title is the label Isaac actually reads; the English title is the syllabus name, kept so an adult or a tutor can map it back without translation.
| Subject | Trap | Consequence if missed |
|---|---|---|
| 0500 English | 2027–2029 syllabus rewrote Paper 1: Q2 now has (a) summary and (b) short answer; Q4 is 10 reading + 10 writing | Practising the pre-2027 paper shapes |
| 0509 Chinese | 2028–2029 is a different issue from 2026–2027; Paper 2 composition split changed | Wrong Paper 2 section drill |
| 0445 D&T | 2028–2030 removes the 3-from-5 option choice and there is no Paper 5 | Waiting for a "Paper 5" that will never be sat |
| 4EC1 Economics | Two papers, 1 h 30 each, 80 marks — Paper 2 covers the whole macro half | Half the content unscheduled |
| Claim | How it was checked | Result |
|---|---|---|
| Units | Inventory built from the parsed syllabuses | 185 (Chem 21 · Phys 26 · Bio 21 · Maths 36 · Econ 18 · DT 29 · FLE 12 · CN 12 · GP 10) |
| Nothing dropped | Build assertion over block→unit references | unscheduled: 0 |
| Weeks & blocks | Headless DOM read of the built file | 79 weeks · 1,422 blocks · 18 blocks in week 1 |
| Coverage tab | 185 tiles rendered, 185 marked scheduled | 185 / 185 |
| Interactive state | Tick a box, read back localStorage + counter | {"w1-0":true} · "1 / 18 完成" |
| Artifact | shasum -a 256 on the local file and the repo copy | 426b7331615f03572294e17634008b885850826b07c0980270e2a81531ba5225 |
| Size | wc -c | 411,902 bytes |
| Served copy | Live HTML vs local, after stripping Cloudflare's beacon and the site skin block | Identical body; served size is local + injected tags |
The generator lives at ~/.hermes/scripts/igcse80/ — units.py (the 185 units),
build.py (scheduler + renderer) and a headless test that asserts coverage and clicks every tab.
When the school's position or the D&T option is confirmed, the plan is regenerated rather than patched,
so the coverage guarantee survives the edit.