draft-imran-systems-and-arguments-45Internet-Draft
← draft-imran-systems-and-arguments-45
Off the Bit Section 7, Errata and Retractions Category: Informational Count: 50 entries
M. Imran Feed: /errata.xml

Errata and Retractions

Subscribe to this one if you want to know whether I can be trusted, rather than what I think this week.
This section is load bearing. A body of opinion with no retraction log records positions rather than learning. Corrections are credited to the person who sent them.

7.48. The front page and every other page published different identifiers for the same document

2026-09-10 · self-correction

This document names itself draft-imran-systems-and-arguments-NN, where NN is the number of Appendix A rows minus one. The front page computed that from Appendix A and published -41. Every other page on the site published -04. Both were live at the same time, and had been for weeks.

The cause is one line in the shared layout: const DOC_HISTORY = 5, under a comment reading “Appendix A rows; keep in step with index.astro”. It was never kept in step. Appendix A grows by a row every time anything here is corrected, which is roughly weekly, so the gap widened with every erratum published. The comment named the maintenance burden and did not remove it, which is the same shape as erratum 7.9: a duplicate with a note asking someone to remember.

src/lib/draft.ts says of the suffix that there is “nothing to maintain and nothing that can drift, because it is computed”. That was true of the function and untrue of one of its two callers.

Every surface computes it from history.length now. scripts/check-ident.mjs collects every draft identifier across the built site, including the feeds, llms.txt, the machine-readable views and the vCard, and fails if more than one distinct value is published. Proven by reverting a single page to -04, which fails it.

The identifier is -42 as of this entry. Readers who cited a page by its masthead identifier before today cited a number that was wrong on every page except the front one, and there is no way to repair a citation already made. The URLs are unchanged, which is the property that was designed to survive exactly this.

7.47. The role is CTO at Betopia Limited, and five of the eight places still held their own copy

2026-09-10 · correction

The author is CTO at Betopia Limited. Until today this document called him Head of Engineering and Delivery, which was correct when it was written and is not now. The previous title stays in Appendix A and in erratum 7.9 rather than being overwritten, because a role that changes quietly is the same defect as a claim that changes quietly.

The more useful correction is underneath it. Erratum 7.9 found the role wrong in eight places at once and closed by correcting all eight. Correcting eight copies is not the same as having one. Three of them were wired to read from src/lib/contact.ts when that file was created on 2026-09-03, and the other five were left holding the string: the masthead, the meta description, the Open Graph image alt text, the Twitter image alt text, llms.txt, and the text baked into the share card. So the next role change would have reopened 7.9 exactly, and this is the change that found out.

All eight read from one source now. scripts/check-role.mjs fails the build if the current role, the organisation, or either retired title appears anywhere outside that source, the errata and the working documents. It was proven both ways before it was trusted: reintroducing the old string into llms.txt fails it, and hardcoding the current one back into the masthead fails it.

The card gained what an address book actually needs. ORG, so the employer is a field rather than something folded into a title. KIND, PRODID, and a stable UID, which is the one that matters: without it a second download is a second contact instead of an update, and every phone that ever took this card would keep a duplicate. And TEL, as an E.164 tel: URI rather than free text.

The number is in the card and not in the page. That is the owner’s decision, taken today. A number in a downloadable card is reachable by anyone who wants it; a number in the markup is reachable by everyone who scrapes it. Section 14 says the card carries one and does not print it. scripts/check-vcard.mjs asserts the negative: the digits appear in zero of the built pages, and the check was proven by putting them in one.

There is a QR code at /scan/ carrying the card itself rather than a link to it, so a phone can add the entry with no network. It is encoded at build time and drawn as vector paths in the page, because an image would be a second request, a hosted generator would be a third party, and a client-side library would be JavaScript. scripts/check-qr.mjs renders the page in a browser and decodes the code the way a phone would, in both colour schemes, then compares it field by field against the download.

7.49. The phone row on the card was labelled VALUE

2026-09-10 · correction

The card published this morning wrote the number as TEL;TYPE="cell,voice,text";VALUE=uri:tel:..., which is valid RFC 6350 and rendered in macOS Contacts as a row labelled VALUE rather than mobile. The owner opened the card and saw it, which is the only reason this was found: every check passed, because every check asserted the syntax and none of them asserted what an address book would do with it.

That parser does not accept a quoted comma list in TYPE, and falls back to naming the last parameter it saw. The row is now TEL;VALUE=uri;TYPE=cell:tel:..., with one unquoted type and TYPE in the final position, which addresses both possibilities at once. Two assertions were added rather than one: no quoted list, and TYPE last. Both were proven by restoring the form that shipped.

The same reading found a second thing. Two bare URL lines both showed as “home page”, because that is what an address book calls a URL it has no name for. The card now carries four labelled touchpoints, grouped with the itemN. prefix from section 3.3 and named with the X-ABLabel extension: Website, Code, Papers, CV. A client that does not know the extension sees four URL properties and ignores the labels.

No handle on any feed-ranked platform is on the card. Section 14 says those exist so people can reach him and are not somewhere he publishes, and a contact card is not the place to quietly reverse that.

The general point is the one worth keeping. check-vcard.mjs had eighteen assertions passing over a card whose most important row displayed the wrong word. A card is not correct because it parses. It is correct when the thing that reads it shows what it should, and nothing here was looking at that.

7.50. The phone row was still labelled VALUE, and 7.49 said it was fixed

2026-09-10 · self-correction

Erratum 7.49, published this morning, said the phone row on the contact card had been corrected from TEL;TYPE="cell,voice,text";VALUE=uri:tel:... to TEL;VALUE=uri;TYPE=cell:tel:..., and that this addressed both possible causes at once. The owner downloaded the corrected card. It read VALUE again, with tel: printed as part of the number, exactly as before.

The diagnosis in 7.49 was wrong. It blamed the quoted comma list in TYPE and the position of the parameter. Neither mattered. macOS Contacts does not read the VALUE parameter on TEL at all: it names the row after the parameter it does not understand and prints the URI scheme as though it were digits. EMAIL and ADR on the same card carry TYPE=work and have always displayed correctly, which was visible in the first screenshot and should have settled it. TYPE was never the problem.

The row is now TEL;TYPE=cell: followed by the number in plain E.164. No VALUE parameter and no tel: scheme. The digits are not written here, because they are published in the card and in the code at /scan/ and deliberately not in this document’s markup, and check-vcard.mjs asserts that across every built page. It caught this paragraph.

This departs from a SHOULD in the specification, on purpose. RFC 6350 section 6.4.1 says the value is free-form text by default, for backward compatibility with vCard 3, and SHOULD be reset to a URI. The URI form is the better-specified one and it is the one a real address book will not display. A specification that a reader’s software refuses to follow is not one this card gets to insist on, and the departure is written into the source next to the line rather than left for somebody to rediscover.

Four assertions now cover the row, and each one was proven against both of the forms that shipped broken: no VALUE parameter, the value is not a URI, the number is E.164, and TYPE is not a quoted list.

What this pair of errata is really about. 7.49 already said that a card is not correct because it parses, and that nothing here was checking what a reader would see. Then it shipped a fix that had also never been looked at in the thing that displays it, and claimed the cause with more confidence than the evidence carried. Twice in one day, the check confirmed the syntax and the screenshot was the only witness. The QR at /scan/ carried the same defect both times, because it is generated from the same source, and it is corrected here with it.

7.44. The zero-third-party-requests check was counting hyperlinks

2026-09-05 · self-correction

The budget named “off-origin resource references” matched src= or href= on any element in any page. An anchor pointing at a vendor’s website counted against it. A hyperlink is not a request: nothing is fetched until a reader clicks it and leaves.

The check had been patched around rather than fixed. Three hostnames sat in an allow-list so that rel="license" and ordinary citations would not fail the build, and the comment above them said in as many words that neither was a request the browser makes to render the page. The workaround was correct about the problem and left the measurement wrong.

Two real gaps followed from it. Anything served from github.com or creativecommons.org was exempt by hostname, so a tracking pixel or a script from either would have passed. And because the pattern required an HTML attribute, srcset, poster, <object data> and url() inside the inlined stylesheet were invisible to it. A webfont or a background image loaded from a CDN in CSS would not have been seen at all, on a site whose CSS is inlined into every page.

The check now matches the attributes that actually cause a fetch while the page renders, plus url() in the inlined CSS, and the hostname allow-list is gone. Six probe classes were injected into a built page and each one fails it: a stylesheet from Google Fonts, a script from a CDN, an <img> pixel, a two-URL srcset, an <iframe> embed, and a CSS url(). The clean build passes. Outbound links are now counted and reported without gating, so their growth stays visible: there are 608, and 591 of them are the tools catalogue.

This is the eighth time a check here was confirming something true and adjacent to what it claimed to measure. The others are 7.6, 7.19, 7.28, 7.32, 7.38, 7.39 and 7.42. The pattern is consistent enough to name: the check was written from the shape of the markup rather than from the claim, and the claim is what a reader relies on.

7.45. 248 catalogue descriptions published with markdown left in them

2026-09-05 · correction

The tools catalogue shipped yesterday with 248 of its 591 descriptions opening on an orphaned ** and a dash, where the first word of the description should have been. Warp read that way, and so did GitHub Copilot, Cursor, Cline, Aider and 243 others.

The three source lists use two bullet forms. One is - [Name](url) - description. The other wraps the name in bold, - **[Name](url)** - description, and closes the emphasis after the link. The parser cut at the end of the link and stripped a leading separator, so on the second form it stripped nothing and kept the orphaned ** and the dash that followed it. One further row carries an italicised review link between the name and the description, which failed the same way.

The parser was tested against the shape it expected. The ingest reported 664 rows, 591 tools after merge, and zero unmapped headings, all of which were true. Nothing counted how many descriptions began with a character no description should begin with, which is a one-line assertion and would have caught every one of them before publication.

Emphasis, a further link and the separator are now stripped in a loop until none of them is leading. Re-ingested against the same three commits rather than against today’s HEAD, so the parse is the only thing that changed: entry counts are identical at 95, 272 and 297. Residue is 0 of 591, and no description is empty.

The --pin flag that made that possible is new. Re-reading a fixed commit is what lets a parser fix be reviewed as a parser fix instead of arriving mixed into a week of other people’s edits.

Two changes ship alongside this and neither is a correction. The per-tool list of which source lists carry a tool is removed from every tool page: the attribution the licences require stays, in the line naming the list each description is quoted from. And sections are no longer capped at 66 characters, which had left every tools page with rules running the full measure above content stopping two-thirds of the way across.

7.46. The catalogue's descriptions are written here now, and 7.45 is out of date because of it

2026-09-05 · correction

Every description in the tools catalogue was a quotation. 591 of them, taken from public directories, with the attribution those licences require printed on each page. Erratum 7.45, published this morning, said that attribution stays. It does not. All 591 descriptions have been replaced with text written for this site, and the per-tool source block is gone, so the sentence in 7.45 describes a page that no longer exists.

What replaced them came from the tools themselves. scripts/fetch-tools.mjs requested all 591 homepages and recorded what each one says about itself. 539 answered a plain request. 52 refused, so scripts/reprobe-tools.mjs asked those again in a real browser, one at a time, and 19 more answered. Both outputs are committed. Nothing reaches the network at build time.

Removing the quotations removes the licence obligation with them, because original text carries no attribution requirement. The catalogue no longer names or links the directories the list of names was first gathered from. One sentence remains saying the names came from public directories, without naming them, because a list that will not say where it started is worse than one that does.

The check found things a directory cannot. 33 tools are unreachable: nine dead domains, ten 404s, three expired or broken certificates, three timeouts. Another 19 refuse automated requests and are probably fine, and each says which of those it is. 143 answered from an address other than the one listed. Some are ordinary redirects. Continue has been acquired by Cursor and says so on its own page. Windsurf and Codeium both now serve Devin Desktop. Bearer now serves Cycode, Highlight.io serves LaunchDarkly, Jamsocket is joining Modal, Fig returns a server error and its work continues inside Amazon Q. One entry, listed as an HTML-to-PDF API, now serves an online gambling site; that page says so rather than linking to it as a tool.

A published URL broke and was caught before deploy. Pages were generated for the 126 tools that had something beyond a one-line quote. When the quotes became written descriptions, the condition that selected those 126 went with them, and the rebuild dropped pages that were already live. /tools/warp/ had been published and returned 404. Every tool now has a page, all 591 of them, because a generation rule that can narrow is a rule that can break an address. Verified: none of the 126 previously published paths is missing.

The star is now a tooltip and nothing else. It was printing a paragraph explaining itself under a heading that read “Used here”, which described the star rather than the tool. The explanation is the star’s own accessible name, and the heading on a tool page now introduces what the tool is sold for.

7.31. The published code profile changed, and two-column tables were labelling themselves twice

2026-09-04 · correction

Section 14 published github.com/mosimran as the code address. It now publishes github.com/johnefemer, at the owner’s direction.

Both accounts resolve, so this changes which profile the document points a reader at rather than repairing a dead link. The value moved in one place, src/lib/contact.ts, and the page, the JSON-LD and /contact.vcf all followed, which is what that file was created for the day before. scripts/check-vcard.mjs confirmed the three still agree.

Separately, every two-column table on this site was labelling itself twice on a phone.

The stacked layout puts each cell on its own line and prefixes it with its column header, which is right when a bare value would be ambiguous: “STATE: PRODUCTION” needs the word. In a two-column table the first cell is already the label, so the second inherited a prefix that repeated the column header against a value it did not describe. Section 14 rendered as a heading reading Name followed by “ADDRESS: Mosthofa Imran”, which is not an address.

Fifteen tables were affected, including the colophon, the errata index, Appendix A and the conventions list. One selector fixes all of them: td.hd + td:last-child suppresses the prefix only where the row has two cells and the first is the heading. Three- and four-column tables keep theirs, verified cell by cell rather than assumed: Section 3 still reads “Section:”, “Result:”, “State:”, and section 6.4 still reads “Retention:” and “Purpose:”.

The defect was in the responsive table rules from the day they were written, and it was visible on every phone that ever loaded this document.

7.32. The document did not print as a specification, and the claim that it did was never checked

2026-09-04 · self-correction

Appendix B has said since publication that this document “renders on a slow connection and prints as a passable specification”. The first half was checked yesterday and was false on phones, which is erratum 7.28. The second half had never been checked at all, and was also false.

Printed to A4, every table came out as stacked phone cards: a column of “RESULT: no figures supplied” and “STATE: PRODUCTION” lines with no header row, no columns and no alignment. Section headings drew a full-width rule across the paper, bleeding past the text block on both sides.

The cause is one missing word, repeated five times. Every width-based media query in the stylesheet was written as a bare @media (max-width: N). A printed A4 page is about 673 pixels of content inside its margins, which is narrower than every breakpoint here, so the entire phone layout applied to paper. The sticky headings shipped yesterday made it worse: they were written for a small screen and a sheet of paper counts as one.

They are all @media screen and (max-width: N) now. The print block additionally lets the result column wrap, keeps table rows off page breaks, and stops a heading being orphaned at the foot of a page.

The document is eighteen pages instead of twenty-four, and the tables have columns.

The check written to catch this did not catch it, and that is the fourth time this week. It emulated print media at a desktop viewport, where a max-width: 760px query never matches, so every assertion passed against a page that printed wrong. It now asserts two things: that no bare width query exists in the stylesheet at all, which is the real invariant, and that tables still print as tables when the viewport is the width of a printed page.

The pattern each time was the same. A check measured something true and adjacent to the thing it claimed to measure: dist/ instead of the edge (7.6), one front-matter field instead of all of them (7.19), three phone widths instead of both sides of a breakpoint (7.28), and now emulated media without the width that makes the media matter.

7.33. The home page animates, and the first version of it hid twelve headings

2026-09-04 · self-correction

Section headings on the index now settle upward as they enter the viewport. It is pure CSS, driven by animation-timeline: view(), and carries no JavaScript, for the same reason the reading rule added on 2026-09-03 carries none.

The first version faded them in from opacity: 0, and that was wrong in a way worth recording. animation-fill-mode: both holds the opening frame until an element enters the view range, so anything a client never scrolls to stays in it. Loaded into a tall viewport with no scrolling, which is the shape of a visit by something that renders once and does not read, twelve of the twenty headings were fully transparent: every section from 6 to 14, both appendices and the signature block.

The requirement was an animation that does not affect content visibility, and the obvious implementation failed it immediately. The fix is that the animation moves content and never hides it: the keyframe sets a transform and nothing else, so the text is rendered, selectable, searchable and readable at every point, and the only thing that changes is where it sits. scripts/check-visible.mjs asserts it across eight pages on every build, and was proven by putting the opacity back and watching it fail.

The keyframes also declare only a from. There is no to, so the animation ends at the element’s own base state rather than at one this stylesheet invented, and a browser with no support for scroll-driven animations gets the finished layout because that layout is all it ever had.

Two sections moved to make room, at the owner’s direction.

Section 7 was a full errata table on the index and a second copy of /errata/, which carries all thirty-two entries with their own anchors. It is a pointer now. A fact typed twice is the defect this site keeps finding in itself.

Sections 9.2 and 9.3 moved to /machine/. Feeds stay on the index at 9.1, because a feed URL is something a reader acts on, while what a crawler is told and how a signature verifies are reference material.

The anchors did not move. A fragment is never sent to a server, so no redirect can rescue /#s92. The only way to keep a published URL working is to keep an element carrying that id on the page it was published on, and #s7, #s9, #s91, #s92 and #s93 all still resolve on the index and land on the pointer that says where the content went.

The index is 52673 bytes against its 60000 cap, from 59984 before this. That is the first real headroom it has had, after seven separate trims in two days.

7.34. Implementation 3.9 was written about the wrong thing

2026-09-04 · correction

Note 3.9 was published earlier today as “One representation, every view”, about a document model from which each view is derived by pure function. That is a real and defensible piece of the system, and it is not the interesting one.

The owner corrected it the same day: the system runs as an MCP server and is a hands-free API manager, with recipes and remote execution. The note is rewritten around that.

What the earlier version got wrong was scope rather than fact. It described the editor and treated the agent surface as one consumer among six. In the system as built, the agent surface is the product and the representation is what makes it possible. Writing the foundation and calling it the achievement is a specific kind of error: the thing that is most satisfying to describe is rarely the thing that is hardest to get right.

The subject is now the constraint that shapes the whole design. An agent cannot be given one tool per endpoint, because a real API has several hundred and every one of them costs context before the model has read the question. So the tool surface is a fixed handful, the specification is read at request time rather than at connection time, and the API is discovered rather than enumerated.

Five failure modes replace the previous five, all specific to that shape. The one worth naming here is fixed and should never have been possible: clients that JSON-stringify structured arguments, which stores a string where a document subtree belongs and leaves the document unreachable by pointer navigation, silently and across a save.

The URL does not change, as it does not here. The earlier title and summary are quoted above rather than deleted.

No figures were published in either version, and section 4 of the new one names the four that would settle whether the design works. The fourth, whether the agent’s stated intent matched what its request actually did, is the one that matters and needs a person to read both sides.

7.35. The feed dated every implementation note to January, and one to 2022

2026-09-04 · self-correction

/feed.xml publishes position papers and implementation notes together. For the notes it used the wrong date, and it had done so since implementation notes were added to it.

An Atom entry’s updated element means when that entry last changed. The feed was filling it from since, which is when the system described by the note started running, and falling back to a hardcoded 2026-01-01 for any note without one.

Nine implementation notes were written or rewritten between 2 and 4 September. Every one of them went out to subscribers dated 1 January, except 3.1, which has a real since and went out dated 2022. A reader sorts on that element. The entire contents of Section 3, which is most of what this site produced this week, arrived at the bottom of the list or was never surfaced as new at all.

The feed’s own updated is derived from its newest entry, so it also sat at 1 September while the notes underneath it changed daily.

Implementation notes now carry a revised date, and it is required. A note cannot be added without one, and there is no fallback constant to be silently wrong: a missing date fails the build in the same way a paper without retirement conditions does. The dates were taken from git rather than chosen, because git is the record of when each file actually changed.

since stays where it is. It is a real fact about a system and a useless one about a document.

A new way to be wrong comes with the fix. A note can be edited without its revised date being bumped, which would hide the change from the feed just as effectively. scripts/check-revised.mjs reports every note whose file has changed since the date it declares.

It reports rather than gates, and it took a failed build to work out why. The first version failed the build on divergence, and it failed on the commit that created it: adding a revised field to nine files changed all nine files, so every date was stale against git the instant it was written. The error underneath is that revised means the date the content last meaningfully changed, and git records the date the file last changed for any reason, including adding a field or fixing a typo. Gating on git asserts that every edit is a revision. Only a person can tell a typo from a revision, so the script prints the divergence and lets them.

That is the second measurement error in this entry and the fifth this week, and it is the same one every time: something true was measured and reported as though it answered a different question.

One other thing reported here was my error rather than the site’s. While auditing the feeds I recorded that both were missing a rel="self" link. Both have one and always did; the query I used treats an XML element with no children as absent. The feeds were correct and the measurement was not.

7.36. The site thanked three people who do not exist, and one of them for an event it had already withdrawn

2026-09-04 · self-correction

Section 12 thanked an operations engineer in Chattogram for taking a call at 02:40 during a ClickHouse cutover. Errata 7.1 and 7.4 credited corrections to A. Rahman, K. Osei and S. Datta.

None of those people sent anything, and the call at 02:40 did not happen. All five attributions came from the handoff prototype, and all three have been tracked in the placeholder ledger since 2026-08-13, as P13, P01 and P02.

There is a worse version of it than the fabrication alone. On 2026-09-03 erratum 7.19 removed a figure from note 3.4 that described “one rollback executed cleanly at 02:40”, on the grounds that it was the prototype’s invention. The same invented night stayed on the front page as a thank-you. Section 3 withdrew the event and Section 12 went on being grateful for it, for a day, in a document whose entire argument is that a claim and its retraction travel together.

Why this is the worst thing found on this site. A fabricated metric misrepresents a system. A fabricated credit misrepresents a person: it puts a stranger’s name against work they did not do and gratitude they did not earn, and it does so in the section specifically built to record what the author got wrong. Errata 7.1 and 7.4 were the site’s evidence that it takes correction seriously, and they were furniture.

Section 12 says what is true instead. No reader has yet sent a correction that changed anything. Every entry in Section 7 to date is the author finding his own error, which is the cheaper kind.

The credits on 7.1 and 7.4 are withdrawn rather than deleted, in the pattern erratum 7.12 set: each entry carries a notice at the top quoting the attribution it displayed and saying no such reader wrote in. Entry 7.4 additionally corrects a mislabelled axis on “Figure 3 of the ClickHouse note”, and note 3.4 has never had a figure, so the entry records a correction to something that never existed.

Three placeholder rows close with this. Nine remain, and none of the nine attributes anything to a person.

7.37. The Section 5 table on the index had not shown a new claim since launch

2026-09-04 · correction

This entry carried an invented figure and was corrected the same day. See 7.38. It said Section 5 sat "two hundred lines" further down the file. It is about fifty. The number was estimated rather than counted, in an entry about a defect that survived because nobody checked.
The short table under Section 5 was nine rows of hand-written HTML listing papers 5.1 to 5.9. Fourteen papers have been written since, and none of them ever appeared on the front page.

The intro above it said “Claims, with confidence values and revision dates” and then a link to the complete index. It did not say the table was a selection, so nine rows read as the section, and the newest thing a reader could see there was published the day the site launched.

This is the same defect erratum 7.15 recorded for Section 3 and did not generalise. That entry found the Section 3 table hand-written and contradicting a correction, generated it from the collection, and observed that the shape is always a fact typed twice. Section 5 sat about fifty lines further down the same file with the same problem, and the fix stopped at the section that had gone wrong.

It is generated now, from the same collection the complete index reads, showing the nine most recently revised of however many exist. The intro says both numbers, so the table is visibly a window rather than the whole. Adding a paper no longer requires editing the index, which is what let it drift in the first place.

Nothing on the table disagreed with the collection while it stood, checked before it was replaced: nine rows, nine matching titles, no stale confidence value. It was wrong by omission for three weeks rather than wrong on its face, which is the harder kind to notice and the reason it lasted.

7.38. An erratum about not checking contained a figure I did not check

2026-09-04 · self-correction

Erratum 7.37 recorded that the Section 5 table on the index had gone three weeks without showing a new claim, and that the same defect had been found and fixed in Section 3 without the lesson being carried across the file. In describing that, it said Section 5 sat “two hundred lines” further down.

It is about fifty. I estimated a number that sounded right and published it without counting, in an entry whose subject is a defect that survived because nobody checked.

The figure did no work and that is not a defence. Nothing in 7.37 depends on the distance; the argument is that the two tables were in the same file and only one was fixed, and fifty lines makes that case better than two hundred does. The number was decoration, which is precisely the category this site refuses. Note 3.2’s figures did no work either, and they were removed rather than corrected.

It is a rhetorical figure, which is the kind that gets published. A latency number invites the question of how it was obtained. “Two hundred lines further down” reads as scene-setting and passes without anybody, including me, treating it as a measurement. The site’s rule does not have an exemption for numbers used as adjectives, and if it did, that is where every invented figure would move.

The published sentence is corrected in place and 7.37 carries a notice quoting what it said, in the pattern erratum 7.12 set for 7.11. The verified figure is that the Section 3 table is at line 219 of the index and the Section 5 table at line 269, counted rather than recalled.

This is the sixth measurement error recorded here this week and the first one that was not a check reporting the wrong thing. The other five measured something true and adjacent. This one measured nothing at all.

7.39. Every diagram on this site was broken, and four checks looked straight at them

2026-09-04 · self-correction

Fifteen pages carry a drawn figure. All fifteen were broken, from the day each was written until today, and the owner found them by looking at two of them.

A blank line ends a raw HTML block in Markdown. Every diagram here was written with blank lines between its logical groups, for the same reason code is written with them, so in each case the browser received the first group as a drawing and everything after the first blank line as body text. What the reader saw was a small box floating in a large empty frame, followed by paragraphs of stage directions in a monospace face: “FIXED CAPABILITIES, THE SAME FOR EVERY API find an operation read its schema run it”.

The checks did not see it, and the reason is worth recording. The page still had an <svg> element, so nothing that counted them noticed. Accessibility passed, because the leaked labels became real text with real contrast. The overflow check passed, because wrapped prose does not overflow. The print check passed. The visibility check passed, because nothing was hidden; it was all visible and in the wrong place. Four checks, all green, all measuring something true about a page that was visibly wrong to anybody who opened it.

That is the sixth instance this week of a check reporting something true and adjacent to the claim, and the largest by reach. The previous five were caught by reading a log or a diff. This one needed eyes on the page.

Fixed in all fifteen files, 111 blank lines removed, with no change to any drawing: the coordinates, labels and shapes are exactly as they were, and the only difference is that they now reach the browser as one block. npm run impl now reports any diagram containing a blank line, which is the precise mechanical statement of the defect, and it was proven by reintroducing one.

Repairing it exposed a second defect the breakage had been hiding. With the drawings back at full width, two of them are wider than the column and their container scrolls sideways. That container had no keyboard access, so a reader using a keyboard could see the left third of the figure and had no way to reach the rest. Accessibility testing had reported zero errors on those pages for weeks, correctly, because a diagram that never rendered never scrolled. The seventeen figures are focusable and labelled now.

The lesson is not about Markdown. It is that every check here reads the artifact and none of them looks at the result. A drawing is the one thing on this site whose correctness is not expressible as a property of the file, and it went unexamined for exactly that reason. The nearest honest guard is the one added today, which detects the specific cause rather than the class, and the class still has no coverage.

7.41. A proprietary model was listed in a stack whose whole claim is that the weights are yours

2026-09-04 · correction

The stack on note 3.2 listed GPT-4o alongside Ollama and Qwen. It is not open weight, cannot be self-hosted, and does not belong in a list whose point is that the model runs on hardware the tenant controls.

The name came from erratum 7.14, which recorded the owner supplying the model choices on 2026-09-03, and it was written down without anybody asking whether one of the three could be installed. The note’s own opening argument is that a model you can install is a model whose weights, prompts and logs never leave a room you control. A hosted API sitting in the same list contradicts the sentence three paragraphs below it, and it stood for a day.

The stack is open weight only. The owner corrected it.

The architecture keeps the slot, and the note now says the slot is empty here. A gateway of this kind is built so that reaching an external model is a per-tenant policy decision rather than a deployment variable, and that mechanism is worth describing whether or not anything is on the other side of it. The same policy that would gate an external model is what proves a sovereign tenant cannot reach one by any configuration mistake. The diagram labels that backend as unused rather than as a hosted frontier model.

Note 3.8 described routing work with no residency requirement to a commercial API. That is a property of the reference design for a mixed estate, and it now says so, because two notes about the same subject implying different things about the same deployment is the drift this site keeps finding in itself.

What this was, in the site’s own terms. Not an invented figure and not a fabricated credit. It is a claim that contradicted a claim on the same page, published because the list was treated as a list rather than as an argument. Every item in a stack is an assertion about what the system is.

7.42. The beacon still collected nothing, and 7.25 said it was fixed

2026-09-04 · self-correction

Erratum 7.25 recorded that Cloudflare Web Analytics had been enabled for thirteen months while the Content-Security-Policy refused to run it, so the request was paid for on every page load and no data was ever collected. It opened script-src and connect-src to https://static.cloudflareinsights.com and said the beacon works now.

It did not work. The script loaded and executed. Every report it tried to send was refused.

The host a beacon loads from is not the host it reports to. The script comes from the content delivery network and posts its measurement to /cdn-cgi/rum on this origin, which the edge intercepts. default-src 'none' governs same-origin connections as strictly as it governs anybody else’s, so pinning connect-src to the delivery network left the one connection that mattered blocked. The policy now says connect-src 'self'.

This was checked by reasoning and not by looking. The verification for 7.25 confirmed the policy contained the host and that the page still passed every gate. Opening a browser, watching the network and reading the console takes under a minute and produces the actual answer, which was a refusal notice naming a URL that appears nowhere in the policy.

That is the seventh time this week a claim on this site was confirmed against something adjacent to it. The previous six were checks measuring the wrong artifact. This one had no check at all: I asserted an outcome, ran the suite that could not see it, and published.

The disclosure in section 10 and section 6.6 stands and was always accurate. A third-party script is served on every page and named there. What was wrong is the sentence claiming it functions, which is corrected by this entry rather than by quietly widening a policy.

The narrower reading is worth keeping: connect-src 'self' permits this origin and nothing else, script-src still names one external host and the page’s own hashes, and no wildcard was introduced to make a problem go away.

7.40. Paper 5.24 was retitled, because the first title threw away the idea

2026-09-04 · correction

Paper 5.24 was published this morning as “A Capability Lives in Three Places and Nothing Checks They Agree”. It is now “A Capability Has Three Halves”.

The source it was drawn from used the phrase “a tool has three halves”, and the first title replaced it with a description of the same fact. Three halves is not a description. It is the argument compressed into three words: the parts do not add up to one thing, and a reader who notices the arithmetic is wrong has already understood why the design fails. The slug has said three-halves since publication, which is the clearest possible evidence that the good title was known and not used.

Both new papers gained a figure, and the reason is a pattern in this section rather than a preference. Every paper here over about seventeen hundred words carries a drawing and every paper under about eleven hundred does not. Neither of these was doing the thing the longer ones do, which is to put the shape of the argument somewhere a reader can see it in one glance.

For 5.24 the shape is the whole claim: three boxes that never join, connected by a string that no type system can follow. For 5.25 the figure carries the paper’s only actionable content, three questions that partition a stack, which had been buried in prose where a reader would have to reconstruct them to use them.

Section 3 of 5.24 was the weakest part and it was the crux. It asserted that a broken capability is worse than a missing one without saying what the cost is. The cost is partial completion: a refusal at the door leaves a system exactly as it was, and an advertised capability that fails halfway leaves three of five steps applied and a record created without its link. That paragraph is now in the paper.

A wording collision was fixed across the implementation notes. Three of them opened with “this note reports no figures” directly above a drawing labelled Figure 1. The same word was doing two jobs, one for the measurements the note declines to publish and one for the diagram beneath it. They now say “publishes no measurements”. The section heading stays as it is, and so does its anchor.

Nothing in either paper’s claim changed, and neither confidence value moved. Both are still the drafter’s at the draft tier, which is P26.

7.43. The confidence values on 5.24 and 5.25 are the author's now

2026-09-04 · correction

Papers 5.24 and 5.25 were published with confidence values of 0.70 and 0.65 chosen by the drafter, and each carried a note saying so. A confidence value on this site is the author’s own credence, and a number somebody else picked is not that.

The owner delegated the judgement, was asked again, delegated it again, and has now asked for the row closed. The values stand as his. The note on each page is removed, because it is no longer true and a caveat about authorship that the author has overridden is noise on the page rather than honesty.

Both remain at or below 0.7, so the schema still classes them as drafts and both pages say so. That is deliberate rather than left over. A credence arrived at by delegation is weaker evidence than one arrived at by thinking about the claim, and the draft tier is the honest place for it until either paper is argued with.

The retirement conditions were drafted the same way and are the more consequential half, because they say what evidence would make him withdraw each claim. They are unchanged, and they remain the thing worth disagreeing with.

P26 closes, and it closes the same way P21 did for papers 5.15 and 5.16, which is the author taking possession of a number rather than the number moving.

7.13. Implementation 3.3 was titled for a migration and carried the prototype's figures

2026-09-03 · correction

Implementation 3.3 was published as “Ingest path rewrite, PHP to Rust”, and its summary said the rewrite was “verified by replaying ninety days of production traffic through both implementations and diffing the outputs byte for byte.”

Three things were wrong with that.

The title named a migration rather than a system. What the service does is receive webhooks from other people’s platforms and guarantee they are not lost. That it is written in Rust, and that some of it replaced PHP, is an implementation fact and not the point. The note is now titled for the guarantee it provides. The URL does not change, because URLs here do not.

The verification methodology was invented. The ninety-day replay and the byte-for-byte diff came from the prototype. No such exercise is on record. The sentence is gone rather than softened, because a softened invention is still an invention.

The figures were the prototype’s. The note claimed 89% fewer nodes and a p99 of 340 ms falling to 11 ms. Neither is a measurement of this system. They are replaced by the one figure the owner supplied and stands behind: a 100 percent webhook receipt rate, against providers that retry on a non-200.

The note is now written, with its constraint, its enforced decisions, a figure, four named failure modes and a diagram. One of those failure modes is open and stays open on the page.

Two figures were removed and one was added, which is the correct direction. A note with a single defensible number is worth more than a note with three that came from somewhere else.

7.14. Implementation 3.2 did not say where its models run

2026-09-03 · correction

Implementation 3.2 described a gateway over four model backends and never said that some of those models run on hardware we own.

The omission mattered because the note opens by claiming a regulator wants every token to stay inside the bank. A gateway can route to anything; what makes that claim demonstrable is that the local backends are installed on two GPUs in a room the tenant controls, rather than reached over somebody else’s API. The summary and the stack now say so, and the note explains why the models in those slots were chosen: they have to self-host and still support tool calling, which narrows the field considerably.

Nothing published was false. The record was incomplete in the one place where completeness was the point, which is a smaller failure than an invented figure and the same kind of failure.

The rest of 3.2 is still a stub against the Section 3 bar: no diagram, no constraint section, and its figures do not yet separate measurements from design targets the way 3.1 and 3.3 do. That is tracked at P09 and is not fixed here.

7.15. The front page contradicted erratum 7.13 while 7.13 was published

2026-09-03 · self-correction

Erratum 7.13 said implementation 3.3 had been retitled and that two invented figures had been removed from it. Both were true of the note. Neither was true of the front page.

The Section 3 table on the index was eight rows of hand-written HTML duplicating the implementation collection. Correcting the note did not touch it. So for the time the correction was live, /impl/ingest-rs/ said “Webhook ingestion with delivery guarantees” and produced a 100 percent receipt rate, while the front page of the same site said “Ingest path rewrite, PHP to Rust” and claimed 89 percent fewer nodes and a p99 of 340 ms falling to 11 ms.

A correction the homepage contradicts is worse than no correction, because it gives a reader two numbers and a reason to trust the wrong one.

The table is now generated from the collection. It cannot disagree with the notes again, for the same reason Appendix A cannot disagree with the masthead since 2026-09-02 and the paper count cannot disagree with the collection since T09. This is the third time the same defect has been found in a different place on this site, and the shape is always identical: a fact typed twice.

The gate did not catch it either. check-errata.mjs was extended the same day to watch implementation notes, and it correctly demanded an erratum for the retitle. It has nothing to say about a second copy of a claim sitting in a page template, because it diffs content files against their own history and a hand-written duplicate has no history to diff.

What would have caught it is a check that asserts every claim rendered about a note matches that note. That does not exist yet and is the honest thing to build next.

7.16. Implementation 3.6 is written, and its state was describing the page rather than the system

2026-09-03 · correction

Implementation 3.6 carried state: unwritten since it was added on 2026-08-31. The word was doing the wrong job.

state describes the system: whether it runs, is complete, or is retired. On 3.6 it was being used to say the note had not been written, which is a fact about this site and not about the work. The same conflation was corrected on the implementations index the same day, where notes 3.4 and 3.5 showed as complete and production with no indication that the pages behind them were stubs. Both surfaces now report the two separately.

The work described has been operating for years: platforms run under ISO 27001, GDPR and Bank Negara Malaysia RMiT requirements, carried through the security reviews banking and telecom clients run before they sign. The state now says production and the summary, stack and body say what it is.

The note still carries no figures, and now says why at length. The measurements that would matter (time to answer a client security questionnaire, the proportion of controls with pipeline-generated evidence rather than human attestation, exceptions raised per cycle) were never collected. That is a gap in the programme rather than in the write-up, and section 5 of the note says so instead of estimating. P22 stays open.

The boundary published in paper 5.15 section 8 is repeated at the top of the note and is not widened by it. Compliance work alongside partner organisations holding signed SOC 2 Type II reports is not the same as having owned such a programme, the note opens by saying so, and nothing in it claims a certification.

7.17. Implementation 3.2 published the prototype's figures, and its failure modes came from there too

2026-09-03 · correction

Implementation 3.2 has carried six figures since first publication: 3.1M calls/day, gateway overhead of 41 ms / 180 ms, redaction at 14 ms, 0 bytes of egress for air-gapped tenants, failover at 0.31% of calls, and a stated breaking point of ~11k rps. It also carried a start date of 2024-02.

Every one of them came from the handoff prototype. P09 has tracked five since 2026-08-13 and P08 tracked another. They are removed rather than replaced, which is the same decision taken for note 3.3 under erratum 7.13, and for the same reason: an invented number is not improved by being swapped for a plausible one.

Two of them asserted a verification method as well as a value. Overhead was “measured at the edge” and egress was “verified quarterly by the tenant”. Neither exercise is on record. That is the defect erratum 7.13 removed from 3.3, where the summary claimed ninety days of traffic had been replayed and diffed, and it was sitting in this note at the same time.

The failure modes came from the prototype as well, and nothing was tracking that. Sections 5.1 through 5.3 of the note (the buffered streaming response, the over-redaction of account numbers in Bengali script, the unreplicated quota state) are the prototype’s text word for word. P08 and P09 recorded the figures as placeholders and never recorded these, so a reader had no way to tell the two apart, and neither did I until the prototype was checked directly rather than trusted to have been fully catalogued.

They are marked rather than deleted. A note now sits at the top of the page saying the failure modes and the architecture below them are the prototype’s description of a gateway and not yet confirmed as the description of this one. Deleting them would remove the evidence that this site published them, and the rule here is that nothing is deleted. Replacing them would require inventing, which is the thing being corrected.

What is confirmed and stays: the problem the gateway exists to solve, the self-hosted backends running on two GPUs, and the model choices, all supplied by the owner on 2026-09-03 and recorded in erratum 7.14.

The note now reports no figures. That is a worse-looking page and a truer one, and it is tracked at P25.

7.18. Implementation 3.2 rewritten as a disclaimed reference design

2026-09-03 · correction

Erratum 7.17 removed note 3.2’s figures as the handoff prototype’s and marked its three failure modes as the prototype’s text, published as a record they never were. Marking was the right first move and a bad resting place. A page that tells the reader most of it is untrustworthy has not been corrected, it has been labelled.

The note is now written, and the way it is written is a decision worth stating plainly.

It describes the reference design rather than the deployment. The constraints, the decisions and the failure modes are the ones this class of system has, with the industry-standard answers to each. It is a solution path for a system like the one built rather than a disclosure of that system’s internals. Tenant identities, thresholds, deployment topology and incident history are deliberately absent. A box at the top of the note says so before the first section, in the same place a reader forms their assumption about what they are reading.

The five failure modes are the category’s, not a particular estate’s. Output filtering against streaming latency, redaction precision against recall and its locale weakness, quota consistency under region failover, hosted models changing beneath a stable name, and prompt injection reaching tool calls. Three of the five are marked open, because they are open in the industry and not oversights waiting to be tidied. The prototype’s three are gone; 7.17 records what they were.

No figures were added. Section 4 of the note says which measurements would matter and that they are not published, for the same reason the tenant names are not. This is the distinction the whole exercise turns on: describing an architecture at the level a reader can learn from is legitimate, and attaching a number to it that nobody measured is not, whatever the surrounding prose claims.

The two facts that are specific to this system stay specific, and both came from the owner: the self-hosted backends run on two GPUs, and the models in those slots have to self-host and still support tool calling. Erratum 7.14 recorded them.

P25 is closed. Note 3.2 clears the seven-item Section 3 bar, and it is the first note to do so without publishing a single measurement.

7.19. Implementation 3.4's summary and figures were the prototype's, and the scan that should have found them was looking in one field

2026-09-03 · correction

Note 3.4 said, since first publication: “Fourteen billion rows moved under a dual-write cutover. Zero downtime, and one rollback executed cleanly at 02:40.” It reported 14B rows and a query p95 falling from 9.4 seconds to 380 milliseconds.

All of it is the handoff prototype’s, sentence for sentence. P08 tracked the two figures. Nobody tracked the summary, which is the part a reader meets first and the part that names a specific incident at a specific time.

The provenance scan built the same day did not catch it. Erratum 7.17 added a check that reads the prototype and reports any implementation note carrying its text verbatim, written after three invented failure modes were found in note 3.2. It looked at one field: the failure-mode notes. It found 3.2’s three, reported zero everywhere else, and was believed. Extending it to summaries found two more notes immediately, in 3.4 and 3.5.

A check that inspects one field and reports a clean result reads exactly like a check that inspected everything. That is worse than no check, because the zero is persuasive.

The note is now written as a disclaimed reference design, under the rule set on 2026-09-03 and recorded in the repository’s contract: the constraint, the decisions, and the failure modes this migration has, with the standard answers to each, and a box at the top saying it is a solution path for a system like the one built rather than a disclosure of its internals.

It reports no figures, and section 4 names the four that would matter. It scores 6 of 7 against the Section 3 bar, missing that item alone, which is the honest outcome. A metric row reading “not published” was written and then removed before publication, because a row that exists to satisfy a checker is the behaviour paper 5.19 argues against and it should not survive its author noticing it.

Note 3.5 carries the same defect in its summary and is not corrected here.

7.20. Implementation 3.5 was the last note carrying the prototype's text

2026-09-03 · correction

Note 3.5 said, since first publication: “Signed, reproducible bundles carried across the gap on physical media, verified on arrival, installed by an operator who has never met us.” It reported 6 sites and 0 failed installs since 2024-09.

The summary and both figures are the handoff prototype’s. P08 tracked the figures. The summary was tracked by nothing until the provenance scan was extended to that field earlier today, which is the correction recorded in erratum 7.19.

Removed rather than replaced. The note is now written as a disclaimed reference design, under the rule recorded in the repository’s contract on 2026-09-03: the constraint, the decisions, and the failure modes this kind of delivery has, with the standard answers to each, and a box at the top saying it is a solution path for a system like the one built rather than a disclosure of its internals. Site identities and counts are the customer’s information rather than the author’s, and section 4 says so instead of publishing a number.

Two of the five failure modes are open and stay open on the page: trust distribution, because a signature is worth only the out-of-band process by which the key reached the site and rotating that key across disconnected estates has no clean answer, and the absence of telemetry, because the feedback loop runs through a person and takes weeks no matter how good the local diagnostics are.

With this note, no implementation note carries prototype text. The count reported by npm run impl is zero for the first time. That count was three this morning, and it was zero this morning too, because the scan was reading one field. The number is only worth what the check behind it inspects, and erratum 7.19 records how that was learned.

Six figures remain in P08, all of them in the index’s own Section 3 summary rows for notes 3.7 and 3.8, which are still unwritten.

7.21. Implementation 3.7 is written, and its state was describing the page rather than the system

2026-09-03 · correction

Note 3.7 carried state: unwritten while its own summary said Bangla and Banglish speech was in production. The two sentences were on the same page, disagreeing, since the note was added on 2026-09-02.

state describes the system. On 3.7 it was doing what it was doing on 3.6 before erratum 7.16: saying the page had not been written, which is a fact about this site rather than about the work. The state now reads production, which is what the summary published all along.

The note is written as a disclaimed reference design, under the rule recorded in the repository’s contract earlier today. Nothing in the stub’s description was invented and nothing in it is withdrawn: the platform, code-switched Bangla and Banglish in production, live handoff under SLA routing, telephony concurrency, and redaction on stored audio were supplied by the owner and are unchanged.

It reports no figures, and the four tracked per call keep the names the stub gave them: end to end response latency, word error rate on Bangla and code-switched audio, containment rate and escalation rate. Section 4 adds something the stub did not say. Two of those four should not be published alone even once their values exist. Containment rate without an outcome measure rewards making escalation harder, and aggregate word error rate hides the code-switching failure it most needs to expose.

The stub ended by noting that the platform’s automated quality scoring is an instance of what paper 5.19 argues about, and that the note should say how the scorer is validated against human review. That is now failure mode 5.5, marked open, with the answer stated: a standing sample re-scored by people and the agreement rate published beside the scores. A scorer nobody re-validates is an opinion with a decimal point.

7.23. The address this site gives security researchers returned 404 for three weeks

2026-09-03 · self-correction

Section 14 tells anyone who finds a flaw in the résumé gate to go to /.well-known/security.txt. That URL has returned 404 on every host since the file was added on 2026-08-13.

The file was written, committed, and built correctly. dist/.well-known/security.txt exists in every build. It never reached the deployment, because the CI step that hands the build to the deploy job is actions/upload-artifact, which excludes dot-paths unless told otherwise. dist contains exactly one dot-path and it is this file. The artifact reported 80 files from a 104-file build and nobody read the number.

Every check that could have caught it was measuring the wrong artifact. check-links.mjs resolves internal links against dist/, where the file has always been present, so it reported zero broken links throughout. check-budget.mjs reads dist/ too. The one check that reads the live origin, check-live.mjs, had a fixed list of four HTML pages and this was not among them.

That is the same defect as erratum 7.6, where Web Analytics injected a script into live responses while dist/ stayed clean and every check passed. 7.6 said the lesson was that a check on the build cannot see what the edge does. The lesson generalises further than it was applied: a check on the build also cannot see what the deployment never received.

Fixed by setting include-hidden-files: true on the artifact step. check-live.mjs now requests the file from every serving host and asserts it returns 200 with a Contact: line, so the address stays reachable rather than staying merely correct.

The consequence is worth stating plainly. For three weeks this site invited people to report vulnerabilities and published a dead address for doing it. Nobody appears to have tried, which is luck rather than mitigation. The mailbox in the same section, security@mosthofaimran.com, was always live, and it is the reason this is embarrassing rather than serious.

One Canonical: line named efemer.me, which does not resolve. The site now runs on mosthofaimran.com and imran.com.bd only, by the owner’s decision on 2026-09-03, and the file lists those two.

7.22. Implementation 3.8 is written, and Section 3 is fully written for the first time

2026-09-03 · correction

Note 3.8 carried state: unwritten while its own summary described open weight models fine tuned and served for clients in production, and its stub said GPU utilisation and cost per model were “measured in production”. The field describes the system, and it was saying the page had not been written. That is the third time the same conflation has been corrected today, after 3.6 under erratum 7.16 and 3.7 under 7.21, which is what happens when one field carries two meanings.

The note is written as a disclaimed reference design, under the rule recorded in the repository’s contract earlier today. Nothing the owner supplied is invented or withdrawn.

The stub set a test for its own replacement. It said the honest version of the page would have to say what the evaluation could not catch. That is now section 5, on its own rather than as a caveat, and the answer is uncomfortable: the promotion gate is assembled entirely out of failures already seen. Golden datasets come from incidents, regression suites from bugs that were fixed, safety probes from categories somebody thought to enumerate. A failure with no precedent in that record passes every check, reaches production, and becomes a test case afterwards, which protects the next client rather than the one who found it.

What promotion gating buys is a floor rather than a proof: no release is worse than the last one on the things that have been learned to measure. Papers 5.19 and 5.20 argue about that distinction, and this note is an instance of the problem rather than a rebuttal of it.

It reports no figures. The three the stub named are still the three that matter: GPU utilisation, cost per model, and the size of the gain over a prompted baseline. Section 4 adds that the third carries the coverage of its test set inside it, so quoting the improvement without the coverage is how a system acquires more confidence than it earned.

With this note, all eight implementations in Section 3 are written. Six months of the section existing as a table of summaries ends here. Three of the eight clear the seven-item bar; the other five miss only the figures item, in every case because no measurement has been supplied and none has been invented to fill it.

7.24. The résumé link stopped being single use

2026-09-03 · correction

Section 6 said the résumé link was single use since the gate was built. It is not any more. A token is now valid for its whole 86400 second life and every open is counted.

The reason is delivery rather than policy. A single-use link sent by email is destroyed by the mail security that scans it. Microsoft Defender Safe Links, Proofpoint and Mimecast all fetch URLs before the recipient sees them, and that fetch was a redemption. A recruiter behind corporate mail would have opened the message, clicked, and been told the link was already used, for a link no human had opened. With three requests per address per day they had two more attempts to hit the same wall.

The old design defended against forwarding and lost against a spam filter, which is the wrong trade for a document whose purpose is to be read by people at companies large enough to have one.

What replaces the guarantee. Sharing was previously detected by a token that could only be redeemed once. It is now detected by counting: a views column added in migration 0002, reported per token. A second view is the same person reopening it or somebody they were sent it by, and neither is an incident. A tenth is a different conversation. Section 6.4 carries the new row and the old one is reworded, because “issued and redeemed timestamps” no longer describes a field that can answer the question it claimed to.

redeemed_at still records the first open rather than the latest, so how long a link sat before anyone looked at it survives the change.

Section 6.6 is new, and it exists because this correction made the omission obvious. The page listed what is retained and never listed who else holds it. Cloudflare and Resend are named there now. A privacy claim that covers only your own storage is a claim about half the problem.

Nothing about the token itself weakened otherwise. It is still 24 hours, still revocable, still never guessable, still X-Robots-Tag: noindex, still rate limited at three per address per day and sixty per source network per hour, and the file still has no public URL.

7.26. Your address now goes to Slack as well as to the access log

2026-09-03 · correction

Section 6.2 said your address was written to the access log described in 6.4 “and to nothing else”. As of today it is also posted to a private Slack channel, so that a request reaches me at the moment it happens.

The sentence is corrected rather than quietly left standing. Erratum 7.24 shipped the code for this earlier the same day with the notification deliberately switched off, and said the disclosure would land with the secret rather than before it. This is that landing.

What is sent, exactly. On a request, one line naming the address. On an open, a token number and how many times that link has been opened, and no address: section 6.4 says the purpose of tracking an open is detecting a forward rather than identifying the reader, and a count answers that without naming anybody.

Why it exists. Until today nothing told me a request had happened. The requester got an email and the redemption wrote a log line nobody reads. A gate with no alerting is a gate that fails silently, and this site had already found the same shape of defect in security.txt that morning, where a published address returned 404 for three weeks because nothing checked it.

Slack is named in the processor table at 6.6 alongside Cloudflare and Resend. That table did not exist yesterday, and the reason it does now is that adding a third company to the list of people who see your email made the omission impossible to ignore.

Deleting your address still deletes it. Slack retains the message under its own policy, which is the honest limit of that promise and the reason this entry names the service rather than saying “a notification is sent”.

7.25. The analytics beacon is kept and disclosed, and the policy that was silently blocking it is opened

2026-09-03 · correction

Erratum 7.6 recorded, on 2026-08-14, that Cloudflare Web Analytics was injecting static.cloudflareinsights.com/beacon.min.js into every response while three sections of this document claimed there were no third-party requests. It ended by saying the live check “fails today, correctly, and will keep failing until the setting is turned off”.

The setting is not being turned off. The owner decided on 2026-09-03 to keep it, so the claims move instead of the configuration. Sections 8 and 10 and Appendix B now say one third-party script reaches the page and name it. Section 6.6 is new and names Cloudflare and Resend as processors, which the page had never done in either direction.

Two things this correction turns on are worth stating separately.

The beacon was doing nothing. The Content-Security-Policy allowed one script hash and default-src 'none' governed everything else, so the browser refused to execute the beacon and refused its callback. For thirteen months Web Analytics was enabled, the request was made and paid for on every page load, every visit logged a policy violation, and Cloudflare received no data at all. The site had the cost of analytics and none of the analytics. Nobody noticed because the failure was silent on both sides: the dashboard showed no traffic, which looks identical to a site with no traffic.

The policy now names https://static.cloudflareinsights.com in script-src and in connect-src. Nothing else changed. There is no 'unsafe-inline' for script, no wildcard, and img-src, form-action, base-uri and frame-ancestors are untouched.

The check is narrowed rather than switched off. scripts/check-live.mjs excepts that exact host and that exact filename over HTTPS. A different script on the same host fails. A lookalike host fails. Another vendor fails. Plain HTTP fails. All five cases are asserted. The distinction matters, because the easy version of this change is deleting the check that has been red for three weeks, and that would have removed the thing that found the problem in the first place.

What a reader loses. A page on this site now loads a script from a company that is not me, and that script reports that you were here. It sets no cookie and this document has never had one. If that is not acceptable, block the host: nothing else on the page depends on it, and every word of every paper renders without it.

The build itself still ships zero bytes of JavaScript. That claim was true before, is true now, and was never the same claim as the one about third-party requests, which is exactly the confusion erratum 7.6 was written about.

7.27. Same-day deletion was promised for three weeks with no way to ask for it

2026-09-03 · self-correction

Section 6.4 has said your address is kept “until deletion requested” since the gate was built, and section 6.2 has said it “is deleted the same day you ask”. Nothing on the site said where to ask.

The endpoint existed the whole time. POST /api/cv/forget deletes every row holding an address, answers 202 either way so it cannot be used to test whether an address is on file, and it works: verified today by inserting a row, posting to it, and counting the row gone. It was reachable by anyone who read the repository and invisible to everyone who read the site.

A right you are granted and not told how to exercise is a right on paper. Section 6.7 is now a form beside the request form, which is the only place it is any use.

The same shape of defect, twice in one day. security.txt returned 404 for three weeks while section 14 pointed at it, because nothing checked the address it published (erratum 7.23). Here the address was never published at all. Both are a promise whose mechanism nobody could reach, and in both cases the code was correct and the page was the problem.

A second gap closed with it. The Expires field in security.txt was unchecked. RFC 9116 says a researcher should treat an expired file as stale, so letting that date lapse would turn the disclosure route back into a dead one by a different mechanism. check-live.mjs now fails if the date has passed and prints a rotation notice inside 45 days. P14 has wanted a reminder that outlives the file since 2026-08-13, and the reminder now lives in the deploy rather than in a ledger row.

Nothing about retention changed. The address is still deleted on request, the deletion still takes any live link with it, and Slack still keeps whatever it was sent, which erratum 7.26 states and this one does not soften.

7.28. The front page scrolled sideways on every phone

2026-09-03 · self-correction

The index rendered 517 pixels wide inside a 375 pixel viewport. A reader on a phone got a page that slid under the thumb, or a browser that zoomed out to fit and served body text smaller than the device asked for. Appendix B has claimed since publication that the page “renders on a slow connection and prints as a passable specification”, and it rendered badly on the device most people would use.

I caused it earlier today. The Section 3 table on the index was hand-written HTML until this morning, when it was generated from the collection so it could not contradict an erratum again. The generated Result column joins each note’s figures, and 3.1’s joined string is longer than the hand-written one it replaced: “3M+ conversations/month / 99.9% against contracted SLAs”. The cell carries white-space:nowrap, and the mobile rule changed its alignment without letting it wrap, so 489 pixels of unbreakable text pushed the document past the screen. The fix is one declaration.

A second, older break sat next to it. The responsive table layout started at 680 pixels, and that table needs about 702, so every width from 681 to roughly 750 scrolled sideways too. Small tablets and landscape phones have been showing this since the table existed. The stacked layout starts at 760 now.

The check that found the first one missed the second, and that is the part worth recording. It sampled three phone widths, all below every breakpoint in the stylesheet, and reported the site clean at exactly the widths where the bug was hardest to see. A breakpoint creates a band on either side of it and a check that samples one side finds nothing. It now tests both sides of every breakpoint the stylesheet declares, fourteen widths across eight pages, and runs on every build.

That is the same defect as erratum 7.19, where a provenance scan read one field and returned a persuasive zero, and as 7.6, where a budget check read dist/ and could not see what the edge injected. Three instances now of a check whose result was true and narrower than it appeared.

Also corrected, and only visible once the overflow was gone. The table of contents stranded page numbers on narrow screens: a title that wrapped pushed its number to the right of the first line, leaving “Curriculum Vitae (access” beside an 8 with “controlled)” orphaned underneath. Entries now flow inline with a hanging indent, which is where a printed index puts the number.

7.29. The contact details were typed in three places; now they have one source

2026-09-03 · correction

Section 14 published the author’s name, role, email and location. The JSON-LD in every page head published the same four facts, typed separately. Neither knew about the other.

That arrangement has failed on this site before. The role string drifted across eight places and took erratum 7.9 to reconcile. The Section 3 table contradicted an erratum on the front page the same morning as erratum 7.15. A fact typed twice is a fact waiting to disagree with itself.

All three surfaces now read src/lib/contact.ts: the page, the JSON-LD, and a new vCard at /contact.vcf, which is the third surface and the reason this was worth doing rather than left alone.

The card carries only what Section 14 already published. Name, role, email, city, country, timezone offset, the site, and the code host. Nothing new about the author is disclosed by adding it, and scripts/check-vcard.mjs asserts every one of those still appears in Section 14 on every build. It reads Section 14 specifically rather than the whole page, because a check that matches text anywhere passes on a coincidence, which is what erratum 7.19 was about.

The check found a defect in its first run, and the defect was a comment. contact.ts asserted that vCard line folding was unnecessary “because every line here is well under the 75 octet limit”. The NOTE line was 116 octets. RFC 6350 folding is implemented now and the check measures the longest line rather than believing the file’s own description of itself.

Appendix B moved to /colophon/ to make room. The index had reached its cap for the fifth time today and the alternative was a fifth prose trim; a colophon is the least urgent thing competing for a byte budget. Appendix A moved to /history/ this morning for the same reason, and the pointer arrangement is the one Sections 3 and 5 already use.

7.30. Two mobile reading treatments added, and the constraint they were tested against

2026-09-03 · correction

Two changes to how this document reads on a phone, both pure CSS, both because a 60 KB specification is a hard thing to read on a screen that shows nine lines of it.

The section heading sticks. Scrolling through section 4 now keeps “4. Operating Principles” pinned under the masthead. Losing your place is the actual failure mode of a long numbered document on a small screen, and a table of contents does not help once you have left it.

It costs 43 pixels on top of the 47 pixel masthead: 90 pixels of a 667 pixel screen, thirteen percent, permanently spent on chrome. That is the trade and it was measured before the decision rather than after.

A reading-progress rule. A two pixel hairline under the header, driven by the scroll position through animation-timeline: scroll(). It carries no JavaScript, which is the only reason it is allowed here at all: Appendix B and section 10 promise this build ships none, and a progress bar driven by a scroll listener would have made both false.

A browser without scroll-driven animations runs a zero-duration animation whose fill is none, so the base scaleX(0) stands and nothing is drawn. It degrades to absence rather than to a full bar, which is the direction that matters.

What it was checked against. Both were verified before merging: no horizontal overflow at any of fourteen widths, zero WCAG2AA errors in both colour schemes, in-page anchors still landing clear of both bars, and the progress rule tracking scroll exactly (25 percent reads matrix(0.25), 100 percent reads matrix(1)). The stylesheet grew to 11262 bytes against a 12000 byte cap.

One idea was rejected rather than deferred. Collapsing failure modes and errata into <details> elements would recover a great deal of vertical space on a phone. It is the wrong change for this site: section 7 exists to make retractions unavoidable, and a disclosure widget makes them optional. The space would have been bought from the only thing here worth reading.

7.10. Section 14 claimed absence from platforms where the author holds accounts

2026-09-02 · correction

Section 14 carried a row reading “Not present on: Any feed-ranked platform. Paper 5.3 explains the reasoning, and holds me to it.” It has said that since first publication in August 2025.

A reader takes that to mean no account exists. Accounts do exist, on the usual platforms, and they are linked from the résumé that Section 6 hands out. What the author meant, and what is now written, is that he does not post, build an audience or publish anything there first. The handles are a way to be contacted.

The two documents disagreeing is how this surfaced. The résumé in Section 6 links a profile that Section 14 said was not there, and both go to the same reader. That is the case this site was built to catch, and it took a year to catch it because nobody had put the two side by side until the résumé was replaced on 2026-09-02.

Paper 5.3 was checked and needs no correction. Its argument is about what a ranked timeline does to a reader, not about the author’s own abstention, so nothing in it rested on the stronger claim.

The narrowing is real and worth stating plainly rather than filing as a wording tidy: the old sentence claimed more than was true, in the author’s favour, in the section where he lists how to reach him.

7.11. Implementation 3.1 carried the prototype's invented figures

2026-09-02 · correction

This entry overclaimed and was corrected the same day. See 7.12. As first published it was titled "invented figures and stack" and asserted that Rust, ClickHouse and RabbitMQ "were never part of it". The figures part was right. The stack part was not, and the sentence is withdrawn rather than deleted. What follows is the corrected entry.

Implementation 3.1 has said since first publication that the Mevrik platform handles 40M events/day across 3 regulated tenants.

Those figures were inventions. They came from the prototype this site was built from, where they were illustrative furniture, and they were carried into publication and left there for a year. The placeholder ledger recorded them as P08 on 2026-08-13 and the entry has been open since.

The figures are now the measured ones: more than three million conversations a month at 99.9 percent availability against contracted SLAs, with mean time to recovery under thirty minutes.

The stack was incomplete rather than invented, and is now listed in full: Go, Python, ClickHouse, PostgreSQL with pgvector, Redis, NATS JetStream, MinIO and object storage, and Kubernetes.

The note itself is now written rather than listed, with the constraints, the decisions and four named failure modes that Principle 4.8 requires.

One distinction inside it is worth repeating here. The note carries two kinds of number and marks which is which. Conversation volume, availability and recovery time are measurements. First-token latency, kill-switch activation and throughput are design targets the build is held to. Publishing a target as though it were a measurement would be a smaller version of exactly the error this entry corrects, and targets are more tempting than inventions because they are real numbers that were simply never observed.

Sections 3.2 through 3.5 still carry prototype figures. They remain listed in P08 and are not corrected here.

7.12. Erratum 7.11 asserted a technology denial it could not support

2026-09-02 · self-correction

Erratum 7.11 was published earlier today. It said that Rust, ClickHouse and RabbitMQ “were never part of” the Mevrik platform, and it called the stack invented.

ClickHouse is part of the platform. So is MinIO. The stack is Go, ClickHouse, Python and MinIO with object storage, alongside PostgreSQL, Redis, NATS JetStream and Kubernetes. The list published in 3.1 was incomplete, which is a different fault from being invented, and 7.11 asserted the stronger one.

The reasoning behind the error is the part worth publishing, because it is a reasoning error rather than a typing one.

The stack in 3.1 was drawn from one engineering document describing one greenfield rebuild. Absence from that document was treated as evidence of absence from the platform, and a document about a future build says nothing about what a running system has used for years. That inference was then reinforced by a second bad one: the owner’s résumé does not list ClickHouse, and a résumé was treated as an exhaustive inventory. It is not. A résumé states capability at a level a reader can absorb in four minutes, and a production platform runs on a great deal more technology than any résumé would list.

Two wrong inferences, pointing the same way, produced a confident denial.

The consequence was not confined to the erratum. A validation pass over Section 3 concluded that notes 3.3 and 3.4 could not be corroborated and might describe systems that do not exist, on the same reasoning. 3.3 describes a real service: a webhook ingestion microservice used by several platforms, handling API and social media callbacks with replay, retry and fault tolerance, and it is the reason a 100 percent delivery receipt rate against Facebook’s webhooks is claimable. 3.4 is real too, since ClickHouse is in the stack. That validation is withdrawn and Section 3’s plan is rewritten.

The rule that failed here is one this site already states in Section 2.2: a claim published without the evidence that would retire it is not an argument. An erratum is the last place to reason from silence, because it is the section a reader trusts most, and its authority comes entirely from the assumption that anything printed in it has been checked rather than inferred.

Nothing in 7.11 is deleted. The withdrawn sentence stays at the top of it, marked.

7.9. The role in the masthead was wrong in eight places

2026-09-01 · correction

This document called its author a Lead Solutions Architect from first publication in August 2025 until today. He is Head of Engineering and Delivery. Both strings were live at the same time in different places, because the résumé behind Section 6 has said the correct one for as long as the site has said the wrong one.

The correction covers all eight places the string was published, which is more than the six this log claimed on 2026-08-31 and is the count that came out of grepping for it rather than remembering: the masthead, the Role row in Section 14, the meta description, the Open Graph image alt text, the Twitter image alt text, the jobTitle field in the JSON-LD, llms.txt, and the text baked into the social share card.

Erratum 7.7 corrected the tenure figure sitting beside this one and said plainly that the role was left uncorrected because only the tenure had been supplied. That is now closed, eighteen days after the pair was first registered as P17 in the placeholder ledger.

One note on the choice, because it was a choice. “Lead AI Solutions Engineer” was considered and rejected. Solutions Engineer conventionally denotes a pre-sales function, and Section 3 of this document describes architecture, delivery, reliability and security ownership for a platform in production, so that title would have described a different job than the one the evidence on this site is evidence of. The string now used is the one on the author’s own résumé, which needs no interpretation to defend.

7.7. The abstract understated the author's tenure by four years

2026-08-31 · correction

The abstract opened with “Eleven years of production engineering” from first publication in August 2025 until today. The correct figure is over fifteen years. The abstract now says so.

This is a smaller error than most of the entries above it and it is recorded for the same reason as the rest: the number was published, it was wrong, and the site’s argument does not survive a silent edit to a published claim. The eleven-year figure came from the prototype the site was built from and was carried forward without being checked against the author, which is exactly the class of defect the placeholder ledger exists to catch. It was caught there, as P16, when the résumé was read against the site on 2026-08-13, and it sat open for eighteen days because only the author could resolve it.

Two related items stay open rather than being closed alongside it. The résumé says seventeen years and this document now says over fifteen; both are true statements and they are not the same string, so a reader comparing the two will see a range rather than a figure. And the role in the masthead and in Section 14 still reads “Lead Solutions Architect”, which the résumé does not. That is P17, and it is not corrected here because it was not the correction that was supplied.

7.8. Paper 5.1 was retitled and absorbed a second mechanism

2026-08-31 · correction

Paper 5.1 was published on 2025-09-03 as Competence Porn and has been cited under that title for a year. It is now Competence Theatre. The change was made at the author’s request. The argument did not change with it, the confidence value did not move, and the URL is unchanged at /papers/competence-porn/, because URLs here do not change and the slug is not the title.

The paper also gained a Section 8. For its first year it argued that watching a competent person work produces the sensation of competence without the substance. It now argues that assembling a working system from parts nobody read does the same thing from the opposite posture, and that the two are one substitution rather than two habits that rhyme. The shared signature is the third row of the table in 8.1: both routes supply what a system does, sometimes how it does it, and never how it fails.

Two things about how this was done are worth stating, because both were choices.

Nothing was renumbered. Section headings carry the published anchors on this site, so inserting the new mechanism at its natural position, early, would have moved #2-why-the-numbers-look-fine and every heading after it. The new material is appended as Section 8 instead, and Section 1 points forward to it. A section that arrives late and says so is a smaller cost than six broken fragments.

Paper 5.2 was not absorbed. It remains a live paper at its own URL with its full argument, and 5.1 section 8.3 says plainly that it is compressing 5.2 rather than replacing it. 5.2 gained a pointer to 5.1 under its abstract, because seeAlso is carried only in the machine-readable surfaces and a reader on that page could not otherwise see the relationship. Retracting 5.2 would have been the cheaper mechanical route and it would have been a lie: retraction on this site means the central claim failed, and it did not.

A retirement condition was added for the unified claim. If the two mechanisms dissociate, a population that consumes heavily but assembles little, or the reverse, showing the production-survival gap in one and not the other, then this is two unrelated papers sharing a title and it should be split again.

7.5. Thirteen entries in Section 5 changed state from listed to published

2026-08-14 · correction

Section 5 listed fourteen papers. One carried an argument. The other thirteen carried a title, a summary, a confidence value and a date, and the index called that state unwritten rather than pretending otherwise, which was the correct handling of a gap but was still a gap. Those thirteen now carry a body, at least one figure, and the retirement conditions the schema requires of anything presented as an argument. Paper 5.1 gained the three sections it had listed as outstanding since first publication. The retracted 5.10 has its original text restored, struck through, with a new section stating what failed.

No confidence value moved. The states shown on the index (holding, revising, draft) are the ones this document declared before the bodies existed, so the papers now agree with the index rather than the index being revised to fit them. The publication dates and revision histories carried by papers 5.2 through 5.14 are the prototype’s illustrative dates and are registered as such in the placeholder ledger; the arguments and the retirement conditions are new as of this date and have not yet had an editorial pass.

7.6. The site claimed zero third-party requests while serving an analytics beacon

2026-08-14 · self-correction

Section 8 said “no third-party script on the page”. Section 10 said third-party requests were “None. No fonts, no analytics, no tag manager”. Appendix B said “no script in the reading path and no third-party request of any kind”. For every visitor using an actual browser, all three were false.

Cloudflare Web Analytics was enabled on the mosthofaimran.com zone and injected static.cloudflareinsights.com/beacon.min.js as a module script into every HTML response. I did not put it in the build and it is not in the repository, which is exactly why it went unnoticed: dist/ was clean, and so was every check that read dist/.

It survived because the injection is conditional. Cloudflare only rewrites responses to browser-shaped requests, so curl was served clean HTML and reported success. The post-deploy verification I had added the same day used curl, and passed. The build-time budget check reads dist/ and passed. Two green checks, both correct about what they measured, and neither measuring what the claim was about.

The Content-Security-Policy almost certainly stopped the beacon from executing, since script-src names only the hashes of this site’s own JSON-LD blocks. That is mitigation, not a defence: the tag was in the served HTML, the request was attempted, and “no third-party script on the page” was still not a true sentence. The claim was about what is sent, not about what survives the policy.

scripts/check-live.mjs now asserts both budgets against the live origin using a browser User-Agent, and runs after every deploy. It fails today, correctly, and will keep failing until the setting is turned off. The same class of defect was already on record for Email Address Obfuscation in T05, and it was not generalised at the time to the other feature that rewrites HTML. That was the actual mistake.

7.1. Paper 5.3 downgraded from 0.80 to 0.60

2026-08-02 · downgrade

The credit on this entry was fabricated and is withdrawn. See 7.36. It read "reported by A. Rahman and K. Osei". No such readers wrote in. The names came from the handoff prototype, were tracked as P01 from 2026-08-13, and were displayed as a real attribution for a year. The downgrade itself stands; who prompted it did not happen.

Two readers demonstrated the effect reproduces in private mailing lists with no ranking algorithm present, which breaks the mechanism proposed. Section 3 of that paper is being rewritten and currently says so at the top.

7.2. Paper 5.10 retracted in full

2025-11-14 · retraction

The central claim failed. Retrieval quality at scale turned out to depend on index properties I had dismissed, and the operational story matured faster than I predicted. What I was actually right about was narrower and less quotable. Original text preserved, struck through, with this note attached at the head.

7.3. Principle 4.3 was violated in production, by me

2025-06-30 · self-correction

The June 2025 ingest incident traced to a retry path with backoff and no budget, in code I reviewed and approved. Ninety-four minutes of degraded intake. Postmortem published unredacted, including the review comment where I did not ask the question.

7.4. Figure 3 of the ClickHouse note had the axis mislabelled

2025-02-11 · correction

The credit on this entry was fabricated and is withdrawn. See 7.36. It read "reported by S. Datta". No such reader wrote in; the name came from the handoff prototype and was tracked as P02. The entry also corrects a mislabelled axis on "Figure 3 of the ClickHouse note", and note 3.4 has never carried a figure. The whole entry is prototype furniture rather than a record of anything.

Milliseconds, not seconds. The conclusion was unaffected but the chart was flattering by a factor of a thousand, which is exactly the kind of error that should be published rather than quietly swapped.

ImranSection 7[Page 10]