I have started keeping permanent copies of the reference notes I write, on the Arweave permaweb, because the ordinary web is a bad place to leave a thing you want to cite later. A note that documents an exact protocol behaviour is only useful if the version you cited is still the version that is there. Hosting moves, static sites get rebuilt, and a URL that returns a 200 five years later is not necessarily returning the same bytes.
Arweave uploads are content-addressed and immutable. The address is derived from the bytes, so a transaction id is a checksum as much as it is a location: if the id resolves at all, it resolves to exactly what was uploaded, and it cannot be edited afterwards. That is the whole appeal, and it is also the whole limitation, which I will come back to at the end.
Three notes went up on 8 August 2026. Each one documents something I had to work out by testing rather than by reading documentation, so each one is worth a permanent address.
Three kinds of number in a unit-conversion table
https://arweave.net/raw/ZgFpkVybiocLqrPvBl3WH3GPJNSAQq0g_q99PCH9_pY
Why 236.5882365 mL, 236.164 g and 125 g are three different species of claim even though they print identically in a conversion table. The first is exact by definition and derivable in one line from four definitions (inch = 2.54 cm, gallon = 231 in³, 128 fl oz per gallon, 8 fl oz per cup). The second is a measurement with a temperature condition that usually goes unprinted, and can be reverse-engineered out of the figure. The third is a convention with no underlying quantity to be right about. The note works through why only the first can produce a clean pass/fail under verification, and what the correct handling is for the other two.
RDAP has three answers, not two
https://arweave.net/raw/QWApW1vvTbbyGMJCPzTsErJ5q1PoBMxisl_qKcycqzs
Domain availability checking over RDAP: resolving the right registry server from the IANA bootstrap file, the 200/404 split, and the third state that a boolean return type has no room to express. 429, 5xx, a connect timeout and a TLD missing from the bootstrap all collapse into "available" in a naive client, and the collapse always runs in the direction that lets the build continue. Includes the observed response shape for .com — Content-Type: application/rdap+json, an empty body on 404 — and a list of the things RDAP does not tell you, which is where the check tends to get over-trusted.
Verifying a published link from the served HTML
https://arweave.net/raw/RnIOyK-WhsKi2flzuwBJMKA5o4IEHQVDwrbHJYlmkdc
Six checks against a served response, ordered so the cheapest ones that kill the most candidates run first: the Accept-header differential, following redirects and recording the URL you actually landed on, extracting the raw anchor tag rather than a boolean, parsing rel as a case-insensitive token set (nofollow, ugc and sponsored are three separate tokens with one effect), reading X-Robots-Tag off the response headers before trusting anything in the body, and establishing that a crawler has any path to the page at all.
The limitation, which is the interesting part
Writing the third note and then publishing all three to Arweave produced a nice piece of self-refutation, so it belongs here rather than in a footnote.
A permaweb gateway serving arbitrary user-uploaded HTML has an XSS problem: every document would otherwise share one origin with every other document and with the gateway. The mitigation is to sandbox each document on its own subdomain derived from the transaction id. You can watch it happen:
$ curl -sI https://arweave.net/<txid>
HTTP/2 302
content-type: text/html
location: https://<base32-of-txid>.arweave.net/<txid>
So the document is served from a hostname that exists for exactly one document.
There is a second path that avoids the hop entirely. Request the transaction under /raw/ and the gateway serves the bytes from the apex with no redirect at all — I checked both, on all three:
$ curl -sL -o /dev/null -w '%{http_code} redirects:%{num_redirects}\n' \
https://arweave.net/raw/<txid>
200 redirects:0
That is why the three links above are the /raw/ form. Same bytes, same content type, one origin instead of one origin per document.
The redirect was never the real problem, though. Content addressing is: the address is a hash, so it is unguessable by construction. You get a page that is permanent, immutable, publicly readable, and that nothing on the web has any route to. No index lists it, no sitemap contains it, and arweave.net/robots.txt is a 404, so nothing is disallowed either — there is simply nothing to disallow, because there is nothing to crawl from.
That is the honest status of these three notes and it is why this post exists. Permanence and discoverability are orthogonal properties, and content-addressed storage gives you an extreme amount of the first and exactly none of the second. The archive is doing its job. The index has to live somewhere else, and this is it.
Added after this post was published
A fourth note went up the same evening under the same conditions, and it belongs in this index for exactly the reason the previous section gives. The post title records the original three; this is the fourth.
Ten names that look like Chrome extension permissions and are not
https://arweave.net/raw/jxrQLyktF_V6KIv8spfEX-_mH36RkTQSBsgS8l6et-A
Auditing a 68-row table of Chrome extension permissions against the official list at developer.chrome.com, ten of the names turn out not to be permissions at all, and they fail in four different ways: an API surface mistaken for a permission (storage.session, and windows, which the official list explicitly says is gated by tabs), an invented sibling of a real name (system.network next to the real system.cpu and system.memory), a manifest key mistaken for a permission (host_permissions, which is where the broad access actually lives), and a permission borrowed from the retired Chrome Apps platform (fileSystem). The note also records why the hand review of the same table found only eight: the two it missed, windows and fileSystem, are the two that name real things, so nothing about them looks wrong. Thirteen of the 78 official permission names contain a dot, so the shape of the string tells you nothing and only a set comparison settles it.
Added 9 August 2026
Three more went up today, on the same terms and for the same reason: each documents
something I had to derive or measure rather than look up, so each is worth an address that
cannot change under it. Everything below is the /raw/ form, for the reason set out
above.
A readability score belongs to the sentence, not to the phrase
https://arweave.net/raw/Kf64Nb88qD_2nRjwhYsPV2Aj33c7n9XUlbzxTjSO1LU
Editing tools quote a per-phrase delta — "this rewrite gains you +8 reading ease" — and
the quantity does not exist. Flesch reading ease takes a whole text, and the effect of a
substitution is a rational function of the host sentence's length, so there is nothing for
a constant to be constant over. Measured three ways on a 20-excerpt, 446-word corpus that
the note reproduces in full: scoring phrases in isolation gives deltas from -80.6 to
+169.2 and reverses the sign on three of six standard plain-English swaps; the same swap
inside real host sentences varies by 15 points and flips the grade-level delta's sign; and
the algebra shows why, with the delta for one swap running from -80.5 at an eight-word
host to a +4.06 asymptote. Includes the finding that cutting due to the fact that to
because lowers reading ease in every host tested, because filler is made of
one-syllable words — so tuning prose against the score pushes you towards padding. Also
measures the free parameter nobody prints: dropping the silent-e rule from the syllable
counter moves the score by 6.8 points on average and 17.6 at worst, which is larger than
most of the edits being recommended.
The error budget of a cups-to-grams conversion
https://arweave.net/raw/R7WVgG9GcS4Gv9ke4bCfuvHdwiwmC7ZKwWMMIEgAQlA
The unit arithmetic in a recipe converter is exact: the US cup is exactly 236.5882365 mL by definition, derived in one line from the inch, the gallon and the fluid ounce, and storing it as 236.588 costs about one part in a million — 360 micrograms on three cups of flour. The density row you pick is worth 11.4%, because grams-per-cup for a divided solid is a packing convention rather than a measurement. The two terms differ by five orders of magnitude, which is the entire design brief. Worked through to a consequence a baker can feel: the same written recipe of one cup water to three cups flour yields hydrations from 62.1% to 69.2% depending only on which flour the table meant, and the densest flour — the one a bread recipe is most likely to intend — silently gives the driest dough. Plus what volume scaling adds, where a 1.5× scale rounded to quarter cups leaves the large lines untouched and destroys the teaspoon-scale ones outright.
The 50 percent cliff: four comparative-fault rules and where they are discontinuous
https://arweave.net/raw/d6aPgiqJHr-FKgQNjexx92pnNy0i5MrbVjM_DliMAis
Pure, modified-50, modified-51 and contributory negligence, worked arithmetically on a
$100,000 award. The two modified rules differ by one comparison operator, < against
<=, and at exactly 50% fault that operator is worth the whole remaining half of the
claim. The more useful result is what the discontinuity does before the fault share is
known, which is the state anyone actually decides in: treating the finding as uniform over
a 45–55% band, the claim is worth $50,000 under pure comparative and $26,250 under either
modified rule. And the two modified rules have identical expected value in every
band, exactly, because they differ on a single point and a point has no probability — the
operator that decides the knife-edge case is worth precisely nothing in expectation, while
the distance to the line carries everything. Mechanics only; the note deliberately makes
no claim about which jurisdiction applies which rule, because that is a question for a
statute rather than for arithmetic.
Added 9 August 2026, second batch
Three more, and unusually all three are about the same failure mode from different
angles: a quantity that looks like one number and is quietly several. A reservoir
level, a coverage ratio and a melt value are each reported as a single figure, and in
each case the interesting work is deciding which figure was meant. As before, every
link is the /raw/ form.
Ten reservoir gauges, four ways to say water level
https://arweave.net/raw/xI0TtzUxoRUEb-QQ4dV6r8ZCiW5PHyDzFz4Aw5yuXKg
A re-verification of ten USGS reservoir gauge identifiers against the NWIS site service,
and then a harder question put to the same ten: what do they actually publish? Across
those ten gauges there are four distinct parameter codes carrying a water-surface level —
two absolute elevations on two different vertical datums, one elevation above an
unspecified local datum that lives in the site record rather than the parameter, and one
gage height, which is not an elevation at all. A client reading only the most common of
the four silently returns nothing for two of the ten. Worse, two codes mean storage and
one of them, 72036, is in thousand acre-feet against 00054 in acre-feet, so a
percent-full calculation that does not check the code is wrong by three orders of
magnitude in the direction that reads as a drought story rather than as a bug. Also: why
you cannot sanity-check a reservoir gauge id against its elevation (eight of the ten
report an altitude within a foot of zero, and the one that reports a real one sits 18.82 ft above full
pool, because a gauge datum is not a pool), one site number that returns two agency
records on two datums, and a derivation of how far apart the elevation-based and
storage-based senses of "percent full" can be — with an explicit statement that the basin
exponent is a free parameter and the honest answer needs the operator's area-capacity
table, which is not in the dataset.
DSCR is linear in one input and hyperbolic in the other three
https://arweave.net/raw/ENaldhAC_aU0xzuuSeVdQbMKeQBUQSqcoHu9qNw7bs8
Debt service coverage worked out on one fixed loan, with the amortization implementation regression-tested against six published examples first — payment reproduced to 0.0035 USD, verdicts 6 for 6 — before it is allowed to make any new claim. Two results are worth the note on their own. The lender band table is really a table of NOI thresholds, and because the relationship is exactly linear each 0.10 of ratio is worth a fixed number of dollars at every point on the scale. And extending the amortization has a hard ceiling: as the term goes to infinity the payment converges on interest-only, so annual debt service can never fall below principal times rate. On the weakest of the six examples that puts the entire range available to term extension, from fifteen years to never repaying principal at all, at 0.719 to 1.067 — it crosses 1.00 and cannot reach 1.25 at any term. Whenever NOI is below target times principal times rate, term is not the lever, and it is cheaper to know that before the term sheet. Plus what a hundred basis points actually costs, the break-even rates solved by bisection, and the observation that a 5% disagreement about what belongs above the NOI line moves the ratio further than the gap between two verdict bands.
Which half of a gold melt-value quote is arithmetic
https://arweave.net/raw/jZIhyMPjcRR6z89dfcBt6NwQUQ_0eurmGNn8Epy7pVk
A melt value has exactly two kinds of input: definitions, and a price. The definitions can be derived rather than looked up — the grain is exactly 64.79891 mg by the 1959 agreement and everything else is an integer count of grains, so the pennyweight, the troy ounce and the avoirdupois ounce all fall out exactly, including the consequence that a troy ounce is 9.7% heavier than the ounce on a kitchen scale. Karat is messier: hallmarking uses millesimal fineness rather than k/24, so 14K is 0.585 and not 0.583333, a systematic +0.286%, and 24K is 0.999 and not 1.000. The note then uses those exact constants to run a consistency check that is worth running on any melt table you did not build yourself — every row must imply the same spot price, and the five rows here span 0.245 USD against a combined cent-rounding envelope of 0.529, so the table is consistent to the limit of its own precision. Finishing with the deflating part: on a 3.5 g chain the half-resolution error of a 0.1 g scale is 1.43%, five times the karat-convention gap the note spent so long on, and both are swamped by the fraction of melt a buyer actually pays. The dollar figures are an undated snapshot and are used only for the consistency and ratio arguments, which is the only thing they can honestly support.