Each entry records one release cycle: what changed in the content and its assessments, what changed in how the site is built and checked, what was found broken and where it was fixed, and the lesson the cycle left behind. Newest first.

v1.1.0 — The commission closes: 385 briefs, and a second editorial standard for the subjects that needed one

15 September 2026

The research longlist that has driven every content wave since v0.5 is finished. Fifty-six briefs were written across five waves -- 329 to 385 -- and all ninety commissioned slots are now filled, which the build asserts rather than claims: a new gate derives the outstanding set from the commission map against the briefs on disk and refuses to ship a release that says closed while anything is unwritten. The version number moves to 1.1 rather than 1.0.3 because a seventeen per cent corpus growth is an addition, not a fix. Three of the fifty-six were held back deliberately for a decision about whether an assessment site should publish them at all, and the answer -- present the controversy at full strength, do not adjudicate it -- became the Institute's second published editorial standard, adopted before the briefs it governs rather than after. The typed graph's one mutual dependency was examined and deliberately kept, and the page now says so. And the growth surfaced five counts that had been typed into the site's own prose instead of computed -- one page contradicting itself by a factor of two on a single screen -- which are now derived and gated.

  • Content. Fifty-six new briefs close the v0.6 commission: ninety of ninety slots written, the corpus at 385. The waves spanned every category, and the later ones ran deeper than the earlier -- roughly nine thousand words against thirty to forty-five fetched sources each, with load-bearing figures re-fetched under narrow prompts before use. The claim register grew from 26,932 to 32,116 and the citation backbone from 7,177 to 8,850 sources.
  • Architecture. `_commissioncheck.py --complete` is the definition of done, as a gate. It derives the outstanding set from the commission map against the briefs actually on disk -- never a stored count, which would be a second copy of a fact the corpus already holds -- and fails the build while any commissioned slot is unwritten. A release note is exactly the place a project gets 'that was the last one' wrong by one.
  • Content. A second editorial standard, for contested and irreversible subjects, covering self-spreading vaccines, ecosystem gene drives and animal cognitive uplift. Five commitments: present the disagreement at full strength rather than reach a verdict; separate factual disputes, which a measurement could settle, from values disputes, which none can; carry no operational content; flag interested parties on every side; state irreversibility and consent plainly. The three briefs are bound to it by the same typed pointer the military-AI brief uses, and the same gate checks the binding. Unlike the first standard it was adopted BEFORE the briefs it governs, so its audit is a check that the constraints held rather than a retrofit -- and the page says which of the two it is.
  • Correction. The typed graph's mutual dependency between Neuroplasticity Engineering and Human-Machine Symbiosis was examined and deliberately retained. Both edges are real claims of different kinds -- one brief waits on a result the other owns, the other waits on the apparatus the first supplies -- and two fields that genuinely co-evolve have no precedence order. The disposition is declared once in the taxonomy and read by both renderers, so a published cycle can say whether it is an open question or a settled one; a cycle with no disposition reads as an oversight nobody has looked at, which invites the next reader to 'fix' a finding.
  • Correction. The waves corrected more commission anchors than any previous content pass, several of them attributions the wider literature repeats. The universally cited Zubrin and Andrews result that magnetic scoop drag exceeds ramjet thrust is not in the 1990 paper cited for it. The Austrian agent-based model did not beat the official forecasting institutes; it beat benchmarks its own authors implemented. NOAA Atlas 15 is in no state drainage manual, and adoption is bibliographic rather than decided. The canonical summary of the field's headline gene-drive experiment is wrong in two places. Each correction is carried in the brief that found it, with its sourcing.
  • Architecture. `_positioncheck.py` had hardcoded the first editorial standard's particulars -- exactly four commitments, and its literal sentence -- so it failed the moment a second, correctly written standard appeared. It now counts numbered commitments rather than fixing the number, and accepts the non-adjudication family rather than one phrasing; its self-test covers a four-commitment page, a five-commitment page, a page with too few headings, and a page with commitments but no promise, which must still fail. This is the same defect as the six version regexes v1.0.1 found: a pattern is a written-down fact, and a fact that holds while there is one of something stops holding at two.
  • Correction. Five counts in the site's own prose had been typed out rather than computed, and fifty-six new briefs moved every one of them. The tech tree said it could not place 'the ninety-five briefs' while listing 148, and four hundred words later said 62 briefs disclaim a brief-to-brief prerequisite beside its own derived 146 -- the page contradicting itself on one screen. Its meta description, the sentence a search engine quotes, still advertised 329 briefs. The frontier directory illustrated its document-type rows with sixteen briefs leaning on a press release where the row read 20. All five now interpolate the value that computes them, and the essay's pre-expansion baseline reads the constant it was copied from.
  • Architecture. `_countcheck.py` refuses a written count on a page whose job is to report the corpus. It reads the template source rather than the rendered HTML, which is the whole of the trick: after rendering, '329 briefs' and a derived '385 briefs' are the same characters and nothing downstream can tell them apart, while in the source one is a literal and the other is an expression. Nine synthesis pages are scanned; waivers are listed with the reason each is not a count. The gate found the 62-against-146 contradiction on its first run, in a paragraph that had been read several times that day without anyone seeing the number, which is the argument for having it rather than trusting the reading. Prose was the last place in this build where 'derive it, do not write it down' was still on its honour.

Found broken

  • The typed graph still contains one mutual dependency, and the tech tree still publishes the edge it cannot place. This is now a decision rather than an omission -- both edges were judged real and kept -- but a reader looking for a fully drawable graph will not find one. Fixed in open by decision -- retained deliberately on 15 September 2026, with the reasoning published on the tree.
  • The published verification share still predates any live check of the roughly 3,400 sources added since the September ledger. The backbone has grown from 7,177 to 8,850 entries across this release, so the stale fraction is larger than it was, not smaller. The re-run remains the highest-value action available and needs a machine with ordinary egress. Fixed in open -- the ledger re-run is a network job the build container cannot do.
  • Brief-to-brief coverage now reads lower than it did before the expansion, because most new briefs declare constraints rather than prerequisites on other briefs. The figure is published unchanged and the retired rule's threshold is still not moved; the number falling as the corpus grows is the same finding that retired the rule, observed again. Fixed in open by design -- the measurement continues and is published whether or not it flatters.

A commission is closed by a gate, not by a sentence in a release note. The harder lesson is the one the three held briefs taught: the question of whether to publish a subject is separable from the question of what is true about it, and an assessment site that conflates them will either flinch from subjects it should cover or adjudicate disputes it has no standing to settle. Writing the standard first, publishing it, binding the briefs to it with a typed pointer and letting a gate check the binding turns an editorial instinct into something a reader can hold the Institute to. And the gate that checked the first standard broke on the second, which is this project's oldest lesson arriving on schedule: a pattern written while there is one instance of something is a fact about that instance, not about the thing. The last of it is smaller and older than either: a page that reports the corpus must not state a number it did not just compute, and until this release that rule was enforced by care rather than by machine.

v1.0.1 — The tech tree is published, and the rule it waited on was retired rather than met

15 September 2026

Two decisions that had been referred out of v1.0.0, taken and shipped. The tech tree -- five releases of 'planned' with a number attached -- is published: 234 of the 329 briefs sit in a typed dependency graph of 307 edges over six layers, drawn from the prerequisites the briefs declare in their own words and re-derived by a gate on every build. The rule that had gated it was retired on 15 September 2026 and none of its three numbers moved, because the adjudication had shown the problem to be the clause rather than the corpus: it counts a brief only when that brief declares a prerequisite, so a foundational subject that many others are built on scores zero against it. Clause 1 is still computed and still published, unflattering, beside the graph it no longer gates. Separately, the Institute's editorial position on military AI and autonomous weapons is published -- assess-only, four commitments, and an audit of the already-live brief against all four, including the one line that sits closest to the boundary.

  • Content. The tech tree is published at `tech-tree.html`. It draws the typed `depends on` graph as layers rather than as a node-and-arc diagram, because the thing a reader is owed is which brief rests on which, which a layered list says exactly and a hairball says worse -- and because a list is readable at 400 pixels, reachable by a screen reader, and checkable by a gate. 307 edges, 234 briefs in the graph, six layers, a five-edge spine, and the ninety-five briefs the tree cannot place counted apart by the reason each is outside it.
  • Architecture. The ship rule fixed on 26 August 2026 was retired on 15 September 2026, and none of its three numbers moved. Clauses 2 and 3 are met. Clause 1 stood at 46.8%, and the adjudication that produced that figure also produced the reason it is the wrong measure: a brief counts toward it only by declaring a prerequisite, so the foundational briefs a tree is drawn from count for nothing. Lowering 60 to a number the corpus clears would have been the rule rewritten to fit its own result, which is the failure that fixing it in advance was meant to prevent. Retiring it says the quantity is not the right precondition for publishing the graph. The thresholds stay in the code, clause 1 is computed on every build and printed on both the tree and the topic index, and the gate now reports what the retired rule would have said beside the fact that the tree ships regardless.
  • Architecture. The published tree is gated against a second implementation. The page is rendered by the Astro build from `treeLayers()`; `_treecheck.py` re-derives the same layering in Python from the records and fails the build if the page disagrees about a single node's layer or prerequisites, or about which briefs are in the graph. A diagram is the easiest artifact on a site to let drift, because nobody re-reads a picture, so the picture is gated exactly as hard as the numbers beside it.
  • Content. The Institute's editorial position on military AI and autonomous weapons is published: the subject is the evidence and not the policy, interested parties are flagged harder here than anywhere else, the brief carries no operational content, and human cost is stated rather than aestheticised. The choice that had to be made was the first commitment, and the page states the argument against it in its strongest form before taking the other side. The page also publishes the order this happened in -- the standard was drafted to precede the brief and did not -- and the audit of the live brief against all four commitments, including the one line that sits closest to the boundary of the first.
  • Architecture. A brief is bound to an editorial standard by a typed pointer on its record, not by a sentence in its prose or a code test in a template. `_positioncheck.py` fails the build if the standard's page is missing from the records or from the artifact, if either rendered tree omits the note or cites a different standard, if the adopted date is absent, or if the standard's page stops carrying the commitments it is cited for. Its matcher has its own self-test, for the reason `_prosecheck_test.py` exists: a checker whose pattern is wrong reports clean.
  • Architecture. `validate.py` now resolves a link whose target this tree does not render against the artifact, instead of calling it broken. Pages that exist only as records or as routes -- the review policy, the Constraint Atlas, the tech tree -- are built by the shipping renderer and not by the Python one, and until now the shared template simply could not link to one: a constraint on what the site could say, imposed by which renderer a page happened to live in. The fallback is derived rather than listed, so it cannot forgive a page that has stopped being built, and a link neither tree contains is still a failure.

Found broken

  • One mutual dependency is live in the corpus: FR-III-24 and FR-III-23 are each recorded as depending on the other. A layering cannot resolve one, so the edge is dropped for the purpose of assigning layers, kept in the edge count, and named on the tree page. It is an editorial question about two briefs rather than a bug in the extraction. Fixed in v1.1.0 -- examined and deliberately retained. Both edges were read against the briefs' own dependency prose and both are real claims of different kinds; two fields that genuinely co-evolve have no precedence order, and inventing one to make the graph draw would be the worse error. The tree still publishes the edge it cannot place, and now also says the question was asked and answered.
  • Ten of the sixty-six commissioned sweep briefs are written; the remaining fifty-six are queued against the same commission map and continue in later waves, bounded by the shared per-session research-search budget rather than by the toolchain. Fixed in open -- continues against the same commission map.
  • The published verification share still predates any live check of the roughly 1,900 sources added since the September ledger. The re-run remains the highest-value action available and needs a machine with ordinary egress; the kit is prepared. Fixed in open -- the ledger re-run is a network job the build container cannot do.

A threshold written in advance is worth keeping right up until the measurement itself is shown to be measuring the wrong thing -- and at that point there are two moves, one of which is a rationalisation. Lowering the bar to the number in hand rewrites the rule to fit the result. Retiring the rule, in public, on a date, while continuing to compute and publish the number it measured, does not: it leaves the evidence where a reader can check whether the decision was taken or the number was buried. The same instinct runs through the rest of the release. The standard for the military-AI brief says out loud that it was adopted after the brief it governs, and publishes the audit rather than the assurance; the tree publishes the ninety-five briefs it cannot place and the one edge it cannot draw. What makes any of this more than a posture is that each is gated: the tree against a second implementation of its own layering, the standard against both rendered trees, and the coverage figure against the corpus that keeps failing to flatter it.

v1.0.0 — 1.0: the evidence is checkable, the institution says what it is, and the corpus cannot be lost

15 September 2026

The version number is a claim, and this release earns it on three axes rather than by growing the corpus. Durability: the working source is now a git repository and a snapshot the packaging chain emits and refuses to ship without, so the near-loss that sat between v0.4 and v0.7 -- the whole corpus living only in an ephemeral build container -- cannot recur silently. Governance: every one of the 329 briefs carries a review tier and a state derived at build time, a review policy states what each state means, and the licence page now says what it does not cover. Evidence: the seventh and last canonical entity, the Claim, is extracted from the corpus's own flagged statements and made addressable; the tech tree was adjudicated to twice its former coverage and still, honestly, does not pass its own rule; and an external audit's infrastructure gaps -- no sitemap, no robots, no social tags, an unbranded 404, a broken Category XI card, a stale footer version -- are closed. Ten new briefs join, spread across ten of the eleven categories; the wider expansion continues against the same commission map.

  • Architecture. The workspace is now a git repository, and the four-archive workspace snapshot is a packaging stage (`_mksnapshot.py`) that `_mkdelivery.py` refuses to build without and `_briefcheck.py` re-verifies against its manifest. This is the eighth application of the project's organising lesson -- a thing that must survive was surviving only in someone's memory to zip it. Between v0.4 and v0.7 the only complete copy of 2.5 million words lived in an ephemeral container; a release can no longer ship without emitting its own durable source copy.
  • Architecture. The Claim entity, the last of the evolution plan's seven canonical entities. Every flag-led statement in the corpus -- 26,932 of them -- is extracted into a typed register (`_content/claims/`, derived, never authored), each carrying a stable id computed from its own text, plus each brief's decisive-experiment claim. The renderer anchors 26,603 of them on the page so a claim can be linked, cited or challenged directly (`#c-<id>`), and two gates keep the register and both rendered trees in lockstep.
  • Content. The review lifecycle, live. Each brief carries a risk tier -- fast (6-month), standard (18-month) or slow (4-year), 61 / 200 / 68 across the corpus -- with an owner where the tier is fast, and a state derived at build time in both renderers by one rule: Not independently reviewed, Reviewed by, Review due since, or Under revision. Overdue is shown, not hidden. A new review-policy page states the tiers, the five evidence triggers and what each state means; a new gate (`_reviewcheck.py`) enforces that no state string is ever typed into prose and that both trees agree.
  • Content. Ten new briefs, across all ten of the non-XI categories, from the v0.6 research sweep: Aneutronic Fusion and High-Pressure Superconductivity (V), Fission Fragment Propulsion (I), Primordial Black Holes (II), Synthetic Human Chromosomes (III), Organoid Intelligence (IV), Atmospheric Methane Removal (VI), Quadratic Mechanisms (VIII), Research Productivity Decline (IX) and Pathological Science (X). Each researched against fetched sources, validated by the new-brief contract, and tiered. The remaining sweep briefs continue against the same commission map.
  • Content. The tech tree was adjudicated across the 139 briefs whose own dependency prose linked other briefs, by five independent passes recording the weaker claim where ambiguous. 193 genuine depends-on edges were typed onto 77 briefs and 62 briefs were found to disclaim any brief-to-brief dependency in their own prose; coverage rose from 23.8% to 46.8%. It still does not meet the 60% ship rule, and the threshold does not move. The finding underneath is that most frontier dependencies are institutional and industrial, not brief-to-brief -- which is a question about whether the rule measures the right thing, recorded for a decision rather than resolved by moving a number.
  • Correction. The 37 dead and insecure citations from the September ledger were dispositioned: 32 were alive when re-checked in the field (the crawler over-reported death under load), one work was genuinely gone and is now cited by name, and four were re-pointed to verified canonical homes. A second external audit's link findings were folded in: five http citations upgraded to https, and two more re-pointed to verified landing pages.
  • Correction. The broken Category XI card, found by audit: the shipped Frontier Research index enumerated categories from `taxonomy.inprogress`, which still held ten while the map held eleven, so a card linked to a Category XI section that did not exist. The eleventh category is now in that list, `_countcheck.py` now checks the shipping surface against the corpus and not only the Python generator, and the two lists must partition the map.
  • Correction. The footer version was written in two places and had drifted -- the Astro build said v0.7 while the Python constant read v0.2.1, four releases stale. The version is now declared once in the taxonomy and a gate (`_versioncheck.py`) asserts both rendered trees show it on every page. The two open v0.7 defects are closed: the convergence map redraws as a list below 500px, and three static pages lost the inline margin that overflowed a phone.
  • Architecture. Infrastructure and SEO, from audit: a derived sitemap.xml and a robots.txt (Astro routes, so they cannot list a page the build did not produce), Open Graph and Twitter card tags in the shipping head, a branded 404 carrying the site shell, and an h1 on the topic index, the one page of hundreds that lacked one. The nginx-side items -- security headers, cache-control on versioned assets, and serving the 404 -- are specified in the deploy brief.
  • Architecture. The licence page gained the two statements it was missing: that quoted third-party material remains under its own terms, and a provenance line on how the corpus is produced and reviewed. The derived-data and public-export licence is deliberately deferred rather than decided in a build.

Found broken

  • The tech tree ships when adjudicated coverage reaches 60%; it stands at 46.8% after the largest honest adjudication the project has run. This is published on the topic index, not hidden, and the threshold fixed on 26 August 2026 is not moved to meet it. Fixed in v1.0.1 -- decided rather than deferred. The clause was found to measure the wrong property (it counts a brief only when that brief declares a prerequisite, so a foundational brief scores zero), the rule was retired rather than moved, and the tree was published. The 60% figure never moved and clause 1 is still computed on every build.
  • Ten of the sixty-six commissioned sweep briefs are written; the remaining fifty-six are queued against `_commission-v0_6.json` and continue in later waves, bounded by the shared per-session research-search budget rather than by the toolchain. Fixed in open -- continues against the same commission map.
  • The published verification share (54.3%) still predates any live check of the ~1,900 sources added since the September ledger. The re-run remains the highest-value action available and needs a machine with ordinary egress; the kit is prepared. Fixed in open -- the ledger re-run is a network job the build container cannot do.

A version number is a promise, and the honest way to keep it is to make the promise checkable rather than to make the corpus bigger. Three of this release's hardest pieces -- the snapshot gate, the review states, the version check -- exist because a thing that mattered was written down once too often or held only in memory, which is the same lesson the project has now applied eight times. The two things 1.0 could not finish, the tech-tree threshold and the ledger re-run, are both published as open rather than closed by lowering a bar or asserting a number, because a 1.0 that hid them would be exactly the kind of claim this site exists not to make.

v0.7 — The instrument panel: a redesign that changed no words

14 September 2026

The whole site is rebuilt to one visual language -- dark navy for orientation and argument, white for reading, orange as the only action colour -- and not a sentence of the 2.45 million words moved. The redesign restyles the existing class vocabulary rather than replacing it, so 7,539 pages changed appearance without changing markup, and the seven screens that gained behaviour build it from the structure already in the page rather than from hooks added for them. Along the way three things that had been broken for releases became visible, because the redesign asked questions of the shipped tree that nothing had asked before: two of the site's own screens were inert, a gate designed for exactly this class of defect had never once been run against the artifact, and the convergence map's resting edges had been drawn below the contrast floor since v0.3.

  • Design. A new stylesheet, `instrument.css`, replaces `styles.css` on every shipped page. It defines all 285 class names the old sheet defined and adds none: the vocabulary is the contract, and the redesign is a new implementation behind it. That choice is what made a whole-site restyle possible without touching markup -- and it is also what makes the failure mode quiet, because a class the old sheet styled and the new one does not renders with browser defaults on every page that uses it and reports nothing. `_cssclasscheck.py` measures the one sheet against the other and is the reason the number is 285 of 285 rather than 'looks finished'.
  • Design. Colour is now computed rather than chosen. Every pair the sheet uses is declared in `_contrastcheck.py` with the surface it sits on and measured against WCAG 2.2 AA -- 48 pairs, text at 4.5:1 and graphical objects at 3:1. Three of the four flag colours and the focus ring FAILED as the design specified them, and were darkened until they cleared; the accent orange is 2.80:1 on white and is therefore never text on white, only a ground with dark ink on it. A palette looking right is not evidence, and the three places where the margin is under 0.1 are named in the gate's own output so the next edit measures rather than remembers.
  • Design. Seven screens gained behaviour, and every one of them derives it from the page it is on. The topic map builds 408 filterable cells from the topic index's own table rows. The brief reader builds a section ladder from the `h2` elements the renderer emits, a reading-progress bar that measures the article, and a flags toggle that mutes the inline marks while keeping every chip's word. The learn ladder keeps per-module progress in the reader's own browser, keyed by module URL rather than by position. The programmes list filters itself from its cards' own statuses. The constraint atlas turns 1,138 list entries into a sortable table with a kind column. The convergence map isolates the sub-graph under the pointer or the focus ring. The navigation becomes a dark full-height sheet below 760px by MOVING the masthead's nav into it, not copying it. There is no list of sections, categories, statuses or destinations in any of these files, and there must never be one.
  • Verification. `_jscheck.py` now runs against `_astro/dist` -- the tree that actually ships -- as well as against the Python render. It never had, for four releases, because it looked for `css/styles.css` to derive its width containers from and the shipped tree loads `css/instrument.css`: one hard-coded filename kept a gate pointed away from the artifact it was written to protect. It also now asserts the screen-behaviour hook table from `lib/pagescripts.ts`, parsing the single declaration rather than restating it, so a page carrying the markup a screen script reads must load that script.
  • Verification. `browsercheck.mjs` gains eleven assertions, in two new sections, that the v0.7 screens actually run and that the navigation sheet moves rather than copies the nav. A screen whose script silently returns early is, to every static gate, identical to one that ran: same markup, same assets, same referential integrity. This is the v0.3.1 answer applied again -- prove function, not delivery -- and it is the half that caught the two inert screens after the static half had already caught them once.
  • Correction. The topic index's status chips and search box were inert on the shipped site. Their wiring is an inline `<script>` that sits after `</main>` in the page template, and `topic-index.astro` takes the template's `<main>` and discards the rest -- so the controls shipped, looked exactly right, and did nothing. Found while building the topic map from the same table those controls filter.
  • Correction. The convergence map drew its resting edges at 50% opacity, putting the flag marks on those edges at 1.81-2.38:1 against a 3:1 floor. Full strength is the only compliant resting state -- each flag colour was already lowered in the palette pass until it just cleared 3:1, so no alpha below 1 exists that a resting edge can take. The isolation therefore dims what is not connected rather than brightening what is, and the dimmed state is transient by construction.
  • Correction. `_jswire.py` was an allowlist of two hard-coded names and a rule, and a script that was none of the three was written, referenced by both renderers, reviewed, and never projected into the build -- so a page emitted a `<script src>` for a file that did not exist. It is now an exclusion list with a reason per entry. Forgetting to exclude is loud: an unused script ships and is reported as an orphan. Forgetting to include was silent.

Found broken

  • Two of the five new screens shipped inert on their first build, and every gate was green. `topic-index.astro` and `constraint-atlas.astro` write their own markup instead of carrying a body string, so neither was ever passed through `lib/pagescripts.ts` -- the function that decides which behaviour scripts a page needs. The pages rendered correctly, referenced every asset they named, and carried no behaviour at all. This is the v0.3 defect in its newest costume: consistency in one direction is exactly what a page that declares nothing achieves for free. Fixed in v0.7 (the hook table is asserted over the shipped tree by `_jscheck.py --dist`, and the screens are asserted to have built something by `browsercheck.mjs` section 8; a negative control confirms both fire).
  • The brief reader's section ladder was declared `position: absolute` inside a media query and `position: sticky` in an unscoped rule after it. The later declaration won, so the ladder stayed in the document flow with the absolute rule's offset applied, and every brief opened with a fifteen-item list above its own title. The measurements passed -- the ladder existed, the links resolved, the progress bar tracked. The screenshot was the only thing that failed. Its replacement then put the ladder in a real grid column and lost to a three-class selector on specificity, producing the same picture a second time, and then made the row it occupied as tall as itself and opened a 309px hole above the prose. Fixed in v0.7 (a two-column grid with column-gap only, both placement rules written at the same selector depth, and the ladder's row span read from the DOM).
  • Three of the four flag colours and the focus ring failed WCAG AA as the design handoff specified them, and the first contrast audit of them was also wrong -- it measured the flag colours as text when the chips are a tinted ground with dark text on them, which passes comfortably. The real failures were the three inline claim marks and the focus ring at 2.80:1. An audit that measures the wrong surface produces a number that is both precise and meaningless, which is worse than no number. Fixed in v0.7 (every pair in `_contrastcheck.py` now names the surface it is measured on, and the gate reports its three tightest margins on every run).
  • Two new browser assertions failed on their first run for the same reason the v0.6 patterns did: they were written from how the DOM was pictured rather than from the DOM. One demanded that every filter chip carry `aria-pressed`, when the row also holds a 'clear the filters' command that correctly does not. The other demanded a flag cell in every table row, when the last row is the lazy-render spacer that reserves the height of the rows not yet built. Both were off by exactly one, which is the most persuasive kind of wrong. Fixed in v0.7 (both probes now select the thing they are about -- filter chips, data rows -- and say in a comment what they exclude and why).
  • A stray top-level `}` sat in the stylesheet's hero block. CSS error recovery discards it, so it cost nothing and nothing reported it; it would have silently eaten the next rule the moment anyone wrapped that area in a block. Found by measuring the file's brace balance while looking for something else. Fixed in v0.7 (deleted; balance verified at 0 before and after).
  • The convergence map is illegible below about 500px: the SVG scales with its container, so at 390px the front labels render at 5.22px and the edge strokes at 0.7px. The build note's floor of 16px for body copy does not reach inside an SVG, and the two available fixes are a narrow-width redraw in the widget or a horizontal scroller that the interactives block explicitly forbids. Not fixed in this release, and recorded here rather than left to be rediscovered. Fixed in v1.0.0 (below 500px of stage width the widget redraws as a list -- same nodes, edges and flags, built from the same arrays that draw the SVG, so the two renderings cannot disagree; the no-JS fallback prose is unchanged).
  • Three static pages indent their own content by 112px at every width through an inline `margin-left` in authored markup, which at 390px leaves the content 230px of a 390px viewport and causes a 26px horizontal overflow on the learn page. Pre-existing, present with JavaScript disabled, and not repairable from a stylesheet without an `!important` reaching into a class that belongs to another screen. Fixed in v1.0.0 (the margin-left declaration removed from all four occurrences across the three page records; the 80px gutter it compensated for belongs to the retired design).

The v0.6 lesson was that a derived number written down will drift. v0.7's is narrower and sharper: a check is only ever run against the tree somebody pointed it at, and the tree nobody points it at is the one that ships. `_jscheck.py` was written specifically to catch behaviour that ships without its script -- and for four releases it was run exclusively against the Python render, because one hard-coded stylesheet filename made the shipped tree unreadable to it. Two of this release's five screens then shipped inert and no gate objected, which is the defect that gate exists for, occurring inside the blind spot of that same gate. The second half is about evidence. Every layout failure in this release passed its measurements and failed its screenshot: the ladder that existed, resolved and tracked while sitting in the wrong place; the cells whose count was right and whose names were shredded mid-word; the map whose elements all drew and whose edges nobody could see. Geometry proves a thing is where you said it is. Only looking proves it is what you said it is, and in a redesign that is the whole question.

v0.6 — Why any of this matters, and a directory of who is working on it

14 September 2026

Every brief now opens by saying what you get if the thing works, in its own units, against a baseline. That section is new, it is required, and it was written into all 295 briefs that predated it as well as the 24 written in this release. A new eleventh category, Theoretical & Pre-Paradigmatic, holds the subjects where the honest register is speculation and the discipline is therefore heavier rather than lighter. A Frontier Directory, derived entirely from the citation record, says which journals, agencies and laboratories the corpus's evidence actually comes from. And a defect that would have quietly falsified 1,052 cross-references was found by a pilot before the work that would have caused it ran.

  • Content. Section 1, 'Why this matters', is added to every brief and is now required. It states the prize in the brief's own units against a baseline -- not 'transformative' but 'removes the 1,500-3,000 m2 radiator, about half the mass budget, from the vehicle'. Unfalsifiable superlatives are checked. The rule that governs it is that the section must be written from the brief that exists rather than from the topic: where a brief documents nulls, cancelled programmes and bounds tightening the wrong way, section 1 says so. 110 of the 319 say in terms that the upside is narrower than the field's own rhetoric, and three open on a handwave flag. A section that reads 'the upside here is narrower than the field's rhetoric suggests, and here is the part that survives scrutiny' is a complete and successful section 1.
  • Content. Category XI, Theoretical & Pre-Paradigmatic: 24 briefs on subjects with no settled paradigm -- objective collapse, prebiotic chemical networks, assembly theory, homochirality, the Turing mechanism, dissipative adaptation, indefinite causal order, Wigner's-friend experiments, undecidability in physical theory, and others. This is the one category where `handwave` is the expected register rather than a lapse, so it carries MORE mechanical discipline: floors on the speculative share of unsettled claims, on the established share of all claims, on flagged claims in the required-experiments section, and on how many works in the bibliography the brief is willing to call measured. Median XI brief: 8,391 words, 198 flagged claims.
  • Correction. Every commission anchor checked in this release contained a real error, twelve for twelve. A blind test of four samples was described as 114 -- the 114 was a calibration set in the same manuscript. The Soai reaction's amplification from 0.00005% took three consecutive rounds, not one. Murchison isovaline's enantiomeric excess is 10 +/- 1%, not the 15% in circulation. A robin-cryptochrome species contrast was overturned by its own 2025 follow-up in chicken. Landauer erasure was reported 'at the bound' when the measurement is 0.59 kT with a 0.72 asymptote, and its independent confirmation is a feedback trap rather than a second optical trap. A Turing-network paper was credited with a polydactyly result belonging to a different paper that does not contain the word. Each correction is in the brief that carries it.
  • Architecture. The Frontier Directory: 2,705 venues behind the corpus's cited sources, with which briefs rest on each, derived from the citation record on every build so it cannot drift from the bibliography it describes. It carries no author column, and that is a decision rather than an omission -- two attempts produced rows that misattribute work, and 3,180 author mentions in the record are a single token with no initial, a bare surname identifying nobody. The measured counts are published as a stated limit; the rows are not.
  • Correction. 1,052 section cross-references were about to become wrong at the same instant. A brief that says 'the numbers are in section 2' has written down a position in a list, and inserting section 1 shifts every one of them. The retrofit pilot found it before the retrofit ran. The fix is not to add one -- that corrects the corpus today and re-arms the same defect for the next framework change -- but to stop writing the number down: the prose names the section, both renderers resolve the number from the framework order that numbers the headings, and a gate fails the build on a bare number, on a token naming a section that does not exist, and on an unresolved token reaching a shipped page.
  • Verification. Seven new gates, each for a defect this release found in itself. Written briefs must match the slot they were commissioned into -- one commission's filename had already drifted from the brief that shipped. The prose diagnostic's own filters are unit-tested and the test is a gate, because a report-only check with broken filters does not report loudly, it reports clean. Tag balance is checked per section in the per-brief validator rather than only over built pages at the end of a pipeline: two briefs shipped fourteen doubled paragraph tags and passed all three gates an author is told to run. Framework adoption state is checked, and so is whether the authoring spec still states the map's framework. The citation record's parse rate is ratcheted so new reading-list labels cannot degrade the directory one brief at a time. The ledger runbook must state the record's real tally rather than a figure from two releases ago. And a floor that had been declared, documented and read by nothing for a whole release is now wired. The count in this sentence was itself wrong on its first writing -- it said five, which is the kind of derived number this release is about.
  • Correction. The per-brief prose gate could not run while a wave was in progress. It read one string constant by executing a 29,000-line module that hard-exits when brief ordering is non-contiguous -- which is what a wave in flight looks like for as long as it runs. Four commissioned authors hit it and worked around it; a fifth passed only because the corpus happened to be contiguous at that instant, which is worse, because it makes the result depend on sibling timing. The constant is now read without executing anything.
  • Correction. Two gates kept hand-maintained lists where the packager applies a rule. The behaviour-script gate enumerated three underscore-prefixed directories to skip and audited whatever fourth nobody had thought to add; it now applies the packager's own rule -- drop every path with a component beginning with an underscore -- on both sides. The prose diagnostic excluded the citation shard directory but not the index of that directory nor its JSON export, so 26 findings were third-party paper titles reported as the Institute's own voice.

Found broken

  • The gate written to catch the cross-reference defect reported PASS over 518 stale references it could not see. Its pattern was written from how a cross-reference would be written rather than from how this corpus writes them: an entity separator where whitespace was expected, the section sign, and a list member whose word 'section' sits three tokens to its left. Larger than any of those, 482 of the 518 were in reading-list notes and titles -- a field the checker never opened, which is a scope error rather than a pattern one. Six commissioned authors found them independently, one slice at a time. The checker and the sweep now share one definition instead of two that claim to match the same thing, and both run to a fixed point, because converting 'sections 3, 5 and 9' one pass at a time leaves the third member behind. Fixed in v0.6 (the checker and the sweep now share one definition; seven negative controls).
  • The tool built to repair the cross-reference defect reproduced it, in the same shape, one layer up. It decided which framework a brief's prose was written against by asking whether the record had an `upside` section -- a property of the record, which felt like the right kind of fact. It was correct for exactly one run. The retrofit then gave all 319 briefs that section, so on the second run every legacy brief answered 'fifteen', and 567 references written against the fourteen-section framework were mapped one section too early. They resolved, they rendered, and they read as ordinary numbers; the only way to see it was to compare a rendered page against the text before the sweep. A fact inferred from mutable state is not a fact, it is a coincidence with a shelf life. The authoring framework is now read from the brief's category, which is stamped at commission and cannot move -- and because even that expires the moment a brief is written into categories I-X against the new framework, the sweep refuses to run without an explicit acknowledgement that it is a migration with a known expiry. Fixed in v0.6 (pass reverted from a pre-pass snapshot and re-applied; verified by rendering a brief and diffing the numbers against its text before the sweep).
  • The first version of the cross-reference sweep held back 28 genuine self-references on words this corpus uses in their ordinary senses -- 'code' for the genetic code, 'act' inside 'could act', 'report' inside 'cannot outrun report'. A filter that holds back the true cases along with the false ones does not make a sweep safer; it makes the hold list unreadable, and an unreadable hold list gets approved wholesale, which is the failure it existed to prevent. Fixed in v0.6 (matcher narrowed to proper nouns; holds fell from 44 to 1).
  • A floor for Category XI was declared with a written rationale and read by no check for the whole of its first release. Every XI brief was reported as having cleared a floor that was enforcing nothing. Fixed in v0.6 (wired; all 24 XI briefs clear it, minimum observed 3 against a floor of 2).
  • The authoring spec told commissioned agents to construct a landing URL from a DOI or arXiv id rather than spend a search on it. Fetching is provenance-gated in the environment the agents run in, so a correct constructed URL is refused; the advice cost searches rather than saving them. Rewritten from what four agents measured, including the harder finding that a fetch summariser can return a confident, specific statistic that is not in the document it claims to be summarising. Any figure carrying argumentative weight now requires a second, narrowly scoped fetch. Fixed in v0.6 (spec rewritten from what four agents measured).
  • Two briefs shipped fourteen doubled paragraph tags, passing the per-brief validator, the experiments validator and the prose diagnostic. The fault surfaced only in the balance check over built pages, a hundred seconds into a full pipeline and a long way from the author who could have fixed it in ten seconds. None of the three gates an author is told to run looked at whether the markup closed. Fixed in v0.6 (caught pre-ship by the balance check; per-section balance added to the per-brief validator).
  • The spec and the prose diagnostic disagreed about two banned words for a whole release, and when the words were added corpus-wide they produced 68 findings on 'an unlimited budget', 'unlimited negative energy' and 'unprecedented in 1,200 years' -- all correct prose. The rule belongs to section 1, where the register is the issue, and is now scoped there. The diagnostic also reported a sentence describing a programme's retreat from framework replacement, 'explicitly non-revolutionary', as vendor hype; the author rewrote correct prose to satisfy a regex, which is the wrong way round. Fixed in v0.6 (scoped to section 1 and quantification-tested; negation guard added, with a unit test that is itself a gate).
  • The Category XI speculative floor originally counted speculative and handwave claims as a share of ALL flagged claims. The pilot brief -- well anchored, resting on four world-leading measurements -- came in one claim under, BECAUSE it was well anchored, so the cheapest way to pass was to delete a measurement or inflate a frontier call. A floor that rewards citing less is worse than no floor. The denominator is now the unsettled claims alone, and adding a measurement can no longer push a brief under it. Fixed in v0.6 (caught by the pilot brief before the wave ran).

Everything that broke in this release broke the same way: a number that was derived from something, written down next to it, and then left to drift. 1,052 cross-references were positions in a list. A commission's filename was a plan the brief no longer matched. A version stamp was read by executing the whole build. Two gates kept lists of directories where the packager keeps a rule. The fix is the same every time -- delete the second copy, derive it at build time, and if neither is possible, gate the copy against its source. What is new in v0.6 is the other half of the lesson: a gate written for exactly this defect reported clean over 518 instances of it, because the gate and the thing it checked had been written from the same assumption by the same author. A check is only as wide as the imagination of whoever wrote its pattern, which is the argument for having the people doing the work report what they had to interpret -- every one of those 518 was found by an author who was told to say what did not fit.

v0.5.1 — The scripts come back

12 September 2026

A repair release, and a short one. A reader opened the Frontier Convergence Map and found a page whose text ran into the left edge of the window and whose diagram was an empty box. Both were true, and both had been true since 10 September. The cause was one import: when the site moved to its current build in v0.3, the page bodies came across and the things attached to them did not — the <script> tags that loaded the site's behaviour, and the whole directory those scripts lived in. Four interactive diagrams went silent, 41 pages lost their glossary tooltips, and one page lost the wrapper that gives it a margin. Nothing failed, because the references and the files they pointed at were removed in the same motion, and a check that asks “does every referenced file exist” is perfectly happy with a site that refers to nothing.

  • Correction. The behaviour scripts ship again, and the pages that need them load them. Which scripts a page gets is now worked out from the page's own markup at build time rather than written into the page: a diagram declares which interactive it is, and the build reads the scripts' own registration calls to find the one that provides it. A page cannot carry the markup for a behaviour and silently lack the behaviour.
  • Correction. The Frontier Convergence Map is readable again. Its width wrapper had lived on an element the new build owns, so the import kept the article and dropped the margin, and the text rendered flush against the window with its first column of letters clipped.
  • Correction. All four diagrams drew outside their own frames — a clipped label here, the bottom of a box there, a stroke bleeding off the left edge. Each was drawn to numbers that were correct when it was written and stopped being correct as rows and labels were added; the convergence map had quietly grown a sixth research front. The frame is now measured from what was actually drawn, once, in the shared toolkit, so the next addition cannot reintroduce it.
  • Correction. The map's page said five research fronts and drew six, and the description read by screen readers said five streams and four nodes where there are six and five. The page's own fallback text had said six all along, so the page disagreed with itself. The spoken description is now counted from the data rather than written beside it.
  • Correction. The feedback sections on 344 pages said “Feedback form · needs JavaScript”, which was misleading: the form is not built yet, and email is the route. They say so now. The feedback script stays deliberately unshipped — it would add a link to the privacy page the site has withheld, and with no submit endpoint configured it would do nothing else.
  • Verification. Two new gates, and one existing gate pointed at the artifact instead of the workspace. The first checks that behaviour markup and behaviour scripts still claim each other, in both directions — a page that declares a diagram must load its script, and a script that ships must be wanted by a page — and that no page opens flush against the window edge. The second checks that the scripts served by the build are byte-identical to the ones in the source directory, so there is one copy rather than two that drift. The browser gate now opens each of the four diagrams and asserts it drew something, marked itself live, hid its own fallback and fits inside its frame.

Found broken

  • Four interactive diagrams, 41 glossary tooltips and the feedback widget on 344 pages were dead in production from 10 September, when v0.3.1 was deployed, until this release. The v0.3 build migration dropped the script tags and the script directory together, and every gate stayed green: the release's checks measured whether referenced assets existed, and nothing referenced them any more. The pages still rendered, and each dead diagram fell back to an honest written description of what it would have shown, which is why it read as a design choice rather than a fault. A reader found it, not a check — the same way v0.3.1's dead search was found. Fixed in v0.5.1.
  • The Frontier Convergence Map rendered flush against the left edge of the window, its first column of glyphs clipped, for the same two releases and by the same import. 72 of the 73 page records carry their own width wrapper; this one had carried it on the element the new build owns. The invariant the other 72 satisfy is now enforced, defined as any class the stylesheet gives a maximum width and an automatic margin rather than a list of class names — the first version of the check listed names and flagged a page whose wrapper was perfectly good under a different one. Fixed in v0.5.1.

Referential integrity is not function, and a lossy import gives you referential integrity for free. Remove a reference and its target together and every check that asks whether references resolve will pass over a site that does nothing. This is the third time this project has been taught the same thing — v0.3.1 proved the search assets were delivered while the search box was dead, v0.4 proved the browser checker shipped while its input file did not — and the answer has not changed: assert the behaviour, in a browser, against the artifact that ships. What is new is the other direction. Checking that everything referenced exists is half a check; the other half is that everything shipped is wanted, and everything that declares a need has it met. A page whose markup announces a diagram and whose scripts never mention one is a contradiction the build can see, and now does.

v0.5 — The map doubles, and the evidence base gets its first honest count

12 September 2026

The widest content release the Institute has made: 83 new briefs commissioned from an external review of where the corpus was silent, 36 expansions folded into briefs that already existed, a fifth research programme published, and the citation ledger the production server ran in September committed as the build's input. The topic map moves to the front page, because it is the thing everything else is a view onto.

  • Content. 83 new briefs. An external research review produced a longlist of candidate topics the corpus did not own; every candidate it marked as needing its own treatment was commissioned and written. The map goes from 235 slots to 318 and from 212 published briefs to 295, adding roughly 450,000 words and 7,000 flagged claims. The additions are deliberately unglamorous: screening infrastructure, qualification queues, metrology, repair fleets, chokepoints, test capacity. That is where the review found the silence.
  • Content. 36 expansions into existing briefs, under a rule enforced by machine: an expand pass may add and sharpen and may never lose a flagged claim or a cited source. A new checker compares every edited record against a byte snapshot taken before the pass and fails on any loss. Twenty-nine briefs grew, none shrank.
  • Content. Programme P-002, Ring Gates and Higher Dimensions, is published — wormhole solutions in general relativity, the energy-condition problem, compactified dimensions from Kaluza-Klein to braneworlds, and a layer-by-layer audit of the fiction against known physics. It was the last programme on the roadmap still marked planned; the planned grid is now empty, and it emptied itself, because a programme's status is derived from whether its pages exist.
  • Correction. The verification ledger, run over all 4,272 external URLs from the production server, is committed as the build's input: 3,512 verified outright and 391 more resolving to the work at a recorded new location. Because the expansion added roughly a thousand sources that no live check has yet touched, the published verification share lands at 61 percent rather than the 72 percent the ledger alone would have given — a number that went down because the corpus grew, and is printed that way rather than deferred until it flatters.
  • Content. The topic map is promoted to the front page, directly beneath the masthead, with its own panel: slots mapped, briefs published, words of flagged analysis, flagged claims. Every figure in it is computed at build time.
  • Architecture. Three more written-down copies deleted. The ten category slot lists were Python literals that the expansion silently falsified — the build reported ten count mismatches on the first run — and now load from the taxonomy record, which is the same fix v0.4 applied to the briefs one file over. The site index was a hand-maintained list of every URL that did not know about the 88 pages this release adds, and is now derived from the routes the build produces. The sharded citation record and the programme records were manual export steps that went stale twice in one session, and are now build stages.
  • Correction. The annual essay's authored prose carried three superlatives about its own corpus — which category is most established, which is most contested, and whether energy is the only category whose constraints are industrial rather than institutional. The expansion falsified all three at once. They are now computed, and the third turns out to be a real finding the old wording concealed: five of the ten categories are constrained more by factories, feedstocks and capital than by institutions.
  • Verification. The build runs eleven checks now, and two new authoring gates run per file before a record is ever integrated: one validates a new brief's whole contract, the other enforces the no-loss rule on expansions. Both are negative-controlled.

Found broken

  • v0.4.1 — the ledger release — was packaged and verified but never deployed; its contents are folded into this release rather than shipped separately, the same way v0.2.1 folded into v0.3. A packaged artifact that never reached production is recorded here rather than quietly dropped. Fixed in v0.5 (folded).
  • The deploy brief said the site grew "from 5,441 files to 7,498." 5,441 was v0.3.2; the release v0.5 actually replaced was v0.4, at 6,304 files. The figure was carried forward from an earlier brief by hand, which is the same class of error this project has spent five releases removing from its build: a derived number written down once and then left behind by what it was derived from. The deploy agent caught it by reading the artifact it had deployed. The brief checker now takes the previous release's manifest and refuses any "from N files to M" claim it cannot confirm against it — including the case where no manifest is offered at all, because an unverifiable claim about the release you are replacing is worse than no claim. Fixed in v0.5 (tooling; the brief's prose corrected in place, no redeploy required).
  • Every archive size in the release chain was computed as bytes/1048576 and labelled MB. That is MiB; the two differ by 4.6 per cent and the gap grows with every release. An operator checking a 37.7 MB upload in decimal megabytes sees 39.5 and has no way to tell a unit error from a truncated transfer. The mislabel ran from v0.3.1 through v0.5. Four packaging scripts now print MiB with the byte count beside it, and the brief checker fails on any bare MB in a document describing this chain. Fixed in v0.5 (tooling; the brief's prose corrected in place, no redeploy required).
  • Fixing the unit label introduced a worse defect in the same edit: the byte counts typed beside the new MiB labels were invented rather than measured, and three of the four were wrong. A byte count is the one size figure that needs no convention to interpret, which is precisely why a wrong one is more dangerous than a vague one — "~13.6 MiB" invites a check and "14,280,563 bytes" does not. Caught before shipping, by writing the check before trusting the correction: the brief checker now matches every size figure against the actual size of the file it names, requires the MiB and byte halves to agree, and rejects a bare binary figure for a named artifact unless it is marked approximate. Fixed in v0.5 (caught pre-ship by the check added for it).

A corpus that grows faster than its own descriptions will falsify them. Everything that broke in this release broke that way: the slot map, the site index, the shard set, the essay's own superlatives. The answer is the same one v0.4 reached and this release had to apply four more times — derive it at build time, or gate it against its source, but never write it down twice. The three documentation defects in this release point at the one place the rule was not yet applied: the deploy brief, the last document in the chain still written by hand. It is now gated against the artifact it describes — file counts against both manifests, sizes against the bytes on disk — which is the weakest of the three fixes and the only one available for prose.

v0.4 — One corpus, an honest citation record, and the first synthesis products

11 September 2026

The structural release. The second copy of the corpus is deleted — brief content now lives in exactly one place, as data — and the citation record is rebuilt from the current corpus with its verification state published rather than implied. Three synthesis products ship: the Constraint Atlas, the Decisive Experiments Index, and State of the Frontier 2026, alongside this change record itself.

  • Architecture. The generator's embedded copy of all 212 briefs — 29,479 lines — is deleted; both builds now read the same per-brief data files. Proven byte-identical before and after by tree hash, which was the parity checker's final job before its retirement.
  • Correction. The citation record was stale: derived once and never re-derived while the deepening rounds changed what the corpus cites. Rebuilt from the current corpus — 5,389 sources, up from 4,614 — with a ledger accounting for every prior id: 4,535 kept, 79 moved with redirects at their old URLs, none lost.
  • Correction. A merge defect found during the rebuild: author styling on 'et al.' made five unrelated 2026 papers fold into one record. Fixed in the corpus (53 reading-list entries de-styled) and at the mechanism (the title extractor now skips degenerate titles), and the fix is negative-controlled.
  • Verification. The citation gate gains a ninth check — shard bijection: every source the corpus cites has a record page, every record page is cited by at least one brief, and the search index and redirect map agree with both. Negative-controlled in all four failure directions. This is the check whose absence let the record go stale.
  • Verification. A depth gate now blocks any release that loses a flagged claim or lets a deepened brief regress below its floors — the mechanical form of the standing directive that the depth of content is the objective.
  • Content. Verification honesty: the citation index now states plainly how many sources have had their links re-checked live, rather than leaving the number implied. At this release that is 387 of 5,389 — 7.2%. Publishing an unflattering number beats implying a flattering one.
  • Synthesis. Constraint Atlas: the 496 non-research constraints named across 164 workback plans, derived from the corpus at every build so it cannot go stale. Its headline: 55% of what blocks the frontier is institutional, against 12% that is missing science.
  • Synthesis. Decisive Experiments Index: for each of 212 briefs, the one result the brief says would most change its assessment, quoted verbatim and machine-checked against the brief. Its headline: 173 of the decisive tests are unscheduled — possible, and unfunded.
  • Synthesis. State of the Frontier 2026: the first annual synthesis essay, written from the corpus and its derived measurements.
  • Synthesis. This change record: revisions become a first-class entity, so what changed — including what was found broken — is published rather than buried in build tooling.

Every defect this cycle had one shape: something derived was written down, and then drifted from what it was derived from. v0.4's answer is structural — delete the second copy where possible, and where a derived artifact must exist, gate it against its source.

v0.3.2 — The browser becomes a gate

September 2026

A fix release for the two v0.3.1 production defects, shipped with the check that would have caught them: a headless-browser gate that loads the site's pages, fails on any uncaught error, and types real queries into the search box asserting real results. Packaging now refuses a build that does not work in a browser.

  • Correction. Search restored. Three plausible fixes failed before the working one; the fix that held moves the search import to a native inline script the build tool cannot rewrite.
  • Correction. The brief-page script error fixed at the mechanism, not just the instance: a build-time check now refuses TypeScript syntax in any inline script, alongside the runtime fix.
  • Verification. Browser-level verification added as a packaging precondition: twelve pages loaded in a headless browser, zero uncaught errors tolerated, three search queries typed and asserted against their results. Verified against the broken v0.3.1 build, which it fails in seven places.
  • Correction. The deploy runbook's rollback procedure was found to be a no-op — its search-and-replace pattern could never match the live config it was meant to roll back, because the runbook was itself produced by find-and-replace over its predecessor. Rewritten version-agnostic, with a guard that fails loudly, and a checker added that validates every future deploy brief against the release it ships with.

Found broken

  • The deploy brief shipped with four documentation defects, all found by the deploy agent: the rollback no-op, a gate count that disagreed with its own table, a wrong expected-root value, and a hard-coded browser path that fails on any other machine. Fixed in v0.3.2 (revised brief, same release).

A check you haven't run is a guess with authority. The browser gate exists because five passing gates measured that files were delivered, not that they worked; the brief checker exists because the runbook was derived from its predecessor and drifted.

v0.3.1 — The Astro migration ships — with two defects the gates never saw

September 2026

The site's shipped form moved from a hand-assembled page tree to an Astro build: 306 pages, a sharded citation record with a page per source, and full-text search. The content itself carried the deepening round: 28 briefs in Categories V and VIII rewritten from their research packs. Two defects reached production and were found by the deploy agent, not by the gates.

  • Content. 28 briefs deepened from their research packs — every Category V energy brief and 14 Category VIII governance briefs — under the standing directive that depth of content, not word-count parity, is the objective. The packs held 136,311 words of flag-tagged research of which as little as 2% had reached some published briefs.
  • Content. During the deepening, 8 rewrites were found to have dropped speculative- and handwave-flagged claims while adding evidence. All were restored: losing a flagged claim is a regression, because the uncertainty is the product.
  • Architecture. Citation record sharded: one addressable page per source replaces the single citations-index monolith (6.45 MB, ~60,000 DOM nodes) that every reader downloaded in full and no brief could link into.
  • Architecture. Site search added (static index, no server, no query logging), with a no-JavaScript path preserved for every piece of core content.

Found broken

  • Search was dead on arrival: the build tool wrapped the search library's dynamic import in a preload helper and left its placeholder token unreplaced, so the search box accepted typing and never returned a result — while every search asset served a clean 200 and the release's asset gate passed. The gates measured delivery, not function. Fixed in v0.3.2.
  • All 212 briefs threw a SyntaxError in the browser: TypeScript syntax in an inline script that is passed through verbatim, never transpiled. Every page rendered, so no gate noticed that none of them ran. Fixed in v0.3.2.

Five gates passed on a release whose two most visible interactive features did not work. Both defects share one shape: something derived (the packaged artifact) drifted from what it was derived from (a build that works in a browser), and nothing compared the two.

The record begins at v0.3.1 because that is where release records were kept contemporaneously; the cycles before it exist in build tooling and internal reports, and reconstructing them here would present memory as record. Version v1.1.0 · September 2026.