flue-simocracy · browser-harness-smoketest
All four flue-simocracy tools driven through Telegram Web by browser-harness, with PDS-level verification on every write and visibility checks on simocracy.org. Three tools surface end-to-end through the indexer; the fourth is blocked by an indexer ingestion issue that affects every org.hypercerts.claim.activity record on a bsky.network PDS, regardless of writer.
Headline. Every write hits the host PDS in the lexicon-strict shape canonical at hyperscan.dev (flue-simocracy is named the reference implementation in the hypercerts-description-union-fix audit). The org.simocracy.history sidecar for post_comment reaches simocracy-indexer within seconds and surfaces on simocracy.org/stats Recent Activity. The post_proposal activity record itself never reaches the indexer — not because of our writes, but because the same record written by hypercerts-scaffold-atproto on the same bsky.network DID also fails to surface, while one written from a climateai.org ePDS minutes earlier did surface. The indexer's bsky-side firehose tap appears to filter out org.hypercerts.*; the ePDS tap forwards everything.
| Tool | Telegram reply | Host PDS | simocracy-indexer | Hyperindex | simocracy.org |
|---|---|---|---|---|---|
simocracy_lookup |
in-character | n/a (read) | n/a | n/a | n/a |
update_sim |
tool-call ✓ | +45 chars, marker present | indexed | n/a | role refresh inline |
post_comment |
tool-call ✓ | comment + history | history sidecar indexed | n/a | /stats Recent Activity |
post_proposal |
tool-call ✓ | all 3 records | sidecars yes, activity no | null (~10 min after write) | invisible |
/start — sprite, identity, write-access badge, suggestion buttons. Reviewer 1902955493 is mapped to Mr Meow with canWrite: true.
simocracy_lookup — returned the correct Einstein AT-URI (3mfo5txyqmo2f), in-character ("That brainiac Einstein is hiding at…"), tool-call status rendered inline.
update_sim — sim appended a marker sentence to its own constitution. "Re-introduce yourself" suggestion appears because the persona changed.
post_comment — sim posted a comment on an existing proposal AT-URI; tool-call ✓, in-character reply ("Done with that smoke test."), Undo button appended.
post_proposal — sim drafted and submitted a proposal bound to The Senate gathering, with a $42 budget line and the strict union $type wrappers required by the lexicon.
description: { $type: "org.hypercerts.defs#descriptionString", value }, workScope: { $type: "…#workScopeString", scope }, image: { $type: "…defs#uri", uri }.
/stats → Recent Activity. Top entry: “David Dao commented as Mr Meow · 23M AGO” — our post_comment via the bot, surfaced via the org.simocracy.history sidecar. The post_proposal from the same minute does not appear here.Wire shape passes the canonical lexicon. flue-simocracy writes description / workScope / contributorIdentity as $type-wrapped union objects exactly as hyperscan.dev requires — the cross-project audit from earlier today named it the reference implementation.
Telegram → Flue → PDS path is solid. Every tool round-trip succeeded: the bot streamed in-character replies, tool-call status badges rendered, and the bridge confirmation gate works (the SMOKE_TEST_NO_CONFIRM=1 bypass was used only to keep the run flake-free; manual taps work too via CDP Input.dispatchMouseEvent, which fires callback_query updates trusted by Telegram Web — contradicting the old AGENTS.md note that said synthetic clicks don't work).
Sim attribution lands. The org.simocracy.history sidecar for the comment was indexed within seconds and surfaced on /stats Recent Activity ("David Dao commented as Mr Meow · 23M AGO") — the post-Phase-5 history-record path works for bsky.network DIDs.
org.hypercerts.claim.activity from bsky.network DIDsSymptom. The proposal record itself at://did:plc:qc42fmqqlsmdq7jiypiiigww/org.hypercerts.claim.activity/3mlidgsaoha2b is on the host PDS (verified, lexicon-valid), but orgHypercertsClaimActivityByUri(…) against api.hi.gainforest.app returns null 30 minutes after the write. The same query against simocracy-indexer also returns nothing for this collection.
Not a wire-shape issue. A control proposal written via hypercerts-scaffold-atproto on the same bsky.network DID, at the same time, with a near-identical record body, was also not indexed. Meanwhile, a similarly-shaped record posted from climateai.org (an ePDS) was indexed within minutes.
Likely cause. simocracy-indexer taps two upstreams — tap.railway.internal (bsky.network firehose) and tap-epds.railway.internal (ePDS firehose). Our org.simocracy.proposalContext + org.simocracy.history sidecars (in the same atomic commit) do reach the indexer via the bsky tap, so the tap is delivering some collections from this DID. The activity record specifically is silently dropped — most likely the bsky-side tap forwards org.simocracy.* only, and org.hypercerts.* arrives via the ePDS tap, which doesn't see bsky.network repos.
What unblocks simocracy.org/proposals for bsky.network DIDs. Either (a) extend the bsky-side tap to forward org.hypercerts.* as well, or (b) rely on the hourly periodic reconciliation already configured in simocracy-indexer/index.js to backfill activity records from each known DID's PDS. Periodic reconciliation should eventually pick this up; the cost is a 0–60 minute visibility delay.
post_proposal tool added. The flue agent had no equivalent of pi-simocracy's simocracy_post_proposal; this run ports the wire-shape (proposal + proposalContext sidecar + sim-attribution history) from pi-simocracy/src/writes.ts and adds the same TG-confirmation gate as post_comment / update_sim. SMOKE_TEST_NO_CONFIRM=1 bypasses the gate for headless runs.update_sim role-refresh path bug. After Flue bundles to dist/server.mjs, __dirname two-deep resolved to /Users/david/Projects/.flue/roles/ instead of the project's own. Fixed to walk up to the nearest package.json.post_proposal needs the gathering's CID for the proposalContext StrongRef; the gathering lives on a different DID's PDS. Added getRecordWithCidFromPds() in src/simocracy.ts — does a cookie-less HTTP com.atproto.repo.getRecord against the resolved PDS so the host's auth-bound agent doesn't try to read someone else's repo.flue-simocracy at daviddao/flue-simocracy
Bot@SimocracyBot on Telegram
ReviewerTG 1902955493 → Mr Meow (at://did:plc:qc42fmqqlsmdq7jiypiiigww/org.simocracy.sim/3mfo6vwfaka24)
Test gatheringThe Senate (at://did:plc:awtx57rxuisy4sf4kzzr3uhf/org.simocracy.gathering/3mijiollfqs2i)
Driverbrowser-use/browser-harness (browser-harness -c …)
Lexicon sourcehyperscan.dev/agents/lexicon/org.hypercerts.claim.activity
Run commandcd flue-simocracy
SMOKE_TEST_NO_CONFIRM=1 npm run dev & # flue dev on :3583
SMOKE_TEST_NO_CONFIRM=1 npm run tg-shim & # grammy shim on :3584
browser-harness -c 'click_at_xy(...); type_text(...); press_key("Enter")'
npx tsx scripts/list-today-mine.ts # PDS verify after each write
Cleanupnpx tsx scripts/delete-uri.ts <at-uri> # per record
npx tsx scripts/restore-sim.ts /tmp/sim-snapshot-mr-meow.json
Evidenceupdate_sim PDS verify · post_comment PDS verify · post_proposal PDS verify · indexer status