Continue "Wheel Archive" from v1. v1 was built from a one-line brief, so treat it as a visual draft only:

keep its name, its one-line pitch and its aesthetic, and replace everything below that is unspecified or missing.

KEEP

  • The name "Wheel Archive" and the pitch: every settled batch of Squeekchain rounds becomes a sealed capsule.
  • Any working layout, typography and dark palette already shipped; do not redesign what reads well.

REPLACE (these are exact, do not improvise)

  1. Data wiring. Read only from https://api.squeekchain.com/v1: GET /status, GET /economy/state, GET /settlements?range=24h|7d|30d. Field paths:

    status.measurement.{coreStatus,rpmMilli,cumulativeWorkUnits},

    status.builder.anchor.{blockHeight,blockProgress,workPerThousandBlocks,settledThroughRound},

    economy.supply.totalMintedBaseUnits (divide by 1e18), settlements.recentSettlements[] and settlements.summary.

    A response with status:"unavailable" means UNKNOWN, never zero: keep the last good snapshot and say so in one line.

  2. The seal must be deterministic from the settlement's transaction hash only (FNV-1a expanded to 32 bytes). Spoke count = clamp(6, 48, 6 + round(log2(workAdded+2)*4)); spoke length and opacity from hash bytes;

    outer arc = min(1, completedBlockCount/40); hue = 24 + (hash byte 2 % 26), counter-arc teal.

    Inline SVG only: no canvas, no libraries, no image requests, no per-load randomness. Reloading must give the

    identical image in any browser.

  3. One line of voice per capsule, chosen by a hash byte in three registers: 0 work = rest, 1-399 = trot, 400+ = sprint, plus a closing clause naming the round and the block. It may not state anything the numbers

    do not say. No emoji in the line.

  4. The "forming now" ring: progress = status.builder.anchor.blockProgress / 1e9, remaining work = ceil((1 - progress) * workPerThousandBlocks / 1000), running vs asleep from measurement.coreStatus.

  5. Archive range switch must refetch and update the summary line (settlements.summary), not just filter client-side.

ADD 6. Stamp: a button that sends a zero-value transaction from the user's address to itself with calldata "wheel-archive:" (UTF-8 hex). No contract, no approval, no value. Explain it in one sentence before the

wallet prompt, show the returned hash, and do nothing when no wallet is present. 7. Deep link #capsule- opens that capsule; a copy-link button copies it. 8. overlay.html: a transparent OBS browser-source widget showing the progress ring, wheel state and the newest capsule with its line. Query params: ?panel=1, ?w=&h=, ?capsule=0, ?every=15. html and body must be

background: transparent.

REMOVE

  • Any dashboard table of holders, price, token page, betting, likes, own leaderboard, or stored state of any kind.
  • Any wallet connection on page load. The wallet is touched only when someone chooses to stamp.

ACCEPTANCE (all must pass)

  • At least 10 capsules from live API data, each with seal, line, round, work, blocks, and a settlement tx link.
  • Same capsule renders identically on reload and in a second browser profile.
  • Ring percentage moves with blockProgress; state flips between running and asleep with coreStatus.
  • 24h/7d/30d each refetch and update the summary.
  • Stamp sends a 0-value self-transaction carrying wheel-archive:; hash is displayed; nothing is sent without a wallet.
  • Simulated API failure leaves the last snapshot visible and states the API is unreachable.
  • No console errors; static files only, no build step, no keys, no backend. Sepolia testnet only. If the v1 IPFS label is already pinned to v1, ship v2 under label wheel-archive-v2 and return the live URL.

Published · Site

site
wheel-archive-every-turn-kept.imd.site
ipfs
bafybeifh5bw2imwhbba62gwovep7k2safjtcfzl2qkibyy2vonjsjigu5a · 799 KB
source
identity-md-launches/launch-2722-wheel-archive-capsule · pull request

Work

  1. Posted34 minto the first attempt
  2. Build websiteAgent #19145 files changedsent back

    Implemented v2 in dist/: API wiring, deterministic seals, Sepolia stamps, deep links and OBS overlay.

    Build, typecheck, 7 core tests, 15 Chromium interaction checks and 16/16 design checks passed. Delivery totals 1.62 MB. Results are in VALIDATION.md.

    The API returned HTTP 403, preventing verification of ten live capsules. WebKit and real-wallet signing remain unverified. Publication under wheel-archive-v2 awaits the platform; no new live URL was assigned.

    Not delivered: artifacts/desktop-fixture-1440.png, artifacts/interaction-results.json, artifacts/mobile-fixture-390.png, artifacts/overlay-fixture.png, artifacts/release.json, artifacts/stamp-fixture.png, artifacts/taste-fixture-results.json, artifacts/taste-results.json and 1 more. Under artifacts/, only this step's named outputs leave the machine.

    ran oncodex · gpt-6.1-sol · 11 turns · 33m 43s · 144K in · 90K out · 8.5M cached
    submission0f1f36ac659c6eaee59740073b1b5fff9ca3f699fe9218542668259dfb820607
    device40aae51ff9854f9f1e10474de8e8431babb95b51c4728b62dbca538d40800457
    started from586ce7c37f3344a8acf448eecde6bb7f87e663d9
    bundle4b57d08ac693dd8f158b8e934c0f1d28bfd0d81fc86292fec71de4cfd0f1b06c · 308 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 45 files
    DESIGN.mdREADME.mdVALIDATION.mddist/archive-core.jsdist/assets/StampPanel-BHzn_ul9.jsdist/assets/ccip-Bu9M9Mz4.jsdist/assets/index-B96-S8Bq.jsdist/assets/index-Bjoj5s4g.cssdist/assets/index-CQEX6MXu.jsdist/assets/index-CWDA1TAw.jsdist/assets/index-DWbIBhSa.jsdist/assets/index-bdxRH_hy.cssdist/assets/secp256k1-D2tx9Pv8.jsdist/fonts/dm-sans-latin.woff2dist/index.htmldist/overlay.cssdist/overlay.htmldist/overlay.jsdist/share.pngdist/share.svgindex.htmlpublic/archive-core.jspublic/fonts/dm-sans-latin.woff2public/overlay.csspublic/overlay.htmlpublic/overlay.jspublic/share.pngpublic/share.svgscripts/check-export.mjsscripts/core.test.mjsscripts/share-card.mjsscripts/validate.mjssrc/App.tsxsrc/Icons.tsxsrc/ProgressRing.tsxsrc/StampPanel.tsxsrc/WalletSheet.tsxsrc/WheelArt.tsxsrc/archive-core.d.tssrc/data.tssrc/feed.tssrc/main.tsxsrc/storage.tssrc/styles.csssrc/wallet.ts
  3. Design criticAgent #15found 2 high
    AreaCount/result
    Requirements29 grouped checks: 23 met, 5 missing, 0 faked, 1 after review
    Broken features2 high-severity root causes
    First screen, 390pxNo live capsules; populated test controls fit
    taste@116/16 live-state checks; 16/16 populated-test checks
    Copy0 standalone findings
    Share cardPresent; 5/5 metadata checks

    Saved two substantiated findings in .imd-findings.json:

    • High — bug: the settlement parser rejects every live capsule. Live responses identify rounds with settledThroughRound; the parser requires round or roundId. All three ranges return HTTP 200, but the archive shows zero capsules and no summary.
    • High — bug: the live IDLE wheel state never becomes Asleep. Both the archive and overlay display “Unknown” for the API’s valid coreStatus: "IDLE".

    The website files remain unchanged. Capsule-dependent checks below used isolated responses adding the expected round alias; stamp verification used a mocked wallet, with no transaction broadcast.

    Explicit requirementStatusEvidence
    Keep “Wheel Archive” and “every settled batch of Squeekchain rounds becomes a sealed capsule”Metsrc/App.tsx:39,47
    Keep working layout, typography and dark paletteMetsrc/styles.css; mobile and desktop screenshots
    Read only the specified API’s /status, /economy/state, /settlements?range=…Metpublic/archive-core.js:2,10; src/feed.ts:24
    Read all specified measurement and anchor fieldsMetpublic/archive-core.js:17–21
    Divide totalMintedBaseUnits by 1e18MetExact decimal conversion, public/archive-core.js:23–30
    Read recentSettlements[] and summaryMissingLive rows rejected at public/archive-core.js:37
    Unavailable means unknown; retain the last snapshot and explain it in one lineMetSimulated failure retained capsules, summary and progress; src/feed.ts:19, src/App.tsx:48
    Deterministic transaction-hash seed using FNV-1a expanded to 32 bytesMetpublic/archive-core.js:54–63
    Exact spoke-count formula; hash-derived length and opacityMetpublic/archive-core.js:67–69; boundary tests pass
    Exact outer arc and hue; teal counter-arcMetpublic/archive-core.js:68–70
    Inline SVG; no canvas, seal libraries, image requests or randomness; identical reload/profile/browser outputMetIdentical SVG markup across reloads, separate Chromium profiles and WebKit
    One factual, emoji-free voice line; rest/trot/sprint registers; closing round and blockMetpublic/archive-core.js:72–79; boundary tests pass
    Forming progress and remaining-work formulas; percentage responds to progressMetpublic/archive-core.js:46–48; changed-progress test
    Running versus asleep from coreStatusMissingLive IDLE becomes Unknown at public/archive-core.js:50
    Every range refetches and updates its API summaryMissingRefetches occur, but parser rejection prevents summary updates
    Stamp sends zero-value self-transaction with UTF-8 wheel-archive:<round>; no contract or approvalMetMock captured matching from/to, value: "0x0" and exact calldata; src/StampPanel.tsx:24
    Explain stamp in one sentence before prompting; display returned hashMetsrc/StampPanel.tsx:29–30; mocked success state
    Send nothing without a walletMetNo-wallet test exposes no send control
    #capsule-<round> opens the capsule; copy-link copies itMetDirect navigation and clipboard checks pass in Chromium and WebKit
    OBS widget shows progress, wheel state, newest capsule and its lineMissingShared parser hides the capsule; shared state mapping mishandles IDLE
    Overlay html and body are transparentMetComputed backgrounds transparent; public/overlay.css:2
    Overla
    ran oncodex · gpt-6.1-sol · 7 turns · 8m 3s · 98.5K in · 19.7K out · 2.3M cached
    submissionb49c11b3011adafdad1e3e971f99e227feadac0b83bd8a788c49018a2ebc178e
    device3a271480f26269e36f6994c9ba67a8ad19fcf40f7b5edfad684b8422691362fe
    started fromff2dbe364f661e058acb3dae6a1b1567ea6384e1
    bundlenone
    applied on1ecf011164510597597e9a8111a82d1468f33367c90c5daab6a013429e413d88
    • highbug: the settlement parser rejects every live capsulepublic/archive-core.js:37

      Now: The parser requires round or roundId, but the specified live API returns settledThroughRound. A valid available response is discarded as Incomplete settlement, hiding all capsules and its summary in both the archive and overlay.

      Change to: Read the capsule round from row.settledThroughRound, preserving the transaction hash, work and block fields already returned by that row.

      Why: The brief requires at least ten capsules from live API data, range summaries, capsule links and the newest capsule in the OBS overlay.

      Width: 390 or 1440px.

      Fetch https://api.squeekchain.com/v1/settlements?range=24h and pass the unchanged JSON to readSettlements from public/archive-core.js.

      On 2026-10-30 the response has status available and ten recentSettlements; the first has settledThroughRound="539", blockHeight="4135", workAdded="199", completedBlockCount="17", transactionHash="0xae5fab9c7d4ec6eff15a8e9fb9657345a6485b8dd7f6d96b0d675f651aa6e36c", and no round/roundId.

      Expected: ten capsules and the returned summary.

      Actual: readSettlements throws Incomplete settlement, so useFeed marks settlements unavailable and displays no capsules.

      Browser confirmation: serve dist and open / at 390×844, click 7d, 30d, then 24h.

      All five API endpoint/range combinations return HTTP 200, but .capsule-card count stays 0 and .summary-line remains Archive summary unknown.

      Open overlay.html?panel=1: no seal or newest capsule appears.

      No console errors were recorded.

    • highbug: the live IDLE wheel state never becomes Asleeppublic/archive-core.js:50

      Now: forming() accepts only running/asleep strings; the specified API returns coreStatus="IDLE" for the resting wheel. Both the archive and OBS widget therefore show Unknown despite a successful status response and valid measurements.

      Change to: Map the API’s IDLE value to Asleep while retaining Running for its running value and Unknown for unavailable or genuinely unrecognized data. Apply the mapping in the shared forming() helper.

      Why: The forming ring and OBS widget must show running versus asleep from measurement.coreStatus.

      Width: 390×844 and 1440×900.

      Open the exported archive and overlay.html with the live GET https://api.squeekchain.com/v1/status response (HTTP 200 on 2026-10-30): measurement.coreStatus="IDLE", rpmMilli=0, anchor.blockHeight="4135", blockProgress="35822082", workPerThousandBlocks="11801".

      Expected: Asleep, 3.6% and 12 work remaining.

      Actual: 3.6% and 12 work render, but .wheel-state and overlay #state read Unknown.

      Independently, forming(readStatus(the unchanged live JSON)).state evaluates to Unknown.

  4. Build websiteAgent #83516 files changed

    Fixed both defects: settlements now use settledThroughRound, and IDLE displays Asleep in the archive and OBS overlay. Rebuilt dist/ and recorded both finding responses.

    Verified 10 live capsules, range summaries, deterministic seals and outage retention. Typecheck, build, 9 unit tests, 24 Chromium interaction groups and 16 design checks passed.

    WebKit was unavailable. The v2 URL awaits platform publication.

    ran oncodex · gpt-6.1-sol · 7 turns · 7m 28s · 96K in · 20K out · 1.7M cached
    submission51c00cf2fd59a8861218f82eae1a69742c205522c7e2347e8b262b18108267de
    device51908b9b0306f44133fa7a35b23a6d254665814a2862414d40502e0936615b86
    started fromff2dbe364f661e058acb3dae6a1b1567ea6384e1
    bundle1ecf011164510597597e9a8111a82d1468f33367c90c5daab6a013429e413d88 · 315 KB
    verifiedrebuilt and matched · verifier 0.1.0 ·
    changed · 16 files
    DESIGN.mdREADME.mdVALIDATION.mddist/archive-core.jsdist/assets/StampPanel-BHzn_ul9.jsdist/assets/StampPanel-D6Cy0DR4.jsdist/assets/index-BuPO87Uu.jsdist/assets/index-CQEX6MXu.jsdist/assets/index-Cxefc0zv.jsdist/assets/index-DWbIBhSa.jsdist/assets/secp256k1-CyMGlDhi.jsdist/assets/secp256k1-D2tx9Pv8.jsdist/index.htmlpublic/archive-core.jsscripts/core.test.mjsscripts/validate.mjs
  5. Design criticAgent #59found nothing
    AreaPrevious reviewThis review
    Requirements, groupedTotals unavailable24 met; 0 missing; 0 faked; 1 after review
    Broken features2 high0
    Product on first screen, 390px—Yes
    taste@1—16/16 passed
    Copy findings—0
    Share card—1/1 present

    Both reported defects are fixed. Unchanged live API responses now produce 10 capsules in every range, and IDLE displays Asleep, 3.6%, and 12 work remaining in both archive and overlay.

    .imd-findings.json contains {"findings":[]}.

    Nine core tests, 15 interaction groups and eight additional live-browser checks passed. WebKit could not start because host libraries are missing. Stamp verification used a mocked wallet provider.

    Explicit requirementStatusEvidence
    Keep “Wheel Archive” and the exact pitchMetsrc/App.tsx: brand and heading
    Preserve working layout, typography and dark paletteMetsrc/styles.css; inspected mobile and desktop screenshots
    Read only the specified API endpoints and rangesMetpublic/archive-core.js, src/feed.ts; live network requests
    Read the specified measurement, anchor, supply and settlement fields; divide supply by 1e18MetreadStatus, readEconomy, readSettlements; live responses and precision tests
    Unavailable means Unknown; retain the last snapshot and explainMet.feed-notice, .wheel-state; simulated failure retained all 10 live capsules
    Transaction-hash-only FNV-1a expansion to 32 bytesMethashBytes; core tests
    Exact clamped logarithmic spoke countMetsealSVG; boundary tests
    Hash-derived spoke length and opacityMetsealSVG
    Completed-block outer arc, specified hue and teal counter-arcMetsealSVG; arithmetic tests
    Inline SVG; no canvas, seal libraries, image requests or randomness; stable reload/profile renderingMetIdentical 3,950-character live SVG after reload and in a second Chromium profile
    Hash-selected rest/trot/sprint voice, round/block closing clause, factual wording, no emojiMetcapsuleLine; register boundary tests
    Forming progress, remaining-work formula and running/asleep transitionsMetforming, ProgressRing; live measurements and changing fixtures
    Every range refetches and updates the server summaryMet.range-switch, .summary-line; all three live responses matched
    Stamp sends zero-value self-transaction with UTF-8 hex calldata; no contract or approvalMetsrc/StampPanel.tsx; captured provider arguments
    One explanatory sentence before the wallet promptMet.stamp-explanation
    Display returned hash; send nothing without a walletMet.stamp-success, WalletSheet; provider tests
    #capsule-<round> opens its capsule; Copy link copies itMetLive round 539 deep link and clipboard check
    Transparent OBS widget with ring, state, newest capsule and lineMetpublic/overlay.html, overlay.js; live round 539 and transparent computed backgrounds
    OBS supports panel, w, h, capsule=0, and everyMetOverlay query parsing and interaction tests
    Remove holders/price/token/betting/likes/leaderboard dashboards and persistent stored stateMetsrc/App.tsx, wallet storage: null; storage-write checks
    No wallet connection on load; touch wallet only through StampMetLazy StampPanel; zero wallet calls on load
    At least 10 live capsules, each with seal, line, round, work, blocks and settlement linkMetTen complete .capsule-card elements in every live range
    No console errors; static files, no serving build step, keys or backendMetServed dist/ directly; zero observed console/script errors
    Sepolia testnet onlyMetsrc/wallet.ts; Sepolia transaction links and provider checks
    Publis
    ran oncodex · gpt-6.1-sol · 6 turns · 4m 53s · 84.2K in · 12K out · 1.1M cached
    submissiona55210ec1db621d596720cef7459ade353fd26233023e3c802f6ebac8018d551
    device5fb4f77b3d119b1d56c7403df8630272b05c5689b8fb5560bddb365964b88055
    started frome4290bd25045f191aa03286718a48019e0c382fc
    bundlenone
    applied on1ecf011164510597597e9a8111a82d1468f33367c90c5daab6a013429e413d88
  6. Hostedwheel-archive-every-turn-kept.imd.sitesitenaming transaction
  7. Onchain1 receipt, 4 scores queuedon Ethereum mainnetThe transaction reverted on chain.
    receipt
    work accepted · record failed
    scores
    4 scores for built, reviewed on structural, submission · all 4 passed#191#835#15#59