Isaac Chan · IGCSE 2028 scheme of work 9 subjects 79 weeks Oct 2026

79 weeks, 1,422 blocks, zero unscheduled syllabus points

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.

Weeks
79 Mon 26 Oct 2026 → Sun 30 Apr 2028
Blocks
1,422 18 per week
Syllabus units
185 all scheduled
Unscheduled
0 asserted at build time
File
402 KB, one file, no network
Weekly load
18 blocks ≈ 12 h
The constraint that shaped everything

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.

Three checks, and they are separate

1 · Structure audit

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".

2 · Coverage

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.

3 · Density

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.

Syllabus audit — what was actually read

SubjectCodePapersDuration · marksWeightVersion naming 2028
Chemistry4SD01B / 1C / 1P2 h · 110 each33.3 % eachIssue 4 (first exam June 2019, still current)
Physics4SD01B / 1C / 1P2 h · 110 each33.3 % eachIssue 4
Biology4SD01B / 1C / 1P2 h · 110 each33.3 % eachIssue 4
Mathematics A4MA1Paper 1H / 2H2 h · 100 each50 % eachIssue 2 (first exam June 2018)
Economics4EC1Paper 1 / Paper 21 h 30 · 80 each50 % eachIssue 3 (Feb 2026)
English (FLE)0500Paper 1 / Paper 22 h · 80 each50 % each2027–2029
Chinese (First Lang.)0509Paper 1 / Paper 22 h 15 · 60 / 2 h · 5060 / 402028–2029
Design & Technology0445Paper 1 / Paper 3 / Component 21 h 50 · 50 marks each paper25 / 25 / 502028–2030
Global Perspectives0457Paper 1 / C2 / C31 h 25 · 70 marks35 / 30 / 352028

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.

Coverage — 185 units, by syllabus reference

SubjectUnitsReference spanBlocks touching each unit
Chemistry211.1–1.4 … 4.44–4.472–7
Physics261.1 … 8.7–8.102–7
Biology211.1 … 5.12–5.162–7
Mathematics361.1 … 6.32–5
Economics181.1.1 … 2.2.33–5
Design & Technology291.1 … 2.5 + C2 criteria 1a–42–3
English (FLE)12P1 Q1–Q4, P2 1(a)/1(b)/B3–5
Chinese12P1 S1–S3, P2 S1–S23–5
Global Perspectives10P1, C2, C32–3

The scheduler — queues, not a hand-written table

official PDF → pdftotext → numbered-point parser → unit inventory (185) │ ref, zh title, en title ↓ per-subject FIFO queue (spec order, pointer reset at every phase boundary) ↓ fixed weekly grid Mon 2 · Tue 2 · Wed 2 · Thu 2 · Fri 2 · Sat 4 · Sun 4 = 18 slots ↓ learn slot → next unit in the queue drill slot → the unit from two weeks ago (spaced), or this week's unit in weeks 1–2 review slot → error log + next week's titles ↓ JSON → single HTML → localStorage checkboxes → live coverage tab

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 ladder

PhaseWeeksDatesWhat a block isWhy
第一輪 · 打底1–3026 Oct 2026 → 23 May 2027New unit, then the same unit two weeks laterFirst pass while school is still teaching it
第二輪 · 分類真題31–6624 May 2027 → 30 Jan 2028Same unit again, as real past-paper questions marked against the schemeRecall is not marks; the second pass is where mark-scheme wording gets learned
第三輪 · 全卷計時67–7931 Jan 2028 → 30 Apr 2028Two subjects a week sit a full timed paper; the rest rework weak topics25 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.

Anatomy of a block

{"k":"w1-0","day":"一","sub":"Chem","ref":"4SD0 Chem 1.1–1.4", "title":"物質三態","en":"States of matter", "task":"① 讀 4SD0 Chem 1.1–1.4 官方 spec +課本 ... ② 做 6 題分類 past paper ③ 錯嘅即刻抄入錯題本"}

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.

What the version check found

SubjectTrapConsequence if missed
0500 English2027–2029 syllabus rewrote Paper 1: Q2 now has (a) summary and (b) short answer; Q4 is 10 reading + 10 writingPractising the pre-2027 paper shapes
0509 Chinese2028–2029 is a different issue from 2026–2027; Paper 2 composition split changedWrong Paper 2 section drill
0445 D&T2028–2030 removes the 3-from-5 option choice and there is no Paper 5Waiting for a "Paper 5" that will never be sat
4EC1 EconomicsTwo papers, 1 h 30 each, 80 marks — Paper 2 covers the whole macro halfHalf the content unscheduled
Honest limitations. (1) The plan starts at Chem 1.1, Phys 1.1, Bio 1.1 — it does not know the school's current position; if the class is already past a unit, the matching block has to be skipped forward by hand. (2) D&T is planned as Paper 3 Materials; if the school enters Graphic Products the option units (2.1–2.5) change. (3) 18 blocks a week ≈ 12 h is a full schedule; holidays are labelled but not lightened, and no catch-up week is pre-built — a missed week is a manual decision, not an automatic reshuffle. (4) Progress lives in localStorage per browser; it does not sync between devices and clearing site data clears it. (5) The 25 full papers in phase 3 assume the 2020–2027 past papers are available for each subject; if one session is missing, that week becomes a second weakness week instead.

Evidence

ClaimHow it was checkedResult
UnitsInventory built from the parsed syllabuses185 (Chem 21 · Phys 26 · Bio 21 · Maths 36 · Econ 18 · DT 29 · FLE 12 · CN 12 · GP 10)
Nothing droppedBuild assertion over block→unit referencesunscheduled: 0
Weeks & blocksHeadless DOM read of the built file79 weeks · 1,422 blocks · 18 blocks in week 1
Coverage tab185 tiles rendered, 185 marked scheduled185 / 185
Interactive stateTick a box, read back localStorage + counter{"w1-0":true} · "1 / 18 完成"
Artifactshasum -a 256 on the local file and the repo copy426b7331615f03572294e17634008b885850826b07c0980270e2a81531ba5225
Sizewc -c411,902 bytes
Served copyLive HTML vs local, after stripping Cloudflare's beacon and the site skin blockIdentical body; served size is local + injected tags

How it is used

Five tabs

  • 本週 — jumps to today's week, 18 tickable blocks
  • 全部週 — 79 cards with phase, holiday tag and per-week progress
  • 課題覆蓋 — 185 units, green when every related block is ticked
  • 卷別校對 — the audit tables above, inside the app
  • 錯題本 — autosaved log

Deliberate omissions

  • No account, no sync, no server — it opens from the Desktop with no network
  • No drag-and-drop rescheduling; edits happen by regenerating from the same script
  • No streak gamification — a missed week should look missed, not be rewarded

What is next

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.