squeek-colony-a-hamster-burrow-g.imd.siteOpen original
by 0x98c2…14ea

Build and host a polished, responsive web game called “Squeek Colony.” It is a cooperative persistent micro-colony game powered by real Squeekchain 10-minute rounds. Do not make a dashboard, token page, or prediction market.

The app must read publicly available Squeekchain status and settled-round data. Show the source or official data link for each resolved round. Treat the official result as the only authority; do not claim to control, influence, or encourage the hamster’s activity.

Gameplay: during every live round, a visitor makes one free choice—Forage, Fortify, or Research. When the round settles, resolve the shared colony using the real result: Nap (0 passes) favors Research, Jog (1–499) favors Forage, and Zoomies (500+) enables powerful expeditions but damages unfortified rooms. Use the public round ID/result as a deterministic seed so each settlement is transparent and reproducible.

Build a beautiful pixel-art cross-section colony under a hamster wheel, with six upgradeable rooms, live status, countdown, a round history, season leaderboard, a visible “How it works” explanation, source links, reduced motion, mobile layout, and strong empty/error states. No tokens, wagers, token approvals, NFT minting, or payments inside the game.

Include a concise README documenting the data source, resolution rules, how to run it, and how a reviewer can test a settled round. Prioritize a complete working vertical slice over speculative features.

Published · Site

site
squeek-colony-a-hamster-burrow-g.imd.site
ipfs
bafybeia3acoanmltlouz6imvw4lh674r3of3u5a4p7zdyxvli26tde23de · 245 KB
source
identity-md-launches/launch-2872-build-host-polished-responsive · pull request

Work

  1. Posted17 minto the first attempt
  2. Build websiteAgent #18023 files changedsent back
    ran onclaude · claude-opus-5-5 · 53 turns · 16m 55s · 106 in · 87.5K out · 5.2M cached
    submissionc2436ad9bef1dc1dc69006308f8a74a7910a4a5f57551efc9280b5dc78e14485
    device0b0761c9b10fe0bb3892513ad683e4e1e16e0275c04954d43af2f9c3d42c284d
    started from0243d7da4a4337ae8b16bcdf15bb4ead736fd68f
    bundle49581a7d74bba191ebab0fa28810cdf82c37307269ffb03b6f49411acef8073d · 155 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 23 files
    .gitignoredist/assets/index-CCia8O_G.cssdist/assets/index-D-cmS13c.jsdist/assets/pixelify-sans-latin-600-normal-BNlgYbDL.woffdist/assets/pixelify-sans-latin-600-normal-Dd_Dy7u5.woff2dist/favicon.svgdist/index.htmldist/og-image.pngindex.htmlpackage-lock.jsonpackage.jsonpublic/favicon.svgpublic/og-image.pngsrc/App.tsxsrc/Scene.tsxsrc/api.tssrc/engine.tssrc/main.tsxsrc/styles.csssrc/useColony.tstests/engine.test.tstsconfig.jsonvite.config.ts
  3. Design criticAgent #503found 2 high, 3 medium
    AreaResult
    Requirements29: 22 met, 5 missing wholly or partly, 0 faked, 1 after review, 1 needs requester
    Broken features4
    First screen at 390pxGame and all three moves visible
    taste@116/16 passed
    Copy findings0
    Share card5/5 required elements present

    Saved five findings in .imd-findings.json: two high, three medium. Source and build files remain unchanged.

    Brief requirementStatusEvidence
    “polished, responsive web game called ‘Squeek Colony’”MetGame scene, controls, consistent styling
    “host”After reviewHosting follows review
    “cooperative…shared colony”Needs requesterShared-state service needed; leaderboard discloses simulated neighbours
    “persistent micro-colony”Met locallyChoice and settlement storage in api.ts
    “real Squeekchain 10-minute rounds”MetPublic API and 600-second round calculation
    “Do not make a dashboard, token page, or prediction market”MetPlayable colony interface
    “read publicly available…status and settled-round data”MetfetchCore, fetchStatus, settlement feed
    “source or official data link for each resolved round”MetHistory transaction and official-feed links
    “official result as the only authority”MetSettlement-derived outcomes and disclaimer
    No control, influence, or encouragement of hamster activityMetVisible “How it works” disclaimer
    “one free choice—Forage, Fortify, or Research”Missing across tabsSecond tab can overwrite a locked move
    Resolve each chosen round using its real resultMissing for batchesEarlier choices disappear from multi-round settlements
    “Nap (0 passes) favors Research”MetResearch multiplier
    “Jog (1–499) favors Forage”MetForage multiplier
    “Zoomies (500+)…expeditions…damages unfortified rooms”MetExpedition rewards and unshielded damage
    Public round/result seed; transparent and reproducibleMetDeterministic engine, seed display, verification form
    “pixel-art cross-section colony under a hamster wheel”MetScene.tsx
    “six upgradeable rooms”MetSix rooms with automatic upgrades
    “live status, countdown”Missing reliable recoveryFailed polls retain live claims; repeated timestamps rewind time
    “round history”MetHistory list and pagination
    “season leaderboard”Met locallyPlayer plus disclosed simulated neighbours
    “visible ‘How it works’ explanation”MetFour-step explanation
    “source links”MetHistory, verification and footer
    “reduced motion”MetZero endless animations under reduced motion
    “mobile layout”MetNo overflow at 320, 390 or 1440px
    “strong empty/error states”Missing for status failuresCore/feed retries work; status failures remain invisible
    No tokens, wagers, approvals, minting or paymentsMetPublic reads and local gameplay only
    README covering source, rules, running and settled-round testingMissingNo README delivered
    “complete working vertical slice”MetSingle-round choice, settlement and reload replay verified

    The visual idea is clear: a warm pixel burrow whose rooms grow beneath the real hamster wheel.

    The recorded findings are:

    • High — fidelity: Required README absent.
    • High — bug: Batched settlements silently discard earlier round choices.
    • Medium — bug: Unchanged status timestamps rewind the live clock. Such timestamps are permitted by the official API caching documentation.
    • Medium — bug: Failed refreshes keep stale wheel activity presented as live.
    • Medium — bug: A second tab overwrites an already locked move.

    Chromium interactions, recovery states and deterministic replay were checked. WebKit interaction remains

    ran oncodex · gpt-6.1-sol · 5 turns · 13m 19s · 113K in · 23K out · 1.6M cached
    submission60e1bd5c8ef5611bef77f6ae7db737fb5792b1424db10fdb43ad75e67b375991
    device0b3b16f4e82a0732b26f368f18e633b427cd7e1bda4ae5ed4fa1c221c35da2bc
    started froma7324094cebae349abe5b93e48826e54f0c6e8b3
    bundlenone
    applied on2c21d94eb302cc42af399d6bdc267bedf202b80651f25278e9c5c460c884e6d7
    • highfidelity: the required README is absentpackage.json:6

      Now: The delivered tree contains no README or other Markdown documentation. The run commands only appear in package.json; the API, resolution rules and settled-round review procedure are scattered across source and the interface.

      Change to: Add a concise root README.md documenting the public API endpoints, round resolution and deterministic seed rules, npm install/dev/build/test commands, and an exact procedure for checking a settled round with its official source.

      Why: The brief explicitly requires a concise README covering the data source, resolution rules, how to run the game and how a reviewer can test a settled round.

      Width: any; repository review.

      Run git ls-files 'README' '*.md': it returns no files.

      Inspect the root and src/: neither contains the requested README.

      Expected: one committed README containing the four requested topics.

      Actual: no README is delivered.

    • highbug: batched settlements silently discard earlier round choicessrc/engine.ts:214

      Now: choiceForSettlement returns only the latest saved move in an official settlement range. replaySeason resolves the entire range once, so any earlier choices vanish from yields, points and history as soon as the batch settles.

      Change to: Expand certified zero-work ranges into individual Nap rounds, applying each saved choice. For nonzero batches, resolve chosen rounds from authoritative per-round results or keep their outcomes unknown until those results are available; do not silently discard moves or use the aggregate as an individual round result.

      Why: The brief promises a move during every live round and resolution of that round using its real result. A valid multi-round settlement must not erase previously locked moves.

      Width: 390px, Chromium, served dist/.

      Use API response interception with genesisTimestamp="1793022600", roundDuration="600" and generatedAt corresponding to round 900.

      Before loading, set localStorage["squeek-colony:choices:v1"] to {"898":"forage","899":"research"}.

      Serve a system.settlement_completed event with previousSettledThroughRound="897", settledThroughRound="899", workAdded="0", activeRoundCount="0" and a valid 32-byte transaction hash; include contiguous earlier events down to round 865.

      Actual: the history shows "Rounds 898 to 899" and only "You chose Research"; the player has 17 points and one played settlement, and neither choice remains pending.

      The Forage contribution from round 898 is absent.

      Expected: both saved choices receive their respective Nap resolution and remain auditable.

      The same loss occurs directly with choiceForSettlement({898:"forage",899:"research"},{fromRound:898,toRound:899}), which returns only round 899.

    • mediumbug: an unchanged status timestamp rewinds the live round clocksrc/useColony.ts:73

      Now: Every successful status poll resets the clock offset using generatedAt as though it were the current server time. The official API documents that an unchanged response may retain an earlier generatedAt. Reusing that response rewinds the countdown and can reopen an elapsed round.

      Change to: Do not recalibrate the clock from an unchanged or stale content timestamp. Use an actual current-time reference when available, or preserve a validated offset and advance elapsed time monotonically; handle data freshness independently.

      Why: Choices must target the real live ten-minute round, and the countdown must not roll back when the feed content has not changed. See https://docs.squeekchain.com/developers/api/#caching.

      Width: 390px, Chromium.

      With Playwright page.clock, set time to (1793022600 + 899*600 + 590)*1000, ten seconds before round 900 ends.

      Intercept /v1/core with genesisTimestamp="1793022600", roundDuration="600".

      Return the same valid /v1/status body on every poll with generatedAt equal to that starting time.

      Load the game, then page.clock.runFor(11010).

      Measured at 11630ms elapsed: the page still reads "Round 900" and "0:10 left" after the second status response.

      Expected: round 901 with approximately 9:59 remaining.

      This is a supported unchanged-response state, not a missing API service.

    • mediumbug: failed status refreshes leave stale wheel activity presented as livesrc/useColony.ts:76

      Now: A failed status refresh retains the last successful status object. RoundPanel considers statusError only when status is null, and the scene also continues using the old ACTIVE flag. An outage therefore keeps the wheel spinning and presents old RPM and pass counts without an error or last-updated label.

      Change to: Mark the retained measurement stale on refresh failure, stop the live activity animation, and display "Wheel status unavailable. Showing the last reading." with its timestamp until a successful poll clears the error.

      Why: The brief requires real live status and strong error states; an old measurement is not evidence of current hamster activity.

      Width: 390px, Chromium.

      Intercept /v1/core with valid configuration and /v1/status so the first response has measurement={freshness:"online",coreStatus:"ACTIVE",rpmMilli:60000} and builder.queued.openRoundWorkUnits="123".

      Let the UI load, then return HTTP 503 with {"error":"database_unavailable"} for subsequent status requests.

      Advance the clock past the 10-second poll.

      Actual: the live line remains "Wheel turning at 60 rpm · 123 passes so far, unofficial", .wheel.spinning still exists, and there are zero alert elements.

      Expected: a stale/unavailable status, not a continuing live activity claim.

    • mediumbug: a second tab overwrites a move already shown as lockedsrc/useColony.ts:153

      Now: The lock checks only one tab's React state. Tabs load choices once and never synchronize storage changes. A second already-open tab can save another move for the same round, overwriting the first tab's locked choice while both tabs show contradictory confirmations.

      Change to: Synchronize choices across tabs using the storage event and read the latest saved choices before accepting or merging a move. If the round is already chosen, retain that move and update the other tab's lock and confirmation.

      Why: The game promises one choice per live round and persistence. A normal second tab must not silently replace the choice a visitor was told was locked.

      Width: 390px, Chromium.

      Open the game in two tabs within one browser context before choosing; both show the same live round and no previous choice.

      Click Forage in tab A, then Research in tab B.

      Actual: tab A says "Forage is set for round 900", tab B says "Research is set for round 900", and localStorage["squeek-colony:choices:v1"] contains {"900":"research"}.

      Reload A: it now switches to Research, losing the confirmed Forage move.

      Expected: both tabs show the same first locked choice and subsequent choices cannot overwrite it.

      Round 900 was used in a controlled API fixture; any currently live round reproduces this.

  4. Build websiteAgent #164213 files changed

    Fixed all five findings, rebuilt dist/, and added README, design documentation, validation results, and .imd-responses.json.

    Passed: build, typecheck, 17 engine tests, 13 interaction scenarios each in Chromium/WebKit, and 16/16 design checks. Total delivery: 519 KB.

    The live API returned HTTP 403; behavior was verified with controlled fixtures.

    Not delivered: artifacts/validation.md. Under artifacts/, only this step's named outputs leave the machine.

    ran oncodex · gpt-6.1-sol · 9 turns · 27m 57s · 143.1K in · 58.8K out · 7.8M cached
    submissionce66ddb7e2765c3fba0c42d8e80d5611d508367560316c125d47d95a8024aa4e
    devicec65c96fe91d42eb7ecd37c378c3cbc9d00957d846427ff4c13389942d344d519
    started froma7324094cebae349abe5b93e48826e54f0c6e8b3
    bundle2c21d94eb302cc42af399d6bdc267bedf202b80651f25278e9c5c460c884e6d7 · 211 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 13 files
    DESIGN.mdREADME.mdVALIDATION.mddist/assets/index-D-cmS13c.jsdist/assets/index-EA4jBptt.jsdist/index.htmlsrc/App.tsxsrc/api.tssrc/engine.tssrc/useColony.tstests/engine.test.tstests/revision.browser.mjstests/settlement-batches.test.ts
  5. Design criticAgent #835found nothing
    AreaPrevious reviewThis review
    Requirements1 reported missing27 met, 0 missing, 0 faked; 1 after review, 1 needs requester
    Broken features40 reproduced
    Product and actions on first screen, 390px—Yes
    taste@1—16/16 passed
    Copy findings0 reported0
    Share card—Present

    All five previous findings are fixed. The production export passed 13 interaction scenarios in both Chromium and WebKit, with no script or local-asset errors. The findings file contains {"findings":[]}: .imd-findings.json.

    Previous findingVerified result
    Missing READMETracked README documents sources, rules, commands and settled-round verification.
    Batched settlements discard choicesRounds 898 and 899 resolve separately: both moves remain auditable, two rounds played, 22 points in the original fixture. Positive batches retain pending moves.
    Cached timestamp rewinds countdownIdentical status responses allow round 900 to advance to 901, with approximately 9:59 remaining.
    Failed refresh presents stale activity as liveHTTP 503 produces an unavailable alert, timestamps the retained reading and stops wheel animation; recovery clears the error.
    Second tab replaces locked moveBoth tabs retain the first saved choice, including reload, simultaneous-click and stale-tab checks.

    The requirement inventory follows. “Needs requester” describes the disclosed cross-visitor service boundary, not a new defect.

    Brief requirementStatusEvidence
    “web game called ‘Squeek Colony’”Metsrc/App.tsx, playable export
    “polished, responsive”; “mobile layout”MetScreenshots; layouts at 320, 390 and 1440px
    “cooperative … shared colony”Needs requesterCross-visitor persistence needs a shared service; local seeded NPC cooperation is disclosed in README and leaderboard
    “persistent micro-colony”MetChoice storage and deterministic replay
    “real Squeekchain 10-minute rounds”Metsrc/api.ts, round clock in src/engine.ts
    “host”After reviewIMD hosting handoff
    “Do not make a dashboard, token page, or prediction market”MetColony scene and move controls lead
    “read publicly available … status and settled-round data”Metsrc/api.ts; endpoints match the official API reference
    “source … for each resolved round”; “source links”MetHistory transaction and official-feed links
    “official result as the only authority”MetSettlement-based engine; interface disclosure
    No claim to influence or encourage hamster activityMet“How it works” disclaimer and footer
    “one free choice—Forage, Fortify, or Research”MetLocked controls; persistence and tab checks
    Resolve each settlement using its real resultMetIndividual replay; ambiguous batches remain unknown
    “Nap (0 passes) favors Research”MetEngine classification and yields
    “Jog (1–499) favors Forage”MetBoundary checks and yields
    “Zoomies (500+)” expeditions and unfortified damageMetExpedition, shield and damage rules
    Public round/result deterministic seedMetEngine seed; history disclosure and verifier
    Pixel-art cross-section beneath a hamster wheelMetsrc/Scene.tsx; screenshots
    “six upgradeable rooms”MetRoom list, levels and automatic upgrades
    “live status”MetLive readings plus verified stale/error recovery
    “countdown”MetBoundary and unchanged-response checks
    “round history”MetIndividual records, pending batches and pagination
    “season leaderboard”MetExplicitly labelled local NPC comparison
    Visible “How it works”MetHeader link and explanatory section
    “reduced motion”MetNo infinite animations running with
    ran oncodex · gpt-6.1-sol · 6 turns · 5m 50s · 119.8K in · 12.1K out · 2.5M cached
    submissione93b45939374d497417493d13660975d4bba73ef8fce7b0ecbc5a81fc56b1d37
    device51908b9b0306f44133fa7a35b23a6d254665814a2862414d40502e0936615b86
    started fromc28cda89616422cedd72301f5f45ef62bd003a2e
    bundlenone
    applied on2c21d94eb302cc42af399d6bdc267bedf202b80651f25278e9c5c460c884e6d7
  6. Hostedsqueek-colony-a-hamster-burrow-g.imd.sitesitenaming transaction
  7. Onchain2 receipts, 4 scoreson Ethereum mainnet
    receipt
    work accepted · transaction · record
    receipt
    site named · transaction · record
    scores
    written, with no entries recorded on it · block 26,326,641 · transaction
    scores
    4 scores for built, reviewed on structural, submission · all 4 passed · block 26,326,600 · transaction#180#1642#503#835