series · 1 round
· latest
· https://www.simocracy.org
· @daviddao
Latest (r1): First post-merge audit of the new Training Lab on production as satyam2.climateai.org. Modal opens, all four tabs render, all three AI routes return well-shaped output and the alignment test scores per-proposal — but two real bugs surface: a closure-stale-state race in BaselineTab silently overwrites the user's vote to 'abstain', and 'Apply to constitution' on a sim with no org.simocracy.agents record produces no toast / no error / no close.
series · 2 rounds
· latest
· https://www.simocracy.org
· @daviddao
Latest (r2): Re-ran the flow against the production redeploy containing commit adaad59. The 'Suggested Interview Templates' picker now loads immediately (28-question 'Default Constitution' template appears under Curated), the Use button attaches it, and submitting the form writes a complete org.simocracy.gathering record with a suggestedInterviewTemplates StrongRef to did:plc:awtx57rxuisy4sf4kzzr3uhf/org.simocracy.interviewTemplate/3mjtodp56ps2e.
Reskinned the Simocracy v2 landing in the TransparencIA editorial design language — civic-newspaper rhythm, 44px architectural grid, cobalt halo with sims walking inside, blinking plus marks, drifting cobalt+terracotta accent squares, mono kickers, serif H1 with cobalt italic emphasis, and a new three-up stat-column section pulling live indexer counts. Simocracy's paper+foil palette and clickable walking sims preserved.
Built /chat[[…path]] from a hand-drawn mockup and smoke-tested it live: sign-in via certified.one OAuth, real chat with two sims, four org.simocracy.history records written + verified out-of-band on the facilitator PDS, history-replay confirmed on reload, all four records cleaned up.
33-iteration autoresearch session merged to main. Production end now serves the mega-atlas + WebP-lossless pipeline. All sprite-renderer surfaces (landing hero, /senate walking world, /gallery, sim profiles) verified to load + render correctly. Pixel-rendered output byte-identical to pre-merge baseline (bench checksums pass). Total atlas bytes on prod: 311 KB across 4 character sets — down ~98% from the original raw baseline.
Audited all three projects against the upstream `org.hypercerts.claim.activity` lexicon at hyperscan.dev. Two projects (pi-simocracy, simocracy-v2) were writing `description`, `workScope`, and `contributorIdentity` as plain strings — silently incompatible with the lexicon's union definitions. Wrapped every write site with the right `$type` discriminator, made the read pipeline tolerant of all three union variants, and confirmed all three projects still typecheck, lint, and build.
· simocracy-v2 local dev (Next.js 16 / Turbopack), final HEAD 1657c3a
· reports/simocracy-v2/gathering-world-pan-zoom-minimap/
· @daviddao
Converted /senate and /events/<gathering> from a fixed canvas into a 2× game-map world with click-drag pan, mousewheel zoom (1.0–2.5×, cursor-anchored), and a bottom-right mini-map showing the building footprint, sim dots (gold for owned), and the current viewport rectangle (click to recenter). Six commits to land: ca59ade (initial), 02200b4 (floor-color + sim-sidebar offset + perf v2), 4e3b7b6 (mini-map cream), 78a7838 (zoom min 1.0 — fixes a freeze at full zoom-out), ee328aa (world grow-only on resize + render-gated owned-tinted dots), 1657c3a (codex pets respond to arrow keys when selected). 60 fps idle and during continuous panning at default zoom; viewport culling skips off-screen sims, so render cost is bounded by visible area regardless of total sim count.
Built a unified ⌘K search across sims, skills, events, and proposals with pre-resolved canonical hrefs. Reorganized the navbar into four mental-model groups (You · Browse · Governance · About) with hairline foil dividers on desktop and PLEX section headers on mobile. End-to-end verified across 4 result kinds, 126 indexed records, keyboard navigation, click navigation, and mobile viewport (390×844).
Adds a 'Browse Petdex' sub-tab to the Codex Pet picker so users can mint a sim from any of the ~1,177 community pets at petdex.crafter.run without leaving simocracy. End-to-end smoke test on Node 22 + certified.one ePDS: search → pick Boba → save → sim record lands on the user's PDS with spriteKind=codexPet, petManifest, and a 1.9 MB petSheet blob. After review, polished with cursor-driven infinite scroll, bar-cropped thumbs, and hover-triggered idle-loop animation. All test data cleaned up; production left exactly as found.
Ships org.simocracy.proposalContext (a sidecar lexicon binding hypercerts proposals to Simocracy gatherings) across the entire 5-phase rollout. All seven simocracy-v2 commits live on production. Phase 4 backfill ran (17 sidecars written, 0 errors). Phase 5 dropped the legacy hashtag write entirely, pivoted four server-side fetchers to a sidecar-driven seed (Hyperindexer's per-URI lookup orgHypercertsClaimActivityByUri), and removed every regex strip site — net -63 lines. Smoke-tested live as satyam2.climateai.org: 16 proposals across all gatherings + FtC SF floors render correctly post-Phase-5, including the sidecar-only proposal whose shortDescription carries no hashtag at all.
Verified live against satyam2.climateai.org on the dev build: the Sim profile Interview picker now lists templates that other users attached to gatherings (e.g. the 'Flourishing Interview' from the Floor gathering), in addition to the facilitator's curated 'Default Constitution'. Before the fix, only the curated default was shown because Hyperindexer doesn't ingest org.simocracy.interviewTemplate and the existing PDS fallback only checked the facilitator's repo.
End-to-end test of the new feat/codex-pet-sims branch on satyam2.climateai.org: dropping ~/.codex/pets/einstein into the Mint-a-Sim dialog, persisting on the user's PDS, and verifying horizontal-only pacing in the Senate. All 11 codex-pet acceptance criteria pass; one environment blocker on Node 25 (DPoP retry + undici regression) and two minor warnings flagged.
A new pi extension (`pi-simocracy`) lets you type `/sim mr meow` inside pi: it searches the Simocracy ATProto indexer, fetches Mr Meow's sim record, agents (constitution), and style records, renders his sprite as colored ANSI half-block art inline in the chat at native 32×32 size, and injects his persona into pi's system prompt so pi roleplays as him from then on.
End-to-end test of the org.simocracy.alias slug system on production as satyam2.climateai.org. Sim auto-claim works (toast + slug URL resolves + alias on facilitator's PDS verified). Gathering form availability/taken/invalid checks all green. Two real bugs caught and fixed in follow-up 05a8463: list-page fetchSlugMap returned empty in production (Next.js fetch cache locked the empty response); manual slug-override field wedged on 'Checking availability…' (useEffect dependency loop). Both verified fixed on production: list views now emit slug-aware hrefs, detail pages emit slug as <link rel=canonical>.
New /profile/<did> page reads + writes app.bsky.actor.profile so it stays interoperable with Bluesky. Verified against two real PDS profiles, sims/events list correctly, navbar dropdown links here, 404 path works. One visual bug found and fixed mid-run: long bios pushed the H1 into a dark banner photo.
User reported clicking the village then a proposal threw an error on the GainForest Data Council gathering. Root cause: the Hyperindexer returns proposal `description` fields as Leaflet documents (`{ blocks: [...] }`), not strings — so a freshly-added budget parser crashed with `text.indexOf is not a function`. Shipped a `descriptionToText()` normaliser; bundle re-deployed and the parser now passes.
Added an optional `context` field on `org.simocracy.gathering` so event creators can attach a briefing that flows into every AI sim system prompt (chat, hearing, discussion, S-Process) and the agentic heartbeat. Verified end-to-end on production: the record round-trips through the PDS and the 'Context for Sims' block renders in the event Info sidebar.
· simocracy-v2@94cf72d local production build
· reports/simocracy-v2/gathering-ftc-layout-parity/
· @daviddao
Production-build audit confirming that every Simocracy gathering/event world route available from Events now matches FtC SF canvas, building, and right-sidebar placement. Includes browser screenshots, a screen recording, and raw layout measurements.
· simocracy-v2 local production build
· reports/simocracy-v2/gathering-resize-fix/
· @daviddao
Switched gathering worlds to the same min(width-cap, height-cap) placement rule as /ftc-sf. The building now stays a fixed pixel size as the viewport narrows from 1440 down to ~720, then shrinks at the narrow tail like /ftc-sf. Includes a horizontal-resize screen recording and side-by-side screenshots.
· simocracy-v2@880a955 local production build
· reports/simocracy-v2/gathering-resize-parity/
· @daviddao
Resize audit proving that Generic GatheringWorld now matches the FtC SF canvas and sidebar resize behavior at desktop, tablet, and narrow viewport sizes. Includes a screen recording, paired screenshots, and raw rect measurements.
End-to-end verification on production: authored a new org.simocracy.gathering through the /events Create Event dialog, then opened the event's building sidebar, switched to the Council tab, and appointed FixTestSim via the sim picker. The PDS record now carries councilSims with the sim's StrongRef; the sidebar renders '1 council member' and the sprite walks in the gathering world.
Reproduced, root-caused, patched, and verified live on prod. Saving a sim was surfacing 'expected non-null body source' because Vercel's default runtime flipped to Node 24 (undici 7.x) which interacts badly with Next.js 16's fetch patching on every @atproto/api write. Fix: pin engines.node to 22.x + add .nvmrc (commit 717090a, merged to main). Post-deploy check: the exact create-sim flow that failed now writes Node22FixVerified to the PDS cleanly.
Systematic audit of 19 modal surfaces at a 1280×577 viewport, the realistic 13-inch laptop case. Three real clipping bugs found: Create New Sim right-column overflows DialogContent by 79px (name field, Reset/Reset Colors/Randomize row, and Save button all spill off the right edge), Connect-to-Agent overflows both top and bottom of the viewport without internal scroll, and the FTC S-Process run view's tab strip clips '🔍 Disagreement' at the right edge. Two additional structural risks noted: FTC proposal-detail modal's 16:10 hero image eats 85% of dialog height on short viewports, and two smaller DialogContents ship with neither max-h cap nor overflow-y-auto.
End-to-end attempt to author an interview template, create a gathering, and paste a custom building-image URL. Blocked: POST /api/records returns 500 "expected non-null body source" for every collection, so nothing reaches the PDS. The UI's Save button silently no-ops for the user — no toast, no error banner.
The Simocracy landing page is reskinned in the fieldnotes aesthetic — cloth-green background, gold foil headings in EB Garamond, italic Cormorant taglines, IBM Plex Mono small-caps labels, a rotating ASCII globe, and pixel citizens walking along the hero. Ships with a 52 s screen recording, 4 still frames, and a fixed post-ship bug where the globe rendered skewed because @theme inline tokens don't emit runtime CSS custom properties. Landing only; other routes unchanged. Navbar restyle, name-tag restyle, and old-component cleanup deferred to R2.
End-to-end agent-browser walkthrough of sim creation, Save, and the Interview picker. First run reproduced a silent Save dismissal 3× on simocracy.org; a post-redeploy follow-up confirmed the fix and validated the Interview picker + questioning phase.
A text-only Claude Sonnet (via pi --model claude-sonnet-4-6) was handed Simocracy's skill.md and a handle + app-password. From the new /api/sprite-options endpoint's text descriptions alone, it composed a 9-part pixel-art avatar, logged into the user's self-hosted ePDS, and wrote org.simocracy.sim on the first attempt — then, unprompted, spun up a second sim on the nekonin (catgirl) character set. Both render correctly in the gallery.