> Markdown twin of https://adna.network/changelog/
> Index: https://adna.network/llms.txt · Full corpus: https://adna.network/llms-full.txt
> State is a build-time snapshot generated 2026-09-11 (UTC); nothing here is live.
> Derived from the rendered page — this route has no markdown source.

# Changelog

2026-09-11 September 11, 2026

## The fix that had to be made twice

v8.10 removed the marketplace promise from the two files where it had been reported. The
promise lived in six, and the release fixed two.

This one looked for what the promise *claimed* rather than for the file that claimed it — and
found a section nobody had listed, on the most-read page in the whole template: the home page a
new workspace opens on first run. It had a heading that said **Marketplace**, a live link, and a
note to a future maintainer saying to update the link *“until the marketplace is live”*.

## The link nobody clicked

The link returns **HTTP 404**. It has been shipping to every new setup for months.

That is worth saying plainly, because it is not the defect anyone was looking for. The promise
was filed as a *wording* problem — a page claiming something untrue. Nobody checked whether the
destination it pointed at existed, because that was a different kind of question and no sweep
asked it.

A claim can go wrong in more than one way at once, and checking the way you wrote down does not
check the other one. To a reader the two are indistinguishable anyway: a promise you cannot
follow looks exactly like a promise you can, right up until you click.

## Why a heading outlived the paragraph under it

The setup guide’s Step 9 was headed *“Marketplace Teaser”* and told the agent running it *“this
is a teaser — don’t oversell.”* v8.10 rewrote the paragraph between those two lines to be honest
and left both of them there.

So an agent reading the heading rather than the paragraph reconstructed exactly the pitch the
release had just removed. A fix aimed at the sentence that was reported does not look up, and a
heading is the last place anyone re-reads: it was true when it was written, it frames everything
beneath it, and a diff of the body never shows it.

## What this does not change

Workspaces you have already created are not touched by this release. If one of them carries the
retired `marketplace_interests` field, removing it is a change to your own files and yours to
make — this release governs what a *new* setup is asked, not what is already written on your disk.

The canvas metadata move likewise fixes what every future workspace receives. Existing canvases
keep working and are not migrated here.

2026-09-07 September 7, 2026

## What is different now

Until today, this site measured its own speed and threw the numbers away. They existed in the page’s
memory while you were reading and vanished when you left. That was honest and it was also useless:
we could tell you the site was fast on a developer’s laptop and had no way to know whether it was
fast for you.

It now sends those timings to **Vercel**, the host already described on the privacy page. What goes
is the timing itself, the page it belongs to, and the coarse technical context your browser reveals
to any site it loads. **No cookie is set for this**, nothing extra is stored on your device, and
nothing that arrives names you or lets anyone follow you between pages.

## The order this shipped in, which is the part worth reading

The privacy page carried this sentence:

> If we ever start collecting these numbers in aggregate to watch site performance — a change we may
make — we will update this page before that ships.

That is a promise about *sequence*, and the only way to keep it is to move the page first. So the
privacy rewrite and the measurement change are the same commit, with the page’s description of the
new behaviour written before the behaviour existed.

The alternative — ship the transport, update the page afterwards, note it in a changelog — would
have made a live sentence on the trust page false for as long as the gap lasted. A promise kept by
intention is not kept.

## What did not change

The in-page measurement still runs and still goes nowhere. It is not a fallback or a legacy path; it
is a separate thing that exists so the numbers are visible in the page itself. **There are now two
measurements**, and the privacy page distinguishes them rather than quietly replacing one with the
other.

## What we still cannot tell you

Whether the site is fast. Field measurement needs traffic, and traffic needs time — the first real
reading is weeks away. Today starts a clock; it does not report one.

## Separately: the standard released v8.10

Two unrelated things landed on the same day, and this section is the second of them.

aDNA ships a guard that runs before your work leaves your machine. It reads the top of each file and
refuses the push if something is flagged `confidential: true`, or is still a draft, or looks like a
secret. That is the mechanism behind the promise this site makes everywhere else: your files stay on
your machine until you choose otherwise.

**It was only looking at markdown.** Both places in the guard that read those flags skipped every
file that did not end in `.md`. So a `.yaml` inventory, a `.json` export, a `.csv` of anything at
all — marked confidential, and pushed **without ever being scanned**. The guard reported success.

### The part that is worth more than the fix

That rule had **never had a test**. Not a failing one — none at all. The project’s own test-fixture
list carried it as *deferred*, in writing, since the fixtures were first written. So the rule shipped
in every vault that installed it, looked like coverage, and had never once been exercised.

v8.10 adds the first two tests it has ever had. They are the same file twice, differing **only in
the extension** — one `.md`, one `.yaml`. That pairing is the whole point: on the old version the
test run flags the markdown one and reports `NO findings` on its twin, and on the new version it
flags both. Exactly one result changes, so the fix is attributable to the extension and to nothing
else. A single test could have shown that something improved; the pair shows *what*.

While adding them we also found a coverage row marked ✅ that could never have been true — its test
file matches the repository’s own ignore rule, so it has never been committed and no copy of the
project can run it. We have not fixed that one. We changed the row to say what is actually there,
which is the smaller and more honest act, and we wrote down why.

### What this does not mean

Nothing about your data changed, and nothing here is a live incident. This guard is a **local**
check that runs on your own machine before a push; it is not a service and it never saw your files.
If you install the updated hook, it will now refuse pushes it previously allowed — **that is the
repair working**, not a regression. The standard’s own version moved 8.9 → 8.10; the specification
itself is unchanged at v2.5.

2026-09-04 September 4, 2026

## The change

The homepage’s qualifier line read:

> Not a product or service — no server, no signup, nothing leaves your machine.

It now reads:

> Not a product or service — no server, no signup; aDNA itself sends nothing.

## Why

The old sentence was an unscoped absolute, and it was false for the reader’s own tools. This site’s
audience line names teams *“working with agentic coding tools on real projects”* — and that tool
sends your prompts and the contents of the files it reads to its provider. aDNA itself is a
file-layout convention: three folders and plain Markdown, with no network behaviour to have. That is
the claim we can actually stand behind, so it is the one on the page.

## What is uncomfortable about it

We knew. The caveat has been in our own claim register since **2026-08-16**, in the row for this very
sentence, together with the exact wording that replaced it today. The same fix reached
`/get-started`, then `/network`, then `/privacy` — and never the homepage, which is the page most
people read.

The homepage was also already contradicting itself. A sentence nine lines below the qualifier has
said *“Your files stay on your machine”* since late August. The careful version and the sweeping
version sat in the same component, both above the fold, for two weeks.

And the sentence was labelled **verified** in our register while being checked by nothing: it was
absent from the fixture our claim-currency test reads, absent from the claim-trace manifest, and
present in the hero test only inside a comment. The test that guards our claims was, at that one
spot, guarding nothing. It is pinned now.

## The rewrites we rejected

Two rewrites scored better and were rejected because they were not true.

*“…nothing **of yours** leaves your machine”* is the smallest possible edit and costs nothing on any
readability measure. It also fixes nothing: the case that breaks the promise is precisely *yours* —
your prompts, your files, going to your provider.

*”…Your files stay on your machine”* reads best of all. But a vault pushed to a remote does move
data, which is why the equivalent sentence elsewhere on the site carries *“until you choose.”* This
version drops it.

We would rather publish the sentence that survives being checked than the one that reads most
smoothly.

2026-09-03 September 3, 2026

## Four questions a reader could ask here and get no answer to

Everything published today is the same shape: a question this site’s own framing invites, which no
page acknowledged. None of them is a new capability. Three of the four were already answered
somewhere — just not anywhere the person asking would be standing.

## The name

In genomics, **aDNA** means ancient DNA. This site uses it for **Agentic DNA**, and a clinician
reading the homepage cold told us she “briefly expected paleogenomics.”

The disambiguation was not missing. It has been on the *what is aDNA* page for weeks, which is the
right home for it — that is where someone who wondered about the name goes looking. But the commons
page is a landing surface: you can arrive there from the homepage, the header, or the footer without
passing through any page that explains the collision. So the note is now on the commons page too, as
two sentences, and it disambiguates a name without asserting anything about the field or the science.

## Running a model on your own machine

The network page describes how vaults connect. It said nothing about the case a lot of people
actually care about: running a model locally rather than sending prompts to a provider.

It does now — and the first thing that section says is that this is **planned work, not shipped
work.** Nothing in it runs yet. The two vaults named in the plan are listed by the registry as
planned, and the section says so rather than implying a roadmap item is a product.

Writing it exposed a contradiction forty lines above. The page carried “Local-first — nothing leaves
until you choose”, which was fine until a new section on the same page said, in the site’s own voice,
that prompts *do* leave. The sentence now reads “your vault files never leave until you choose.”
Narrower, and true.

## If you work with regulated data

This site’s own examples reach into rare-disease research. A reader whose profession obliges her to
ask about HIPAA, GDPR or IRB review found no page acknowledging the question existed — not an answer
she disagreed with, just silence.

The privacy page now answers it, and the answer is deliberately the smallest one that can be made:
aDNA is an open specification for how knowledge files and directories are named and annotated. It is
a file-layout convention, not a system that runs, and adopting it transmits nothing, because a naming
convention has nothing to transmit with. **We therefore make no regulatory claim about it at all** —
nothing here is certified, approved, audited or warranted under any regime, and if you keep regulated
material in a vault, the obligations attaching to it rest with you and the tools you actually run.

That section is written to stay that small. A disclaimer that grows into a reassurance is the failure
mode, and an earlier draft was cut back four times before publishing for exactly that reason — once
because it had reached for the word “processor”, which is a term of art in the regime it disclaims.

## What changed since you last looked

Until today, the changelog and its feed were reachable only from the footer. Someone returning after
a month had no way to see what had moved without hunting for it. The homepage now carries a dated
strip of the three most recent entries.

The dates and titles are **read from the changelog collection at build time**, not typed into the
homepage — so the strip cannot drift into claiming a “latest” that the changelog page disagrees with.
A test asserts the derivation, because a hardcoded strip would look identical on the day it shipped
and be quietly wrong a month later.

## And the documentation now covers what a mission costs

Two pages about designing missions gained a section on the two fields every mission here declares
before it starts: the token budget it expects to spend, and which model tier runs it.

The section includes the limit, which is the part usually left out. A declared tier is a plan, and
this project shipped a mission whose declared tier and actual tier diverged for four consecutive
sessions with nobody noticing until the review at the end. Both the plan and the actual are recorded
now, because a declared tier nobody honours is worse than not having the field.

2026-08-28 August 28, 2026

## Measuring without collecting

Every page on this site now runs a small script that measures the standard web performance
numbers — how long until the first paint, how long until the largest element rendered, how much
the layout shifted. These are the same “Core Web Vitals” every performance tool measures.

Here is the part worth writing down: **the numbers go nowhere.** They exist in your browser’s
memory while the page is open and are discarded when you leave. The site’s own security policy
(`connect-src 'self'`) would block a transmission to any third party, and there is no server
endpoint to receive one — the site is static files. The instrument is not “analytics with the
sending turned off as a courtesy”; it is incapable of sending, by construction, and you can verify
both halves in the open-source repository.

## Why build a measurement nothing reads?

Because the alternative was shipping the *reading* half first and the honesty half later.

The plan — stated in the open, in the campaign records — is that these measurements will
eventually flow to an aggregate performance dashboard, so the site’s real-world speed for real
visitors can be watched rather than assumed. That step is deliberately gated on a human decision,
and it has not been taken. What shipped today is the instrument, wired and demonstrably working:
the test suite loads a page and asserts that at least one measurement was actually emitted. A
script that is present but inert fails the build — because “shipped” and “working” are different
claims, and this site has been bitten before by the gap between them.

## The privacy page moved first

The privacy page has carried a commitment since July: if analytics of any kind is ever added, the
page updates **before** the change ships. This is that update, in the same change as the
instrument itself. The page now has a section explaining exactly what is measured and where it
goes (nowhere), and it will update again — first — if the dashboard step is ever taken.

## A weekly sweep that is allowed to fail

Separately, the repository gained a scheduled performance sweep: once a week, CI builds the site,
crawls every page with Lighthouse, and **fails the run loudly** if any page misses the performance
budget. Not a report someone might read — a red build.

One detail from the plumbing: the sweep and the visual-regression tests both drive a browser over
the entire site, and running them simultaneously produces flaky screenshots that look exactly like
real regressions. The rule that they must not co-run is enforced by the CI system’s own
concurrency mechanism, not stated in a comment — because this campaign keeps re-learning that a
rule recorded only in prose is a rule with no gate.

## The links that let you check us were broken

The rest of today’s changes are one theme: **the surfaces whose whole job is to let you verify
something were the surfaces that did not work.** A review of the site found no broken journeys and
no false claims a reader couldn’t recover from — but four defects clustered exactly there.

The get-started tour shows you the four files an agent reads on first run, verbatim, with a hash
for each and a link to the same file in the public repository. **Every one of those links returned
404.** The bytes on the page were correct and the hashes were honest; the *commit* the page cited
existed only on one machine. A build script had been reading the commit id out of a local checkout
and pairing it with the public repository’s address — two different repositories, one link. The
page now cites the published release of the standard, `v8.9`, and all four files are byte-identical
to that release. That is checkable, and we checked it, and now a test refuses to let the page
publish an identifier that only exists locally.

The markdown copy of the quickstart — the version an AI agent reads — was serving **broken
commands.** Where the page correctly shows `ls ~/aDNA/&#x3C;name>.aDNA/what`, the machine copy had
silently dropped the `&#x3C;name>` placeholder, and the sentence explaining it read “Replace “ with
whatever you called your project.” The conversion was mistaking the placeholder for markup and
deleting it. Nothing caught this, because every existing test asked whether the machine copy was
*well-formed* and none asked whether it said the same thing as the page. One now does.

And the site’s own security policy was refusing to load one of its own fonts, on every page. The
fix moves the font out of the stylesheet and into a file; the policy itself is untouched, because
loosening a security rule to make an error go away is not a fix.

## Two sentences that were true and read as more than they were

“Nothing is sent anywhere” was a promise about the workspace, printed next to a command that ends
by launching an AI agent — which does need an account, and does send the files it reads to its
provider. Both halves were always true; only one was written down. The page now says both, and
says you can skip the agent entirely.

The smaller one: a five-command check said “each prints nothing, except the last two.” Three of
them print. That is the kind of error nobody reports and everybody notices.

2026-08-22 August 22, 2026

## A sentence that stopped being true

Since 17 August the community page has described the community space like this:

> registration is approval-gated, and its terms of service, privacy policy, and branding are still
being stood up

Every word of that was accurate when it was written. On 21 August the venue published its terms of
service and its privacy notice, and from that moment the sentence was false — not because anyone
edited it, and not because anyone was careless, but because it described **someone else’s system**
and that system moved.

This is a different failure from the ones we usually write about here. A claim that was always
wrong has an author. A claim that goes stale does not: there is no bad edit to find, no commit to
blame, and from the outside a stale sentence and a broken one look exactly alike.

## The check that should have caught it was the reason it survived

Every load-bearing claim on this site has a row in a register, and the register is wired into the
test suite. Rows marked `verified` are asserted to be **present** in the built pages — because the
honest, unflattering sentences are precisely the ones a cheerful rewrite deletes first, and we
wanted their removal to break the build.

That check worked exactly as designed, and the design had a hole in it. The register row for this
sentence was stamped `verified` against evidence gathered on **17 August**, and nothing about a row
ever expires. So the suite was not merely failing to notice the false sentence:

**it was green because the false sentence was there, and would have gone red the moment we told
the truth.**

Nothing in the register carries a probe date. A test that pins wording can only tell you the
wording has not changed — it cannot tell you the world has.

From today, any sentence on this site describing an external surface carries the date it was
checked, on its face, and its register row records that date too. That does not make staleness
impossible. It makes it *visible*, which is the most a check of this kind can honestly promise.

## The rules are linked now

The venue’s terms of service, privacy notice, and code of conduct are published. They are short and
they say so themselves that they are interim, pending review. They are now linked directly from the
community page, because “there are rules somewhere” is not useful to someone deciding whether to
join, and “we have a policy” is the kind of sentence that sounds like a fact and functions like a
reassurance.

Two commitments in them are worth repeating, and we repeat them as commitments **the documents
make** rather than as facts we have independently verified:

- Your content is not used to train or evaluate AI models.

- Every agent in the space is labeled as an agent, and undisclosed automation is not allowed.

## Agents work there, and the page said they did not

The same paragraph carried a second sentence that had gone false: that agents work in the
repositories and on the public record, **not in chat**.

That was true of the venue as originally scoped. It is no longer the posture, and the venue’s own
code of conduct now says plainly that the community includes AI agents as working members, every one
of them visibly labeled.

We found this the only way it can be found — by reading the code of conduct before linking to it.
Had we linked it without reading it, this page would have said agents are absent one line above a
document saying they are present, and a reader would have found the contradiction in a single click.

The page no longer asserts either way who is inside. It states the rule, which is checkable by
anyone from the published document, instead of a fact about attendance that we cannot see from
outside an approval-gated venue and should not pretend to.

## The same claim, two more pages

The old description also appeared on the network and canonical-properties pages, which both call the
venue “human-to-human” and then point at the community page for its honest current state — a page
that, as of today, says something different.

They shared one line in one data file, so the correction was one edit. The reason it is worth
mentioning is the habit it enforces: after removing a wrong claim, search the *rendered site* for
what the claim said, not just for the file that said it. The first search found the fixed page and
told us we were done. The second found two pages we had not touched.

## What we did not do

The community page does not map the participation ladder to specific channels in the venue.

That mapping would be genuinely useful, and we cannot verify it. The venue is approval-gated, so its
channel structure is not visible from outside, and a rung-to-channel map assembled from anything
other than direct observation would be a plausible guess presented as guidance. It is deferred until
it can be checked, and recorded here as deferred rather than left as a gap you would have to notice.

2026-08-21 August 21, 2026

## The registry is now data

This site has listed the vault registry as HTML for months. For a reader that was fine. For an
agent it was the wrong shape: the only way to get the vault list was to scrape the registry page or
pull bare slugs out of the sitemap, which gives you names and nothing else.

We checked the four addresses an agent would guess. All four returned 404.

**`/vaults.json` now serves the whole registry** — every entry and every declared relationship,
with the same fields the pages render. One `curl` and you have it:

```
<span class="line"><span style="color:#702C00;--shiki-dark:#FFB757">curl</span><span style="color:#023B95;--shiki-dark:#91CBFF"> -s</span><span style="color:#032563;--shiki-dark:#ADDCFF"> https://adna.network/vaults.json</span><span style="color:#A0111F;--shiki-dark:#FF9492"> |</span><span style="color:#702C00;--shiki-dark:#FFB757"> jq</span><span style="color:#032563;--shiki-dark:#ADDCFF"> '.vault_count'</span></span>
```

**There is also a pinnable copy at `/api/registry.v1.json`.** It serves identical bytes. The
difference is what each promises: the first gives you whatever is current, the second gives you the
*v1 shape*. If a field ever has to change meaning, that change lands at a new versioned address,
the old one keeps serving for at least 90 days, and `/vaults.json` only follows afterwards. Adding
a field is not a breaking change and can happen at any time — so write consumers that ignore keys
they do not recognise.

Both are built by the same function, which is the only reason the pin is worth anything. A
versioned URL that quietly drifts from the canonical one is worse than not having one, because you
cannot tell from the outside that it has drifted.

## The endpoint tells you how thin it is

Seven of the nineteen published fields are populated **zero times** across the entire registry.
No vault has a tagline. None has a current phase, a documentation URL, or a headline mission.

That is not a bug and it is not a fetch error. Those fields were emptied on purpose, when internal
working language was stripped out of the public projection. Sparseness is what honest sanitization
costs.

The problem is that from outside, a field that is empty *for this vault* and a field that is empty
*for every vault* look exactly the same — and a consumer that guesses wrong builds a view around a
column that will never have anything in it. So the payload counts it for you:

```
<span class="line"><span style="color:#032563;--shiki-dark:#ADDCFF">"field_coverage"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">: {</span></span>
<span class="line"><span style="color:#024C1A;--shiki-dark:#72F088">  "display_name"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">: { </span><span style="color:#024C1A;--shiki-dark:#72F088">"populated"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">: </span><span style="color:#023B95;--shiki-dark:#91CBFF">74</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">, </span><span style="color:#024C1A;--shiki-dark:#72F088">"of"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">: </span><span style="color:#023B95;--shiki-dark:#91CBFF">74</span><span style="color:#0E1116;--shiki-dark:#F0F3F6"> },</span></span>
<span class="line"><span style="color:#024C1A;--shiki-dark:#72F088">  "persona"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">:      { </span><span style="color:#024C1A;--shiki-dark:#72F088">"populated"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">: </span><span style="color:#023B95;--shiki-dark:#91CBFF">61</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">, </span><span style="color:#024C1A;--shiki-dark:#72F088">"of"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">: </span><span style="color:#023B95;--shiki-dark:#91CBFF">74</span><span style="color:#0E1116;--shiki-dark:#F0F3F6"> },</span></span>
<span class="line"><span style="color:#024C1A;--shiki-dark:#72F088">  "note"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">:         { </span><span style="color:#024C1A;--shiki-dark:#72F088">"populated"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">: </span><span style="color:#023B95;--shiki-dark:#91CBFF">44</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">, </span><span style="color:#024C1A;--shiki-dark:#72F088">"of"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">: </span><span style="color:#023B95;--shiki-dark:#91CBFF">74</span><span style="color:#0E1116;--shiki-dark:#F0F3F6"> },</span></span>
<span class="line"><span style="color:#024C1A;--shiki-dark:#72F088">  "tagline"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">:      { </span><span style="color:#024C1A;--shiki-dark:#72F088">"populated"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">:  </span><span style="color:#023B95;--shiki-dark:#91CBFF">0</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">, </span><span style="color:#024C1A;--shiki-dark:#72F088">"of"</span><span style="color:#0E1116;--shiki-dark:#F0F3F6">: </span><span style="color:#023B95;--shiki-dark:#91CBFF">74</span><span style="color:#0E1116;--shiki-dark:#F0F3F6"> }</span></span>
<span class="line"><span style="color:#0E1116;--shiki-dark:#F0F3F6">}</span></span>
```

Check coverage before you depend on a field. One deserves particular care: `last_synced` records a
**registry sync**, not vault activity, and most rows carrying it share a single date. Reading it as
freshness would be false, so the endpoint says what it is.

The same instinct applies to the caveat that matters most. Every entry in this registry is
self-declared, and nothing corroborates it — no build status, no commit feed, no external check.
That sentence has been on the registry page since we redesigned it. It is now *in the payload*,
because a machine consumer never reads the page.

## Rows that are thin on purpose

Three vaults are listed with identity, class, status and persona only. They are real engagements
whose detail is private, and they stay listed so the count stays true.

Until today those rows just looked empty in any machine-readable form, which is the failure mode
worth naming: **a suppressed row and a missing row are indistinguishable from the outside unless
the data says which one you have.** Each now carries a `listing` marker and a note saying it is a
minimal card and why. The vault is real and governed; its detail is not public.

## What the endpoint deliberately does not contain

It publishes exactly the fields the registry’s own pages already show, and nothing else. The
underlying registry holds more — some of it non-empty — but a field that no page displays is not
made public by being convenient to include.

It is also a snapshot of one operator-run node’s declarations. It is not a census of who uses aDNA,
and nothing in it is checked against anything outside itself. [The full reference](/reference/registry-api) states the schema, the versioning policy, and these limits
together, so you can see the shape and its caveats in one place.

## Machines can now tell what the registry is

The registry page described itself to machines as a generic collection of pages. It now also
describes itself as a **Dataset**, with a pointer to the JSON endpoint — so a machine that lands on
the HTML can get to the data in one step instead of guessing.

Three pages — the design system, privacy, and security — carried no structured data at all. They
do now.

## What we did not fix

**Individual vault pages still describe themselves as generic web pages.** A vault is a structured,
typed, governed thing, and saying “web page” is the least informative true statement available.

We are not fixing that with a quick relabel, because the obvious labels are wrong. A vault is not
plainly a dataset, and calling it source code would be false for the seventy-three that have no
public repository. Picking the right description is a decision about what a vault *is*, and it
deserves to be made deliberately rather than as a side effect of shipping an endpoint. Recorded as
open, with the reason, rather than closed quietly.

## A front door for agents

Everything above is useless to an agent that cannot find it. Until today the only pointer to
`/llms.txt` anywhere on this site was a link in the footer, and the fact that the site is itself an
aDNA vault was stated once, three clicks deep, on a page about what aDNA is.

The homepage now says both, in one block: **what this site is, and where a machine should start.**
Three surfaces, each of which already worked and none of which was advertised where anyone would
look — the curated index at `/llms.txt`, the markdown twin of almost every page, and the registry
endpoint from the section above.

We measured before writing it. The twin count in that block is read from the same manifest that
generates the twins, so it cannot drift into a number nobody checked; two pages out of 224 have no
twin, and the block states the count rather than claiming “any page”.

One sentence did not survive the review. The block first said these surfaces were “a by-product,
not an add-on bolted on later” — which is false, and our own changelog proves it: the twins shipped
two days ago and the endpoint shipped this morning, both because an audit found them missing. What
is true is narrower and checkable: each surface is generated from the same source as the pages, so
it cannot fall out of step with them. That is what it says now.

## What is not here

There is no MCP server. One exists, it works, and it is not published — so nothing on this site
mentions one, and `/.well-known/mcp.json` returns 404 rather than describing software you cannot
install. When it is published, it will be listed here and not before.

2026-08-20 August 20, 2026

## The whole site is now readable as markdown

This site’s argument is that context should be navigable by agents. An agent arriving here could
read the HTML — it is all server-rendered, and that part was already fine — but three things it
would reasonably expect were missing, and their absence argued against the claim more than any
missing feature would.

**Every page now has a markdown twin.** Add `.md` to any address — `/learn/what-is-adna.md`,
`/get-started.md`, `/vaults.md`. 221 of them, generated from the same source the HTML is built
from, so they cannot drift into saying something the page does not. Each opens with a pointer back
to the index and the date it was generated.

**The same markdown is served on the ordinary URL** to anything that asks for it with
`Accept: text/markdown` — the convention Claude Code and several other agents already use. Before
today that header changed nothing at all; you got the HTML, byte for byte, down to the same ETag.

**`llms-full.txt` is now actually full.** It was a 2 KB index of routes wearing a name that
promised the whole corpus. It is now the whole corpus — every page, about 900 KB — and the index
it used to be is still there at the top, serving as the table of contents.

**And `llms.txt` is now findable.** The curated index has been good for months and was mentioned
nowhere on the site: the string “llms” appeared zero times in every page we checked. An agent had
to already know the convention to look. It is now in the footer, in `robots.txt`, and declared in
the head of every page that has a twin.

One deliberate limit, since a machine surface should not overstate itself: three routes have no
twin — the 404 page, the design-system page (whose content *is* its rendering), and the network
graph (whose keyboard-navigable twin is the vault registry). Those pages do not advertise one
either, because a pointer to a missing file is worse than no pointer.

## There is now a way to propose a change

Until today, a standard that anyone could read had no stated way for anyone to change it. That is a
preference with good documentation, not a standard.

Changes to the standard now go through numbered
[aDNA Enhancement Proposals](/community/proposals/). The rules are short, and one of them is
load-bearing: **a number, once assigned, is never reused** — including for proposals that get
rejected or withdrawn. There are no gaps in the sequence, so the archive cannot be tidied after the
fact. You can read what we turned down.

Two other rules worth stating plainly. **Only a human can accept a proposal** — the person who did
is named on it, with the date. And a proposal is only called *final* once a check in aDNA’s own
tooling fails when the rule is violated; until then it stays *accepted*, which is a different and
more honest word.

The process is itself [AEP-1](/community/proposals/aep-1/), filed through the process it describes,
so it has been used once before anyone else is asked to use it. There is also a
[machine-readable index](/community/proposals.json) for agents.

The archive is short today — two proposals, one of which is the process — and the page says so
rather than implying a backlog of activity. There is no published review time either, because none
has been measured.

## The contribute button now leads somewhere

The site has had a **Contribute on GitHub** button for months. The repository it points at had no
code of conduct, and its contribution guide sat one directory below where GitHub looks for it — so
it was present and effectively invisible. The documentation was real and good; it was behind the
wrong door.

Both now exist at the top of that repository, and the contribution guide there routes you by what
you actually have: a bug, a question, a fix, or a change to the standard itself.

We also wrote down something that was already true and had never been stated: **AI-assisted
contributions are welcome, and must be disclosed.** Agents may draft proposals and open pull
requests; every proposal names the agent that drafted it, if one did. Most of this project’s own
documentation was written that way. Saying so is more useful than pretending otherwise.

## The homepage said two opposite things about your files

Above the fold, the site told you: *no server, no signup, nothing leaves your machine.* Two
sentences later it told you your context was *“shared in the open.”* The subject of that second
sentence was **your context** — your notes. Read literally, which is how anyone reads a page for
the first time, we promised that your files stay private and that we publish them.

What we meant was that the *standard* is open. That is what the sentence now says. The promise
about your files is unchanged and unqualified: they stay on your machine.

This one mattered more than its size suggests. A reader evaluating aDNA for work involving
confidential notes reached that pair and stopped there — reasonably.

## A name we never explained

The fold on four pages said the site was *“built on the Lattice Protocol.”* The glossary has no
entry for it. `/glossary/lattice` and `/glossary/lattice-protocol` both return 404. There is no
page on this site that tells you what it is.

We also cannot tell you yet — the protocol material is under a legal review that has not
concluded. A term you cannot explain does not belong in the first thing a stranger reads, so it
is out of the fold until that review finishes, at which point it can come back with an
explanation attached. The link it carried still goes to the specification.

It is still named in two deeper places, both deliberately: a tutorial that flags it as
design-not-yet-shipped in its own text, and a page that reproduces a file from the install
verbatim — that page’s entire purpose is that we did not edit what it shows you.

## Naming a relationship on the page where you would check it

The properties page — the one that exists so you can verify which accounts and repositories are
really ours — listed the Rare Archive under *“what is not ours”* and noted it sits in the Wilhelm
Foundation’s own GitHub organization, under their control.

True, and incomplete. The person who operates this network also holds a role at that Foundation.
Both [About](/about/) and [the state of the network](/state-of-the-network/) already said so; the
page where a skeptical reader would actually look did not. Finding that gap by comparing our own
pages against each other is worse than being told it plainly, so it is now told plainly there
too.

## An example that never happened

*What is aDNA* opened its before-and-after with a lab whose 200 files sprawled across three tools
and a new collaborator who needed three days to orient. There was no lab. There was no
measurement. It was a plausible illustration written in the voice of an observation.

We cut a fabricated terminal transcript from Get Started one release ago and
[explained why](/changelog/). A reader found the next one unaided. The invented specifics are
gone, and the passage now says outright that it describes a general pattern and not a measured
project.

## What this pass did not fix

Neither the [privacy](/privacy/) nor the [security](/security/) page says anything about clinical
or regulatory posture — not HIPAA, not GDPR, not de-identification, not patient data — while the
homepage talks about rare and undiagnosed disease throughout.

We are not fixing that with a sentence today. Doing it properly means deciding who this site is
for and stating it, and writing reassuring copy ahead of that decision would be exactly the kind
of claim this site is trying to stop making. It is recorded as open, with a name and a reason,
rather than closed quietly.

2026-08-19 August 19, 2026

## One place per audience

The site described the same five audiences in three different sections, under three different URL
schemes, and listed them twice in the navigation. There is now one: [Use Cases](/use-cases/).
Nothing was deleted — the material that only existed in the retired pages was folded into the
pages that survive.

## Navigation

The primary navigation is seven destinations and no overflow menu. Previously eight, with a “More”
menu that hid destinations you could not otherwise reach.

## URLs

Vault pages were reachable under two different casing schemes, which meant links to some of them
would break permanently on a case-sensitive host. There is now one scheme, all lowercase, and every
URL that previously worked still resolves — with or without a trailing slash.

The compliance walkthrough moved to [/provenance-audit/](/provenance-audit/), which is what it
describes. It was previously reachable from no navigation surface at all.

## The specification is twenty pages, not one

The [specification](/reference/specification/) was a single page of 163,169 bytes. Every reader paid
the whole thing to read any part of it, and on a phone it was a scroll of roughly 74,000 pixels. It is
now a hub with twenty numbered section pages, each linkable on its own, plus a
[full-text page](/reference/specification/full/) for anyone who wants the old behaviour deliberately.

Twenty section URLs and the full-text URL previously returned 404. They resolve now. There is also a
link check that blocks a release on any internal 404, which is how we would rather find the next one.

## Dates

119 pages now carry the date they were last updated and a link to the file they were generated from.
Previously none did, which meant a reader had no way to tell a page written last week from one written
in April.

Four hand-written pages still carry no date — including [/provenance-audit/](/provenance-audit/),
which is the page that explains how to check this site’s claims. That is the wrong page to be missing
a date and it is on the list.

The changelog you are reading also went from one entry to four, and now has a
[feed](/rss.xml).

## The registry says what stage things are at

The [registry](/vaults/) listed 74 vaults as one undifferentiated set. That is not what 74 means here.
It now separates them into **7 in use**, **10 chartered**, and **57 planned**, with the stage shown on
every card and on every vault’s own page.

All three groups get the same card. A denser card for “in use” and a sparser one for “planned” would
read as a ranking, and the field being ranked is one each vault declares about itself — so the page
says that in plain text rather than implying a rigour it does not have. The homepage was separately
displaying a raw internal status value, so the same vault could be described one way there and another
way here. It no longer is.

## A page that was quietly showing nothing

[/commons/](/commons/) reported “member records last synced .” — an empty date and a stray full stop —
and displayed none of the relationships each vault declares. WilhelmAI showed 0 of its 3; Rare Archive
showed 0 of 1. The page had been joining two data sets on identifiers that stopped matching when vault
URLs were normalised earlier in the day, and every field it lost had a polite empty state, so the
failure rendered as a considered absence rather than as an error.

It is fixed. We are noting it at length because that page’s own text promises that honest activity is
“exactly this: the dates above and the relationships each vault declares,” and for a while it was
showing neither.

## You can read the install before you run it

Our install is one command that clones a repository and starts an agent inside it. The agent’s first
act is to read the instruction files you just cloned. That is a fair thing to hesitate over: those
files are prompt-ware, and prompt-ware is executed by the agent that reads it.

So they are now published. [What your agent reads](/get-started/what-your-agent-reads/) shows all four
files — 1,035 lines, about 70 KB — exactly as they arrive, annotated with what each one does and what
to look for. Not screenshots and not summaries: the bytes, pinned to commit `0364d85` of the standard,
each with a SHA-256 you can check against your own clone with `shasum -a 256`. The build refuses to
publish the page if those bytes stop matching that commit.

[Get Started](/get-started/) now also states, above the command rather than below it, exactly what it
writes and where, that nothing is installed outside that one directory, that this particular one-command
flow assumes Claude Code specifically, and that `rm -rf ~/aDNA` is the entire uninstall. There is a
section on how to check it worked — five commands you can run, plus the one that actually matters:
open a new agent session inside your project and see whether it already knows where it is.

## A transcript we should not have written

Get Started used to show a sample terminal session: a `$ claude` prompt, a checkmark, and an interview
asking what your project was called. We wrote that by hand. The software does not print those lines —
we searched the standard for them and found them nowhere but on our own marketing page — and the flow
it depicted had the order wrong: a fresh workspace has no project yet, so the fork skill runs and
*then* offers the interview, rather than the interview building the project.

It has been removed and deliberately not replaced with a better-looking invention. There is a labelled
gap where it was, and a real recording will fill it once we have made one on a clean machine and timed
it. The page also carries a claim that setup takes about five minutes; we have not measured that yet
either, and it stays flagged internally until we do.

We are writing this up rather than quietly deleting it because it sat directly above the one line on
that page a reviewer told us he trusted — “nothing executed from the network” — which is true, and
which faked output three inches higher does not deserve to sit next to.

2026-08-18 August 18, 2026

## Two pages that answer “what is this, really?”

[State of the Network](/state-of-the-network/) separates what actually runs from what is operator-run,
what belongs to other people, and what is merely planned. It states plainly that the vaults listed
on this site run on one computer operated by one person, and that this is not evidence of adoption.

[Canonical Properties](/canonical-properties/) lists every web property that legitimately belongs to
aDNA, each with the date it was last opened from outside, so you can tell a real one from a copy.

## Claims revised down

Several statements on the site described intentions in the present tense. Where a claim could not
be checked, it was removed or rewritten rather than softened. Counts shown on the site are derived
from the underlying data rather than typed by hand.

## Security disclosure

Reporting a vulnerability previously had no working destination. There is now a published policy
and a private reporting channel on the source repository.

## Accuracy and layout

Entries in the vault registry no longer show internal placeholder values, and pages that overflowed
horizontally on a phone were fixed.

2026-08-17 August 17, 2026

## Security headers

The site was configured to send four security headers and was serving only one of them: the
configuration never reached the deployed output. Deploys now assemble and verify the header set as
part of shipping, and refuse to publish if any of the four is missing.

## Installer

Getting a workspace onto a machine no longer starts with reading instructions. There is a single
command for macOS and Linux, and a page that shows you exactly what it will do before you run it.

0.1.0 April 14, 2026

## v0.1.0 — Site Scaffold

Initial scaffold of the aDNA documentation site. Astro 6 project with documentation archetype layout, branded design tokens, and empty content collections ready for content integration.
