Nothing is invented.
A redesign is a migration with opinions, and its failure mode is not an ugly page — it is a fee that is now wrong, a module that quietly vanished, an address that moved a digit. Nobody notices for months, and by then the old site is gone.
The first deliverable was an archive.
- My role
- Executed — the whole rebuild
- Dates, from version control
- 4 – 23 September 2026
- Scope
- 47 templates rendering 448 static pages
- Tests
- 209 — 94 in the site package, 115 in config
- State
- Complete and building. Not deployed
The site, transcribed.
Qualifications
Add-on electives
Job listings
Recovered by crawl; ids 1133–1223, no gaps
Centres, with postal addresses
Accreditations
Gallery photographs
Four rules, each of which cost something.
- All copy is newly written
- Every number, name, address, module and date survives exactly
- Nothing is invented — a missing value renders a marked placeholder
- No fabricated social proof, no dark patterns
- Every page had to be argued from scratch
- No rounding, no tidying, no “that looks like a typo”
- Visible holes in a site being shown to its owners
- The most persuasive blocks on a sales page shipped mostly empty
They held from the first commit to the last. The cost is the only evidence that they were real.
Twelve testimonials recorded. Four published.
- Before
- Twelve testimonials were captured from the old site. For eight of them the archive holds a name, a role and the theme of what the student said — not the words.
- What forced it
- Writing a quote from a theme is the most ordinary thing in this industry, and it is putting sentences in a real person's mouth.
- The decision
- Only the four whose words the archive actually holds are published. The other eight are seeded unpublished, and the seeder refuses to publish them.
- What it changed
- The decision survives the next person who runs the seeder in a hurry. The same rule is why no aggregate rating ships, and why the placement pages carry no outcome figures — a placement count, a median salary and a time-to-placement were all asked for and none was available.
An ambiguity you cannot leave blank.
Two job listings published a salary ceiling with no period attached, while every sibling listing on the same board said “per month” explicitly.
The problem
Rendering it raw is not neutral
A reader supplies the missing word, and half of them supply the wrong one.
Dropping the field hides a published fact
Both defaults are a decision; neither is abstention.
The argument
The annual reading is arithmetically impossible
It works out to a monthly wage below every entry-level role on the same board — for department-manager and store-manager posts.
How it ships
Read as monthly, like its siblings
The inferred value is what the page shows.
The raw string is kept beside it
Stored in sourceSalary, so the inference stays auditable and anyone who disagrees can overturn it.
An inference is allowed when leaving the field empty would itself mislead. It must be labelled, carry its reasoning, and keep the raw source next to it — otherwise it is a guess with better manners.
Findings, and the register of what is still missing.
- Fourteen published self-contradictions resolved, each with a stated default and a reason
- Two corrections written back into the archive itself — 91 job URLs that did resolve, and two application cohorts rather than one
- A bank account number and IFSC published in plain text on the old payment page, removed rather than migrated
- An app-store link whose publisher could not be verified, deliberately left out of the footer
- 1,664 of 1,664 page strings translated, none orphaned, using the English sentence as the lookup key
- Thirty numbered gaps were still open at handover
- Twenty-two accreditation registration numbers: none is published anywhere
- Written consent from seven named students before any of them appears on the rebuilt site
- Verified placement outcomes: count, median salary, time-to-placement
- Employer names for all 91 listings, every one published under a generic label