# v0.3.1 — a code published on the two journeys it applies to, and it cannot buy anybody's day

The ask was to publish a discount code on the main site on specific journeys. The obvious objection is that a code at a hundred per cent, sitting where anybody can read it, is free product.

SO IT IS SAFE BY CONSTRUCTION RATHER THAN BY TRUST. The code — printed on those two pages and not repeated here, because a release note is an indexed page and the check that holds a code to its journeys is right to refuse one — is held to the two levels that are PRODUCED the moment you pay, out of material already published free under CC BY. It takes ten pounds and fifty pounds to zero and leaves five hundred and fifteen hundred exactly where they were. What it gives away is the packaging and the licence, not a person's day — which is the same reasoning the project lead gave for not needing redemption caps at all, applied to the thing that actually carries the risk.

check_a_leaked_code_cannot_buy_somebody_s_day is absolute and it is the half that matters: a code published on a journey may never reach a level that is somebody's time, may never apply to every level, and the page carrying it has to say what it does not cover — a reader who assumes it covers everything has been misled by omission.

THE JOURNEYS ARE THE TWO LEVEL PAGES THE CODE APPLIES TO, not the home page. A code on a first screen discounts a decision nobody has made yet; a code at the end of a level page discounts one somebody is in the middle of making.

THREE RULES NARROWED, AND EXACTLY THIS FAR. A printed code used to be allowed under /admin/ and nowhere else; it may now also appear on the journeys IT ITSELF DECLARES, and on no others, because a code that leaked onto every page would be a price change nobody decided. A printed code used to have to be on /admin/try/; one that names journeys lives on those instead. And the dead-rail rule used to refuse any printed code once a rail could take money — it now asks what the code can REACH, because a person's day cannot be given away by a typo and a zip of published files can.

Four deliberate breaks were run. One of them found a real bug rather than proving a check: levels is a list or the string all, and the block rendering the code iterated the string character by character and raised on the first one. A crash was the right failure there, and it now renders honestly instead.

- Released: 2026-09-16
- Built from commit: `bbfbfb35b730eeb15ceb943b7e2e19e8849cc4b2`
- Reconstructed: no

---

This document is released under the Creative Commons Attribution 4.0 International licence (CC BY 4.0).
