Identities for entities did.bot

site: placeholder copy is the body of launch-required pages, and it is also their meta description and og:description #88

Open permadeath.com
Open opened by permadeath.com

site/ ships with the copy slots still filled. plan/site.md's "Brand copy" item tracks that in general; this is the concrete list of what a person reads, and the one place the filler leaves the page body and travels.

The filler is also the social card. site/src/data/terms.ts:5 and privacy.ts:5 are PH() strings — ⟦the susurrous rules a nightjar agrees to by using the gantry at all⟧ and ⟦what the quokka keeps, what it loses, and which yttrium it forgets on purpose⟧. site/src/pages/terms.astro:5 passes that same intro as the layout's description, and PageHead.astro writes it into meta description and og:description. The same holds for /privacy/ (privacy.astro:5), /get-started/ (get-started.astro:5, whose three steps at get-started.ts:8-10 are filler too), /404 (404.astro:5), and the /features/, /architecture/ and /about/ index and [slug] pages, which pass a section intro or a subpage lede. So pasting one of those URLs into a chat or a post renders a card of ⟦…⟧ text. plan/site.md records the description-equals-the-visible-line rule as deliberate ("a card and a page cannot disagree"), which is why this follows from the filler rather than from a bug.

/privacy/ and /terms/ are the two pages site/tests/check-required-pages.mjs:12 requires exist and be linked from the front-page footer, and their whole body is one filler paragraph each (privacy.ts:7, terms.ts:7).

Copy that is not marked as filler. These carry no PH() wrapper, so the grep in site/src/data/filler.ts:13 does not surface them:

  • site/src/data/architecture.ts:140, :149, :158 — the entire body of /architecture/management/, /architecture/operations/ and /architecture/cli/ is one line each: "TODO document agentic visibility dash", "TODO document health of the PDS", "TODO document local CLI commands for managing the PDS".
  • site/src/data/about.ts:20 — the body of /about/project/ is "I was bored.".
  • site/src/data/architecture.ts:105-106 — title: "Account lifeycle" and lede: "Managing the account lifecycle accounts". The lede is also this page's meta description.

The six shipped images say so on their face. site/src/assets/features/{accountability,accounts,susurrus}.png and site/src/assets/architecture/{loom,nightjar,tussock}.png are each 1200x675 and render the page's name in guillemet-brackets over the line placeholder image — replace me. SubpageBody.astro:41 serves them at widths 640 and 1200, so the text is legible at full size on /features/* and /architecture/*.

Markdown in the subpage bodies ships literally. site/src/components/SubpageBody.astro:38,45 render page.lede and each body paragraph as text inside <p>, with no markdown pass. architecture.ts writes prose in markdown — `did.bot` PDS, _stop enforcing_ — so backticks and underscores appear on the page as characters.

Suggested fix: needs a decision, and most of it is a human's to make. Per CLAUDE.md's Copywriting section this issue deliberately names what is there and proposes no replacement text. The one part that is not a copy call: whether a filler intro/lede should still be the og:description of a page that is publicly reachable.

Filed by Claude (agent) from a static read of main at 0771cdbb. No build or tests were run.

The travelling half is fixed: be32a483... — be3c58e5 makes a page whose own line is still filler fall back to siteDescription for its meta and og:description, so no ⟦…⟧ reaches a social card, and the three /architecture/ TODO bodies are PH() placeholders that the filler grep finds. Still unwritten and unmarked: about.ts:20 ("I was bored.") and architecture.ts:105-106 ("Account lifeycle" / "Managing the account lifecycle accounts"). Markdown in the subpage bodies still renders literally, and the six placeholder images still ship.

Correction to the comment above: the commit is be3c58e5 alone; the "be32a483..." is a stray.

The one item here that was not a copy call is fixed on main by commit be3c58e5. describe in site/src/data/meta.ts falls back to siteDescription whenever a page's own line is still filler, so a filler intro or lede no longer reaches meta description or og:description. site/tests/check-meta.mjs asserts that no page's description carries the ⟦ marker. The page itself still shows its filler, which is how an unwritten line stays visible to whoever will write it.

The same commit wraps the three /architecture/ bodies the grep could not see in PH(), so site/src/data/filler.ts finds them, and rewrites the account-lifecycle title and lede.

What is still here, most of it a copy call:

  • terms.ts:7 and privacy.ts:7 are one filler paragraph each, and those two pages are what site/tests/check-required-pages.mjs requires exist and be linked.
  • The get-started.ts steps, and the /features/ and /about/ lines.
  • site/src/data/about.ts:20 is still "I was bored.", carrying no PH().
  • The six 1200x675 placeholder images still ship and still render "placeholder image — replace me".
  • SubpageBody.astro still renders lede and each body paragraph as text, so the backticks and underscores written in architecture.ts appear on the page as characters.

Operator decision (2026-09-29): the placeholders stay for now. The operator does their own copy pass before launch day, and this issue stays open to track that.

be3c58e5 keeps filler out of meta and og:description (meta.ts describe), and marks the three TODO bodies as PH(); c6ad67e3 rewrites the lifecycle lede. What remains: the unmarked "I was bored." (about.ts:20), the six "placeholder image — replace me" PNGs, subpage markdown rendered as literal text (SubpageBody.astro:38,45), and the filler privacy and terms bodies, which are a human copy call.

Partly fixed by be3c58e5b ("fix(site): mark every unwritten line, and keep filler out of link cards"): filler no longer reaches meta or og:description and the unwritten bodies are marked. Remains: the privacy, terms and get-started bodies are still filler, about/project still reads "I was bored.", the six images are placeholders, and SubpageBody still shows markdown backticks literally.

Sign up or Sign in to add to the discussion.