plresearch-org · edit-ai-opportunity-spaces-r6 · round 6

Round 6: fix byline placement + expand to all CMS pages

@daviddao

Reported in prod: daviddao.org edited Economies & Governance, the audit record landed on blewit.us-west.host.bsky.network, the indexer picked it up — yet the byline stubbornly refused to appear. Two bugs stacked on top of each other: r5 only wired the byline onto opportunity-space detail pages (not area pages), and when I extended it on the quick-fix commit I put the byline as a sibling of the fixed-positioned <EditPageButton>, which dropped it ~2500 px down the document.

Date: 2026-04-20 · Target: Economies & Governance · Previous: r5 (pass) · pass


Headline result

7
CMS pages now render the byline
2
Stacked bugs found & fixed
0
New lines of CSS (reused existing mt-4)
1 / 1
daviddao's real edit surfaced

Headline. Fix verified on prod against the user’s own real-world edit (not a synthetic test): /areas/economies-governance/ now correctly shows “Last edited by David Dao · 38 min ago · View history (1)” under the breadcrumb, and the drawer opens to the daviddao.org · sections edit. Byline also verified on the 4 opportunity-space detail pages (already working from r5) and the other CMS area/about/collaborate pages (silent when zero events, as designed).

The two bugs

#BugEffectFix
B1 r5 only imported <EditHistoryByline> in the 4 opportunity-space detail pages, not on area pages, about, or outreach. daviddao’s edit of the area-economies-governance page record landed on her PDS and in the indexer, but the target surface (/areas/economies-governance/) had no byline to render it. Wire <PageEditHistoryByline rkey=…> on 7 additional page routes.
B2 First attempt to wire the byline put it as a sibling of <EditPageButton>. <EditPageButton> is position: fixed & its JSX lives near the end of each page file. The byline <div> fell wherever EditPageButton sat in source order — for the E&G page, top: 2500.5px out of a ~3000px page height. Cosmetically invisible. Move the byline to sit directly below <Breadcrumb>, where it visually anchors as a subtitle.

B2 was visible in the DOM (get html showed it existed) but not in screenshots. The computed getBoundingClientRect() confirmed it:

// browser console on /areas/economies-governance/ after the broken deploy
> document.querySelector('.mt-4 > .flex').getBoundingClientRect()
{ top: 2500.5, left: 88, width: 1104, height: 20 }

Opportunity-space detail pages happened to work in r5 because their <EditPageButton> sat right after <Breadcrumb> in JSX — pure coincidence. The 7 newer pages all had content between the two.

What changed

Two commits on plresearch.org@main:

48fb939Wire byline on 7 CMS page routes — first attempt, placement bug B2 shipped d02541fMove byline from below <EditPageButton> to below <Breadcrumb> on every file

Pages that now render the byline (when the target record has at least one audit event):

Walkthrough

E&G page with daviddao byline under breadcrumb
01Money shot: /areas/economies-governance/ with David Dao’s real edit surfaced as a byline between the breadcrumb and the hero. Signed out, so “Collaborate” is in the header; the byline renders for everyone (history is public).
Drawer showing the single daviddao edit
02Clicking “View history (1)” opens the drawer: David Dao · 38 min ago · changed sections. Data flowed cleanly from daviddao’s PDS (blewit.us-west.host.bsky.network) → indexer (via firehose + manual backfill after its earlier restart) → our GraphQL → /api/edit-history → component.
Opspace detail page byline unchanged
03Regression check: /areas/ai-robotics/opportunity-spaces/open-compute-networks/ still shows its r5 byline (Satyam Two · 1h ago · View history (2)). The opspace detail pages were unaffected by the r6 fix.
Digital Human Rights page, no byline, clean layout
04Zero-event page: /areas/digital-human-rights/. No one has edited the area-digital-human-rights record yet via the UI, so the byline renders as null. Breadcrumb → icon + title → content flows cleanly with no empty slot.
/about shows clean layout with no byline
05Same for /about/. The component is wired and will slot in under the breadcrumb as soon as someone edits the about record via /admin or /about/edit.
E&G impact page clean
06/areas/economies-governance/impact/ similarly renders cleanly with no byline, waiting for its first edit of the area-eg-impact record.

Verification

daviddao’s raw audit record, still on her PDS, cryptographically signed by her key:

$ curl -sG "https://blewit.us-west.host.bsky.network/xrpc/com.atproto.repo.listRecords" \
    --data-urlencode "repo=did:plc:qc42fmqqlsmdq7jiypiiigww" \
    --data-urlencode "collection=org.plresearch.editEvent" | jq '.records[0].value'
{
  "$type":    "org.plresearch.editEvent",
  "editor":   "did:plc:qc42fmqqlsmdq7jiypiiigww",
  "editorHandle": "daviddao.org",
  "target":   "at://did:plc:pgwr6hkosgznfl5nz7egajei/org.plresearch.page/area-economies-governance",
  "targetCid": "bafyreihukoqyujcafnsexgpzu7cnmvvrwd3tfmsgvwbznbi5ntn4xum6mi",
  "collection": "org.plresearch.page",
  "changedFields": ["sections"],
  "editedAt": "2026-04-20T21:55:12.319Z"
}

After the r6 deploy, our API surfaces it:

$ curl -s "https://www.plresearch.org/api/edit-history?target=at://…/org.plresearch.page/area-economies-governance" | jq '.count, .events[0].editorHandle, .events[0].changedFields'
1
"daviddao.org"
["sections"]

Findings

FIX1 · Byline now renders on 7 additional CMS pages

Areas index, each generic area, E&G subareas/impact, about, and collaborate now load <PageEditHistoryByline>. Parity with opportunity-space detail pages from r5.

FIX2 · Byline no longer falls to the bottom of the page

Moved from <EditPageButton>-sibling to <Breadcrumb>-sibling. The distinction matters because <EditPageButton> uses position: fixed; its JSX position in the file doesn’t determine where it renders, but it does determine where an ordinary sibling div renders — which is why placing the byline next to EditPageButton worked by accident for opspace pages and broke everywhere else.

P1 · End-to-end loop verified against a real user edit

No synthetic test data this time. The site owner performed a normal edit to fix real content, the audit record landed on her PDS, the indexer caught it, and the r6 deploy surfaces it on the public area page — exactly the product path.

P2 · Zero-event pages stay clean

Verified on /areas/digital-human-rights/, /about/, and /areas/economies-governance/impact/: no empty slots, no “0 edits” chip, no fallback text. The component returns null when the events array is empty, and the layout flows as if the byline weren’t there.

I1 · Landing page (/) is excluded

The homepage has no breadcrumb, and its full-bleed hero has no sensible anchor for a byline. Admins still reach the history via /admin or the /edit route. If a reasonable slot shows up later (e.g., a footer chip under the hero), it’s a one-line add.

I2 · Detection via getBoundingClientRect() was the key diagnostic

The bug was subtle because the byline rendered correctly into the React tree and the DOM — it was just positioned off-screen. Both View history (1) and the avatar URL were present in document.querySelector('.mt-4').outerHTML. The next time a “rendered but invisible” bug shows up, jumping straight to getBoundingClientRect() saves a lot of time.

Reproducing

Content URL/areas/economies-governance/ Editordaviddao.org (on blewit.us-west.host.bsky.network) Target URIat://did:plc:pgwr6hkosgznfl5nz7egajei/org.plresearch.page/area-economies-governance Commits48fb939 (expand — shipped bug), d02541f (reposition — fix) Indexer backfillPOST https://plresearch-indexer-production.up.railway.app/backfill {"dids":["did:plc:qc42fmqqlsmdq7jiypiiigww"]} — needed once because the indexer’s tap firehose consumer restart from r5 had missed daviddao’s edit at 21:55Z Verify on PDScurl -sG https://blewit.us-west.host.bsky.network/xrpc/com.atproto.repo.listRecords --data-urlencode repo=did:plc:qc42fmqqlsmdq7jiypiiigww --data-urlencode collection=org.plresearch.editEvent Verify via APIcurl -s "https://www.plresearch.org/api/edit-history?target=at://…/org.plresearch.page/area-economies-governance" Previous roundsr1 (fail) · r2 (pass) · r3 (pass) · r4 (pass) · r5 (pass) Screenshotsassets/01-*.pngassets/06-*.png