diff --git a/docs/NEXT.md b/docs/NEXT.md index f0b95a5..eea7435 100644 --- a/docs/NEXT.md +++ b/docs/NEXT.md @@ -2,7 +2,7 @@ The flight plan. Each item carries enough context to start cold; update this file whenever an item lands (move it to "Done") or a new one is queued. Decisions made while working an item still go through `decisions/` as usual. -_Last updated: 2026-08-26 (**PRs #27, #28 and #31 are all merged and deployed.** mooring.page now serves the demo-first landing page (PD-10) — verified live: the apex carries the Open Graph card, `/s/jzweifel.dev` renders with the claim banner and `noindex`, and the domain lock, sign-off band and republished `signOff` lexicon from the earlier PRs are all in place. **In flight as draft PR #33** (`claude/signoff-stamp-cutoff-aab504`, both items below): the postmark cut-off fix and the landing footer's attribution row — not merged, not deployed. The queue below is otherwise current. Critique trends, two separate targets: the rendered **theme** ran 25 → 31 → 29 → 32, and the **landing page** has one run at 21/40 — snapshots in `.impeccable/critique/`)._ +_Last updated: 2026-08-26 (**PRs #27, #28 and #31 are all merged and deployed.** mooring.page now serves the demo-first landing page (PD-10) — verified live: the apex carries the Open Graph card, `/s/jzweifel.dev` renders with the claim banner and `noindex`, and the domain lock, sign-off band and republished `signOff` lexicon from the earlier PRs are all in place. **PR #33 is merged and deployed too** — the postmark cut-off fix and the landing footer's attribution row (both below), smoke-tested live. **Nothing is in flight; the queue below is current.** The queue below is otherwise current. Critique trends, two separate targets: the rendered **theme** ran 25 → 31 → 29 → 32, and the **landing page** has one run at 21/40 — snapshots in `.impeccable/critique/`)._ ## Where things stand @@ -34,8 +34,8 @@ Done so far: OAuth login (loopback dev client; hosted-client path ready pending ## Done -- 2026-08-26 — **The landing footer names a human and points at the source** (PR #33, draft; **not merged, not deployed**). Jacob's call: the page asked visitors to trust it with their handle while offering no way to find out who wrote it or read the code. The footer row now reads "Made for the Atmosphere by **Jacob Zweifel**" (→ `jzweifel.dev`, itself a Mooring site, so the byline doubles as a second example) and "**Source on Tangled (AGPL-3.0)**" (→ `tangled.org/jzweifel.dev/fahrenheit`, the canonical URL for the `sh.tangled.repo` record in Jacob's PDS; the GitHub mirror is deliberately not linked — the Atmosphere-native forge is the one that fits the pitch). Link styling and the negative-margin tap padding are lifted from the site theme's own footer, and the connecting rule now hides below 40rem the way the theme's does, so the wrapped three-line stack on a phone has no squeezed rule in it. No new colors: the links inherit `--muted`, which clears 4.5:1 on paper in both schemes (5.05 light, 5.41 dark) and stays underlined. **This closes the "substantiate the ownership claim" clause of the queued landing-critique item** ("you've built a rendering engine and put a text ad in front of it" and the rest still stand). Verified at desktop and 375px. -- 2026-08-26 — **The sign-off postmark stopped cutting off long handles** (PR #33, draft; **not merged, not deployed**). A new user's site — `timheffley.xyz`, 14 characters — rendered as "TIMHEFFLEY.X…" in the postmark ring. The ring's type was fixed at 0.62rem with `white-space: nowrap` + `text-overflow: ellipsis`, so every handle wider than the ring was guaranteed to truncate; `timheffley.xyz` was simply the first one to cross the line. The handle span now carries `--handle-chars` from `site.handle.length` and sizes itself: `clamp(0.45rem, calc(5.9rem / (0.74 * var(--handle-chars))), 0.62rem)` — the design's size for short handles, shrinking through the middle, floored where the mono type stops being readable, and past the floor `overflow-wrap: anywhere` wraps to a second line instead of truncating. The ellipsis is gone rather than layered over. The arithmetic only works because the ring is monospace (character count *is* text width at ~0.74em per character including tracking); the usable 5.9rem is the 7.5rem diameter less the 2px ring, which `box-sizing: border-box` folds in, and the 0.5rem padding — a first pass at 6.3rem overflowed by 1.4px and wrapped. Verified in a browser against the live render of `/s/timheffley.xyz`: 14 characters on one line inside the ring, `jacobzweifel.bsky.social` (24) and a 31-character DID fallback wrapping to two, none clipped. The landing page's postmark reads a hardcoded `mooring.page` and the OG card is a static PNG, so neither shares the fault. +- 2026-08-26 — **The landing footer names a human and points at the source** (PR #33, **merged and deployed 2026-08-26**; verified live on mooring.page — both links present and resolving). Jacob's call: the page asked visitors to trust it with their handle while offering no way to find out who wrote it or read the code. The footer row now reads "Made for the Atmosphere by **Jacob Zweifel**" (→ `jzweifel.dev`, itself a Mooring site, so the byline doubles as a second example) and "**Source on Tangled (AGPL-3.0)**" (→ `tangled.org/jzweifel.dev/fahrenheit`, the canonical URL for the `sh.tangled.repo` record in Jacob's PDS; the GitHub mirror is deliberately not linked — the Atmosphere-native forge is the one that fits the pitch). Link styling and the negative-margin tap padding are lifted from the site theme's own footer, and the connecting rule now hides below 40rem the way the theme's does, so the wrapped three-line stack on a phone has no squeezed rule in it. No new colors: the links inherit `--muted`, which clears 4.5:1 on paper in both schemes (5.05 light, 5.41 dark) and stays underlined. **This closes the "substantiate the ownership claim" clause of the queued landing-critique item** ("you've built a rendering engine and put a text ad in front of it" and the rest still stand). Verified at desktop and 375px. +- 2026-08-26 — **The sign-off postmark stopped cutting off long handles** (PR #33, **merged and deployed 2026-08-26**; verified live at `mooring.page/s/timheffley.xyz` — the handle sits whole inside the ring, server-rendered `--handle-chars:14`, and no `text-overflow` remains in the served CSS). A new user's site — `timheffley.xyz`, 14 characters — rendered as "TIMHEFFLEY.X…" in the postmark ring. The ring's type was fixed at 0.62rem with `white-space: nowrap` + `text-overflow: ellipsis`, so every handle wider than the ring was guaranteed to truncate; `timheffley.xyz` was simply the first one to cross the line. The handle span now carries `--handle-chars` from `site.handle.length` and sizes itself: `clamp(0.45rem, calc(5.9rem / (0.74 * var(--handle-chars))), 0.62rem)` — the design's size for short handles, shrinking through the middle, floored where the mono type stops being readable, and past the floor `overflow-wrap: anywhere` wraps to a second line instead of truncating. The ellipsis is gone rather than layered over. The arithmetic only works because the ring is monospace (character count *is* text width at ~0.74em per character including tracking); the usable 5.9rem is the 7.5rem diameter less the 2px ring, which `box-sizing: border-box` folds in, and the 0.5rem padding — a first pass at 6.3rem overflowed by 1.4px and wrapped. Verified in a browser against the live render of `/s/timheffley.xyz`: 14 characters on one line inside the ring, `jacobzweifel.bsky.social` (24) and a 31-character DID fallback wrapping to two, none clipped. The landing page's postmark reads a hardcoded `mooring.page` and the OG card is a static PNG, so neither shares the fault. - 2026-08-25 — **The demo-first landing page landed** (PD-10). The apex asks for a handle ("Your site is already written.") and redirects to `/s/[handle]`, resolving the handle server-side so a typo fails inline instead of 404ing; input is normalized (trim, lowercase, leading `@` dropped) by a helper shared with the login action. Every `/s/` preview now renders a claim banner — "This is me — claim it" links to `/login?handle=…` prefilled (deliberately one click, never straight to `authorize()` on GET: prefetchers and crawlers would fire real OAuth flows) — and always carries `noindex`, since the preview path is never the canonical address and unclaimed handles shouldn't rank. The landing page finally wears the site theme (airmail band, warm paper, postmark "par avion"). Found and fixed in verification: the banner needed `color-scheme: dark` so auto-darkening browsers (Chrome's force-dark, default on many Androids) don't invert its hardcoded navy. Banner shows unconditionally on `/s/`, owner or not — revisit if it grates. **Merged as PR #31 and deployed 2026-08-26**, with the critique fixes below in the same deploy; smoke-tested live (apex OG tags, `/s/` preview + banner + `noindex`). - 2026-08-26 — **The landing page took its first critique, and the P1s are fixed** (dual-assessment, 21/40, snapshot in `.impeccable/critique/`; remaining design-decision items are queued above). Copy first, on Jacob's call: em-dash asides removed throughout, and "Own the record" became **"Yours to keep"** — portability as a plain benefit ("leave anytime and everything comes with you"), since the record-ownership framing only sells to protocol-literate readers. Then the three P1s: the lookup form runs through `use:enhance` so the button disables into "Assembling…" and a status line holds through the redirect (the wait for a live PDS read was the page's least-designed moment and the whole demo-first thesis hinges on it); the landing branch emits Open Graph tags against a 1200×630 airmail card at `apps/web/static/og-card.png` (authored as SVG, rasterized with `sharp` — `qlmanage` mangles the scale, and base64-through-the-browser is a context sink); and "Or peek at an example site first" links `/s/jzweifel.dev` so a skeptical visitor sees output before typing their own handle. Mechanical P2s in the same pass: a distinct `--warn` wine for errors with a leading mark, so failure stops wearing the CTA's exact accent red; `aria-invalid`/`aria-describedby` wired and focus kept in the field on a failed submit; 44px controls and a 16px input (iOS zoom-on-focus); input border raised to non-text contrast; the airmail stripe keeps paper-white bands in the dark scheme (they were resolving to `--paper` = `#101520`, degrading the barber pole to generic diagonal stripes); fact titles promoted to real `