diff --git a/docs/NEXT.md b/docs/NEXT.md index 7c421c4..984f50e 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-25 (**all operator steps done** — deployed, contactEmail set, Image Transformations live (avatar 966KB→17KB webp), /about written, lexicons republished. Critique 3 ran: 25 → 31 → 29, the dip being newly discovered pre-existing issues; the mechanical fixes for them are in the current PR)._ +_Last updated: 2026-08-25 (**session handoff** — the 2026-08-24/25 theme-UX push is complete through PR #25; critique trend 25 → 31 → 29 → 32 across four dual-assessment rounds, snapshots in `.impeccable/critique/`. Nothing is in flight; the queue below is current and each item starts cold)._ ## Where things stand @@ -14,10 +14,14 @@ Feasibility is done and the verdict was **build it** (see `FEASIBILITY.md`). All Done so far: OAuth login (loopback dev client; hosted-client path ready pending a real key + deploy) with D1-backed state/session stores; lexicon convention tests; **read-only adapters** for Bluesky (profile + posts, replies filtered), standard.site (documents/publications, `pub.leaflet.document` fallback only when no standard.site docs exist), and sifa (profile/positions/education/skills, defensively parsed) — fetch-injected modules in `apps/web/src/lib/server/atmosphere/` with unit tests, plus `detectSources` (drives the ADR 0012 default section order) and a source-overview admin page; **site/page authoring** — record builders, PDS writes through the OAuth session, and the `/admin` + `/admin/pages` CRUD routes; **the professional-presence theme** — the render pipeline in `apps/web/src/lib/server/render/` and the public routes at `/s/[handle]`. Remaining, roughly in dependency order: -- **Theme UX overhaul, remaining tail** (critique trend 25 → 31 → 29 across three dual-assessment rounds — snapshots in `.impeccable/critique/`; the 29 reflects newly *discovered* pre-existing issues, not regression, and the current PR fixes the mechanical ones: per-site favicon (was the stock Svelte logo — the round-3 P0), career records sorted newest-first (was raw PDS record order), `yearSpan` tolerant of sifa's formless date strings, the career "More" disclosure made reversible, visible contact address in the footer, banner `srcset` + 768 blob width, absolute `og:image` through /blob, `color-scheme`/`theme-color` metas): - 1. *Record-level career curation fields* (decided 2026-08-24, staged): hide/order/feature for positions, education, skills — e.g. de-emphasizing a high-school entry or dropping generic imported skills ("Software Development", "Windows 7"); becomes `careerSection` fields once the admin grows a section editor. The round-3 review sharpened the framing: "honest by default, curatable by choice." - 2. *Design questions queued from round 3*: an airmail **sign-off block** closing the page (postmark/restated contact/handle — the metaphor currently peaks in the first 300px and the page ends unresolved); whether email should be the only action on an Atmosphere-native product (no follow/DM intent anywhere); scheme-aware site color overrides (a single background override pins both schemes); mono-metadata density (the detector's standing flat-type finding). - 3. *Residual*: no RSS; postcard hero still unexercised by a real record. +- **Post embed rendering** (queued 2026-08-25, Jacob's call): render Bluesky post embeds instead of the "· view on Bluesky" cue that currently marks `hasEmbed` posts (critique 4: "the inconsistency reads as a glitch even though it's signal"). Scope: external-link cards (embed `app.bsky.embed.external` — title/description/thumb, thumb blob via the `/blob` route), image thumbnails (`app.bsky.embed.images` — blobs via `/blob`, alt text from the record), and quote posts (`app.bsky.embed.record` — needs a second `getRecord` for the quoted post; render author/text compactly, tolerate deleted/blocked targets). Adapter work in `atmosphere/bluesky.ts` (embed extraction, defensively parsed like facets), view-model additions in `site-view.ts`, theme rendering in `SiteSections.svelte` posts notes. The `/blob` width allowlist (256/768/1600) probably gains a thumb size. Keep the "view on Bluesky" cue only for embed kinds not rendered. +- **Theme UX polish, remaining tail** (all mechanical findings from four critique rounds are fixed and deployed; what remains is design-decision territory — mock on a canvas before coding, per this push's working pattern): + 1. *Record-level career curation fields* (decided 2026-08-24, staged): hide/order/feature for positions, education, skills — e.g. de-emphasizing a high-school entry or dropping generic imported skills ("Software Development", "Windows 7"); becomes `careerSection` fields once the admin grows a section editor. Framing from the reviews: "honest by default, curatable by choice." + 2. *The airmail sign-off block*: the page opens like a letter and never signs off — a closing band above the footer (restated contact/postmark/handle; round 4 asked "what would 'Warmly, Jacob' look like as a template affordance?"). + 3. *Atmosphere-native actions*: email is currently the only action; no follow/DM intent anywhere on an Atmosphere-native product. + 4. *Contrast guards for user color overrides*: `theme.colors` can set any `--accent`/background; nothing protects the AA math or the dark scheme (a single background override pins both schemes). + 5. *Volume behavior*: every section is an uncapped list — decide caps/pagination ("latest N") before a user with 40 posts finds the missing answer. Posts/writing already honor per-section `limit` in the site record; the question is defaults and UI. + 6. *Residual*: no RSS; postcard hero still unexercised by a real record (flip `heroSection.style` on a site record to demo); mono-metadata density (the detector's standing flat-type finding, 10.9–11.5px cluster — deliberate system, revisit only if it keeps bothering reviewers). - **Thin deletion-honoring cache** over the direct PDS reads (ADR 0010 §4) — deliberately reordered below hosting on 2026-08-07: rendering reads live per request, which is correct until there is traffic to cache. Revisit once sites are actually served; when it comes up, start from Jetstream v2's snapshot+tail replay (`research/2026-08-14-bluesky-protocol-services.md`) rather than a relay consumer. - Later, when token-refresh races become real: a Durable-Object `requestLock` for the OAuth client. @@ -30,6 +34,7 @@ Done so far: OAuth login (loopback dev client; hosted-client path ready pending ## Done +- 2026-08-25 — **Critique rounds 3–4 and their fix PRs (#24, #25) merged and deployed.** Round 3 (29/40) discovered pre-existing issues all earlier reviews missed; PR #24 fixed the mechanical ones: per-site favicons (the stock Svelte logo was the P0 — sites use the record `icon` blob → avatar fallback via `/blob`, app pages get an airmail-striped icon), sifa positions/education sorted newest-first (record order was never meaningful), `yearOf`/`yearSpan` tolerant of formless date strings, the career "More" disclosure made reversible with focus retained, visible contact address in the footer, banner `srcset` + 768 blob width, absolute `og:image` via `/blob`, `color-scheme`/`theme-color`. Round 4 scored **32/40** ("an authored design with a real point of view") and caught PR #24's own regression; PR #25 fixed it: footer wraps at phone widths (the visible email had overflowed the nowrap row), the career summary leads with its full first paragraph so the quantified proof ("~1M → 5M+") is visible without clicking, Skills sublabel, "+21 more"→"Show fewer" swap, ≥24px disclosure targets, banner double-download eliminated. Working pattern that held all push: dual-assessment critique → decisions with Jacob (AskUserQuestion) → design canvas when the change is visual → PR with local verification against live PDS data → deploy → re-critique. - 2026-08-25 — **PR #22 merged: contact affordance, career clamp, blob proxy, polish.** The site record gained optional `contactEmail` (admin settings field; renders a "Write to me" mailto stamp in every hero and a filled "Say hello →" chip on the Open to row — answering the re-critique's P0). The sifa career summary clamps to two sentences behind a native disclosure; record-level curation fields stay queued. Profile images serve through `/blob/{did}/{cid}?w=` (ADR 0015, **Accepted**): DID-document-pinned source, width allowlist, immutable cache, `cf.image` transform with pass-through fallback. Sweep: own-host links suppressed in bios, single writing link, consistent new-tab externals, permalink `aria-label`s, ≥24px tap targets, dark-mode airmail token, " · " paragraph separator in meta descriptions, avatar alt text. Re-critique of the deployed overhaul scored **31/40** (from 25; dual-assessment snapshots in `.impeccable/critique/`). - 2026-08-24 — **Theme UX overhaul landed** (PR #20 merged: linkification everywhere, two CSS specificity/background bugs, sifa `startedAt`/`endedAt` date fix, writing URLs joined from publication url + doc path, skill cap, dates in `