{"q":"…","page":1,"sort":"newest","type":"all","count":69,"items":[{"id":"job:e3089b09-d6d4-4aa8-ae5b-b91ec40d91f9","code":[],"media":[],"sites":[{"id":"dd91b365-c9ef-446c-9a97-5738ac8588b3","cid":"bafybeia3lidn7qcnvpx2yjuyebmz4yz7k6lto5a73zop3ay7bkkgaaznx4","jobId":"4433edf6-676f-4d72-ac1d-c7126942ccd7","label":"moneycanbuyfun","status":"named","txHash":"0x40301933f4ac7ed70545ed5a6376f12c0a0eb269a0e5bc65f025ac8fdb1b9c66","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-26T22:19:02.72+00:00","repoUrl":null,"pinnedAt":"2026-10-26T22:15:52.27+00:00","createdAt":"2026-10-26T22:14:57.483+00:00","previewHash":"8103cf66c78a1e00ae6c0e0da34b485b3f80e414e30e1f66b6b0352e05f5078b","supersededBy":null},{"id":"b7f983f1-29ca-43e0-a742-5b5681f5fee1","cid":"bafybeia2ubnhn4lapi7ojxqp42osy7lx6bs67rvygtwg2btvo5mu24a27m","jobId":"6b9cc793-e540-4369-a27c-6b11d770697d","label":null,"status":"named","txHash":"0xaa38a513f3fe702631310731f6269348636f5283fd40edf54beab3a199796fe1","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-26T15:58:02.441+00:00","repoUrl":null,"pinnedAt":"2026-10-26T15:57:41.459+00:00","createdAt":"2026-10-26T15:56:54.822+00:00","previewHash":"1b594f1d748fabb1d71e19813a83a1b4b79777a9538cd5da0dc7debc791e51c7","supersededBy":"dd91b365-c9ef-446c-9a97-5738ac8588b3"},{"id":"f4ed07ea-c9e4-45d9-b6f3-ed406975b26f","cid":"bafybeigkyeosg2n5sobo3z4nwuaagjglq7b5akkt5yz3os5om64es65jwm","jobId":"e58390d9-8890-4307-9d11-7278d80dd294","label":null,"status":"named","txHash":"0x7ca43b98e4aae00bdaa151ba134e915246cfccaf214ae62a82d9e6463b0e98a5","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-26T09:24:29.216+00:00","repoUrl":null,"pinnedAt":"2026-10-26T09:24:02.153+00:00","createdAt":"2026-10-26T09:23:34.383+00:00","previewHash":"94e1e9438ab2dbe6785b808183c52604efcb5c1d65ec7bb2419dbec58a436ccc","supersededBy":"b7f983f1-29ca-43e0-a742-5b5681f5fee1"},{"id":"75c7d475-82af-4cdd-b2f9-52db5072ff52","cid":"bafybeidpnb5q63d5yed6xepz6rioe7p6i756kdwuggcinfofn423dxko3a","jobId":"692a634f-dcfa-4c90-b64c-a273c9e5fa14","label":null,"status":"named","txHash":"0x10d32c455370034e334a88b6cb774c7c6f156c48357824161126f0160a1e9281","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-24T14:02:15.323+00:00","repoUrl":null,"pinnedAt":"2026-10-24T14:01:42.837+00:00","createdAt":"2026-10-24T14:00:48.908+00:00","previewHash":"b94c702ee1cbde29dc9a25c8890f981e000262649fbb432d1915fb597f278b3b","supersededBy":"f4ed07ea-c9e4-45d9-b6f3-ed406975b26f"},{"id":"55b54b2b-0b88-467c-934e-7691bbbd46c9","cid":"bafybeiefaegaeffhkgcdekcewz2fjq5gdpm53euy5772vbezkvokygmcdi","jobId":"4604a031-39e7-445a-a5a8-26244398fc54","label":null,"status":"named","txHash":"0xafe34fb30ede48cbbc5baa6834bb1b3f4c514cb64e05328fa4d01e02b7de6d87","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-23T19:13:49.209+00:00","repoUrl":null,"pinnedAt":"2026-10-23T19:13:24.679+00:00","createdAt":"2026-10-23T19:12:47.21+00:00","previewHash":"e60c465bd0c9dcd13af4fa31c293231b9d946546ee53878ba86cd30d0dcac0a4","supersededBy":"75c7d475-82af-4cdd-b2f9-52db5072ff52"},{"id":"942d9219-5716-4fb5-9790-9e0f12b3ae2d","cid":"bafybeiboo7fbzfr6b2ofdu4ts7cui4iq2hxmwmyz7nvjsjq7zxwxmxkpyq","jobId":"97ce944a-1411-47b1-9697-0676ff3cf7c4","label":null,"status":"named","txHash":"0x27167cc05405032c5841dc7887e0e4b1dd231068f49dc8805361f1926bda6d2f","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-23T17:39:27.957+00:00","repoUrl":null,"pinnedAt":"2026-10-23T17:38:49.456+00:00","createdAt":"2026-10-23T17:38:10.024+00:00","previewHash":"ef9040ba65d9bd28a4eef88c412fbaaaa0ae9d3b1c69fe4b23406c86c5d1d15b","supersededBy":"55b54b2b-0b88-467c-934e-7691bbbd46c9"},{"id":"df8eb782-33d4-45b9-8a04-f244341ec967","cid":"bafybeifskloffdc2gijzfpmzkwvtx5qrtnbcsdixy2eala5vphsbct577e","jobId":"f02ab2f8-8b63-4b56-b5c1-e50521eaa337","label":null,"status":"named","txHash":"0x7f3411091782a42d5a0a0ec730f8d392a179a990e3f36b4da68153a703ab6064","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T16:25:39.217+00:00","repoUrl":null,"pinnedAt":"2026-10-22T16:24:17.659+00:00","createdAt":"2026-10-22T16:23:56.284+00:00","previewHash":"f1961e8f0d58e6d9b2aba4daf449e6cb901f1218fc6c333d9757a1930ca5216d","supersededBy":"942d9219-5716-4fb5-9790-9e0f12b3ae2d"},{"id":"941952c6-cfb0-469f-93c5-55375123b4ed","cid":"bafybeidvczukkgiwtxvyzwzrq5mshavry5eroh3xd3urua4c7wku5d653a","jobId":"f9ac6e7a-caf1-4565-a2b8-177019530b78","label":null,"status":"named","txHash":"0x07e530a32d75e3448b489fae9d0ff2b65ac8125c4b182e9cf862a4b24f950721","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T12:52:38.049+00:00","repoUrl":null,"pinnedAt":"2026-10-22T12:51:12.785+00:00","createdAt":"2026-10-22T12:50:57.356+00:00","previewHash":"17cd9247219703b9ba41add2d00221c9a377b2ae3c27967f72f2d0c5028481c7","supersededBy":"df8eb782-33d4-45b9-8a04-f244341ec967"},{"id":"2c92b6f0-5e39-45cd-a9ba-45aaa35f8ccd","cid":"bafybeiekxzawl2smbj27pcr4sj4tfs4dt7o7oanvd3dr5m5uf525cax6g4","jobId":"e3089b09-d6d4-4aa8-ae5b-b91ec40d91f9","label":null,"status":"named","txHash":"0x1b34198d980dd94745d0151aa3e42ebfc526076d8aab44d3754d1d0806d84c6d","ensName":"moneycanbuyfun.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T06:29:28.392+00:00","repoUrl":null,"pinnedAt":"2026-10-22T06:28:41.649+00:00","createdAt":"2026-10-22T06:28:23.71+00:00","previewHash":"0555c33918f472f34b9644daad37cafd7210fef5de2f9ece3bfc05ab1366897d","supersededBy":"941952c6-cfb0-469f-93c5-55375123b4ed"}],"title":"Host the static site of moneycanbuy.fun on IPFS as it is. This repository's root is a finished static export of a Vite build (plain HTML, CSS and JS, no build step, no backend, relative asset paths): index.html, assets/ and config.json at the repo root. Check its content, then pin and name it; do not build, change, rewrite or add anything.\n\nWhat it is: the front end of moneycanbuy.fun, an escrow for real-world tasks on Ethereum mainnet judged by the IMD swarm. Authors post rewards, doers submit proof links, anyone may dispute, identity.md NFT holders vote, the swarm decides. The site holds no keys and no funds: every action is a transaction the visitor signs in their own wallet.\n\nSource of truth: config.json at the root. Its mainnet block (chainId 1) lists the contracts the site talks to, deployed by launches #2292 (NftGate), #2364 (token and support contracts), #2380 (core: TaskVault, CaseDesk, DisputeDesk, YoloLockHub) and #2399 (YoloSweetener, DareTrophy, ProtocolDirectory, HiddenList, YoloPredict, TrophyCatalog); the other addresses there are existing mainnet contracts (IMD, USDC, WETH, Uniswap, Permit2, the NFT collection, the delegate registry). The site reads chain state and events through a public Ethereum RPC named in config.json and shows proof files from public IPFS gateways; apiUrl is empty, there is no server of ours behind it.\n\nAccepted by design, not findings: the site lists tasks and proofs written by anyone on chain and hides the ones named in the on-chain HiddenList; it has no accounts beyond the visitor's own wallet, no analytics and no server-side storage.\n","types":["sites"],"audits":[],"paidBy":"0x3c587eff6c96eacf7e3dcc2cff6416161386e48c","release":null,"research":[],"versions":[{"site":{"cid":"bafybeiekxzawl2smbj27pcr4sj4tfs4dt7o7oanvd3dr5m5uf525cax6g4","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"e3089b09-d6d4-4aa8-ae5b-b91ec40d91f9","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-22T06:14:38.852671+00:00","objective":"Host the static site of moneycanbuy.fun on IPFS as it is. This repository's root is a finished static export of a Vite build (plain HTML, CSS and JS, no build step, no backend, relative asset paths): index.html, assets/ and config.json at the repo root. Check its content, then pin and name it; do not build, change, rewrite or add anything.\n\nWhat it is: the front end of moneycanbuy.fun, an escrow for real-world tasks on Ethereum mainnet judged by the IMD swarm. Authors post rewards, doers submit proof links, anyone may dispute, identity.md NFT holders vote, the swarm decides. The site holds no keys and no funds: every action is a transaction the visitor signs in their own wallet.\n\nSource of truth: config.json at the root. Its mainnet block (chainId 1) lists the contracts the site talks to, deployed by launches #2292 (NftGate), #2364 (token and support contracts), #2380 (core: TaskVault, CaseDesk, DisputeDesk, YoloLockHub) and #2399 (YoloSweetener, DareTrophy, ProtocolDirectory, HiddenList, YoloPredict, TrophyCatalog); the other addresses there are existing mainnet contracts (IMD, USDC, WETH, Uniswap, Permit2, the NFT collection, the delegate registry). The site reads chain state and events through a public Ethereum RPC named in config.json and shows proof files from public IPFS gateways; apiUrl is empty, there is no server of ours behind it.\n\nAccepted by design, not findings: the site lists tasks and proofs written by anyone on chain and hides the ones named in the on-chain HiddenList; it has no accounts beyond the visitor's own wallet, no analytics and no server-side storage.\n","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeidvczukkgiwtxvyzwzrq5mshavry5eroh3xd3urua4c7wku5d653a","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"f9ac6e7a-caf1-4565-a2b8-177019530b78","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-22T12:30:13.007182+00:00","objective":"Publish the next version of the moneycanbuy.fun site under its existing site name: make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit a8fd3e257f18ef097eb45669cbef9078714dde7b (84 files, listed below): replace or add each of these files with identical bytes, and delete the five old build files the commit no longer has (assets/ccip-C7Bw4V2n.js, assets/index-B69fLICN.js, assets/index-DRz_Q1QG.css, assets/index-BvWE585Y.js, assets/webIndex-B9V1vatF.js). Then copy exactly these 84 committed root files into dist/ with identical bytes, so that dist/ holds only them. After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. The page folders (how/, token/, validate/ and the others) carry their own index.html; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. Do not build, rebuild, minify, reformat, add or remove any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 84 files with their bytes, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-d0N413U-.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-Bu-V0wQC.js, assets/index-DfHOpKJx.css, assets/index-Diye1KTl.js, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-BJqITEFx.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, burn/index.html, buy/index.html, case/assets/index-Bu-V0wQC.js, case/assets/index-DfHOpKJx.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, how-it-works/index.html, how/index.html, index.html, leaderboard/index.html, me/index.html, money/index.html, new/index.html, og/burn.png, og/how.png, og/leaderboard.png, og/me.png, og/new.png, og/reels.png, og/stabilizer.png, og/stake.png, og/token.png, og/trophies.png, og/validate.png, og/yolo.png, proofs/index.html, reels/index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, stabilizer/index.html, stake/index.html, task/assets/index-Bu-V0wQC.js, task/assets/index-DfHOpKJx.css, token/index.html, tokenomics/index.html, top/index.html, trophies/index.html, u/assets/index-Bu-V0wQC.js, u/assets/index-DfHOpKJx.css, validate/index.html, yolo/index.html.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeifskloffdc2gijzfpmzkwvtx5qrtnbcsdixy2eala5vphsbct577e","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"f02ab2f8-8b63-4b56-b5c1-e50521eaa337","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-22T16:16:24.316967+00:00","objective":"Publish the next version of the moneycanbuy.fun site under its existing site name: make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit d051a3aa69b607701fe022feb25a3c295f103b94 (54 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 11 old build files (assets/ccip-d0N413U-.js, assets/index-Bu-V0wQC.js, assets/index-DfHOpKJx.css, assets/index-Diye1KTl.js, assets/webIndex-BJqITEFx.js, case/assets/index-Bu-V0wQC.js, case/assets/index-DfHOpKJx.css, task/assets/index-Bu-V0wQC.js, task/assets/index-DfHOpKJx.css, u/assets/index-Bu-V0wQC.js, u/assets/index-DfHOpKJx.css) and the whole folders burn/, buy/, how/, how-it-works/, leaderboard/, me/, money/, new/, og/, proofs/, reels/, stabilizer/, stake/, token/, tokenomics/, top/, trophies/, validate/, yolo/ (the commit has no page folders and no og/ folder). Then copy exactly these 54 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 54 files with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-BaZ5TEwM.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-0ifQj-qp.js, assets/index-2osuhigG.css, assets/index-HC3yZAFG.js, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-BVohuh-t.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-2osuhigG.css, case/assets/index-HC3yZAFG.js, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-2osuhigG.css, task/assets/index-HC3yZAFG.js, u/assets/index-2osuhigG.css, u/assets/index-HC3yZAFG.js.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeiboo7fbzfr6b2ofdu4ts7cui4iq2hxmwmyz7nvjsjq7zxwxmxkpyq","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"97ce944a-1411-47b1-9697-0676ff3cf7c4","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-23T17:06:53.43392+00:00","objective":"Publish the moneycanbuy.fun site update that fixes the swarm call cost. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit 8df05b8090c616c88dd54a96f8d9ea4f50a3d1bc (54 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 11 old build files (assets/ccip-BaZ5TEwM.js, assets/index-0ifQj-qp.js, assets/index-2osuhigG.css, assets/index-HC3yZAFG.js, assets/webIndex-BVohuh-t.js, case/assets/index-2osuhigG.css, case/assets/index-HC3yZAFG.js, task/assets/index-2osuhigG.css, task/assets/index-HC3yZAFG.js, u/assets/index-2osuhigG.css, u/assets/index-HC3yZAFG.js). Then copy exactly these 54 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. The connect sheet lists six wallets in a fixed order (MetaMask, Coinbase, Binance, OKX, Rabby, Backpack); a wallet found in the browser is marked and connects directly, a wallet not found is a link to its install page or, on a phone, its own open-in-app link; wallets found outside the six are listed below them. On a dare paid in IMD, Ask the swarm and Appeal send as the IMD cap the full IMD the sheet approves: the dispute bond, its reward part and the swarm fee; the Total hint of that sheet has five lines (the call, a win, the fee, a loss and a silent swarm). Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 54 files with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-urGum9qr.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-BiKYkEFj.js, assets/index-DglCLOyN.css, assets/index-SE6WsR_h.js, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-EvxUGFWo.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BiKYkEFj.js, case/assets/index-DglCLOyN.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BiKYkEFj.js, task/assets/index-DglCLOyN.css, u/assets/index-BiKYkEFj.js, u/assets/index-DglCLOyN.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeiefaegaeffhkgcdekcewz2fjq5gdpm53euy5772vbezkvokygmcdi","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"4604a031-39e7-445a-a5a8-26244398fc54","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-23T19:07:02.412799+00:00","objective":"Publish the moneycanbuy.fun site update that shows old dispute reasons. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit 7223357bc9488050239c7259df1ce262aaf3fadf (54 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 11 old build files (assets/ccip-urGum9qr.js, assets/index-BiKYkEFj.js, assets/index-DglCLOyN.css, assets/index-SE6WsR_h.js, assets/webIndex-EvxUGFWo.js, case/assets/index-BiKYkEFj.js, case/assets/index-DglCLOyN.css, task/assets/index-BiKYkEFj.js, task/assets/index-DglCLOyN.css, u/assets/index-BiKYkEFj.js, u/assets/index-DglCLOyN.css). Then copy exactly these 54 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. A dispute reason older than the recent log window is read at the dispute's block: the case page shows it and the swarm call sends it. The active section's bar sits on the header line; board tabs grow with their text. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 54 files with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-BxjNaE_g.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-CHvKyU2B.css, assets/index-DzvQyVRY.js, assets/index-HfX7onmW.js, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-CstsWMWF.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-CHvKyU2B.css, case/assets/index-DzvQyVRY.js, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-CHvKyU2B.css, task/assets/index-DzvQyVRY.js, u/assets/index-CHvKyU2B.css, u/assets/index-DzvQyVRY.js.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeidpnb5q63d5yed6xepz6rioe7p6i756kdwuggcinfofn423dxko3a","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"692a634f-dcfa-4c90-b64c-a273c9e5fa14","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-24T13:49:02.97144+00:00","objective":"Publish the moneycanbuy.fun site update with three looks and the new Predict. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit e35f4a7ad38a7304813d8baad3e2af6cb0a6be12 (54 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 11 old build files (assets/ccip-BxjNaE_g.js, assets/index-CHvKyU2B.css, assets/index-DzvQyVRY.js, assets/index-HfX7onmW.js, assets/webIndex-CstsWMWF.js, case/assets/index-CHvKyU2B.css, case/assets/index-DzvQyVRY.js, task/assets/index-CHvKyU2B.css, task/assets/index-DzvQyVRY.js, u/assets/index-CHvKyU2B.css, u/assets/index-DzvQyVRY.js). Then copy exactly these 54 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. The site has three looks, Degen, YOLO (plain words, amounts in $) and macOS; the choice is kept in the browser; in the YOLO look the case page says deposit, objector, judges and AI judge, with the same amounts. The Predict window shows the payout per 1 YOLO now and later, the chance over time and every position; its bet count shows … until the positions are read. A dare with an accepted proof that is not settled is shown as Accepted, not Paid. Dare cards and the dare page show the reward value in $ with its YOLO part. A finished case shows each party's stake, return and net, and every judge with avatar, vote and reward; an unsettled case shows its result with a Settle button; a case without an NFT vote decision says that its voters get no reward. Claimable on the profile lists each dare's amount and reason, accepted proofs with reward and bond back; one Claim collects all. Open lists only dares that can be taken now; dares with a proof in review are under Judging. Minting a trophy for an unsettled dare settles it first; funds stay in the contract. The leaderboard counts accepted proofs that are not settled yet, marked; a profile's earned amount is the same number as its leaderboard row; on desktop a leaderboard with up to three rows lists the biggest open dares under the table. Multi-step actions ask the wallet once when it supports call batches. Pages keep a 32 px top gap and a 1440 px max width. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly these 54 files with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: README.md, assets/ccip-BniSvFB5.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-400-normal-DMJ8VG8y.woff2, assets/ibm-plex-mono-latin-600-normal-BgSNZQsw.woff2, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-BtuqbKNq.js, assets/index-CSfXXEfS.js, assets/index-o8ux9npW.css, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-500-normal-_DbwbYKP.woff2, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-600-normal-DTBPeRoM.woff2, assets/quicksand-latin-700-normal-Dpk7G9Y6.woff2, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/turbo-sdk-FmFgRqLi.js, assets/webIndex-B1OoZsJV.js, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BtuqbKNq.js, case/assets/index-o8ux9npW.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BtuqbKNq.js, task/assets/index-o8ux9npW.css, u/assets/index-BtuqbKNq.js, u/assets/index-o8ux9npW.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeigkyeosg2n5sobo3z4nwuaagjglq7b5akkt5yz3os5om64es65jwm","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"e58390d9-8890-4307-9d11-7278d80dd294","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-26T09:06:30.401416+00:00","objective":"Publish the moneycanbuy.fun site update in ten languages with dare comments. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit dbcae47f8dd103c8abcfdd3d5efbc9b9c6912db4 (252 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 16 old build files (assets/ccip-BniSvFB5.js, assets/ibm-plex-mono-latin-400-normal-CvHOgSBP.woff, assets/ibm-plex-mono-latin-600-normal-DWFSQ4vo.woff, assets/index-BtuqbKNq.js, assets/index-CSfXXEfS.js, assets/index-o8ux9npW.css, assets/quicksand-latin-500-normal-7J1fbcAD.woff, assets/quicksand-latin-600-normal-CkxN0sDw.woff, assets/quicksand-latin-700-normal-HjJN-aaT.woff, assets/webIndex-B1OoZsJV.js, case/assets/index-BtuqbKNq.js, case/assets/index-o8ux9npW.css, task/assets/index-BtuqbKNq.js, task/assets/index-o8ux9npW.css, u/assets/index-BtuqbKNq.js, u/assets/index-o8ux9npW.css). Then copy exactly these 252 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: Dollar amounts use the market price read in the browser from the Uniswap pools (YOLO/IMD, IMD/USDC, WETH/USDC). The doer's own deposit back is shown apart from the reward everywhere: case payouts, Claimable and dare cards. Every open dare shows the doer's deposit as a number: returned in full if the proof is accepted, lost if rejected. An open dare whose last proof was rejected reads Open, with that proof's number and result under the step bar. The YOLO look has its own home, dare page, case, profile, leaderboard and How it works, in plain words with amounts in $. The macOS look has a sidebar on desktop and a tab bar on phones, grouped rows on every page and its own How it works. A case names the judge of its verdict from the dispute's own events: the AI judge or the NFT vote. Validate rows and the proof history show the proof number. Post a dare is one stepper; amount fields take digits and one point; the task text shows the characters left. The interface is available in ten languages, each with its own words for durations and contract time windows (days, hours, minutes, seconds), not English units relabeled. Sentences that mention a time window read naturally in each language, with no stray Latin letters or missing spaces around the number. Signing in offers an embedded wallet next to connecting an existing one. A dare can carry comments. During a dispute, the page names the step (review or voting) and the time left to vote, in the site's language; only an NFT holder sees the legit or fake voting buttons, everyone else sees the same status without them. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 252 files (214 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 214 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":null,"jobId":"2adc2011-3147-4e81-be52-41bf7428ee28","state":"blocked","commit":null,"repoUrl":null,"createdAt":"2026-10-26T13:27:54.650049+00:00","objective":"Publish the moneycanbuy.fun site update with Telegram Mini App sign-in and interface fixes. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit c03f498e7c9d27afbdf4e08785b80d922dda6e1d (252 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 180 old build files in assets/ (every file in assets/ that the commit does not have). Then copy exactly these 252 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: Inside the Mini App, signing in uses the account the Mini App is opened from. Outside the Mini App, the sign-in button reads Sign in with Google or e-mail. Inside the Mini App, Share opens the same dare or case in the Mini App. The YOLO home page lists open dares with category chips, a sort (Biggest, Newest, Ending soon) and a currency filter. In the wallet window, Top up and Export key are two equal full-width buttons. The Style and Language menus are drawn in the design of the selected skin. In Reels, amounts stay readable in every theme and a progress bar shows the position. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 252 files (214 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 214 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":null,"jobId":"46c1e8ed-e3d9-4bb2-99a8-43336e19931d","state":"blocked","commit":null,"repoUrl":null,"createdAt":"2026-10-26T14:01:44.737074+00:00","objective":"Publish the moneycanbuy.fun site update with Telegram Mini App sign-in and interface fixes. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit c03f498e7c9d27afbdf4e08785b80d922dda6e1d (252 files, listed below): replace or add each of these files with identical bytes, and delete every root file the commit no longer has: the 180 old build files in assets/ (every file in assets/ that the commit does not have). The root update runs in two steps so that each upload stays under the limit: first only these deletions, then the additions and replacements. Then copy exactly these {n} committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: Inside the Mini App, signing in uses the account the Mini App is opened from. Outside the Mini App, the sign-in button reads Sign in with Google or e-mail. Inside the Mini App, Share opens the same dare or case in the Mini App. The YOLO home page lists open dares with category chips, a sort (Biggest, Newest, Ending soon) and a currency filter. In the wallet window, Top up and Export key are two equal full-width buttons. The Style and Language menus are drawn in the design of the selected skin. In Reels, amounts stay readable in every theme and a progress bar shows the position. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 252 files (214 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 214 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeia2ubnhn4lapi7ojxqp42osy7lx6bs67rvygtwg2btvo5mu24a27m","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"6b9cc793-e540-4369-a27c-6b11d770697d","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-26T15:37:31.555603+00:00","objective":"Publish the moneycanbuy.fun site update with Telegram Mini App sign-in and interface fixes. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit 2dcc87f059aaf06fcd3cba2f3f07b8e42c1f62a2 (253 files, listed below): add or replace each of these files with identical bytes. Every file the root has now is in the commit, so delete nothing: add the 181 build files in assets/ that the root does not have and replace the 38 changed files. Then copy exactly these 253 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: Inside the Mini App, signing in uses the account the Mini App is opened from. Outside the Mini App, the header has one Connect button, it opens a sheet with Sign in with Google or e-mail on top and the wallets under it. Connect finds the wallets installed in the browser (MetaMask, Rabby and others) and asks them directly. Inside the Mini App, Share opens the same dare or case in the Mini App. The YOLO home page lists open dares with category chips, a sort (Biggest, Newest, Ending soon) and a currency filter. In the wallet window, Top up and Export key are two equal full-width buttons. The Style and Language menus are drawn in the design of the selected skin. In Reels, amounts stay readable in every theme and a progress bar shows the position. A proof photo shown large is shown whole, over a blurred copy of itself. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 253 files (215 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 215 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeia3lidn7qcnvpx2yjuyebmz4yz7k6lto5a73zop3ay7bkkgaaznx4","status":"named","ensName":"moneycanbuyfun.site.identitymd.eth"},"jobId":"4433edf6-676f-4d72-ac1d-c7126942ccd7","state":"completed","commit":null,"repoUrl":null,"createdAt":"2026-10-26T21:51:09.743426+00:00","objective":"Publish the moneycanbuy.fun site update with steadier chain reads and Mini App header fixes. Make the repository root byte-identical to https://github.com/sergey-mavr-agent/moneycanbuy-site commit b54245793e49458cdf48903b296a17217077908b (242 files, listed below): add or replace each of these files with identical bytes and delete the 18 old build files in assets/ that the commit does not have: add 7 build files in assets/, replace the 98 changed files, delete 18 files in assets/. Then copy exactly these 242 committed root files into dist/ with identical bytes, so that dist/ holds only them (no page folders, no og/). After this job the repository root and dist/ are both byte-identical to that commit; check the content of dist/ and host it under the same site name as now (moneycanbuyfun). It is a finished static export for Ethereum mainnet: plain HTML, CSS and JS with relative paths, no build step, no backend. Every page opens through the root index.html, there are no page folders on purpose; task/assets/, case/assets/ and u/assets/ hold two tiny stand-in files each on purpose. In this version: The site is about 250 KB lighter: wallet screens that sign-in and top-up never reach are left out of the build. Chain reads go through a pool of public RPC nodes with batching, a pause for a node after rate limiting and retries. A chain read that did not come back shows loading or an error with Retry, never a zero; on Burn too. Dare titles that did not load are read again. On a case, the proof note is shown once, in Arguments. On a wide case page, Arguments and the timeline sit under the amount panel. In the macOS skin on a phone, the bottom tab bar and the Dispute, Open case and Burn bars are solid. Page texts and the page description say IMD identity NFT holders. Inside the Mini App, the header fits 360 to 420 px in all 10 languages, scrollbars are hidden and the header has a language button. Inside the Mini App, a saved session of another account is signed out and the app signs in with the account it is opened from. On Me, the wallet card shows the whole balance in dollars on top, and the stats are a 2 by 2 grid on a phone. On Burn and on the BURNED card, the burned YOLO is also shown in dollars at today's price; with no price, no dollar amount is shown. In the language list, the Russian entry is spelled in Ukrainian. In Ukrainian, Russian and French, the desktop header uses the short word for How it works, so the header row fits the window. Do not build, rebuild, minify, reformat, add or keep any other file. Fixed parameters, fail, don't change: the repository and commit above; exactly 242 files (204 under assets/), the commit's tree, with their bytes and no others, at the root and in dist/; the site name moneycanbuyfun; config.json as committed (Ethereum mainnet). If the commit cannot be fetched or any file would differ, fail instead of changing it. Files: the 204 files under assets/ exactly as in the tree of that commit, and these 38: README.md, brand/apple-touch-icon.png, brand/favicon-16.png, brand/favicon-32.png, brand/mark-96.png, brand/mark-pixel-64.png, brand/og-1200x630.png, brand/toad-head.png, case/assets/index-BAbgmWtG.js, case/assets/index-BeoLujrk.css, config.json, fallback/action.png, fallback/crazy.png, fallback/food.png, fallback/onchain.png, fallback/other.png, fallback/prank.png, fallback/proof-github.png, fallback/proof-link.png, fallback/proof-stream.png, fallback/proof-tx.png, fallback/proof-x.png, fallback/proof-youtube.png, fallback/shill.png, fallback/sport.png, fallback/trash.png, favicon.ico, index.html, robots.txt, roles/author.png, roles/doer.png, roles/nft.png, roles/predictor.png, sitemap.xml, task/assets/index-BAbgmWtG.js, task/assets/index-BeoLujrk.css, u/assets/index-BAbgmWtG.js, u/assets/index-BeoLujrk.css.","baseCommit":"4130ff996c3a22d22c8d061a74ca7cc61c62aa7b","workflowId":null,"deliveredAt":null,"pullRequestUrl":null}],"contracts":[],"publishedAt":"2026-10-26T22:19:02.72+00:00"},{"id":"job:1b5f1ecb-493e-484e-9352-9747a543e7d8","code":[],"media":[{"cid":"bafybeifhmrvjbdtjomytavcltlsyahv4wn5me7n4dv3lbhh26x7iee7pwi","files":[{"hash":"2442fe0e24278d9d58f7bfe065bdddc95bd673ea00c6002b0c1acc75c198e139","name":"image","path":"artifacts/image.png","bytes":71313,"committed":true,"mediaType":"image/png"}],"jobId":"1b5f1ecb-493e-484e-9352-9747a543e7d8","commit":"8bf45a52d9f32278e9e5ef2f62828ff5fc5453f4","repoUrl":"https://github.com/identity-md-launches/launch-2598-job-order","publishedAt":"2026-10-26T21:26:34.777+00:00"}],"sites":[],"title":"## Job Order — Siphon Wheel Logo Animation (Final)\n\n**Project:** sigmahook.com logo animation\n**Platform:** Cloudflare Pages\n**Paid by:** `0x7351…eff9`\n\n---\n\n### Deliverable\n\nOne animated logo mark.\n---\n\n### Subject\n\nA siphon wheel — a circular mechanical wheel with a continuous loop of water flowing over the top and down the opposite side, forming a closed siphon circuit. The siphon action is the hero: water rising on the left, cresting the top, falling on the right, continuous loop.\n\n---\n\n### Style\n\n- Flat vector meets subtle 3D depth\n- Tech/crypto aesthetic\n- Clean geometric lines\n- No text\n- Iconic, readable at 32px\n- Water trail is a single smooth ribbon\n- Wheel structure in muted silver/grey\n- Water ribbon in a cool gradient (match site accent color)\n- Dark background (match site background color)\n\n---\n\n### Animation\n\n| Phase | What happens | Duration |\n|-------|-------------|----------|\n| Intro (one-time, plays once on page load) | Water primes the siphon — tube fills from empty, flow begins | ~2s |\n| Loop (infinite, seamless) | Steady-state: water flows continuously, wheel rotates slowly synced to flow | ~4s loop |\n\n---\n\n### Critical Specs\n\n- **Loop point:** frame N matches frame 1 exactly. Seamless. No stutter, no jump on repeat.\n- **Priming entry is a one-time intro ONLY.** The loop is steady-state flow only.\n- **No text, no wordmark.** Just the mark.\n\n---\n\n### Output Files\n\n| File | Format | Why |\n|------|--------|-----|\n| Animation | **Lottie JSON** (`.json`) | Cloudflare Pages serves it via `lottie-web` or `@lottiefiles/dotlottie-react`, zero extra infra |\n| Fallback | MP4 (H.264) | For places Lottie won't render |\n| Source | After Effects project or SVG+CSS (match whatever the current logo uses) | So you can tweak later without re-commissioning |\n\nDeliver the Lottie JSON as a **standalone asset**, not baked into a component. You'll hot-swap it from the Cloudflare dashboard later.\n\n---\n\n### Done","types":["media"],"audits":[],"paidBy":"0x735121a546092f31050a867fd7e3a750c7b0eff9","release":null,"research":[],"versions":[],"contracts":[],"publishedAt":"2026-10-26T21:26:34.777+00:00"},{"id":"workflow:2759fb3d-89a9-4c2f-a5e3-6472208fac0e","code":[],"media":[],"sites":[{"id":"812b1ac7-d731-4510-baf7-2270a5fd62a8","cid":"bafybeifi6imde2o4tfrtfdquarcxf3vvkotqfe4tk5vhppenkry5kbzfg4","jobId":"96082b22-214f-4beb-97c8-3809119d60f1","label":"swornbyswarm","status":"named","txHash":"0x4a53749e1b19f434232208d061f9108adb99dab5692aff8e734f55bc5bd91040","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-25T11:41:17.057+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-25T11:40:45.926+00:00","createdAt":"2026-10-25T11:40:13.503+00:00","previewHash":"02a5ecd9e323f3b65c0dde66832c3d67e48fdda5fe8dc4dc16f7b0e1f2d38436","supersededBy":null},{"id":"a4f9b2ed-f404-493b-87a5-685e4638d1d1","cid":"bafybeiffdoib7w2y46f5yf5mid4hidoztkyzgrzkuqm335knmwsnfdrdxi","jobId":"c7347c33-28f2-48c8-ad8f-930191a8a446","label":null,"status":"named","txHash":"0x9f5624df6312aec6619bb5ae6d9154efa29c9d9da2322e23729c92921462f5e1","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-24T20:43:14.869+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-24T20:40:44.492+00:00","createdAt":"2026-10-24T20:40:02.388+00:00","previewHash":"90f83babbb6dcc0091236f8682e5427e807af859e7d012f9bd8505367b5e781d","supersededBy":"812b1ac7-d731-4510-baf7-2270a5fd62a8"},{"id":"a232d6a5-c45c-45cc-ba3f-5374c35c3d43","cid":"bafybeiaadknrfotagyvppod37qvol6shf6aziqk7s66eikenp5reuulaom","jobId":"a96c1fc1-6677-4cfd-8428-99694fe43cb9","label":null,"status":"named","txHash":"0x094323c27ecf0099adb5e2cb1da9b9cc447dfdd11253f6046abede28d21b0668","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-24T19:01:04.409+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-24T18:59:19.937+00:00","createdAt":"2026-10-24T18:58:31.526+00:00","previewHash":"90f83babbb6dcc0091236f8682e5427e807af859e7d012f9bd8505367b5e781d","supersededBy":"a4f9b2ed-f404-493b-87a5-685e4638d1d1"},{"id":"8ed5ba9b-b314-429d-91f4-0b054c21ddb2","cid":"bafybeifdbkexosnc3w6zsr2ko3psffu5kgvywnf6jlpqp3cn3ha5dreiiq","jobId":"6e07d918-51f8-4f43-8382-57321e285d7f","label":null,"status":"named","txHash":"0x35c15e20b1c73fc610c458e7c9a78431b852ea9b304ae0bb3d9a0a7f29f24aea","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-24T17:39:49.709+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-24T17:39:24.131+00:00","createdAt":"2026-10-24T17:38:51.337+00:00","previewHash":"90f83babbb6dcc0091236f8682e5427e807af859e7d012f9bd8505367b5e781d","supersededBy":"a232d6a5-c45c-45cc-ba3f-5374c35c3d43"},{"id":"ed936dbd-ee4f-4879-8dfa-e33dd4233726","cid":"bafybeieyzztqs52vqmyhsh4zzvw44bvav37pxu3otopp6accb25d36pdue","jobId":"13436464-fc5e-4597-8b31-3db16f9a8e75","label":null,"status":"named","txHash":"0x2fafb95b450b3c9a50cc3ba8c965bc88c9e8d80ddcaf07d56629169d122bac5b","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-24T04:55:27.558+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-24T04:54:15.111+00:00","createdAt":"2026-10-24T04:53:12.652+00:00","previewHash":"90f83babbb6dcc0091236f8682e5427e807af859e7d012f9bd8505367b5e781d","supersededBy":"8ed5ba9b-b314-429d-91f4-0b054c21ddb2"},{"id":"7d53405f-f3e7-4ab9-baa0-183e77d4919e","cid":"bafybeieszepojdwxhexb5fqs64wqejhiirlkpedpn5nv2duprl6ldoiiji","jobId":"718215b4-44d2-466d-be59-ff3b80a4d8ce","label":null,"status":"named","txHash":"0xaae74ea2db15f4dcf7ba01c724e088b429b1929a085ed07ca9515d81074bcaa3","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-23T04:00:28.665+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-23T04:00:01.432+00:00","createdAt":"2026-10-23T03:59:40.987+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"ed936dbd-ee4f-4879-8dfa-e33dd4233726"},{"id":"176eb02f-ce40-44d7-a567-185400ead694","cid":"bafybeihi3iciq2nbkev66pd4lhylknxmqqqvqhefdrfi72bnvjiwulsrb4","jobId":"9aaf9962-0b2c-4c62-9ad2-d6ea6cd1f177","label":null,"status":"named","txHash":null,"ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-23T02:37:33.585+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-23T02:35:33.636+00:00","createdAt":"2026-10-23T02:35:06.114+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"7d53405f-f3e7-4ab9-baa0-183e77d4919e"},{"id":"0c0a3007-0d74-4afa-9273-f57b74f1a277","cid":"bafybeihi3iciq2nbkev66pd4lhylknxmqqqvqhefdrfi72bnvjiwulsrb4","jobId":"ba64e70a-158b-4558-837d-a29fb55e1ef4","label":null,"status":"named","txHash":"0x387642538a62565d4853bce784cf105baba3c7574791dde14ce13d2e5cd451a7","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T22:53:04.635+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-22T22:50:13.019+00:00","createdAt":"2026-10-22T22:49:37.905+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"176eb02f-ce40-44d7-a567-185400ead694"},{"id":"fd91ebe7-c111-43a8-b0e0-09664ac71400","cid":"bafybeia2vt2biuojs35f7lxmspe2cvzb2aqs45rzpw75worduv6jlcxfza","jobId":"ecce04a1-96c0-400f-bcc2-d141e6fc7175","label":null,"status":"named","txHash":"0x77c5ebfcc3a721257696e6e649401bf5cd79ef71f679a2b5c6531d404fabacbb","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T20:41:16.022+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-22T20:41:00.11+00:00","createdAt":"2026-10-22T20:40:49.396+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"0c0a3007-0d74-4afa-9273-f57b74f1a277"},{"id":"0a43c753-43dc-4736-aad2-c13133a985d8","cid":"bafybeifhtau2dghpetq7fh5am5v75thp5uapih4sb76aml7zhgrd2unzqy","jobId":"342c6c14-3978-4781-8db1-82ec85f3a75e","label":null,"status":"named","txHash":"0x6e7d0a91f182da39bd376ed113ab1ee96bc9bd650352dc483b0fe6750b4547b8","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T18:09:53.13+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-22T18:09:39.807+00:00","createdAt":"2026-10-22T18:09:12.338+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"fd91ebe7-c111-43a8-b0e0-09664ac71400"},{"id":"d9335970-fad6-4ba9-927b-ea5b4a6e8f4d","cid":"bafybeigpxj47rb2kk2omhnhhzf2uzz7kmxdsnzlxumkcb6rcwtq4qw33ce","jobId":"5d9d3fa0-dc53-476e-8fae-c04c8012c6cc","label":null,"status":"named","txHash":"0x2f546a4a08dad3069be320793f94729c31d7b3d504b6e6d7d279cfa63f1bb88b","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T16:29:39.863+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-22T16:29:00.116+00:00","createdAt":"2026-10-22T16:28:29.092+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"0a43c753-43dc-4736-aad2-c13133a985d8"},{"id":"203b32a7-8dd5-4c75-87aa-c47418576f5a","cid":"bafybeihnixa7ffvfqgundvbtoysnhggtrj4y7cooc3d2oexq3omusnffce","jobId":"4cbe7e1e-42a1-4521-a34d-e4b6c14c4282","label":null,"status":"named","txHash":"0xfb224026a53c911bc8429b8b4f54234533bd0fbf35416bfecdbb42822f1dca74","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T15:01:37.905+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-22T15:00:30.799+00:00","createdAt":"2026-10-22T14:59:49.124+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"d9335970-fad6-4ba9-927b-ea5b4a6e8f4d"},{"id":"8070491c-0ee9-419e-913c-845cd0fbe615","cid":"bafybeia5b2akc37l6ovcflkqwibvldrxygmoicuppgmk6d45t54h4x6waa","jobId":"74206482-15fa-45b9-b6af-455571dcc1f1","label":null,"status":"named","txHash":"0xa293301a17ed5f8b90ef4800ec468e735be2a7b62138c35ef89ba7620a21b09f","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T11:49:50.522+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-22T11:48:47.432+00:00","createdAt":"2026-10-22T11:48:26.064+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"203b32a7-8dd5-4c75-87aa-c47418576f5a"},{"id":"be7ad405-8158-47fd-b04c-ea229e27bb68","cid":"bafybeicfpijonuhbm55q2gj4g6b4vper644wc3oy6nfdawud3oyrf3j4mi","jobId":"27f78bb1-1809-42c2-8d7b-6bb1d26947fe","label":null,"status":"named","txHash":"0xd950996b1cefd0984556af6c6e7afba9ab8e393b0881763e8d81f91be4f0b737","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T02:59:39.985+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-22T02:59:00.59+00:00","createdAt":"2026-10-22T02:58:53.909+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"8070491c-0ee9-419e-913c-845cd0fbe615"},{"id":"127e7d52-48f8-4163-9621-58aa58591981","cid":"bafybeigwnkjeyhg7aowqh6mt6jpl4awrrashzuvzekv5rbkeol2op3urae","jobId":"0fcb87d2-f680-4c66-a44c-67a2e876bc67","label":null,"status":"named","txHash":"0x55f4bf5b142d6459294f49d02066d508b493a6648456d40dc17dc12f7546322a","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T01:05:02.576+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-22T01:03:05.639+00:00","createdAt":"2026-10-22T01:02:35.535+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"be7ad405-8158-47fd-b04c-ea229e27bb68"},{"id":"ed7cbb1c-e084-4569-9539-0806cadeeaf6","cid":"bafybeig3cuo5owj565z663a66o5xgp5mbtrx6ugh367ngkmli5i6x7lnau","jobId":"70b3f40a-65a9-4b1e-ba2d-1ca94224be08","label":null,"status":"named","txHash":"0xd90002b3bf05e77856cae22c72d9f7d1ceb01b596134bf612479d4176728d7df","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T22:46:01.514+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-21T22:44:18.266+00:00","createdAt":"2026-10-21T22:43:55.206+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"127e7d52-48f8-4163-9621-58aa58591981"},{"id":"c6c421fa-4aec-4568-ba9e-6a3fcd2ef4c5","cid":"bafybeiazwlvrtxi5j337gcoaue4nsr6ifnugzkzxaggcxu665iljtr2jjy","jobId":"45cf2dd9-57bc-4f94-beda-7c63c8c67457","label":null,"status":"named","txHash":"0xa18344a109f17e26becdb1e00ae58375deb906bc75cfd5f13aadacddd52b996c","ensName":"swornbyswarm.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T21:13:26.958+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","pinnedAt":"2026-10-21T21:12:47.313+00:00","createdAt":"2026-10-21T21:12:40.924+00:00","previewHash":"7a6df449931fc77ca19916cef8c502d94e752d69e200580678710b61a9cea23a","supersededBy":"ed7cbb1c-e084-4569-9539-0806cadeeaf6"}],"title":"Sworn - an ownerless registry of facts about wallets: build the three-contract registry of this repository from its specification alone, every line new, deploy it on Ethereum mainnet, then build its user-facing website and host it at a public URL. STARTING TREE: https://github.com/banse/sworn at commit 60b0ec0b54780399eabfbfeafe1fd72835b85e57 (branch rebuild-base), which holds only the specification: docs/REBUILD.md on top (self-contained, it wins on any conflict) and docs/SITE.md for the site. Earlier trees of this product are not an input. CONTRACTS: write src/ (Registry, Composer, Renderer), test/, script/Deploy.s.sol and tools/gen_template.py from docs/REBUILD.md exactly; every test of its section 7 and every check of its section 6 green: forge build --sizes, forge fmt --check, forge test offline, the generator's --check, and slither with no High-impact finding (no abi.encodePacked of two or more strings, no shift of a constant by a variable). The three runtimes together at most 69,800 bytes. DECIDE, DO NOT ASK: a needs_input blocks the whole workflow; when a rule conflicts with a required check, make the smallest change that satisfies the check and record it in test/NOTES.md. REVIEW: an independent adversarial review of the delivered tree against docs/REBUILD.md before deployment. DEPLOYMENT: evm_contracts on Ethereum mainnet (chainId 1), in this order and nothing else: Renderer (no constructor arguments), Composer (no constructor arguments), then Registry with curator 0xcb0b0531e86a9ac36fa865ca8e3dbccf047fda91, imd 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, intake 0xa43e6f75ee006411f79ac1c84120606c2330de82, attester 0x5598aa9146215bc13eb26f2c692ad1461fd32982, renderer $contract:Renderer, composer $contract:Composer, burnExecutor 0xe29386719C155B6847aD5a4E97C6674f10ffc750. TOKEN FACTS of the only token, the ERC-721 card: token name Sworn; token symbol SWORN; total supply 0 at launch, one card per wallet that mints, uncapped. NO COIN: no ERC-20; fees are paid in the existing IMD token; no owner. SITE (after deployment): build web/ from docs/SITE.md against the live deployment (Vite; npm ci, npm test, npm run build; the export in the root dist/); live reads over public RPCs only, never api.imdnotdead.fun. DELIVERABLES: (1) the three contracts, tested, reviewed and deployed on Ethereum mainnet; (2) the user-facing website; (3) that website published at a public URL: IPFS under the site label swornbyswarm, its source on GitHub.","types":["contracts","sites"],"audits":[],"paidBy":"0xe5b1275fb926613d983da33fbfe1f331b7f64f2a","release":{"status":"completed","failure":null},"research":[],"versions":[{"site":{"cid":"bafybeiazwlvrtxi5j337gcoaue4nsr6ifnugzkzxaggcxu665iljtr2jjy","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"4f2565af-3ba6-4fde-9444-473ed6b1ee68","state":"completed","commit":"c4ff3238390fc51962fb67e86affc20cf418126e","repoUrl":"https://github.com/identity-md-launches/launch-2404-renderer-composer-registry","createdAt":"2026-10-21T17:12:20.728546+00:00","objective":"Sworn - an ownerless registry of facts about wallets: build the three-contract registry of this repository from its specification alone, every line new, deploy it on Ethereum mainnet, then build its user-facing website and host it at a public URL. STARTING TREE: https://github.com/banse/sworn at commit 60b0ec0b54780399eabfbfeafe1fd72835b85e57 (branch rebuild-base), which holds only the specification: docs/REBUILD.md on top (self-contained, it wins on any conflict) and docs/SITE.md for the site. Earlier trees of this product are not an input. CONTRACTS: write src/ (Registry, Composer, Renderer), test/, script/Deploy.s.sol and tools/gen_template.py from docs/REBUILD.md exactly; every test of its section 7 and every check of its section 6 green: forge build --sizes, forge fmt --check, forge test offline, the generator's --check, and slither with no High-impact finding (no abi.encodePacked of two or more strings, no shift of a constant by a variable). The three runtimes together at most 69,800 bytes. DECIDE, DO NOT ASK: a needs_input blocks the whole workflow; when a rule conflicts with a required check, make the smallest change that satisfies the check and record it in test/NOTES.md. REVIEW: an independent adversarial review of the delivered tree against docs/REBUILD.md before deployment. DEPLOYMENT: evm_contracts on Ethereum mainnet (chainId 1), in this order and nothing else: Renderer (no constructor arguments), Composer (no constructor arguments), then Registry with curator 0xcb0b0531e86a9ac36fa865ca8e3dbccf047fda91, imd 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, intake 0xa43e6f75ee006411f79ac1c84120606c2330de82, attester 0x5598aa9146215bc13eb26f2c692ad1461fd32982, renderer $contract:Renderer, composer $contract:Composer, burnExecutor 0xe29386719C155B6847aD5a4E97C6674f10ffc750. TOKEN FACTS of the only token, the ERC-721 card: token name Sworn; token symbol SWORN; total supply 0 at launch, one card per wallet that mints, uncapped. NO COIN: no ERC-20; fees are paid in the existing IMD token; no owner. SITE (after deployment): build web/ from docs/SITE.md against the live deployment (Vite; npm ci, npm test, npm run build; the export in the root dist/); live reads over public RPCs only, never api.imdnotdead.fun. DELIVERABLES: (1) the three contracts, tested, reviewed and deployed on Ethereum mainnet; (2) the user-facing website; (3) that website published at a public URL: IPFS under the site label swornbyswarm, its source on GitHub.","baseCommit":"60b0ec0b54780399eabfbfeafe1fd72835b85e57","workflowId":"2759fb3d-89a9-4c2f-a5e3-6472208fac0e","deliveredAt":"2026-10-21T18:49:40.094+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2404-renderer-composer-registry/pull/1"},{"site":{"cid":"bafybeig3cuo5owj565z663a66o5xgp5mbtrx6ugh367ngkmli5i6x7lnau","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"70b3f40a-65a9-4b1e-ba2d-1ca94224be08","state":"completed","commit":"6100cc611a07cdaabc7ad627c99bd6d88fe5c6e3","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-21T21:37:26.330971+00:00","objective":"One step on this project's site, the Sworn registry site this workflow built (.imd/reads/project.md): implement items A to E below, rebuild and commit the static export in dist/ so the same site name serves the new version, then check the items. Change nothing else: contract addresses, chain, ABIs and existing copy stay. Keyless and static: no server, key, analytics or request to api.imdnotdead.fun; tests use a fake EIP-1193 wallet and fake RPC answers; nothing is signed or sent. Decide, do not ask: a question blocks the job. (A) The deployed Registry refuses every kind-3 (shared top list) answer holding an address below 2**80 (address(0), 0x...dEaD) or fewer entries than the spec's head (Missed reason 9); the requester loses the price. The site must not let a user register or pay for such a spec. (B) A menu entry Agents linking straight to agents/sworn/SKILL.md, a plain Markdown skill in the open Agent Skills format for Claude Code and Codex, written for agents only and complete with just an RPC: what Sworn is, quoting WhitelistCurator.sol lines 32 to 53 (for builders consuming this list); the deployment (chain 1, launch #2404, source commit, the three addresses) and how to verify it; reading facts (hasTrait, traitsOf, verified, verifiedSpecsOf, claimantOf, tokenOf, the 25 ids; a card is never a credential, never ownerOf); a strict DON'T section (no kind-3 spec of item A's kind; no image, preview or ownerOf as proof; no paid call without the user's confirmation, the live price and a simulation; no invented ids, no test deployment); read-only examples (cast call, a Solidity gate, viem, a Multicall3 batch); building wallet lists for allowlists and onchain reputation (Verified logs, the curator's 19,522 wallets for direct facts, shared facts, one pinned block, a reproducible rule recorded with the output, the sybil caveat); costs and the Missed reasons. Plus a root llms.txt with links, install steps for Claude Code and Codex, and a Hackathon entry section mapping the four criteria to evidence links. (C) Reads that survive a failing public RPC, and no action offered while a value it needs cannot be read; a wallet that already holds a card sees that card, never a mint offer. (D) The community spec form starts empty, the template's examples as placeholders only. (E) One dialog for all four paid actions (mint card, fact request, shared fact request, spec registration): the page keeps one Prepare button per action; the dialog shows what will happen (the live price, where the IMD goes: fees forwarded to the IMD BurnExecutor for bridging and burning on Base, requests paid to the IMD Intake; the balance; for the card the preview of its facts), the disclaimer checkbox, Approve only when the allowance is short, then the action, each step unlocked after the previous one confirmed, the box is ticked and a simulation of that call passed, each step's state, and the result.","baseCommit":"b8c9d5453fe84f49db430f434ddb6866165f5e57","workflowId":null,"deliveredAt":"2026-10-21T22:44:17.011+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/2"},{"site":{"cid":"bafybeigwnkjeyhg7aowqh6mt6jpl4awrrashzuvzekv5rbkeol2op3urae","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"0fcb87d2-f680-4c66-a44c-67a2e876bc67","state":"completed","commit":"1ec1a01dea6843733b2ba94618264bb756578924","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-22T00:20:18.986793+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md): implement items 1 to 6 below, rebuild and commit the static export in dist/ so the same site name serves the new version, then check the items. Change nothing else: addresses, chain, ABIs and existing copy stay. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Decide, do not ask: a question blocks the job. (1) Remove every visible Simulate button; each call is still checked silently before its step unlocks, and a call that would fail shows its reason in plain words. (2) Every 'Prepare ...' action button reads 'Mint ...' instead ('Prepare selected facts' becomes 'Mint selected facts', likewise 'Mint card', 'Mint shared fact' and the others). (3) While a fact request of the connected wallet is pending, a notice at the top of the claim page names the pending fact, says since when and why that fact cannot be requested again until the answer arrives. The Registry refuses only the same fact while it is pending (AlreadyPending(wallet, id)), so the site blocks only that fact; every other action stays available. (4) For each pending request of the connected wallet the claim page shows a live oracle feed like the explorer: status (assessing, attested, failed), answers so far of the panel size, how many agree against the quorum, and each seat's answer (true or false, its figure, or why it failed); it updates without a reload when a new answer arrives, and on attestation the card and facts are read again from the Registry. Data: https://api.imdnotdead.fun/oracle/requests and /oracle/requests/<id> allow browser reads (access-control-allow-origin *); a request carries consumer.verifyingContract, questionHash, status, panelSize, quorum, members[] (tokenId, ok, reason, answer.answer, answer.figure), agreement, attestedAt. Match a pending Registry request by consumer = the Registry and the questionHash of its TraitRequested event, the newest one created at or after the request. This is the site's only api.imdnotdead.fun read, progress information and never proof; when it cannot be read the feed says 'progress unavailable' and chain reads go on. (5) The 'Check verdict delivery' button reads 'Check swarm' and opens that feed. (6) On the claim page the feed sits between the text column (left) and the card (right); on a phone: text, then feed, then card.","baseCommit":"6100cc611a07cdaabc7ad627c99bd6d88fe5c6e3","workflowId":null,"deliveredAt":"2026-10-22T01:03:17.515+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/3"},{"site":{"cid":"bafybeicfpijonuhbm55q2gj4g6b4vper644wc3oy6nfdawud3oyrf3j4mi","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"27f78bb1-1809-42c2-8d7b-6bb1d26947fe","state":"completed","commit":"9aa3cbbf179190c34bc3884fa4970e6d92122855","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-22T01:55:43.452799+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md): implement items 1 to 8 below, rebuild and commit the static export in dist/ so the same site name serves the new version, then check the items. Change nothing else: addresses, chain, ABIs, layout and existing copy stay, except the labels item 7 names. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Decide, do not ask: a question blocks the job. (1) While the connected wallet's tokenOf read is pending or failed, the mint step shows 'Reading your card…' or the retry text, never a mint offer. (2) After a confirmed mint, fact request or shared fact request the dialog shows its result (the card and its number; 'request sent, the panel answers in a few minutes' with the feed), as a registration already does. (3) The dialog shows only the price and fee destination of the action being paid. (4) 'Read the contract README' links https://github.com/identity-md-launches/launch-2404-renderer-composer-registry/blob/c4ff3238390fc51962fb67e86affc20cf418126e/README.md. (5) Do not change the pinned network.json; the site's test notes state why its read RPC list differs (measured 2026-10-21: publicnode first, then tenderly's public gateway, mevblocker/fast, thirdweb; drpc's free tier refuses log ranges over 10,000 blocks). (6) The disclaimer checkbox is never restored from browser storage; after a reload the user ticks it again. (7) Exactly these labels change and no other: 'Mint abandon' becomes 'Abandon request'; 'Mint apply' becomes 'Apply shared fact'; 'Prepared, see Transaction steps.' becomes 'Ready: confirm the steps in the dialog.'; 'Preparing…' becomes 'Checking…'. (8) The oracle feed finds the oracle request of a pending request in this order: (a) exact: GET https://api.imdnotdead.fun/intake/1/<request transaction hash>, entries[].requestId equals the Registry request id and admission.result.requestId is the oracle request id; the browser may refuse it (no CORS header today): on any refusal or error go to (b) silently; (b) the OLDEST oracle request created at or after the request with consumer.verifyingContract = the Registry and the same questionHash, listed with /oracle/requests?q=<claimant address> for personal facts (the listing ignores consumer= and questionHash=, honours q, jobId and status; the default page holds the newest 100); (c) after delivery the Registry's Verified event names it: oracleRequestId is the UUID's 16 bytes left-aligned in the bytes32 (0x23474d49bf7c40e08dad41636c73ea84 followed by zeros = 23474d49-bf7c-40e0-8dad-41636c73ea84); the feed then shows that request and says so if it differs. The feed labels how it found the request: exact, matched, or confirmed by the Registry.","baseCommit":"1ec1a01dea6843733b2ba94618264bb756578924","workflowId":null,"deliveredAt":"2026-10-22T02:59:14.93+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/4"},{"site":{"cid":"bafybeia5b2akc37l6ovcflkqwibvldrxygmoicuppgmk6d45t54h4x6waa","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"74206482-15fa-45b9-b6af-455571dcc1f1","state":"completed","commit":"10edf530c13d182001cbd477eebd3d9db4960d33","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-22T11:17:05.122609+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md): implement items 1 to 7 below in the oracle feed (the swarm progress panel on the claim page and in the dialog), rebuild and commit the static export in dist/ so the same site name serves the new version, then check the items. Change nothing else: addresses, chain, ABIs, layout and existing copy stay, except the texts items 6 and 7 name. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Decide, do not ask: a question blocks the job. (1) For a fact about one wallet, the feed accepts an oracle request only if its question field names the connected wallet's full address (any letter case), whichever way it was found (exact, matched, confirmed by the Registry). When the Intake answer or the Verified event names a request whose question names another wallet, the feed shows 'This request is not about your wallet.' and no panel answers. The feed shows the wallet the question names, shortened to its first 6 and last 4 characters. Shared facts are found as before. Listing entries of /oracle/requests carry question and jobId but no consumer or questionHash. (2) From a confirmed fact request until its oracle request is found and the panel is listed, the feed shows a loading indicator with the text 'Waiting for the swarm to pick up the request…'. (3) Every listed seat that has not answered shows a loading indicator next to 'Awaiting answer' until that seat answers; when the request is attested or failed, rows without an answer stop loading and read 'No answer'. With reduced motion the indicator does not move. (4) Below the line 'Oracle request: <id> · <how found>' a link 'View on the IMD explorer' opens https://explorer.imdnotdead.fun/jobs/<jobId> (the oracle request's jobId; the explorer shows each oracle request on its panel job page) in a new tab; no link while jobId is unknown. (5) The feed shows the oracle request's question: a question longer than about two lines shows a preview with 'Show full question', which expands it, and 'Show less', which collapses it; a short question is shown in full with no control. (6) For a true/false question the summary counts the seats' answers itself: '<answered> / <panel> answers · unavailable agree / <quorum> quorum' becomes '<answered> / <panel> answers · <true answers> true / <quorum> needed'. When the true answers reach the quorum, before the attestation arrives, the feed shows 'Panel agreed: <true answers> of <quorum> needed said true. Finishing: the oracle signs the answer and delivers it to the Registry; the fact appears on your card once the Registry stores it.' When the false answers reach the quorum it shows 'Panel agreed: false. The fact is not proven.' Once attested, the existing attested and delivered texts follow. For other answer types the summary keeps the plane's agreement number and reads 'no agreement yet' while there is none. (7) Seat rows 'Answer: <answer> · Figure: <figure>' become 'Answer: <answer>'; no seat row shows a figure.","baseCommit":"9aa3cbbf179190c34bc3884fa4970e6d92122855","workflowId":null,"deliveredAt":"2026-10-22T11:48:36.792+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/5"},{"site":{"cid":"bafybeihnixa7ffvfqgundvbtoysnhggtrj4y7cooc3d2oexq3omusnffce","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"4cbe7e1e-42a1-4521-a34d-e4b6c14c4282","state":"completed","commit":"47fc49ac333a2dcaca5e3cf320cccc4afa617cae","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-22T14:04:16.024693+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md): implement items 1 to 6 below, rebuild and commit the static export in dist/ so the same site name serves the new version, then check the items. Change nothing else: addresses, chain, ABIs, layout and existing copy stay, except the texts the items name. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Decide, do not ask: a question blocks the job. (1) End states of the oracle feed. A count answer (spec kind 1 or 2) counts as meeting the rule when it is at least the spec's threshold. For kind 1 and 2 the summary reads '<answered> / <panel> answers · <m> meet the rule / <quorum> needed' (true/false facts keep '<t> true / <quorum> needed'). When the answers that meet the rule reach the quorum: 'Panel agreed: <m> of <quorum> needed found the rule met (at least <threshold>). Finishing: the oracle signs the answer and delivers it to the Registry; the fact appears on your card once the Registry stores it.' When the false or below-threshold answers reach the quorum: 'Panel agreed: false. The fact is not proven.' (true/false) or 'Panel agreed: below <threshold>. The fact is not proven.' (count). These lines stay after the attestation until the Registry's event for the request id arrives. The feed reads Missed and NoVerdict events too: Verified adds 'Stored by the Registry; your card shows the fact.'; Missed(reason) shows 'Not stored by the Registry: <reason text the site already has for that reason>. The request price is spent; you can request this fact again.'; NoVerdict or a failed request shows 'No fact was added. The request price is spent; you can request this fact again.' (2) In step 02 a personal fact row whose last request by this wallet ended without a fact shows one line from the Registry events, matched to the wallet by the request id of its TraitRequested event: 'Last request <YYYY-MM-DD HH:MM UTC>: answer false' (Missed reason 8), 'Last request <time>: not stored, <reason text>' (other Missed), 'Last request <time>: no verdict' (NoVerdict), 'Last request <time>: abandoned' (Abandoned). (3) A seat row whose answer is a list shows 'Answer: list of <n> wallets · same as the agreed list' or '· differs from the agreed list' (before the attestation: the most common list), plus '· your wallet at #<rank>' when the connected wallet is in it, and a 'Show list' button that expands the full list in that row ('Hide list' collapses it). Measured live: one seat's 32-wallet answer is about 1,470 characters. (4) The feed checks the question against the request's claimant (the claimant of its TraitRequested event), not the connected wallet, so it works on the Explorer page with no wallet connected. On a mismatch it shows 'This request is not about this wallet.' and 'Expected wallet: <claimant, first 6 and last 4 characters>', and never labels another address in the question as the wallet (the Pretrained and Still Here questions name the WhitelistCurator before the wallet). (5) Once the feed knows an oracle request's jobId it keeps the explorer link when the same request is later found another way (matched, exact, confirmed by the Registry), even if that answer has no jobId. (6) Eligibility check before a paid personal fact. When a fact is selected in step 02, and again when the dialog opens, the site checks the fact's rule for the connected wallet against the public data its question names, from specOf(id): kind 1 or 2: the spec's event logs on its target in its window with the claimant field equal to the wallet (and the fixed filter), counted or summed, read in bounded chunks like the shared-list check; kind 5: the account nonce at the window's block (eth_getTransactionCount at that block); kind 4: the view at the window's last block; 601: whether the wallet received an IdentityMD seat (a Transfer of 0x0000eC93127BAA929E58E97dd0095A2BFb38ec1D to it) from block 25090085, stopping at the first one. Met: 'Our check of the public chain data finds this rule met (<what was found>). The panel decides.' Not met: 'This wallet does not meet this rule (<what was found>). The panel will most likely answer false and the <live price> IMD request price is spent.', and that request needs a second confirmation, a button 'Request anyway'. Not checkable (an RPC refuses, no archive state, over 20 seconds): 'Could not check eligibility; the request price is spent whatever the answer.' The check is advice, never proof, and never blocks a request.","baseCommit":"10edf530c13d182001cbd477eebd3d9db4960d33","workflowId":null,"deliveredAt":"2026-10-22T14:59:58.344+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/6"},{"site":{"cid":"bafybeigpxj47rb2kk2omhnhhzf2uzz7kmxdsnzlxumkcb6rcwtq4qw33ce","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"5d9d3fa0-dc53-476e-8fae-c04c8012c6cc","state":"completed","commit":"967ea75ebf9bcd6931ea437ba4b56a1326835a0e","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-22T15:48:52.814666+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md): replace the live log scan of the eligibility check for nine catalog facts with a static snapshot shipped in the site, rebuild and commit the static export in dist/ so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC answers; nothing is signed or sent. Decide, do not ask: a question blocks the job. Why: facts 701, 801, 901, 1001, 1101, 1102, 1103, 1104 and 1105 (spec kind 1) all count WhitelistCurator events (mainnet 0xcB0b0531e86A9aC36Fa865cA8e3dbccF047FDA91) inside blocks 25769870 to 25789604. The game settled on 2026-08-19, so these logs never change. In browsers the live check reads 'Could not check eligibility' for all nine, because keyless RPCs refuse or limit such old reads (measured 2026-10-22: publicnode answers HTTP 403 'Archive requests require a personal token' beyond about 10,000 blocks behind head; thirdweb allows at most 1,000 blocks per eth_getLogs; tenderly's public gateway serves 2,000-block ranges but answers 429 to bursts; mevblocker/fast likewise). (1) Snapshot. Generate from mainnet logs, never from memory, what the check needs to give every wallet the same count per fact that a full eth_getLogs scan of that fact's spec (read from Registry.specOf: event, window, fixed filter) would give. Read the curator's Deposited, FirstDeposit and HourSaved logs in that block range; a range counts as read only when a second endpoint or a second pass returns the same logs, because a public RPC can answer an empty list wrongly. Known totals: Deposited 28,353 logs from 19,522 wallets; FirstDeposit 19,522 logs with index 1 to 19,522 each once (1,000 of them in 1105's window 25769870 to 25770897); HourSaved 41 logs from 33 wallets. Ship the data in dist/data/ with a manifest: block range, logs per event, matching logs per fact, the generator command and the sha256 of every data file. Commit the generator script so anyone can rerun it with a public RPC. (2) Site. For these nine facts the eligibility check reads only the snapshot: no RPC call, and at most one small data file per wallet (snapshot total under 1.5 MB). A wallet absent from the snapshot has no matching log. The bundle pins the manifest's hashes; a data file that does not match or cannot be loaded gives the existing not-checkable line for that fact only, and the request proceeds as before. The met and not-met lines keep their texts and their found part ('<n> matching event(s); at least <t> required'). 601 and 1301 keep their live checks unchanged. Nothing else changes: addresses, chain, ABIs, layout, routes and copy stay. (3) Cleanup, allowed and not required: delete screenshots and images under docs/frontend/ that no page, test or doc of the site references any more, and other site-owned files that nothing builds, tests or links; list every deleted file in the site's test notes. Do not touch contracts, lib/, reference/, test/, tools/ or the root build files.","baseCommit":"47fc49ac333a2dcaca5e3cf320cccc4afa617cae","workflowId":null,"deliveredAt":"2026-10-22T16:29:10.874+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/7"},{"site":{"cid":"bafybeifhtau2dghpetq7fh5am5v75thp5uapih4sb76aml7zhgrd2unzqy","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"342c6c14-3978-4781-8db1-82ec85f3a75e","state":"completed","commit":"7f5370b3f2f2425bfd406034f2598e4b49c01f23","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-22T17:14:11.489149+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md): implement items 1 to 4 below, rebuild and commit the static export in dist/ so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Change nothing else: addresses, chain, ABIs, layout, routes, the round-6 eligibility snapshot and copy stay, except the texts the items name. Decide, do not ask: a question blocks the job. Measured on 2026-10-22 from the site's origin, per RPC: publicnode answers HTTP 403 'Archive requests require a personal token' for reads more than about 10,000 blocks behind head, and once in 10 even for a recent range; thirdweb allows at most 1,000 blocks per eth_getLogs; tenderly's public gateway and mevblocker/fast serve archive reads, including one topic-filtered eth_getLogs over blocks 25090085 to head, and took 10 parallel calls each. The site's Registry scans start at the launch block 26242885, so they grow by about 7,200 blocks a day and fail once past publicnode's line. (1) RPC pool. An endpoint that errors or answers 429 sits out for at most 60 seconds and is then tried again, never for the rest of the visit. A range an endpoint refuses for its size is read in smaller parts rather than ending the read. Logs still count as read only when two endpoints return the same logs. The latest block used for a read is fetched fresh, not cached: right after a confirmed request, the feed shows the waiting line until the request's event is found, never 'progress unavailable'. (2) Read-back windows (the owner's decision; oracle requests finish in minutes: median 1.4 min, slowest 53 min of 493 measured). The oracle feed reads Registry events of at most the last 600 blocks (2 hours). The step 02 'Last request' lines and the shared fact's attempts read at most the last 7,200 blocks (24 hours); the shared line reads 'Attempts in the last 24 hours: <n>. Last panel result: <result, or none in the last 24 hours>.' Nothing reads before those windows on its own. A 'Check older blocks' button on a feed, a row and the shared fact reads back to the launch block on demand and then shows what it found. A pending request older than 2 hours shows 'Requested more than 2 hours ago.' with that button. (3) 601 and 1301 checks. 601 reads IdentityMD Transfer events to the wallet over its spec window (25090085 to head minus 64) as one read that two endpoints answer alike, so a wallet without a seat gets the not-met line with its price and 'Request anyway' within the 20 s deadline, and a wallet that received a seat gets the met line. 1301 reads the nonce at block 25769870 from an endpoint that serves archive state. The steps are not disabled while a check runs: 'Checking eligibility…' shows and the next step can be confirmed; a not-met result that arrives before the wallet is asked to sign the request still needs 'Request anyway'. (4) Feed and row fixes from the last review. The 'Panel agreed' line belongs to its oracle request id: it never shows for another oracle request id, and it stays across 'Retry progress' until the Registry's event for that request arrives. A Missed(requestId, 0, 1) emitted after that request already ended (Abandoned, Verified, Missed or NoVerdict) does not replace its outcome: the row keeps, for example, 'Last request <time>: abandoned'. Connecting or switching the wallet keeps a known explorer link for the same Registry request.","baseCommit":"967ea75ebf9bcd6931ea437ba4b56a1326835a0e","workflowId":null,"deliveredAt":"2026-10-22T18:09:36.577+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/8"},{"site":{"cid":"bafybeia2vt2biuojs35f7lxmspe2cvzb2aqs45rzpw75worduv6jlcxfza","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"ecce04a1-96c0-400f-bcc2-d141e6fc7175","state":"completed","commit":"eb76ff0b958c513d839c98fc3124b10ec399c4bc","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-22T19:59:34.231994+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md): implement items 1 to 7 below, rebuild and commit the static export in dist/ so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Change nothing else: addresses, chain, ABIs, layout, routes, the eligibility snapshot, the read-back windows and copy stay, except what the items name. Decide, do not ask: a question blocks the job. (1) No reads after a check gives up. Measured on 2026-10-22 against mainnet with the delivered rpc.mjs: with tenderly answering 429, the 601 read of blocks 25090085 to head minus 64 could only be answered by mevblocker, thirdweb refused it for size, and the pool kept halving the range: the check returned 'Could not check eligibility' at its 20 s deadline after 154 to 271 calls, and the pool then made about 400 more calls in the next 60 seconds across all four RPCs. A range is split only when every endpoint that refused it refused it for size; once the caller's deadline has passed, or the page or wallet changed, the pool sends no further request for that read. (2) The 'Requested more than 2 hours ago.' notice follows the clock: it shows when the request's own time is more than 7,200 seconds old, whatever the block count. (3) The site's test notes describe this round and round 7: per item what each test checks and its result, and, from a real browser on the site's origin, which RPC served each kind of read. (4) 'Check older blocks' only when it is needed. In step 02 a fact row shows it only when that row's read failed or the 24-hour window could not settle what the row needs (for example a pending request of this wallet older than the window); otherwise the row shows neither the button nor 'No request found since launch.'. The feed's button for a request older than 2 hours and the shared fact's 'Stored before the last 24 hours' button stay. (5) A 'Mint this fact' button on every step 02 fact row the connected wallet can request (not proven, not pending, not impossible): it opens the same payment dialog as 'Mint selected facts' for that fact alone, with its eligibility check, price and 'Request anyway' rules, and leaves the other rows' selections unchanged. (6) Row order: each fact row reads, left to right on one line, the row's text, then its card preview, then its buttons ('Mint this fact', then 'Check older blocks' when shown). On narrow screens the parts may wrap but keep that order and cause no horizontal overflow. (7) A new page 'Wallet Facts' (menu entry after Claim, hash route #/wallet-facts). The Claim page's 'Swarm progress' section moves there unchanged: the connected wallet's open requests with their live panel progress and the line 'Live panel progress, not proof. Facts and card updates come from the Registry.' Without a wallet the page says 'Connect a wallet to see its requests.'; with no open request 'No open request for this wallet.'. The Claim page no longer draws that section; where it was, while requests are open, it shows one link 'Swarm progress: Wallet Facts'. The payment dialog's own progress stays as it is, and so does step 02's 'Check swarm' block for an undelivered verdict. Wallet Facts also shows the history of the connected wallet's claimed facts: every fact its card holds, catalog and community, each with how it was proven, either direct, frozen at the card's mint (Registry.mintedAtBlock, shown as that block's date), or panel-sworn (Registry.verified: its oracle request id linked to the IMD explorer, its evidence window, and the attested time from api.imdnotdead.fun/oracle/requests/<id>, which allows CORS). It reads this from Registry state, not old logs, so it needs no 'Check older blocks'.","baseCommit":"7f5370b3f2f2425bfd406034f2598e4b49c01f23","workflowId":null,"deliveredAt":"2026-10-22T20:40:58.881+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/9"},{"site":{"cid":"bafybeihi3iciq2nbkev66pd4lhylknxmqqqvqhefdrfi72bnvjiwulsrb4","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"ba64e70a-158b-4558-837d-a29fb55e1ef4","state":"completed","commit":"7d2803871c275a5cab60084e8fa8a1febaabc3d6","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-22T21:44:08.676973+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md): implement items 1 to 8 below, rebuild and commit the static export in dist/ so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Change nothing else: addresses, chain, ABIs, layout, routes, the eligibility snapshot, the RPC pool and copy stay, except what the items name. Decide, do not ask: a question blocks the job. (1) The test notes round 8 asked for. web/TEST-NOTES.md gets a section for rounds 7 and 8: for each item of both rounds, the test file and case that checks it and its result on this commit; and, from a real browser on the site's origin reading mainnet, which RPC answered each kind of read. Our own measurement on 2026-10-22 from the hosted site, to check against and record: publicnode answered eth_chainId, eth_getCode, eth_call, eth_blockNumber and block reads; log reads were answered by publicnode and tenderly as the agreeing pair; publicnode refused an old-block nonce (HTTP 403) and tenderly served it; the full-window seat read for fact 601 can only be answered by tenderly and mevblocker, so with tenderly rate-limited it reads 'Could not check eligibility' within about a second and sends nothing after. (2) Wallet Facts keeps the attested time when the API is busy. api.imdnotdead.fun/oracle/requests/<id> sheds load with HTTP 503 'busy' and retry-after 2, without a CORS header, so the browser sees a network failure; measured: two record reads sent at once both failed and both panel-sworn rows showed 'Attested: time unavailable' without the explorer link, and nothing read them again. Read the records one at a time; retry a failed read about 2 seconds later, up to 3 times; after that show 'Attested: time unavailable' with a 'Retry' button that reads it again. (3) Names. The menu entry and page title 'Claim' become 'Mint', and 'Wallet Facts' becomes 'Wallet'; every site text that names these pages follows (contract words such as claimant stay). Routes become #/mint and #/wallet; old #/claim and #/wallet-facts links, with their queries and anchors, still open the renamed pages, and every link the site publishes uses the new routes. (4) The 'Swarm progress' section (heading, its 'Live panel progress, not proof.' line, one live feed per open request of the connected wallet) moves from Wallet back to Mint, as its own full-width section directly below 'Why add traits after minting?' and above 'Add traits', shown while the wallet has an open request. The 'Swarm progress: Wallet Facts' link goes. Wallet keeps the claimed-facts history; without a wallet it says 'Connect a wallet to see its facts.' (5) Row alignment. In every step 02 fact row the card preview and the 'Mint this fact' button are centred vertically on the row and stand in the same two columns in every row, with one equal gap between the row's text, the preview and the button; a row without a button keeps its preview in that column. The preview gets a thin 1 px border in the site's green accent around the card. (6) No 'Check older blocks' button is left anywhere (the shared fact's, the feed's and the row fallback go). Where the 24-hour window cannot settle something the site reads back to launch block 26242885 itself, once per page view: a stored shared fact's list, an open request's outcome. A failed row read is retried with the existing 'Retry reads'. (7) 1201 / Top Weights, and each shared community fact, become rows of the step 02 fact table in id order, shown like every other row: checkbox, the row text (shared-list rule, panel 11 / quorum 7, stored or pending, attempts in the last 24 hours, last panel result), card preview and button: 'Mint this fact' to request it, or 'Apply shared fact' when the stored list includes the wallet. Its checkbox joins 'Mint selected facts', whose dialog then adds its request step; its pending request shows with the other pending requests under the table. The separate shared-fact blocks go. (8) WhitelistCurator, 'Every hour': remove the 66-row hour table and its note about scrolling sideways; each bar of the chart shows its hour's numbers (hour, deposits, ETH, first deposits) in a tooltip on mouseover, keyboard focus and tap. The window line and the census download stay.","baseCommit":"eb76ff0b958c513d839c98fc3124b10ec399c4bc","workflowId":null,"deliveredAt":"2026-10-22T22:49:59.089+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/10"},{"site":{"cid":"bafybeihi3iciq2nbkev66pd4lhylknxmqqqvqhefdrfi72bnvjiwulsrb4","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"9aaf9962-0b2c-4c62-9ad2-d6ea6cd1f177","state":"completed","commit":"eb5e0266076e9fd1fb549e56b74bbb2be93206cc","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-23T02:14:15.98355+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md): implement the items below, rebuild and commit the static export in dist/ so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Change nothing else: addresses, chain, ABIs, layout, routes, the eligibility snapshot, the RPC pool and copy stay, except what the items name. Decide, do not ask: a question blocks the job. (1) Fewer RPC requests. The site's reads go one request per contract read today: a connected wallet sends about 85 requests on Mint (73 single eth_call) and 77 on Wallet, up to 33 at once. Batch the reads through Multicall3 (0xcA11bde05977b3631167028862bE2a173976CA11, deployed on Ethereum and Sepolia; viem's multicall batching on the public client with the chain's multicall3 contract set), and let the RPC pool send at most 6 requests at a time, queuing the rest. Log reads, wallet calls and simulations stay as they are. Measured on a local copy of this site against mainnet on 2026-10-23: 85 -> 20 requests on Mint with a wallet, 77 -> 13 on Wallet, 23 -> 13 without a wallet, at most 3 at once, the same page text everywhere, and with six visitors at once facts shown in 205-343 ms instead of 263-618 ms. (2) An intro on every page: one or two plain sentences under the title, as Catalog and Integrate have. Explorer: 'Look up any wallet: its card, the facts it holds and any open request, read straight from the Registry. No wallet connection is needed.' Mint: 'Mint your Sworn card, then add facts to it. Direct facts are captured at mint; chain-proven and panel-sworn facts are requested from the swarm's oracle and land on your card when its panel agrees.' Wallet: 'Your wallet's Sworn record: every fact it holds, what each fact says, and how it was proven, with the oracle request behind every panel-sworn fact.' Agents stays a plain link. (3) No window code name (W_LIFE, W_JUDGED, W_FIRST1000, W_DEPLOY) anywhere on the site: 'The whole game, hours 0–65', 'Hours 24–65 of the game', 'The game's opening, until the 1,000th first deposit', 'At the game's first block'; 601's window reads 'From the start of the IdentityMD collection to 64 blocks before your request'. The windows table keeps its block numbers. (4) Step 03 examples. After the template, an 'Example' choice ('Your own rule' first) prefills contract, signature, claimant field, sum field and comparison, leaves name, threshold, block window and the hour value empty, and shows one line saying what it proves; T4 starts from 'function balanceOf(address) view returns (uint256)'. Mainnet examples: T1 'IdentityMD seats received' (0x0000eC93127BAA929E58E97dd0095A2BFb38ec1D, 'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)', to), 'WETH deposits' (0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2, 'event Deposit(address indexed dst, uint256 wad)', dst), 'WhitelistCurator deposits in one hour' (curator, Deposited, contributor, filter hour); T2 'IMD received' (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, 'event Transfer(address indexed from, address indexed to, uint256 value)', to, value), 'WETH deposited' (dst, wad), 'ETH sent to WhitelistCurator' (contributor, amount); T3 'Top WhitelistCurator senders' (amount), 'Top WhitelistCurator weight' (weightAdded); T4 'Holds IdentityMD seats', 'Holds IMD', 'Holds a Proof House Broker Pass' (0xa6958cbc41325e97ecb3bb9d837fbd0938cb2b4f), all balanceOf with ≥; T5 'An active wallet'. The curator event is 'event Deposited(address indexed contributor, uint256 indexed hour, uint256 amount, uint256 creditedDelta, uint256 weightAdded, uint256 newWeight, uint256 txCount, uint256 hourTotal, uint256 earlyBps)'. (5) In step 02 a row's label (Chain-proven, Panel-sworn, Shared) and 'Already proven' follow the rule and window on that second line after ' · ', not on lines of their own. (6) The card preview's border uses the hairline colour of a disabled button, not green. (7) The payment dialog never shows an old preparation: a prepared action that sent nothing is not restored after a reload (a journal with a sent or confirmed transaction still is), and 'Clear journal' becomes 'Close', which closes the dialog and clears the journal unless a transaction is pending. (8) The 'Transaction steps' section shows only once an action is prepared or a journal is saved. (9) The 1201 row shows only rule, window, label, preview and button: the price and quorum sentence, the attempts and last result and 'Pay with' go; one short line stays when its list is stored ('Stored: listed wallets can apply it for gas only.') or a request is pending. (10) Wallet's claimed facts use the full width: each row has the id and name with the fact's meaning in plain words (the catalog rule, or a sentence built from a community spec), then how it was proven; one column on phones. (11) Fact vs artifact becomes a section of Integrate right after its title and intro, content unchanged; its menu entry goes, #/fact-vs-artifact opens the section, the footer's 'A fact is not an artifact' links there, and nothing of the footer is repeated. (12) WhitelistCurator moves into About: About opens with the Why Sworn text as intro (the paragraph, the quote and the 'WhitelistCurator.sol · for builders' link, now pointing at the source section on About), then the WhitelistCurator content (summary, hour bands, hour-24 cliff, hour chart, contract source), then Ownerless and the rest; its menu entry goes and #/whitelistcurator, with #hours or #source, opens that part of About. (13) The header logo is the full-house card from the deployed Renderer: scripts/generate-art.mjs also renders all 25 catalog facts plus 32 community facts, no mint number, into public/art/full-house.svg, shown at 40 px beside SWORN in place of the favicon.","baseCommit":"7d2803871c275a5cab60084e8fa8a1febaabc3d6","workflowId":null,"deliveredAt":"2026-10-23T02:35:13.362+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/11"},{"site":{"cid":"bafybeieszepojdwxhexb5fqs64wqejhiirlkpedpn5nv2duprl6ldoiiji","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"718215b4-44d2-466d-be59-ff3b80a4d8ce","state":"completed","commit":"9485a8841edb9e1c036235002e4e55fa7a2f3909","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-23T03:10:38.53443+00:00","objective":"One correction step on this project's site, the Sworn registry site (.imd/reads/project.md). The previous step (commit eb5e0266) changed web/ but did not rebuild dist/: the hosted site still serves the export of the step before, so none of its 13 items is live. Make the changes below in web/, then rebuild the static export and commit the whole new dist/ (index.html, assets, art/full-house.svg, the manifest) so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Change nothing else: the previous step's items stay as delivered; addresses, chain, ABIs, routes, the RPC pool and copy stay, except what the items name. Decide, do not ask: a question blocks the job. (1) Wallet intro, missing from the previous step: under the Wallet title, with the element Explorer uses, shown with and without a connected wallet: 'Your wallet's Sworn record: every fact it holds, what each fact says, and how it was proven, with the oracle request behind every panel-sworn fact.' (2) Wallet's claimed facts, missing from the previous step: the list uses the full content width (no 80ch cap) and every fact shows its id, name and meaning in plain words (the catalog rule for a catalog id, the sentence the Catalog shows for a community spec). Direct facts sit two per row in aligned columns, so ten direct facts take five rows; their 'Direct · frozen at the card's mint, block … · time' text (or 'read live; no card minted') appears once above them as info, not in each row. Panel-sworn facts keep their proof (evidence window, oracle request) under the meaning. One column on phones. (3) The payment currency choice (IMD or ETH) still calls the removed journal.clear(): it throws a TypeError and fails the typecheck. A currency change clears an unsent preparation through the journal's own clearing, and the typecheck passes. (4) Close pressed while a simulation is still running hides the dialog but keeps the unsent preparation, which can be reopened later. Close clears every preparation that sent nothing, also during a simulation; only a journal with a sent, pending or confirmed transaction stays. (5) A pending 1201 request shows two status lines ('Request pending.' and 'A request is already pending.'); it shows one. (6) The Catalog's direct table states its window once instead of on every row: the rule column's header reads 'Rule · window: Live' and each direct row loses its 'Live' line, so the rule column has one line per row. (7) Text uses the full width: a paragraph or line with nothing beside it spans the content width like the tables, on every page of the site (the Agents link is a file and stays as it is). Text set beside a card or another column keeps its column. (8) Explorer merges into Mint. The Mint page becomes three parts, each with a title of the same size and one intro sentence: 'Mint Card' (the page title; the menu still says Mint) with 'Mint your Sworn card. It captures your direct facts at mint and updates itself when new facts land.', then the mint panel; 'Explorer' with its current intro and all its content; 'Mint facts' with 'Add facts to your wallet: chain-proven and panel-sworn facts are requested from the swarm's oracle and land on your card when its panel agrees.', then 'Why add traits after minting?' and everything after it. Explorer leaves the menu; #/explorer, with ?address= and &trait=, and the home page's wallet form open the Explorer part with that wallet loaded. The page keeps one Transaction steps section. (9) Integrate: right under its intro, one line: 'For agents: Sworn for agents and llms.txt carry every fact id, the authentic addresses and RPC-only examples for checking a fact.', with 'Sworn for agents' linking agents/sworn/SKILL.md and 'llms.txt' linking llms.txt.","baseCommit":"eb5e0266076e9fd1fb549e56b74bbb2be93206cc","workflowId":null,"deliveredAt":"2026-10-23T04:00:14.314+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/12"},{"site":{"cid":"bafybeieyzztqs52vqmyhsh4zzvw44bvav37pxu3otopp6accb25d36pdue","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"13436464-fc5e-4597-8b31-3db16f9a8e75","state":"completed","commit":"d4482048d664e8ba53b38b9e7ea34cdb57035d70","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-24T04:16:43.579142+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md). Make the changes below in web/, rebuild the static export and commit the whole new dist/ so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Change nothing else: addresses, chain, ABIs, routes, the RPC pool, integrity checks and copy stay, except what the items name. Decide, do not ask: a question blocks the job. (1) First load: on a cold load the page shows only 'Loading Sworn…' for about 4 s, because loadRuntime() in web/src/chain.ts fetches imd-deployment.json, the five ABI files and data/renderer-preview.json one after another (seven round trips of about 0.4 s to the sites host) and nothing renders before all seven arrive. The site's header, menu and the route's own text render as soon as the scripts run; the seven files load at the same time, or are part of the build, with the same integrity checks; parts that need them or chain data show their own loading state. (2) Words: every visible text on every page says fact, never trait ('Why add facts after minting?', 'Pay for minting and paid facts with', 'Register a community fact', 'Fact name', 'A white dot marks a rare fact' and the rest). Contract function and event names (hasTrait, TraitRequested) and URL parameters stay as they are. (3) Fact tables except the Catalog's: facts the wallet is not eligible for (the existing check finds the rule not met, or the fact cannot be true because the wallet is not in WhitelistCurator.sol) are hidden by default; one control per table shows or hides them and says how many are hidden. Facts whose eligibility is unknown stay visible. The Catalog lists every fact as today. (4) For a fact the wallet already holds, the column where 'Mint this fact' sits shows 'Minted' with when: the attestation's UTC time for a requested fact, the card's mint block and time for a direct fact. (5) The Public RPC selector and Retry reads move into the footer's bottom row (with 'No owner. No backend. No coin.' and its two links), right-aligned, on every page. (6) The Explorer part (its title, intro, wallet form and all its results) moves from the Mint page to the Catalog page, directly below the Catalog's intro. #/explorer, with ?address= and &trait=, and the home page's wallet form open it there with that wallet loaded. (7) Table rows are more compact: their vertical padding is 8 px or less (16 px today), on every page. (8) Mint page order: the part 'Why add facts after minting?' with its four links becomes the last part of Step 02 · Request facts; the payment choice ('Pay for minting and paid facts with', IMD or ETH, with its note) moves directly below the paragraph that begins 'Chain-proven facts use 5 agents / quorum 3.'. (9) The transaction dialog no longer shows the oracle feed or the card's mint updates. In their place: one line saying that progress continues on the Wallet page, and a button 'Follow progress on the Wallet page' that opens #/wallet. The Wallet page shows that progress for the connected wallet: each pending request's oracle feed and the card's updates, as the dialog showed them. (10) The Wallet page shows the wallet's rendered card (the Registry's tokenURI image, as the Explorer shows it). At desktop widths the card is on the right and the claimed facts, in their current detailed form, on the left; on phones the facts come below the card. Without a card the page stays as today. (11) Clicking a non-empty hive cell of that card highlights, on the left, every claimed fact of the cell's family; a family cell can hold several facts (single points plus a filled cell, for example), and all of them light up. Clicking the cell again clears the highlight; clicking another cell moves it. Empty cells do nothing.","baseCommit":"9485a8841edb9e1c036235002e4e55fa7a2f3909","workflowId":null,"deliveredAt":"2026-10-24T04:53:30.152+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/13"},{"site":{"cid":"bafybeifdbkexosnc3w6zsr2ko3psffu5kgvywnf6jlpqp3cn3ha5dreiiq","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"6e07d918-51f8-4f43-8382-57321e285d7f","state":"completed","commit":"366f512b9dc904d4ce9c746a541bf4fd62320965","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-24T15:03:52.83908+00:00","objective":"One step on this project's site, the Sworn registry site (.imd/reads/project.md). Make the changes below in web/, rebuild the static export and commit the whole new dist/ so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Change nothing else: addresses, chain, ABIs, routes, the RPC pool, integrity checks and copy stay, except what the items name. Decide, do not ask: a question blocks the job. (1) Footer: the Public RPC selector and Retry reads sit on one line in the footer's bottom row, right-aligned, at desktop widths (today the button wraps below the selector at 1280 px); on phones they may wrap. (2) 'Follow progress on the Wallet page' in the transaction dialog stays enabled while a transaction is busy. (3) The six 'CATALOG · …' links on the Catalog page point at github.com/banse/sworn at commit c4ff3238, which is not there (HTTP 404). They point at the same commit and file in https://github.com/identity-md-launches/launch-2404-renderer-composer-registry, the deployed source, with the same anchors. (4) The Mint page loses the title-only 'Add facts' section and, in every step, the 'Who can · Cost and risk · Who benefits' block. (5) Separators: where two separator lines follow each other with nothing between them, one of them goes, on every page at 1280 and 390 px, with and without a wallet (seen today: between the Mint Card panel and Mint facts, above step 01, between the last row of step 02 and step 03 at 390 px, between the home page's record strip and its evidence section at 390 px, between the Wallet's last fact and the footer). (6) Step titles lose the word Step: '01 – Direct WhitelistCurator facts – written onchain, readable from the contract', '02 – Sworn WhitelistCurator facts – provable onchain, sworn by the swarm', '03 – Sworn Community facts – not limited to WhitelistCurator'; the number in the accent colour, the name in the title's weight, the part after the second dash lighter. Under the 01 title a link 'WhitelistCurator.sol on Etherscan: Read Contract ↗' opens https://etherscan.io/address/0xcB0b0531e86A9aC36Fa865cA8e3dbccF047FDA91#readContract. (7) Each step starts with the Catalog's intro of its topic, as on the Catalog page but without its 'in step 02' pointers: 01 the Direct reads intro; 02 the Chain-proven, Shared facts and Panel-sworn intros, one line each, led by the topic name in bold; 03 the Community facts intro. (8) Title hierarchy: on every page each heading level is easy to tell apart: the page title clearly largest, part titles next, step titles next (with the number in the accent colour), sub-parts inside a step smallest, in capitals and muted ('Community facts', 'Why add facts after minting?'). Each level's size is distinct and decreasing, and no two levels look alike. (9) The 'Show ineligible facts (N hidden)' control appears only when at least one fact is hidden. (10) 'Why add facts after minting?', with its text and its four links, moves directly below the Mint facts intro (the previous step had put it at the end of 02). No separator line follows it: the Mint facts part (its title, intro and 'Why add facts after minting?') runs into 01 with space but no line; the lines between 01, 02 and 03 stay. (11) 01 has no 'Show ineligible facts' control: it lists the direct facts the wallet holds, and the Catalog lists every direct rule.","baseCommit":"d4482048d664e8ba53b38b9e7ea34cdb57035d70","workflowId":null,"deliveredAt":"2026-10-24T17:39:03.874+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/14"},{"site":{"cid":"bafybeiaadknrfotagyvppod37qvol6shf6aziqk7s66eikenp5reuulaom","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"a96c1fc1-6677-4cfd-8428-99694fe43cb9","state":"completed","commit":"7cc77af754c49507e5f3005cf074ee6bc4235ace","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-24T18:42:30.503411+00:00","objective":"Sworn site, one step on this project's site (.imd/reads/project.md): make the changes below in web/, rebuild the static export and commit the whole new dist/ so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Change nothing else: addresses, chain, ABIs, routes, the RPC pool, integrity checks and copy stay, except what the items name. Decide, do not ask: a question blocks the job. (1) Wallet: every claimed fact uses the direct facts' form: two columns, the id and name, then one short line, and no proof lines (no 'Panel-sworn', evidence window, oracle request or attested time). The short line is the fact's short rule: 601 'Accepted swarm jobs >= 3', 701 'Deposited again in hours 24–65', 1301 'Account nonce ≥ 20 at launch', the others as the direct facts show theirs. The intro becomes 'Your wallet's Sworn record: every fact it holds and what each fact says.' (2) Wallet: the line 'Direct · frozen at the card's mint, block … · time' goes. Above each group of claimed facts a title in the accent green: 'Direct facts', 'Sworn WhitelistCurator facts' (chain-proven, shared and panel-sworn facts), 'Sworn Community facts'; a group with no fact shows no title. (3) Mint: the step titles 01, 02, 03 show their number and name in the accent green and the part after the second dash in grey, at 19 px (15 px today; the tail 15 px). (4) Mint, 02: in the three lines that start 'Chain-proven ·', 'Shared facts ·' and 'Panel-sworn ·' the text is grey; the three names keep their colour and weight. The paragraph after them ('Chain-proven facts use 5 agents / quorum 3. Panel-sworn facts use 11 / 7. …') is grey too, with one blank line above it, and all the grey text of this block has that paragraph's font size. (5) Mint: selecting a fact never removes its row. Today a wallet whose 1301 rule is not met sees 1301 vanish when it is selected, because the hiding rule in web/src/fact-ui.tsx also hides on the eligibility check that the selection starts, while the payment dialog still lists it. One check: hiding by default uses only what is known before any selection; a selected fact stays in its table with its eligibility result, and the row and the dialog show the same result text. (6) Mint, 'Why add facts after minting?': no links, and 'Mint a card' goes. In their place three quiet info items in three columns, like Integrate's 'The fact / The artifact / The attestation' but smaller and grey, each a title with its arrow and one sentence: '→ Request a fact' 'Choose facts in 02 and pay the live oracle price, per fact.'; '→ Agents check the rule' 'A panel of IMD agents checks your wallet against the fact's rule and block window.'; '→ Your card updates' 'When the panel agrees, the fact lands on your card and in your wallet's record.' One column on phones. (7) Integrate, 'How to verify a card': steps 1 to 4 and the sentence below them are grey; the function names in them (claimantOf(tokenId), hasTrait, verified, ownerOf) keep their look. (8) About: the 'Contracts' section (addresses, chain, attested source, earlier deployments) and the links row after it go, with one separator line left where they stood. (9) Footer, every page: 'Deployment manifest ↗', 'About & sources ↗', the Public RPC selector and Retry reads go. After 'No owner. No backend. No coin.' come 'Source repository ↗' (https://github.com/identity-md-launches/launch-2404-renderer-composer-registry), 'Identity.md ↗' (https://imdnotdead.fun), 'IMD agents ↗' (https://imdnotdead.fun/docs), 'Sworn on X ↗' (https://x.com/swornbyswarm). Reads keep falling back across the RPC pool by themselves; no text tells visitors to use the removed controls. (10) Separators: with a pending request, the last row of 02 and the start of 03 show two lines; one goes. No two separator lines follow each other with nothing between them, on any page.","baseCommit":"366f512b9dc904d4ce9c746a541bf4fd62320965","workflowId":null,"deliveredAt":"2026-10-24T18:59:11.244+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/15"},{"site":{"cid":"bafybeiffdoib7w2y46f5yf5mid4hidoztkyzgrzkuqm335knmwsnfdrdxi","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"c7347c33-28f2-48c8-ad8f-930191a8a446","state":"completed","commit":"55475816f2b5d548a3e89a9a4042b02539ced51b","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-24T20:14:21.409353+00:00","objective":"Sworn site, one step on this project's site (.imd/reads/project.md): make the changes below in web/, rebuild the static export and commit the whole new dist/ so the same site name serves it, then check it. Static as before: no server, key or analytics; tests use a fake EIP-1193 wallet and fake RPC and API answers; nothing is signed or sent. Change nothing else: addresses, chain, ABIs, routes, the RPC pool, integrity checks and copy stay, except what the items name. Decide, do not ask: a question blocks the job. (1) Wallet: below the intro comes the card block that Mint shows today for a wallet with a card: on the left the title 'Your Sworn card #N', the line 'Card #N · Original claimant: …' and the line 'already minted'; on the right the card. The card is the Wallet's interactive card: selecting a non-empty hive cell highlights its claimed facts and selecting it again clears. Under the card stays only the hint 'Select a non-empty hive cell to highlight its claimed facts. Select it again to clear.'; the caption 'Sworn #N · minted' and the status line ('… family selected.', 'All claimed facts shown.') go. A card that holds no fact shows no hint either, since no cell can be selected. A wallet without a card shows no card block. On phones the block stacks as Mint's does. (2) Wallet: 'Claimed facts' follows below the card block at the full content width. Direct facts stay as today, two facts per row. Sworn WhitelistCurator facts and Sworn Community facts show one fact per row in three aligned columns: the id and name, the short line, and the fact's type as Mint's rows show it (Chain-proven, Shared or Panel-sworn, in the same colour). The green group titles, the rows' lines and the highlighting stay; phones as today. The line under 'Claimed facts' ('Every fact this wallet holds, read from Registry state. Card #N.') goes. (3) Mint: for a wallet with a card, the Mint Card part no longer shows the card block; in its place one line: 'Your Sworn card #N is minted. It is on the Wallet page with every fact it holds.', with 'Wallet page' linking #/wallet. A wallet without a card sees the Mint Card part as today, with item 9's capital. (4) Mint, 02: the three lines that start 'Chain-proven ·', 'Shared facts ·' and 'Panel-sworn ·' and the paragraph after them use the step's full width, as the texts of 01 and 03 do; today they stop at 75 characters (.step-intros > p, .step-note in web/src/styles.css). (5) Mint, 02: the 'Community facts' heading and the line under it after 'Mint selected facts' go ('No community specs registered yet. …', 'Community facts appear in the picker above.'). Registered community facts keep appearing as rows in the list. While the community specs load, or if reading them fails, one status line says so above 'The payment dialog explains …'. (6) Mint, 02: a paid fact that the site's own eligibility check finds not met is hidden on load behind 'Show ineligible facts' and counted there, like the facts hidden today. On load, run the same bounded check the Explorer runs (useFactChecks in web/src/fact-ui.tsx) for every paid fact the wallet does not hold. A fact whose check fails, times out or has no answer stays visible; a selected fact keeps its row and its note. Example: a wallet whose nonce at block 25,769,870 is below 20 finds 1301 among the hidden facts. (7) Mint, 'Why add facts after minting?': the three info columns start at the same height; today the second and third sit 8 px lower (the global 'li + li' margin). (8) Separators, last round's item 10, not yet done: with a pending request, the last seat row of 02's Swarm progress and the start of 03 show two lines with nothing between them; the seat row's line goes. Above '01 – Direct WhitelistCurator facts' comes one separator line, as above 02 and 03. No two separator lines follow each other with nothing between, on any page. (9) BurnExecutor texts: that the fee is forwarded to the BurnExecutor is enough. The community intro (03 and Catalog) loses 'BurnExecutor V2 receives this fee.'; on About, 'BurnExecutor V2 receives fees; its bridge configuration, message delivery and Base execution are external dependencies.' goes, so that paragraph reads 'For minting and registration, the fee is forwarded to the BurnExecutor for bridging and burning on Base.' No public text names BurnExecutor V2. The mint panel's line for a wallet without a card starts with a capital: 'The fee is forwarded to the BurnExecutor for bridging and burning on Base.' (10) 1301's short rule reads 'Account nonce ≥ 20 at launch of WhitelistCurator' wherever it shows (web/src/data.ts: Mint, Catalog, and Wallet for a wallet that holds it).","baseCommit":"7cc77af754c49507e5f3005cf074ee6bc4235ace","workflowId":null,"deliveredAt":"2026-10-24T20:40:18.149+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/16"},{"site":{"cid":"bafybeifi6imde2o4tfrtfdquarcxf3vvkotqfe4tk5vhppenkry5kbzfg4","status":"named","ensName":"swornbyswarm.site.identitymd.eth"},"jobId":"96082b22-214f-4beb-97c8-3809119d60f1","state":"completed","commit":"dcf509b5e566c8e0c33bff216deb89751f508eb8","repoUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context","createdAt":"2026-10-25T11:09:05.973071+00:00","objective":"Sworn, replace this project's site, served under the site name swornbyswarm, with a redirect page to https://sworn.sites.imd.fun/, where Sworn's version 2 now lives under the site name sworn: change the site source in web/ so that its build is the redirect page, rebuild the static export and commit the new dist/, so the same site name serves it. The page is deliberately minimal and is not a redesign: one heading, one sentence and one link, in the colours and type the site already uses, nothing else. Static: no RPC read, wallet code, analytics or request to api.imdnotdead.fun. Change nothing outside web/ and dist/. Decide, do not ask: a question blocks the job. (1) The page title stays exactly 'swornbyswarm'. (2) A visit with JavaScript goes at once, without adding a history entry, to https://sworn.sites.imd.fun/ followed by the visit's own hash, so every route keeps its hash; a visit without JavaScript goes to https://sworn.sites.imd.fun/ after one second by a meta refresh; the head carries a canonical link to https://sworn.sites.imd.fun/. (3) The visible text, word for word: the heading 'Sworn has moved', the sentence 'This page served Sworn's first public version (swarm launch #2404). Sworn now lives at sworn.sites.imd.fun.' and the link 'Open Sworn' to https://sworn.sites.imd.fun/ with the visit's hash added. (4) dist/ holds index.html and at most a favicon and one same-origin script or stylesheet; the app's assets, abi and data folders are removed from dist/.","baseCommit":"55475816f2b5d548a3e89a9a4042b02539ced51b","workflowId":null,"deliveredAt":"2026-10-25T11:40:40.341+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2412-workflow-frontend-stage-context/pull/17"}],"contracts":[{"id":"1377d17c-3f09-49e8-87e7-20a07ad45ea9","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"Composer","role":"other","txHash":"0x2f65613f267fc2a5eb38efc3c1534fe47b184bd5f63f7bda975f6a17136016cf","address":"0xf564dd76bd081554170c5e0b78144abfb39f7061"},{"name":"Registry","role":"other","txHash":"0x2f65613f267fc2a5eb38efc3c1534fe47b184bd5f63f7bda975f6a17136016cf","address":"0x0da2679000ea5380d1361cc3cca7d4e8c881f766"},{"name":"Renderer","role":"other","txHash":"0x2f65613f267fc2a5eb38efc3c1534fe47b184bd5f63f7bda975f6a17136016cf","address":"0x3039eaf3b979759c77a2a3fc62850f9534162c3b"}],"createdAt":"2026-10-21T18:49:40.094+00:00","updatedAt":"2026-10-21T18:51:16.808+00:00","launchNumber":2404,"parkedReason":null,"sourceCommit":"c4ff3238390fc51962fb67e86affc20cf418126e","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2404-renderer-composer-registry"}],"publishedAt":"2026-10-25T11:41:17.057+00:00"},{"id":"job:4cc83fbc-42d7-49fe-a9db-4310fb61a570","code":[],"media":[],"sites":[{"id":"21fa66f9-ce88-476d-a29a-3cfa8f31f6ad","cid":"bafybeiglhncli5eti74njswt5ekr27gfm4lymhjlavk2afj2oqfeveu3lq","jobId":"4c5dbeb7-9acb-4a64-b204-9f55e6d78ada","label":"the-hooks-store","status":"named","txHash":"0xb32becdb414bd009ee4b8b9dae830bcaf8cf94a565cab859f41e266dd53e9094","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-23T13:56:04.288+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-23T13:44:40.434+00:00","createdAt":"2026-10-23T06:09:44.639+00:00","previewHash":null,"supersededBy":null},{"id":"ff7197de-7a86-4a31-bcaf-8772eced6ff5","cid":"bafybeihweu5aeeo7dkznbtnxhhfxd6es4ziulbbjqgdm44cls4tpf2v6iu","jobId":"fae11abf-1a3b-4c75-a4cf-c9d6dddda048","label":null,"status":"named","txHash":"0x47eeae0f7c25b6376c3a31cbe019d9099a6a3ebd7130786440970277b363124e","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T20:52:29.519+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-22T20:52:10.447+00:00","createdAt":"2026-10-22T20:51:38.942+00:00","previewHash":"10ec5825e60b7c338f7c3ce8435dd4b0e2333ccfbfdcd8645b76b50b882e91cd","supersededBy":"21fa66f9-ce88-476d-a29a-3cfa8f31f6ad"},{"id":"7ae5c047-39ea-48f5-af9d-c447badaea7b","cid":"bafybeienilq6lgi2kj2sydm2gwy4fcjbcvcfi3vepmdph2avpnmzxnibey","jobId":"2890a532-849a-42ef-ad89-ac69f28af73f","label":null,"status":"named","txHash":"0x9a280dbbf1518f2e10f4441a0219903d32194bd37a8da5bfe75b0dea024653b3","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T19:49:50.541+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-22T19:49:34.592+00:00","createdAt":"2026-10-22T19:49:14.721+00:00","previewHash":"b7790087e499dd38250ca8f6516f46200b6bb5f6c65544e267648f2a8293537e","supersededBy":"ff7197de-7a86-4a31-bcaf-8772eced6ff5"},{"id":"15b888ec-8aea-4247-9533-052adc48b1e0","cid":"bafybeigbhtz7r3f2oz5bncqubmof3wdtdye7au5gscf6ff2w5ici3c3pia","jobId":"a307647e-223c-4679-b2b1-f140a98f23df","label":null,"status":"named","txHash":"0xb6572235752d827728d2a3cf1b794c7e159a6338946cc63adc1cd9bf769b0cb1","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T17:55:53.234+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-22T17:55:00.697+00:00","createdAt":"2026-10-22T17:54:53.893+00:00","previewHash":"221141efdb333188af7d602f1332eeb8dc1af500477716d29e2eb5a6d94671c2","supersededBy":"7ae5c047-39ea-48f5-af9d-c447badaea7b"},{"id":"e508e431-1624-4ed4-b288-b45dc3aa8fff","cid":"bafybeibaclhwmcwb4fuyib3t3okhwqeftt5nr6v7iglor44mttzxcqmrtm","jobId":"65b39d7a-7c8c-43d4-a48d-7083d0aab9ff","label":null,"status":"named","txHash":"0x6fc2959ecf2adcb826cbc887c0994a4b86f92954c9e2df3cbf2fcbca6f9f0b4d","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T07:32:04.257+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-22T07:31:33.684+00:00","createdAt":"2026-10-22T07:31:29.294+00:00","previewHash":"8ec5ad8426b53069ae452b5206a6704a34f5fdc3b00236a0d59eb4f44a3645b9","supersededBy":"15b888ec-8aea-4247-9533-052adc48b1e0"},{"id":"4cb17ce7-2d0a-49ae-b07a-92ec9e526e8b","cid":"bafybeie4rczo3rxn5mqwiywjeyxiot22r6dmhgvttf4ipzddpxul5ioska","jobId":"0543f750-a284-4783-a62f-1ae098fbff5a","label":null,"status":"named","txHash":"0xb0218728362ff95ad823de65c02038a4e1c125fde2df5765afd938b5bb54bcd0","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T04:05:52.595+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-22T04:05:31.335+00:00","createdAt":"2026-10-22T04:05:03.601+00:00","previewHash":"e4fe3b0e8f2c078fbbb32266a2f9cfc979d05438db50eca40a52911be7b58142","supersededBy":"e508e431-1624-4ed4-b288-b45dc3aa8fff"},{"id":"9b2c8399-0956-4455-bd36-64727bfeaa22","cid":"bafybeicp3542n6wmkwwlgh2espg6zjqa7wnvckqqa5myclzrqqzfwobqei","jobId":"cdfac8f6-434f-4234-8a6b-bb1762c06d87","label":null,"status":"named","txHash":"0x3972907fe8fe250cf5601a0d9d21dc7826e4a3cd01f6f077a265517e3c6bb449","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T01:42:14.337+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-22T01:41:38.432+00:00","createdAt":"2026-10-22T01:41:05.67+00:00","previewHash":"ce09bb6397ac60d22705e882a9073d6de3287e7cf0b5cd2eaaf92c9ea4d98efd","supersededBy":"4cb17ce7-2d0a-49ae-b07a-92ec9e526e8b"},{"id":"f3a7e4e0-2627-430c-b08a-87cd0d3884e9","cid":"bafybeign2bpvolmicme2xbuw3suivivfx3flquceysdnl2gnqmni5tskoe","jobId":"47f44537-b572-4746-a9ce-29f415d4709d","label":null,"status":"named","txHash":"0x7805d3f437d04556ab1964fa758ba8d93b4109d41e48d4a7964caad5e859554d","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T23:39:26.93+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-21T23:39:07.882+00:00","createdAt":"2026-10-21T23:38:41.011+00:00","previewHash":"77d647a8f514a553559fa343820ddff58ed6aff0387e28769412e9455dc1be27","supersededBy":"9b2c8399-0956-4455-bd36-64727bfeaa22"},{"id":"8e99762c-1465-4686-86f1-35906c259612","cid":"bafybeieyzh5kf2xjdrcr2fszpxdjt33up67dhinkphindslvrfi4qm6tl4","jobId":"c2b72f7e-31f3-42e2-84b4-730165ce5310","label":null,"status":"named","txHash":"0xc0c17dfa7022b2cf54338117c4c94c421d656b4c10bb7f011bda740803b586fe","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T20:53:15.304+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-21T20:50:17.91+00:00","createdAt":"2026-10-21T20:49:56.086+00:00","previewHash":"1d0539704aac5626bae88d03abbd88fa043457295968a385e9f138b5b1244c64","supersededBy":"f3a7e4e0-2627-430c-b08a-87cd0d3884e9"},{"id":"5567e3df-1dbf-46cf-b5e8-7723d4c0a3b4","cid":"bafybeih2jfd26s5i4oqny33hp52dz2femfg2xuryjnwjmwqefjo2pstbyq","jobId":"533d1b45-3c2a-4299-97d6-984d193cc8ba","label":null,"status":"named","txHash":"0xf1586f84b4b03e176e4212e9ef53b54447c4fbd42120b5e1a66f3e80490ee418","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T19:44:39.06+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-21T19:43:46.745+00:00","createdAt":"2026-10-21T19:43:40.058+00:00","previewHash":"81695c367171b393c594f18f3f482f210b9a602b62fde1ea1459a8f70c994c1e","supersededBy":"8e99762c-1465-4686-86f1-35906c259612"},{"id":"b1566fbe-7106-4de8-bde7-f5fd82866518","cid":"bafybeigbodivacqjbuvjl3h77hevg5faosn3xxtru4c34yk4upkrkwamrq","jobId":"abc4044e-49c5-4ece-b444-eb0a99bc916b","label":null,"status":"named","txHash":"0xc2b6947cab3a3939a4eb84dc80ebd8952cf2c48a7e3f8e570ee4ff6e046feace","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T18:34:04.236+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-21T18:31:37.324+00:00","createdAt":"2026-10-21T18:31:20.135+00:00","previewHash":"889fce40e9cc445d5559c0863c9cbc101a67c4eaa004529c0ff8866a328448c5","supersededBy":"5567e3df-1dbf-46cf-b5e8-7723d4c0a3b4"},{"id":"47119fc4-f7ad-4ed7-8a58-af254532d7b3","cid":"bafybeihxlkyuu5oyli2z36vglwbruy5a7bh24tfq5c7yhkyvkynuhk6egm","jobId":"24fe1709-9793-4281-92f7-70d4af7f3f3c","label":null,"status":"named","txHash":"0xe87539ab5e64400ec3d58f1f204ef9abe8d3bd733318e896af8d4d6de329a040","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T13:09:37.352+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-21T13:08:14.949+00:00","createdAt":"2026-10-21T13:07:49.242+00:00","previewHash":"f8de9734f4e21f2cecd54c1b12d0f9c79ef959dd7e214979837a63b9354fa70e","supersededBy":"b1566fbe-7106-4de8-bde7-f5fd82866518"},{"id":"6f3a468e-ac44-42c7-8d54-691ffa238a48","cid":"bafybeicwc4mb6wpm2lm46eh6acqza4fzmph5coi7ddpfpogqtd7hioqwie","jobId":"a9268c47-5864-45b4-ae6e-022d726eed3c","label":null,"status":"named","txHash":"0x343391780ad64eeabee85e1b53e2b5d9d7c438fb10c683e75a859f07925d2a42","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T10:01:00.792+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-21T10:00:50.989+00:00","createdAt":"2026-10-21T10:00:28.082+00:00","previewHash":"0e55fc12eb886bc3d83a021b67cbab2a576c63d0a9eaaf651cd82b19cb9ffa2f","supersededBy":"47119fc4-f7ad-4ed7-8a58-af254532d7b3"},{"id":"5abb99d8-85c6-4d42-b7fd-97874b6b7f31","cid":"bafybeihqdd2ubw6amcjxmhrn6far5ramzsnwwkmmojexena7jwcsgl2kke","jobId":"4cc83fbc-42d7-49fe-a9db-4310fb61a570","label":null,"status":"named","txHash":"0x1f3259aa182077e8bd1adcc1c24b8e2ca3db7ede8db227f6fdc9706dba5191b1","ensName":"the-hooks-store.site.identitymd.eth","failure":null,"namedAt":"2026-10-21T08:51:04.208+00:00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","pinnedAt":"2026-10-21T08:47:54.082+00:00","createdAt":"2026-10-21T08:47:50.938+00:00","previewHash":"517129d69252e6ecdfca51b4e321fdcf2172e90a9c9cf44f6eeed8dff7c50609","supersededBy":"6f3a468e-ac44-42c7-8d54-691ffa238a48"}],"title":"Build The Hooks Store, phase 1 job 1 of 6: the site shell, the Store page with the character-tile pond landing, the #ad strip and the catalog. Implement SPEC.md sections 3.0, 3.1 (landing, the self-scrolling featured strip with only the open-slot card, catalog, keyword search; address resolution comes in job 3), 3.6 (the seven answers, the Read the sources links and the 14 permissions table exactly as in the mockup), 8, 9 (the live ASCII canvas exactly as mockup/index.html draws it, ported from its pondScene function: the 9 by 15 px cell grid with three tile shades, the Pepe grids copied character for character into src/scene/pepe.json with their meta, the rowboat, the surface and depth fields, the three drawn fish silhouettes and the flocking school of forty-two, the rod, line and hook, the nine-state cast sequence with its timings, pointer flight, click splash, IntersectionObserver pause, ResizeObserver, reduced-motion still frame) and 10 exactly; mockup/index.html is the visual reference and SPEC.md wins on any conflict. Stack: Vite + React + TypeScript, hash routing, base \"./\", one styles.css of the section 8 tokens (Press Start 2P, Pixelify Sans, VT323 from Google Fonts with fallbacks), a single beige theme by design, no footer, every number and amount in VT323. Top bar per 3.0: nothing wraps above 820 px, the search shrinks first, the Connect button keeps one width with or without an address. Landing per 3.1: full-bleed, the scene behind the centered copy on a beige glow, the describe box whose submit stores the text under localStorage hooks-store:draft:v2 as the prompt and opens #builder, three numbers from GET https://api.imdnotdead.fun/swarm hidden on failure, the ticker as outlined text at the bottom edge, no counter and no demo button. Catalog: filter rail (block type, chain, status, sort) and the card grid fed by public/launches.json produced by scripts/snapshot-launches.mjs (GET https://api.imdnotdead.fun/launches?limit=500 then /launches/:id for kinds univ4_hook and evm_contracts whose job objective mentions Uniswap v4 hook; commit the generated file); keyword search from the top bar as in 3.1 with the Results heading and the empty state. Export the cast function for later jobs. Builder, Launch, Hook and My hooks routes render a placeholder panel saying the page arrives in a later job. Never show invented numbers. Tests: Playwright at 320, 390 and 1440 for Store and Learn (no horizontal scroll, the top bar does not wrap at 1440 with a 12-character address in the connect button, filters and search change the grid, a click on the water runs the seven cast frames, reduced motion leaves the scene still), plus unit tests for the snapshot script on a saved fixture. Show a one-line in-progress banner under the top bar that reads This site is being built; launches open when the banner goes away, controlled by a flag in public/site-config.json. Deliver source, dist/, test results and a README that says how to regenerate launches.json.","types":["sites"],"audits":[],"paidBy":"0x5bff2a2fecd1d6152676813b21346238733beab1","release":null,"research":[],"versions":[{"site":{"cid":"bafybeihqdd2ubw6amcjxmhrn6far5ramzsnwwkmmojexena7jwcsgl2kke","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"4cc83fbc-42d7-49fe-a9db-4310fb61a570","state":"completed","commit":"19b00e34cd62ceced303a7b687484f6c3d7c972c","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-21T07:21:56.397682+00:00","objective":"Build The Hooks Store, phase 1 job 1 of 6: the site shell, the Store page with the character-tile pond landing, the #ad strip and the catalog. Implement SPEC.md sections 3.0, 3.1 (landing, the self-scrolling featured strip with only the open-slot card, catalog, keyword search; address resolution comes in job 3), 3.6 (the seven answers, the Read the sources links and the 14 permissions table exactly as in the mockup), 8, 9 (the live ASCII canvas exactly as mockup/index.html draws it, ported from its pondScene function: the 9 by 15 px cell grid with three tile shades, the Pepe grids copied character for character into src/scene/pepe.json with their meta, the rowboat, the surface and depth fields, the three drawn fish silhouettes and the flocking school of forty-two, the rod, line and hook, the nine-state cast sequence with its timings, pointer flight, click splash, IntersectionObserver pause, ResizeObserver, reduced-motion still frame) and 10 exactly; mockup/index.html is the visual reference and SPEC.md wins on any conflict. Stack: Vite + React + TypeScript, hash routing, base \"./\", one styles.css of the section 8 tokens (Press Start 2P, Pixelify Sans, VT323 from Google Fonts with fallbacks), a single beige theme by design, no footer, every number and amount in VT323. Top bar per 3.0: nothing wraps above 820 px, the search shrinks first, the Connect button keeps one width with or without an address. Landing per 3.1: full-bleed, the scene behind the centered copy on a beige glow, the describe box whose submit stores the text under localStorage hooks-store:draft:v2 as the prompt and opens #builder, three numbers from GET https://api.imdnotdead.fun/swarm hidden on failure, the ticker as outlined text at the bottom edge, no counter and no demo button. Catalog: filter rail (block type, chain, status, sort) and the card grid fed by public/launches.json produced by scripts/snapshot-launches.mjs (GET https://api.imdnotdead.fun/launches?limit=500 then /launches/:id for kinds univ4_hook and evm_contracts whose job objective mentions Uniswap v4 hook; commit the generated file); keyword search from the top bar as in 3.1 with the Results heading and the empty state. Export the cast function for later jobs. Builder, Launch, Hook and My hooks routes render a placeholder panel saying the page arrives in a later job. Never show invented numbers. Tests: Playwright at 320, 390 and 1440 for Store and Learn (no horizontal scroll, the top bar does not wrap at 1440 with a 12-character address in the connect button, filters and search change the grid, a click on the water runs the seven cast frames, reduced motion leaves the scene still), plus unit tests for the snapshot script on a saved fixture. Show a one-line in-progress banner under the top bar that reads This site is being built; launches open when the banner goes away, controlled by a flag in public/site-config.json. Deliver source, dist/, test results and a README that says how to regenerate launches.json.","baseCommit":"3d4ef5bdc0fe846931b8344a09d85a14c4926ef3","workflowId":null,"deliveredAt":"2026-10-21T08:48:24.246+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/1"},{"site":{"cid":"bafybeicwc4mb6wpm2lm46eh6acqza4fzmph5coi7ddpfpogqtd7hioqwie","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"a9268c47-5864-45b4-ae6e-022d726eed3c","state":"completed","commit":"6834a291dd218bad3ac872665422e3608bcb4fa3","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-21T09:09:39.898249+00:00","objective":"Before the Builder, carry over two fixes from job 1's delivery; both are visible on the live site and both are defined by mockup/index.html. (1) The top bar must be exactly the mockup's top bar, by the owner's decision (SPEC 14.9): at desktop the hook glyph ʃ at 30 px in VT323 with a 10 px gap, the wordmark at 12 px, nav links padded as in the mockup instead of fixed 48 to 72 px boxes, and the chain pill reading Sepolia · test phase; keep the 820 px wrap rules, the 12-character address rule and the header tests from job 1. (2) The landing copy must use the mockup's text and faces exactly: the eyebrow UNISWAP V4 HOOKS · BUILT BY THE IMD SWARM in Press Start 2P, uppercase, pine; the lede Describe the hook you want, or stack reviewed blocks. The swarm writes it, tests it, audits it and launches it. You pay 0.5 IMD and gas. The three live numbers keep their real /swarm names and stay hidden on failure. (3) The catalog lists only hooks launched through this site (SPEC 3.1 and 14.9): remove scripts/snapshot-launches.mjs, public/launches.json, the unit test for the snapshot and the Public launch snapshot line; job 3 will read this site's launches from chain, so for now the grid shows the empty pond panel from SPEC 3.1 (NOTHING ON THE POND YET, the one line, a DESCRIBE A HOOK button to #builder) with the count 0 hooks, a search or filter shows the no-match state, the featured strip keeps only the open-slot card, and the README's regenerate section goes. Everything else from job 1 stays as delivered, including the Learn cost answer at 24 hours. The Hooks Store, phase 1 job 2 of 6: the Builder. Implement SPEC.md sections 3.2, 4 (including 4.11) and 5 exactly, matching mockup/index.html. The canvas reads as three numbered questions: 1 launch type cards A, B, C first; 2 the describe-or-blocks segmented control with the two-card chooser on a first visit; 3 settings. In Describe mode, show the blocks added from the palette as chips with a remove button under the text area, and the one-sentence rule that numbered rules win over the words; the palette stays usable in both modes. Switching modes keeps both the words and the blocks, which the composer always combines as section 5 says. Add src/blocks/catalog.json with every block in section 4 (id, group, title, blurb, types, params with defaults, limits and units, short label, sentence template that ends with the exact management functions of 4.11, ownerPower, requires, excludes, replaces, owner, anyone, user, view) and src/lib/compose.ts that produces the description text in the exact order and wording of 5.1 for launch types A, B and C (the owner sentence ends with through the functions named above when there are powers; with words and rules together the sentence says the numbered rule wins on a disagreement; the last line asks to keep the function names) plus the request body of 5.2 (univ4_hook body for A with shape, references, steps, chainId, pairWith, owner, economics and customToken only when true; evm_contracts body for B and C; repoUrl and baseCommit when the own-code fields are filled). Palette as collapsible groups with added/total counts and the grey state pills that wrap within 96 px and never squeeze the text column. Block cards show the short label, the fields, the Who uses it line from section 4.12 and the after-launch note (On the hook page: owner buttons, anyone can, users get). Blocks not allowed by the launch type are dimmed and excluded. Preview: the short summary rows, the full description text inside a details disclosure, cost box with amounts in VT323, a disabled free-check button noting it needs the relay, Continue. Enforce every rule in 4.10 and show inline errors. Drafts persist under localStorage hooks-store:draft:v2 and reopen; the landing box text from job 1 lands in the describe editor. Tests: every catalog block renders its sentence with defaults under each allowed type and the sentence contains its 4.11 function names; the fixtures compose-A.txt, compose-B.txt and compose-C.txt in tests/fixtures are identical; body under 16 KiB; the 5% rule, the swap-fee dependencies and the buy/sell exclusion are enforced; Playwright at 320, 390 and 1440 for choosing a type, choosing a mode, switching modes without loss, adding, reordering and removing blocks, and reload persistence. Deliver the source, dist/ and the test report files under tests/results. Pool share per SPEC 3.2 and 5.2: no default value; the field starts empty, Continue stays disabled until the user chooses 10 to 90 in steps of 5, and economics is sent only when chosen. Gameable blocks per SPEC 4.13: a risk field in the catalog, a small yellow warning sign with a hover and focus tooltip (Heads up: this block is easy to work around or needs care, followed by the risk sentence) next to the block name in the palette, on the block card and in the summary list, no red labels, and the Prize pot in its own palette group named Games and lotteries; tests cover the required pool share and that every block with a risk field renders its sign and tooltip. Tested marks per SPEC 4.14: at load fetch https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/evidence/blocks-verified.json and fall back to the bundled public/blocks-verified.json (ship it as an empty array); a block with an entry whose passed is true shows a small tick and the words tested on Sepolia on its card, every other block shows not yet tested on Sepolia in its tooltip; tests cover both states and the fallback.","baseCommit":"19b00e34cd62ceced303a7b687484f6c3d7c972c","workflowId":null,"deliveredAt":"2026-10-21T10:00:44.545+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/2"},{"site":{"cid":"bafybeihxlkyuu5oyli2z36vglwbruy5a7bh24tfq5c7yhkyvkynuhk6egm","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"24fe1709-9793-4281-92f7-70d4af7f3f3c","state":"completed","commit":"100826cca34666e1afd987bca2ca4d4b013cfe08","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-21T11:30:54.886595+00:00","objective":"Before the chain reads, carry over three small fixes and one change of direction from job 2's delivery, all defined by mockup/index.html and SPEC.md. (1) The brand mark: replace the ʃ character in the top bar with the drawn pixel fishing hook from the mockup, because VT323 has no glyph for ʃ and the character falls back to a different system font on every machine (SPEC 3.0 and 14.11). First refresh the repo's SPEC.md and mockup/index.html from https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/SPEC.md and https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/mockup/index.html (the copies in the repo are spec 1.9; the current spec is 1.12). The mark is this inline SVG, placed where the ʃ span was, with the same 10 px gap and the wordmark unchanged: <svg class=\"hook\" viewBox=\"0 0 12 16\" width=\"24\" height=\"32\" shape-rendering=\"crispEdges\" aria-hidden=\"true\"><path fill=\"currentColor\" d=\"M7 0h4v1h-4zM6 1h6v1h-6zM6 2h2v1h-2zM10 2h2v1h-2zM6 3h2v1h-2zM10 3h2v1h-2zM6 4h6v1h-6zM7 5h4v1h-4zM7 6h2v1h-2zM7 7h2v1h-2zM7 8h2v1h-2zM3 9h1v1h-1zM7 9h2v1h-2zM2 10h2v1h-2zM7 10h2v1h-2zM2 11h3v1h-3zM7 11h2v1h-2zM2 12h2v1h-2zM7 12h2v1h-2zM2 13h2v1h-2zM7 13h2v1h-2zM3 14h2v1h-2zM6 14h3v1h-3zM4 15h4v1h-4z\"/></svg> Keep every font self-hosted. (2) The empty pond panel's line must read exactly: Hooks launched through this store appear here. Be the first to cast. (3) When the featured strip holds only the open-slot card it must not scroll and must show that card once; the seamless marquee runs only when there are placements. (4) No test network, by the owner's decision (SPEC 6.1, 14.12 and the 1.13 changes): remove Sepolia everywhere. public/site-config.json enables deploy chains 4663 and 1 and lists only those two chains. The Builder's Deploy on select offers Robinhood Chain and Ethereum behind an empty Choose a chain option, with no default; Continue stays disabled until a chain is chosen, like the pool share. The top bar's chain pill shows the chosen chain's name and reads ETHEREUM · ROBINHOOD before a choice. The catalog's chain filter has two boxes. The Connect button offers a switch only when the wallet is on neither chain, and switches to Ethereum. The Learn question Why Sepolia first becomes Which chains, with the answer from the mockup. The tested marks read proven in a live launch and not yet proven in a live launch. CHAIN_NAMES and the PoolManager map in src/lib/compose.ts drop Sepolia, the compose-A, compose-B and compose-C fixtures are regenerated with Robinhood Chain, the payment notice on the Launch page reads as the mockup's, and the README and the tests follow. Everything else from job 2 stays as delivered. The Hooks Store, phase 1 job 3 of 6: chain reads, search by address, the Hook page with its Manage and Anyone-can panels, and My hooks. Implement SPEC.md sections 3.1 (address search and on-chain resolution), 3.4, 3.5, 4.11, 7.2 and 7.3. Copy the Intake ABI from https://github.com/identity-md-launches/launch-1811-build-technical-foundation-hooks/blob/46e17ea70534e8a7ac2c4ff78501a3c183d32da8/docs/checks/consolidated/sources/intake-abi.json into src/abi/intake.json. With viem public clients over https://ethereum-rpc.publicnode.com and https://rpc.mainnet.chain.robinhood.com, read Requested logs from the Intake 0xa43e6f75ee006411f79ac1c84120606c2330de82 filtered to the launch.open@launch-1 action id in 10,000-block ranges walking backwards with an in-memory and localStorage cache; decode the body JSON; keep only univ4_hook and evm_contracts bodies whose objective ends with the fixed last sentence from SPEC 5.1, which marks a launch made through this site, and ignore every other launch (SPEC 14.9); read Completed logs for those ids; status 0 with an ipfs uri fetches https://ipfs.imd.fun/ipfs/<cid>/result.json for the launch addresses; status 1 or 2 is Failed with the bytes32 reason decoded as ASCII. For every payer address, try an ENS reverse lookup on Ethereum mainnet (cached in localStorage for a day) and keep the name for the featured strip and the hook page. Every card is a launch made through this site, so no Built here mark is needed; derive block labels by matching numbered rules against the catalog sentence templates, falling back to Custom. Search: a 40-hex query matches hook, token, distributor or pool currencies of known launches; a 64-hex query matches request ids and transaction hashes; an unmatched address is resolved on the two chains as in 3.1. Hook page at #hook/<chainId>/<requestId> per 3.4 with the Owner controls panel (rows from the owner functions of the hook's matched blocks, enabled only when the connected wallet equals owner(), OPEN FORM for functions with arguments, one field per argument, address validation) and the Traders, anyone, and readings panel (public and user functions as buttons, views read on load and every 20 seconds); build the minimal ABI from the 4.11 signatures. My hooks per 3.5 with a MANAGE link for live hooks (connected wallet from job 4 may be absent: accept the address from a query param for now). Pond trigger: poll both chains every 20 seconds for new Requested logs with the launch action whose objective ends with that fixed sentence, and call the cast function with the name parsed from the first line of the objective, else A new hook was requested on <chain>; other launches never move the pond or the ticker. When the chain read returns no launches, the catalog keeps the empty pond panel from job 2. Tests: decoding fixtures captured from at least two real Requested and two Completed logs on each chain saved under tests/fixtures, one Live case with a real result.json fixture, one Failed case, address resolution against a known hook and a known token on a fork, a Manage panel test on a fork with a mock hook exposing pause() and paused(); Playwright for the Hook page at three widths. Deliver source, dist/ and test results. When a matched block has a risk field (SPEC 4.13), show the same small warning sign with its tooltip next to the block label on the hook page.","baseCommit":"6834a291dd218bad3ac872665422e3608bcb4fa3","workflowId":null,"deliveredAt":"2026-10-21T13:08:15.948+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/3"},{"site":{"cid":"bafybeigbodivacqjbuvjl3h77hevg5faosn3xxtru4c34yk4upkrkwamrq","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"abc4044e-49c5-4ece-b444-eb0a99bc916b","state":"completed","commit":"a2eb4bab2db3bf3827857cf68ad09caedf34ef8b","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-21T17:36:47.093132+00:00","objective":"Before the launch flow, carry over four corrections to job 3's delivery; the first two are visible on the live site. (1) Every visitor sees Could not finish reading Ethereum, because https://ethereum-rpc.publicnode.com answers HTTP 403 Archive requests require a personal token for any eth_getLogs window older than about 10,000 blocks, so the history walk stops at its second window. Change the Ethereum RPC in public/site-config.json to https://rpc.mevblocker.io for every Ethereum read (logs, eth_call, eth_getCode, eth_getBlockByNumber and the ENS registry): it serves the Intake's whole history, 346 Requested logs from block 26164897, in one call, agrees with publicnode on the newest window, answered 30 whole-history calls in 33 seconds, and sends CORS headers for this site's origin. Keep https://rpc.mainnet.chain.robinhood.com for Robinhood Chain. (2) site-config.json sets intakeFromBlock 0 on both chains, so a fresh browser walks the whole chain in 10,000-block windows (about 2,600 windows on Ethereum and 9,400 on Robinhood Chain; the Robinhood RPC received hundreds of calls in one page view). Set intakeFromBlock to 26164897 on Ethereum (the block where the Intake's code first appears) and 85300000 on Robinhood Chain (before the Intake's first event at block 85318832), add a per-chain logRange to site-config.json (100000 on Ethereum, 400000 on Robinhood Chain; both RPCs accept these windows and Robinhood Chain holds 68 Requested logs in total) and use it for the Requested and Completed windows in web/src/chain/store.ts; read Completed logs once per chain over the same windows and match them to known request ids instead of walking per request; when a window fails for any reason split it in half down to 1,000 blocks before reporting the chain unreadable. On a fresh browser the status line must reach Read from Ethereum and Robinhood Chain within 30 seconds; add a unit test for the window sizes and a Playwright test against the live RPCs that the status line settles. (3) The resolved-address card for a hook outside the store reads A v4 hook not launched through this store (SPEC 3.1 corrected: hooks such as Hamster Hour were launched through IMD, only not through this site). (4) Remove the chain pill from the top bar: the span with class chainpill in web/src/App.tsx, its styles and the state that fed it. The bar is the logo, the nav, the search box and Connect, with nothing between the search box and Connect, and it still never wraps above 820 px; the chosen deploy chain appears in the Builder's settings and summary, on the launch page and on each card, not in the top bar (SPEC 3.0 and 4 step 3, owner's decision 13). Refresh SPEC.md from https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/SPEC.md (now 1.15; section 7.2 records the RPCs, start blocks and windows, and 3.0 drops the pill). Everything else from job 3 stays as delivered. The Hooks Store, phase 1 job 4 of 5: wallets and the launch flow. Implement SPEC.md sections 3.3, 6.1, 6.2, 6.3 and 6.4 (copy-only panel in phase 1). Reuse the wallet layer from https://github.com/identity-md-launches/launch-2254-build-hooks-store-polished/tree/11f246fd8751b48cee018f8d5aa1c6a282e40e0e/src/wallet (EIP-6963 injected wallets, Coinbase Smart Wallet, mobile open-in links) extended to Ethereum 1 and Robinhood Chain 4663 with wagmi and viem; the Connect button keeps its fixed width and shows the shortened address. Launch page per type: summary table, the fee table of 6.3, the payment-chain sentence, the type C pool note, three real steps. Step 1 connect on Ethereum or Robinhood Chain, the payment chain; the hook deploys on the chain chosen in the Builder, which may be the other one (SPEC 6.2). Step 2 read priceOf(launch.open@launch-1 as bytes32, imd) from the Intake 0xa43e6f75ee006411f79ac1c84120606c2330de82; refuse if 0 or above 500000000000000000; then IMD.approve(intake, price) with IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7 on Ethereum and 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127 on Robinhood. Step 3 Intake.request(actionId, bodyBytes, (zero address, 0x00000000), imd, price) with the compact UTF-8 JSON from the composer (refuse above 16 KiB). Each step shows its hash, waits for the receipt, and the next button stays disabled until the previous receipt succeeds. Parse Requested from the receipt for the request id, save it under localStorage hooks-store:pending, show the done notice, call the pond cast, open #hook/<paymentChainId>/<requestId>. The deploy chain selector offers only the chains site-config.json enables. Without the relay show the warning that a refused body spends the fee and a Copy request button. Type C hook pages that are live show the OPEN THE POOL panel of 6.4 with the computed PoolManager.initialize call, the sorted currencies, fee tier, tick spacing, the typed starting price converted to sqrtPriceX96, and a copy button; sending it from the site is phase 2b. Tests: an Anvil fork of Robinhood Chain with a mocked IMD balance runs approve and request end to end for a type A and a type B body and asserts the body bytes equal the preview and the request id is parsed; wrong chain, rejected signature and zero price are covered; sqrtPriceX96 conversion unit tests; no live payment anywhere in tests. Deliver source, dist/ and test results.","baseCommit":"100826cca34666e1afd987bca2ca4d4b013cfe08","workflowId":null,"deliveredAt":"2026-10-21T18:31:55.484+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/4"},{"site":{"cid":"bafybeih2jfd26s5i4oqny33hp52dz2femfg2xuryjnwjmwqefjo2pstbyq","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"533d1b45-3c2a-4299-97d6-984d193cc8ba","state":"completed","commit":"646b79f428d3a70a5d4b408d26110a5ea49320ba","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-21T18:58:50.970483+00:00","objective":"Carry over from job 4's delivery: nothing is missing; one change of order. In the Builder's Pair with select (type A), list IMD first and start on IMD, ETH second (SPEC 4 step 3 and owner's decision 14); the composed request and the summary follow the choice as before. Refresh SPEC.md from https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/SPEC.md (now 1.16). Everything else from job 4 stays as delivered. The Hooks Store, phase 1 job 5 of 6: the relay, the live free check, scene polish and final polish. Implement SPEC.md section 7.4 and the phase 2 polish of section 9 (reeds at the banks, a hat on the fisher, one or two birds over the canopy, all monochrome tiles). Write relay/worker.js, a single-file Cloudflare Worker that forwards POST /check to https://api.imdnotdead.fun/requests/check and POST /import to https://api.imdnotdead.fun/requests/import, and GET /launches, /launches/:id, /jobs/:id and /intake/:chain/:tx to the same paths on api.imdnotdead.fun, adds Access-Control-Allow-Origin *, caches GET responses for 30 seconds, and rejects every other path and method; include a README with the one-command deploy and unit tests with a fetch mock. In the site, read relayUrl from site-config.json (null by default): when set, enable the free-check button in the Builder and render the What the swarm understood panel from the response (facts with their states, plan step titles, blockers, suggestions) and block Launch while blockers exist; resolve own-code repositories through /import before composing; name launches in the pond ticker from /launches; show the real stage names Building, Audit panel and Deploying on the Hook page timeline from /jobs/:id. Final copy pass against SPEC.md section 8; Lighthouse accessibility at least 95 on Store and Builder; Playwright regression at three widths for every route. Deliver source, dist/, relay/ and test results. The second step is an adversarial review by a different seat, read-only, of the money path delivered in jobs 4 and 5: the price read, approve and request calls, body encoding, receipt parsing, request-id handling, the relay, and the chain reads; it reports concrete reproductions, and the owner carries any confirmed finding into the next job. No real launch happens before that review is read.","baseCommit":"a2eb4bab2db3bf3827857cf68ad09caedf34ef8b","workflowId":null,"deliveredAt":"2026-10-21T19:43:55.73+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/5"},{"site":{"cid":"bafybeieyzh5kf2xjdrcr2fszpxdjt33up67dhinkphindslvrfi4qm6tl4","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"c2b72f7e-31f3-42e2-84b4-730165ce5310","state":"completed","commit":"bdd7da306a0f138c7f0bbeb72efd578aee1990ae","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-21T20:10:39.670098+00:00","objective":"The Hooks Store, phase 1 job 6 of 6: go live. The owner has read job 5's adversarial review and the design critic's findings; this job carries all seven, then opens the site. Full reproductions are in https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/evidence/job-5-reviews.md. (1) web/src/relay.ts jobStages(): classify nodes by the states api.imdnotdead.fun really returns: waiting (queued), working (in progress), accepted (done) and failed; a working implement node makes Building active, a working review or audit node makes Audit panel active, a completed job whose launch is not yet live makes Deploying active; add a unit test fed with a recorded live GET /jobs/:id answer and change web/tests/job5.spec.ts to those names. (2) src/lib/compose.ts line 171: the fee sentence names the pair currency, IMD when pairWith is imd and ETH otherwise (SPEC 5.1); update tests/fixtures/compose-A.txt and the preview tests. (3) web/src/relay.ts relayFetch(): read the body as text, check the status, then parse; a non-JSON answer (a Cloudflare HTML error page, a 5xx from a proxy, an empty body) shows 'IMD could not finish this request (status). Try again.' and never a raw SyntaxError; test it. (4) web/src/LaunchReview.tsx: a cancelled or replaced approval (a reverted receipt, or a replacement the wallet reports as cancelled) returns the step to failed with a working retry instead of staying pending with every button disabled. (5) web/src/chain/store.ts: a Requested or Completed log the chain no longer holds (a removed log, or a block hash that no longer matches on refresh) is dropped from records, rows and localStorage, so an orphaned request disappears and an orphaned completion cannot keep a hook marked Live; test it with a reorg fixture. (6) a successful own-code import survives navigation to Launch when browser storage is full: keep the pinned import in memory as well as in storage. (7) the pond ticker's relative timestamp ages (re-render at least once a minute). Then go live: in public/site-config.json set relayUrl to https://hooks-store-relay.hooks-store.workers.dev (the owner's deployed worker, no trailing path) and inProgress to false, so the banner goes away and Approve and Launch work on the Launch page; keep the free-check gate (blockers lock Launch, a failed or stale check asks for a retry) and the refused-body warning. Run one real free check from the built site in a browser against that relay and record the response. No real launch is made by this job. Refresh SPEC.md from https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/SPEC.md (now 1.19). Everything else from job 5 stays as delivered. Deliver source, dist/ and test results under tests/results/job6: unit, relay, Playwright at 320, 390 and 1440 for every route, and the live-RPC settle test.","baseCommit":"646b79f428d3a70a5d4b408d26110a5ea49320ba","workflowId":null,"deliveredAt":"2026-10-21T20:50:04.562+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/6"},{"site":{"cid":"bafybeign2bpvolmicme2xbuw3suivivfx3flquceysdnl2gnqmni5tskoe","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"47f44537-b572-4746-a9ce-29f415d4709d","state":"completed","commit":"6915afa6ef83d833a3f15fc072babfb703645130","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-21T22:05:34.611886+00:00","objective":"The Hooks Store, job 7: launch safety. The owner's first real launches showed that a request the swarm cannot finish still spends the fee, so this job makes a post-payment question almost impossible and carries every open finding. (1) Fee wording: in src/blocks/catalog.json every fee sentence (Swap fee, Different buy and sell fees, Whale fee, Volatility fee, Buyback jar, Prize pot, Fee that fades, and any block that says the ETH side or settled in ETH) names the pair currency for both the fee side and the settlement: IMD for a type A launch paired with IMD, ETH otherwise; an IMD-paired request adds the sentence 'do not convert the fee to ETH and do not use any other pool'; 'my wallet' is written as the paying wallet's address; the treasury choice reads IMD's treasury and writes 0x3f252e859a277a86A3967c11D4E054B2f07a1F22 (SPEC 5.1, decisions 17 and 18); update the fixtures and add composer tests for every block under every type and pairing. (2) A consistency check runs on every composed request before the free check and before Launch, and locks Launch with a red notice naming the sentence when a fee side or settlement does not match the pair currency, a recipient is not an address, a block depends on a pool, token or service with no address on the deploy chain, or two rules contradict each other; unit-test it on the composed output of every block under every type and pairing. (3) Fixed facts: when the free check's response carries a fixed fact that conflicts with the request (such as the IMD-side fee being sold for ETH while the request keeps the fee in IMD), the What the swarm understood panel shows the conflict and Launch stays locked until the request opts out explicitly; the composer adds the opt-out for IMD pairs by itself. (4) Hook page: a job IMD reports as blocked shows the builder's question as IMD reports it under Needs attention, read through the relay from GET /jobs/:id (blockedReason and the failed node's failureReason), with a button Fix in Builder that reopens the draft that produced the request with the question beside it; the launch's request is kept so the relaunch is a corrected request. (5) Known questions: src/blocks/known-questions.json lists past builder questions as rules the check applies; the first entry is launch 2's question, which asked for an IMD/ETH conversion pool because the fee sentence said ETH while the pool was paired with IMD. (6) Copy: the fee table and the Launch page say that a request the swarm has to stop on still spends the fee and that these checks exist to make that rare (SPEC 6.3 and 6.7). Carry-overs from jobs 5 and 6: remove the hat drawn over Pepe's head in src/scene/pond.ts (drawHat) and keep the far boat and the birds (SPEC 9, decision 16); a confirmed cancelled or replaced launch transaction in web/src/LaunchReview.tsx fails with a working retry instead of staying pending with the flow locked; when a reorg removes a request, the pond ticker in web/src/Landing.tsx drops its announcement and stops showing its age; reproductions are in https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/evidence/job-6-reviews.md. Refresh SPEC.md from https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/SPEC.md (now 1.25). Everything else from job 6 stays as delivered. Deliver source, dist/ and test results under tests/results/job7: unit, relay, Playwright at 320, 390 and 1440 for every route, and the live-RPC settle test.","baseCommit":"bdd7da306a0f138c7f0bbeb72efd578aee1990ae","workflowId":null,"deliveredAt":"2026-10-21T23:39:08.146+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/7"},{"site":{"cid":"bafybeicp3542n6wmkwwlgh2espg6zjqa7wnvckqqa5myclzrqqzfwobqei","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"cdfac8f6-434f-4234-8a6b-bb1762c06d87","state":"completed","commit":"dd8913c9d083c7658ff0ec26a227232d156dea00","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-21T23:45:50.976548+00:00","objective":"The Hooks Store, job 8: catalog hardening, so that no request leaves the builder a guess and no sentence earns a high audit finding. Three launches blocked after payment and the audit panels found design flaws in our sentences; SPEC.md section 4.16 (version 1.31, 30 numbered rules) is the complete list and binds this job: implement every rule of 4.16 in src/blocks/catalog.json, src/lib/compose.ts and the Builder. The headline items: (1) type B and C requests open with a deployer whose constructor mines the CREATE2 salt itself (no salt argument, no deploy function afterwards), forwards the PoolManager, $owner and the recipient unchanged, and exposes hook(); the site shows 'hook not deployed yet' when hook() is zero; B and C bodies carry the references uniswap-v4-hooks and uniswap-v4-security; the wording IMD's free check accepted is in https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/evidence/check-B-deployer.request.json, amended as 4.16 item 1 says. (2) type A requests say beforeInitialize accepts only the IMD launch factory passed as $factory, with constructor arguments PoolManager address, $owner and $factory (item 2). (3) B and C requests restrict initialization to pools whose currency0 is native ETH, key every pool-dependent view and limit by PoolId, and define the token (item 3). (4) every fee side, settlement, threshold and unit follows the pair currency, IMD pairs add the no-conversion and currency-order sentences, and with no fee block the composer writes 'Hook fee rate: 0%.' (items 4 and 9). (5) every request without Yield says the hook uses no outside pool, token, price feed or service; the body always carries owner; type A names the factory, B and C never do (items 5 to 7). (6) fees are computed on the amount traded and a partly filled swap that specified the pair-currency amount reverts; Whale fee, Fee that fades, Volatility fee, Split the fee and Share fees with LPs are tied to one rate and one destination as item 10 says; 'burn' leaves the fee blocks; 'my wallet' is the paying wallet's address and 'treasury' is IMD's 0x3f252e859a277a86A3967c11D4E054B2f07a1F22 (items 8, 10). (7) the Buyback jar buys only inside buyback() with a 3% price limit and keeps the standard token's bought tokens forever, the own token gains burn(uint256), the existing token burns only if it can (item 11); Share fees with LPs and Prize pot as items 12 and 13. (8) the Anti-sandwich sentence, windows starting at the first swap, wallets as tx.origin with the stated limit, seconds instead of blocks, Max swap size on token amounts only, liquidity rules keyed per position, Sunset and Donation rules as items 14 to 21. (9) excludes become lists as item 22 says; Batch auctions is dimmed 'not in this version'; Dynamic LP fee needs the dynamic-fee flag and 6.4 initializes with it; Yield stays dimmed (items 23 to 25). (10) words mode and Custom rule carry the warning and checklist, compose no hidden blocks, never deny owner functions the description grants, and a numbered rule wins; the six-block notice; mulDiv and the own-token supply cap (items 26 to 28). Carry-overs: in the Describe it mode the hidden block stack was composed into the request (contradictory), and the composer wrote 'No owner functions' against a description granting them; both are covered by item 26. Tests: composer tests for every block under every type and pairing assert the sentences of 4.16 (no ETH in an IMD-paired request outside the opt-out sentence, the deployer and factory sentences, the definition line, the references, 'Hook fee rate: 0%' when no fee block, the excludes lists); the consistency check of 6.7 fails on each forbidden combination; Playwright at 320, 390 and 1440 for the Builder in both modes. Refresh SPEC.md from https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/SPEC.md (now 1.31). Everything else from job 7 stays as delivered. Deliver source, dist/ and test results under tests/results/job8. The second step is an adversarial review by a different seat, read-only, of the composed requests for every block under every type and pairing against SPEC 4.16, the consistency check, the fixed-facts comparison and the deployer and factory sentences: it reports concrete reproductions of any sentence a builder would have to guess, any sentence that would earn a high audit finding, or any check that lets one through, and the owner carries confirmed findings into the next job.","baseCommit":"6915afa6ef83d833a3f15fc072babfb703645130","workflowId":null,"deliveredAt":"2026-10-22T01:41:18.724+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/8"},{"site":{"cid":"bafybeie4rczo3rxn5mqwiywjeyxiot22r6dmhgvttf4ipzddpxul5ioska","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"0543f750-a284-4783-a62f-1ae098fbff5a","state":"completed","commit":"7e57a8351f28c4d541e0b8d3cd94e8204cdb89b9","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-22T02:05:19.937632+00:00","objective":"The Hooks Store, job 9: proven launches and the wait, plus the open carry-overs. Carry over first, a regression from job 8 that blocks every launch: src/lib/compose.ts body() now always sends owner (s.owner or the connected wallet) but no longer lowercases it, and a connected wallet arrives with checksum capitals, so IMD's check answers 400 'owner: expected a lowercase EVM address' and a paid request would be refused on chain with the fee spent; lowercase owner, remainderTo and every address the body carries, add a unit test that composes with a checksummed wallet, and have the consistency check refuse any body field that is not a lowercase address. Carry over first, from launch 1 (SPEC 7.3, decision 25): for a contracts-only launch the result file behind the Completed event predates deployment and names no address, so the hook page takes the deployed addresses from the launch record through the relay (GET /launches/:id, artifacts[].address, attestation.contracts for the names), reads hook() when the artifact is a deployer and shows both addresses, says 'hook not deployed yet' while hook() is zero, and turns the Live step green when the Completed event has status 0 and the launch record reads live; the hook's address is never a condition for Live. Also carry job 8's residual review findings (evidence/job-8-reviews.md): (a) the written-fee detector in src/lib/writtenFees.ts is a word allowlist, so 'The owner receives 1% of every swap', '1% of each trade goes to the owner', '2% commission', 'toll', 'route', 'divert', 'accrues' still produce 'Hook fee rate: 0%' with no fee-side sentence and no finding; make it structural: any written amount (percent, basis points or a spelled fraction) near a trade word with no fee block counts as fee intent and composes the fee-side, settlement, recipient and partial-fill sentences, and an amount the parser cannot attach to a charge raises the clarification finding instead of writing zero; (b) 'payable to IMD's treasury' written in words leaves the paying wallet as the recipient in the deployer sentence and the fee footer, contradicting the written destination: the recipient named in words flows into both; (c) a spelled threshold such as 'one percent' or '1 percent' lets 'charge a small hook fee' pass without a rate: spelled numbers count as amounts and a fee without a rate is a finding; (d) the combined 5% cap adds written and block maxima across directions; apply it per direction. Then: Then implement SPEC.md section 4.17: the site fetches https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/evidence/proven-launches.json at load (never bundled; a fetch failure means no proven launches); a draft matches an entry when the launch type, the set of block ids and the chain are the same, with parameters, extra words or a Custom rule allowed; nothing is asked: the match is applied in the background, the summary shows one line 'Built from a proven launch: {name} (launch {number}, audited {date})' and the hook page carries the same line after launch; a creator's own repository in Advanced overrides the match and there is no other control; when a match applies the body carries repoUrl and baseCommit from the entry, resolved first through the relay's /import, and if the import fails or the relay is absent the request is composed from scratch with no notice beyond the longer wait estimate; and the composed text says after the first sentence 'Start from the audited source at {repoUrl} commit {commit}: keep its behavior, apply the parameters and rules of this request, adapt the deployer to mine its salt inside its constructor if it mines after deployment, and audit it as imported code', while every other sentence of 5.1 and 4.16 stays. The Builder's summary and the Launch page say 'Typically 1 to 3 hours: the swarm writes, tests, audits with four auditors and a judge, then deploys. From a proven launch, usually less.' The hook page offers Copy link and asks once for permission to show a browser notification when the launch goes live. Tests: composer tests for a matching and a non-matching draft, the import path with the relay mocked, and Playwright for the summary line and the fallback at 320, 390 and 1440. Refresh SPEC.md from https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/SPEC.md (now 1.34). Everything else from job 8 stays as delivered. Deliver source, dist/ and test results under tests/results/job9. The second step is an adversarial review by a different seat, read-only, of the composer's output with and without a proven launch, the import path, the owner and address lowercasing, the written-fee detector and the Live reading for contracts-only launches: it reports concrete reproductions of any request a builder would have to guess at or any body IMD would refuse, and the owner carries confirmed findings into the next job.","baseCommit":"dd8913c9d083c7658ff0ec26a227232d156dea00","workflowId":null,"deliveredAt":"2026-10-22T04:05:20.295+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/9"},{"site":{"cid":"bafybeibaclhwmcwb4fuyib3t3okhwqeftt5nr6v7iglor44mttzxcqmrtm","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"65b39d7a-7c8c-43d4-a48d-7083d0aab9ff","state":"completed","commit":"e1112f9b6d60370e2f99faa5561269a713023dcf","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-22T06:24:27.97759+00:00","objective":"The Hooks Store, job 11: Builder v2. Rebuild the Builder page to SPEC.md section 3.2 (version 1.41, decision 34) of https://github.com/the-hook-store/hooks-store-spec, using mockup/builder-v2.html in that repository as the visual reference (same colours, fonts, words and prices as the live site; screenshots in mockup/shots/). Layout: two zones, the steps on the left in the order type, how, blocks, settings, and a sticky card on the right (first on phones) that shows the hook as it stands: name and symbol or hook name, pills for type, chain and pair, one colour-swatched tile per rule with the block's short label and its numbers filled in, a \"where the money goes\" line composed from the fee blocks and the pool fee, a readiness list built from validate() with \"fill it in\" links that focus the field or open the rule, the cost row with the wait line, CHECK WITH THE SWARM (FREE), CONTINUE TO LAUNCH disabled until ready, and SHOW EXACT TEXT which opens a modal sheet with COPY and CLOSE showing the composed request with the words any open finding points at highlighted. Step 2 carries the starting point (FROM SCRATCH, or FROM MY OWN CODE whose repository and commit fields exist only while it is chosen; the composed text for own code is unchanged) above the DESCRIBE IT | STACK BLOCKS control; the first-visit chooser and the Advanced disclosure in Settings are removed. Step 3 is a category shelf (tabs with swatch and added/total count; block cards with title, blurb and ADD or the state pill; sideways scroll on phones) above the stack, which is one row per rule: number, title, filled-in short label in the mono face, a who-uses-it chip (RUNS ITSELF, OWNER, ANYONE PRESSES), up, down, remove, EDIT; a rule opens to its fields and notes, a newly added block opens, Open all / Close all; the token block is row 0 for type A; the six-block notice stays. Findings: a box under the card with a red stripe, scrolling inside itself at about a third of the screen height, one finding per row (plain title, JUMP TO IT, an excerpt of at most two lines quoting only the words at fault, never a sentence or paragraph); jump focuses the field, opens the rule, or opens the sheet at the highlighted words; pine and \"Nothing to fix. The request is consistent.\" when empty. Sizing: content width capped at 1240 px and centred; two zones at 1100 px and wider (steps minmax(0,1fr), card 420 px); one column with the card first below 1100 px; below 720 px the shelf scrolls sideways and rows wrap their tools; type sizes fixed, never viewport-scaled; every panel min-width 0; addresses and mono text wrap anywhere; no horizontal page scroll at any width from 320 to 2560 px; the card never exceeds the viewport height. Do not change compose(), body(), validate(), checkConsistency(), writtenFees, the relay calls, the free check, the proven-launch line and import, the draft storage key or the launch review page: this job is layout and presentation only, and the unit tests must all still pass unchanged. Rewrite the Playwright tests for the new screen (every step, the card, the findings box, the sheet, the own-code toggle, the shelf on phones, and screenshots at 320, 390, 768, 1100, 1440 and 2560 with no horizontal overflow). Keep the Store, hook page, My hooks, Learn and launch pages as they are. Export the site as before.","baseCommit":"7e57a8351f28c4d541e0b8d3cd94e8204cdb89b9","workflowId":null,"deliveredAt":"2026-10-22T07:31:42.656+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/10"},{"site":{"cid":"bafybeigbhtz7r3f2oz5bncqubmof3wdtdye7au5gscf6ff2w5ici3c3pia","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"a307647e-223c-4679-b2b1-f140a98f23df","state":"completed","commit":"9ce9438877de70e40153bfd48be0dbff9ab4b162","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-22T15:37:44.320768+00:00","objective":"The Hooks Store, phase 2 job 10: free listings and paid #ad placements, after the carry-overs. Read SPEC.md at its current version (1.43, decisions 33 to 36) in https://github.com/the-hook-store/hooks-store-spec, and jobs/job-10-carry-overs.md there (raw: https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/jobs/job-10-carry-overs.md), which holds the full wording, numbers and tests of every carry-over named below. Every carry-over is in scope and is done first. Carry-overs from job 11 (Builder v2, commit e1112f9b): (a) size the hook card's .hc-scroll from its on-screen position, recomputed on scroll (requestAnimationFrame) and resize, never below its load size while the column is stuck; today it collapses to the 140 px floor after any re-render once scrolled (182 to 140 px at 1440x900, 582 to 140 px at 2560x1300); Playwright at both sizes asserts at least the load height and 300 px with the card inside the viewport. (b) below 720 px .hc-scroll is a 64 px window: floor it at 40 percent of the viewport height (the card may run past the first screen); tests at 390x844 and 320x900. (c) web/playwright.config.ts ignores the job 7, 7-revision, 8, 8-revision, 8-written-fees and 9 specs: port every test in them to the v2 selectors (#stack .rule[data-block], .hookcard, #composed, #findings, the step 2 controls) and remove testIgnore; no spec may be ignored. (d) the finding excerpt drops its trailing \"in the request.\". From the first live launches (2448, 2449, 2450 on Robinhood Chain, 2026-10-22): (e) a type A launch goes live from the launch record exactly as B and C do (artifacts by role hook, token, distributor; status live when the record is live and the hook has code; the pool id keccak256 of the ABI-encoded seeded PoolKey, prefilled in the pool selector), because IMD's result file carries no address and launch 2448 (request 0xece8c70d612890553921a16cfbf19b2c674937735f78591743476d8b3ff3bd5c) shows \"In progress\" with every address \"unknown until live\" although TestHook 0x5a9e7a61c45d2c615162fa57931bcbc06d9b20cc, TestToken 0xe7244bfb99c7ad49c5a40eaeedb215cb47dde85b and the seeded TEST/IMD pool (id 0xccab6575b5cdd5798731f62f9299c442f954366e91b9513386d83e249cb99843) are on chain; unit tests on evidence/launch-5-launch-live.json and a Playwright case for a type A page reaching Live. (f) the type C page (launch 2450, hook 0xb3373d1d202449c07fc6a51c5fc38483b409a0cc) says \"Owner could not be read\" although owner() answers on the RPC: re-read once the hook address is resolved through the deployer; drop the Distributor row for an existing token and replace Pool id \"unknown until live\" with \"No pool yet; open one below\" and the OPEN THE POOL panel of 6.4. (g) contracts launches paid from the same wallet (2454, 2456) are not hooks: out of the catalog, no \"Hook not found\" dead end, one plain row in My hooks linking to the IMD explorer. Earlier carry-overs (launch 7, the audits, job 9's review): (1) the post-payment notice links \"Open IMD explorer\" to https://explorer.imdnotdead.fun/jobs/<jobId> (the job id from the intake fate's admission.result.jobId), labelled \"IMD explorer\" to the explorer root until admitted; (2) it drops its \"Hook page\" link; (3) the hook page's \"Launch page\" link (a 404) becomes \"Build page\", one per job id, and a unit test asserts no link to explorer.imdnotdead.fun/launches; (4) SPEC 4.16 rule 31: the range-order sentences and beforeAddLiquidity for Allowlist opening, Open at, Trading hours and Anti-sniper, the one-sided-liquidity sentence for Max buy, Max swap and Cooldown, tests and the 1,014-pair sweep; (5) 4.16 item 8: the same-trade-same-fee sentence with the exact-input and exact-output formulas (mulDiv) on every fee sentence; (6) 4.16 item 24: the dynamic-fee-flag rejection sentence on every request without the Dynamic LP fee block; tests; (7) importProvenSource compares repoUrl after stripping .git and a trailing slash, case-insensitively; mocks use IMD's real .git shape; (8) writtenFees.ts reads \"1 pct\", \"1/100\", \"one in every hundred\", \"1 in 100\" and the like as 1 percent, raises the rate finding for any amount it cannot read instead of writing 0 percent, and raises the recipient finding for receives, accrues, gets, earns, keeps or collects; regression tests; (9) LaunchNotifications watches only this browser's own launches; a test proves a browsed page adds no watch; (10) the wait line: \"Usually 30 to 90 minutes, sometimes up to 3 hours: the swarm writes, tests, audits with four auditors and a judge, then deploys. From a proven launch, usually less.\"; (11) from the ads audit: never render a cancelled or expired placement even when featured() lists it, page past them, the BOOST confirmation sentence, totals from rankOf; (12) controls before a pool exists (decision 33): \"No pool uses this hook yet. Open a pool with it, or enter its pool id above.\" with Send disabled, the pool selector fed by the PoolManager's Initialize events filtered by hook plus a typed id, every Send simulated first with the catalog's plain reason on a revert, management rows built from the contract's ABI at the source commit (out/<Name>.sol/<Name>.json from raw.githubusercontent.com, catalog signatures as fallback) so launch 2424 keeps working; Playwright for a hook-only page with no pool and the 2424 ABI. Then the job itself: implement SPEC.md sections 3.1 (featured carousel) and 6.6 against the deployed contracts, live since 2026-10-22: Robinhood Chain (chain id 4663, launch 2454, https://github.com/identity-md-launches/launch-2454-what-build-two-immutable at commit 952e62de284440144a24fc4ec4868461e4534612) HookListingRegistry 0x366c84a2971713fc8fa24d3d4b8abd2f4f085625 and FeaturedPlacementsV2 0x63b59cbf5b535e46815ae5d4cf126bf409dba69c; Ethereum (chain id 1, launch 2456, https://github.com/identity-md-launches/launch-2456-what-build-two-immutable at commit fcca6490b279cd9821cf71d1edf083afbfa1cba5) HookListingRegistry 0xff8b7110525c1ec39d6df825880890e7d9184f06 and FeaturedPlacementsV2 0x1da6f19ee08365813651de6420603fea4fbcdc9a. Put them into public/site-config.json as an \"ads\" map keyed by chain id (registry, placements, launchNumber, commit) and the ABIs from those repositories at those commits under src/abi; a chain whose addresses are missing shows neither the strip nor the Promotions panel. Featured strip: read featured(1, 100) with each placement total, getPlacement for each active id, getListing and getMetadata at the pinned revision; one-line cards (#AD pill, name, symbol, by creator as ENS name or shortened payer address, hours left) in the self-scrolling strip, sorted by total paid with ties by lower id, open-slot card last, refreshed every 60 seconds, no buttons. Promotions panel in My hooks per SPEC 3.5: the wallet's placements with hours left, total paid, rank, BOOST (ask an amount, deposit if needed, boost(id, amount)) and CANCEL. Promote a hook: for a live hook the connected wallet launched, a four-step flow with real wallet transactions: createListing in HookListingRegistry (chainId, hook address, metadata from the hook page: name, source and audit links, the callback mask from the address bits, the fee and admin disclosures from the blocks), approve and deposit 0.1 IMD into FeaturedPlacementsV2, purchase(listingId, revision, proceedsRecipient read live, deadline now + 10 minutes) for 24 hours, a done state linking to the carousel. Also cancel with the pro-rata base refund and forfeited boosts explained, withdraw the available balance, and the hook page's #ad state while a placement is active. Tests: an Anvil fork with both contracts deployed from the pinned build runs listing, deposit, purchase, boost from a second wallet, cancel and withdraw end to end and asserts the carousel shows the pinned revision after an edit; Playwright for the flow at three widths. Deliver source, dist/ and test results.","baseCommit":"e1112f9b6d60370e2f99faa5561269a713023dcf","workflowId":null,"deliveredAt":"2026-10-22T17:55:13.147+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/11"},{"site":{"cid":"bafybeienilq6lgi2kj2sydm2gwy4fcjbcvcfi3vepmdph2avpnmzxnibey","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"2890a532-849a-42ef-ad89-ac69f28af73f","state":"completed","commit":"a551d1d5ddb654a2ef1a2cd2555e792ff8e6bdf3","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-22T19:01:34.000911+00:00","objective":"The Hooks Store, job 12: the proven lane (SPEC 1.46, decision 39) after the carry-overs. Read SPEC.md at its current version in https://github.com/the-hook-store/hooks-store-spec and jobs/next-job-carry-overs.md there (raw: https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/jobs/next-job-carry-overs.md) for the full wording and tests of every item below; every item is in scope. Carry-overs first. (h) The phantom scroll gap was fixed in job 10; keep its test: at 1920x1080 and 1366x768 with seven findings showing, the column's scrollHeight equals its last child's bottom plus the padding within 2 px, at load and after scrolling the column to its end. (i) The Builder goes fluid (3.2, decision 38): .builder-page.wrap takes max-width 1800px with padding-inline clamp(16px, 3vw, 48px) keeping the safe-area max() on each side; the .b2 grid keeps steps minmax(0, 1fr) and the card becomes clamp(420px, 28vw, 520px) from 1100 px up; rule rows, the shelf and fields fill their column; paragraph text keeps its 65ch measure; type sizes unchanged; the width sweep adds 1920x1080 and 2560x1440 asserting the content edges sit within the gutters up to 1800 px, no sideways scroll, the card inside the viewport. (j) Readable text (decision 41): keep Press Start 2P wherever it is used today; replace Pixelify Sans with Atkinson Hyperlegible for all reading text and VT323 with JetBrains Mono for numbers, addresses, hashes, signatures and the exact request text, same sizes and line heights, both self-hosted as latin woff2 under /fonts with licences in LICENSES and fallbacks declared, the old files and @font-face rules removed; a unit test on styles.css and Playwright assertions on computed font-family for a paragraph, a rule line, an address and the cost number on the Builder and the hook page at 390 and 1440 px. (k) A request id that is not a hook (decision 42): opening #hook/1/<request> for a contracts launch paid through the store (2454, 2456) without a connected wallet must reach the plain \"Contracts launch <n>, live\" page with its IMD explorer link, worded \"Not a hook: a contracts launch for the store\", not \"Hook not found\"; resolve the request from the chain's Requested event the way store bodies are indexed; Playwright covers the ads request id without a wallet. (l) The Promotions panel shows two labelled balances (decision 43): \"In your wallet on <promotion chain>: N IMD\" from the IMD token's balanceOf, with a low-balance note below 0.1 IMD, and \"Deposited for promotions: N IMD\" from available(address) with its one-line explanation; both re-read after every transaction; unit test and Playwright. (m) Pay on any chain (decision 43): the promotion chain is where the wallet pays; the hook dropdown lists every live hook the wallet launched on either chain, labelled with its chain; createListing goes to the promotion chain's registry with the hook's own chain id and address; purchase, boost, cancel and withdraw run on the promotion chain; the strip reads featured() on both chains, merges by hook (chain id plus address), sums totals for the same hook and shows one card per hook ranked by that total; the hook page's #ad state looks on both chains; Playwright with controlled RPC: a Robinhood Chain hook promoted from Ethereum reaches Done, and one card for a hook placed on both chains. Then the job itself, SPEC 4.17 and 6.8. (1) Nearest match: when a draft has no exact proven match, matchProvenLaunch picks the proven launch of the same type (A, B or C) with the most block ids in common, ties to the newer launch, with at least one block in common besides token and own-token; the Builder line reads \"Adapted from a proven launch: <name> (launch <n>, audited <date>): the swarm removes <blocks> and adds <blocks>\"; the request sentence tells the swarm to start from that repository and commit, remove the named blocks and add the named blocks, then audit as a new hook; exact matches keep today's sentence. Unit tests for exact, nearest, tie and no-match, and that a words-only draft never matches. (2) Catalog and hook page marks: a launch in the proven index shows a PROVEN pill on its catalog card and hook page, with \"Build one like this\" preloading its blocks; the index is read exactly as today from evidence/proven-launches.json at the spec repository's raw URL (now updated by a scheduled script; the file's shape is unchanged, extra fields such as tokenAddress, deployerAddress, poolId and notes may be present and are ignored). (3) The wait line and the cost row read \"Usually 30 to 90 minutes, sometimes up to 3 hours. From a proven launch, usually less.\" and, when a proven match exists, the card adds \"This stack starts from audited code.\" (4) No instant lane, no factory, no free launch: the Builder offers exactly one launch, 0.5 IMD through the swarm; remove any copy that promised an instant lane. Tests: unit tests for (1) to (3); Playwright at 390x844, 1100x800 and 1920x1080 for a draft with a nearest match (the line, the request sentence, the sheet) and for a proven catalog card. Deliver source, dist/ and test results.","baseCommit":"9ce9438877de70e40153bfd48be0dbff9ab4b162","workflowId":null,"deliveredAt":"2026-10-22T19:49:37.471+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/12"},{"site":{"cid":"bafybeihweu5aeeo7dkznbtnxhhfxd6es4ziulbbjqgdm44cls4tpf2v6iu","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"fae11abf-1a3b-4c75-a4cf-c9d6dddda048","state":"completed","commit":"199ffd1abfc2e25f694d531a7d39c77e97e7e698","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-22T20:07:42.775022+00:00","objective":"The Hooks Store, job 13: the Promotions panel redone, ad-blocker-safe markup, RPC fallbacks and the proven-line edge case. Read SPEC.md at its current version (1.54, decisions 43 to 47) in https://github.com/the-hook-store/hooks-store-spec and the section \"Carry-overs for job 13\" of jobs/next-job-carry-overs.md there (raw: https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/jobs/next-job-carry-overs.md) for the full wording and tests of every item; every item is in scope. (n) Promotions panel, balance first then hooks (SPEC 3.5, decision 44): replace the four-step \"Promote a hook\" flow with the terms sentence; the promotion chain selector (where the wallet pays); \"In your wallet on <chain>: N IMD\" and \"Deposited for promotions: N IMD\"; a DEPOSIT box with a typed IMD amount (an approval only when the allowance is short, then one deposit) and WITHDRAW for the unspent deposit; then one row per live hook the wallet launched on either chain, labelled with its chain, with PROMOTE (the free listing created first and silently when the hook has none on that chain, then purchase for 24 hours paid from the deposit; disabled with \"Deposit at least 0.1 IMD first\" below 0.1 IMD) and, for a running placement, hours left, total paid, rank, BOOST (typed amount from the deposit, the non-refundable sentence, a confirmation) and CANCEL (pro-rata refund to the deposit, boosts forfeited, explained first); a third line \"Earned as recipient: N IMD\" with WITHDRAW PROCEEDS when the wallet is the recipient; every transaction simulated first; all balances re-read after each. Tests: unit tests for the allowance decision and the disabled states; Playwright with a controlled RPC and local wallet: deposit 0.25, promote one hook, boost 0.05, cancel, withdraw; a wallet with 0 deposit sees PROMOTE disabled with the note. (o) Public RPC fallback (SPEC 7.2, decision 45): site-config.json lists RPC URLs per chain (Ethereum: https://ethereum-rpc.publicnode.com, https://rpc.mevblocker.io, https://eth.llamarpc.com; Robinhood Chain: https://rpc.mainnet.chain.robinhood.com plus a second public endpoint the builder verifies), the chain clients use viem's fallback transport with one retry, and \"Could not read promotions on <chain>\" or any other RPC error line appears only after every endpoint failed; a unit test on the config shape and a Playwright case where the first endpoint answers 429 and the strip still renders. (p) Ad-blocker-safe markup (SPEC 3.1, decision 46): the strip's cards use className adcard, which EasyList's generic rule ##.adcard hides on every site, so visitors with uBlock Origin, AdBlock Plus, AdGuard or Brave see an empty band. Rename every element of the strip and the Promotions panel so no class, id or attribute value matches a generic cosmetic filter (placement-card, placement-slot, featured-band, featured-track, featured-group, promotion-row; never ad, ads, adcard, adslot, ad-card, sponsored or promo as a class or id; the #AD text label stays); a unit test loads the generic cosmetic rules from a pinned copy of EasyList in the repository, refreshed at build time from https://easylist.to/easylist/easylist.txt, and asserts no class or id in dist/ matches any ##.class or ###id rule; a Playwright case injects those rules as a stylesheet and asserts the placement card and the open-slot card stay visible. (q) Proven line for an exact stack on the other chain (SPEC 4.17, decision 47): when a draft's blocks exactly match a proven launch deployed on the other chain, the line reads \"Adapted from a proven launch: <name> (launch <n>, audited <date>): the same blocks, redeployed on <chain>\" and the request's start-from sentence says \"keep its behavior, deploy on <chain> with that chain's PoolManager <address>, apply the parameters and rules of this request\", never \"removes none and adds none\"; unit tests for both chains and for a nearest match on the other chain. Deliver source, dist/ and test results.","baseCommit":"a551d1d5ddb654a2ef1a2cd2555e792ff8e6bdf3","workflowId":null,"deliveredAt":"2026-10-22T20:52:12.688+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/13"},{"site":{"cid":"bafybeiglhncli5eti74njswt5ekr27gfm4lymhjlavk2afj2oqfeveu3lq","status":"named","ensName":"the-hooks-store.site.identitymd.eth"},"jobId":"4c5dbeb7-9acb-4a64-b204-9f55e6d78ada","state":"completed","commit":"956e22dc0b511df849ce4871c0e3a3e2b0eb054e","repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase","createdAt":"2026-10-23T04:58:51.4469+00:00","objective":"The Hooks Store, job 14: stopped and failed launches leave the public pond, the Checking pill, and the resilience carry-overs. Read SPEC.md at its current version (1.56, decision 49) in https://github.com/the-hook-store/hooks-store-spec and the sections \"Carry-overs for job 14\" and \"Carry-overs for a later job 14\" of jobs/next-job-carry-overs.md there (raw: https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/jobs/next-job-carry-overs.md) for the full wording and tests of every item; every item is in scope, in this order. (u) Public pond (SPEC 3.1, 3.4, 3.5, 7.3, decision 49), first: the Store's grid lists three test launches of 2026-10-21 that IMD's builders stopped with a question (intake chain 1, requests 0x43921ed5…, 0x4208cbe0…, 0x8c7a2972…, full ids in the carry-over) as REQUESTED cards for good, because the Intake never completes a stopped launch. A launch is public while it is live, in progress (IMD's record says its job is executing, or completed with the launch not yet live, or the launch is deploying) or requested for less than 24 hours since its Requested log's block time with no record saying it stopped. Not public: Completed status 1 or 2 (Failed); a job record that is blocked, cancelled, failed or superseded or has a node whose failure reason says needs_input; a launch record parked or failed; or a request 24 hours old or older with no record saying it runs. The age rule needs no relay. Public surfaces list public launches only: the catalog grid and its count, the search results, the status rail (All = every public launch; Live only; In progress = in progress, checking and young requested), the landing's launch list and casts, and the featured strip's hook lookup. Not public launches stay in My hooks for the payer (status pill, the Needs attention text, Fix in Builder) and at their direct link #hook/<intake chain>/<request>, where one line under the header reads \"Not on the pond: IMD stopped this launch\" or \"Not on the pond: this launch failed\"; the page is otherwise unchanged. Tests: unit tests of the rule for every case listed in the carry-over, with the three stopped launches' real job records as fixtures; Playwright on a pond-shaped fixture set: the grid counts 4 hooks, the three stopped launches are in neither the grid nor a search for their names, all three appear in My hooks for the paying wallet with the Needs attention text, their direct links open with the Not on the pond line, a request younger than 24 hours shows in the grid and leaves it on the next refresh once its job record reads blocked, and the four live hooks still read LIVE and PROVEN. (v) Checking, not In progress (SPEC 7.3): a live type A launch whose hook code is not yet verified on chain reads \"Checking…\" (status class status-checking), is public and counts as In progress in the rail, and turns LIVE when the verification completes; it never reads In progress; a unit test on the derivation, Playwright before and after the code read. (r) Live without IMD's record plane (decision 48): the spec repository now publishes evidence/launch-records.json (raw: https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/evidence/launch-records.json, refreshed every six hours by scripts/launch_records.py there, which is not yours to change): {version, generatedAt, launches: [{launchId, launchNumber, chainId, kind, status, parkedReason, createdAt, updatedAt, jobId, jobState, blockedReason, paidBy, objectiveSha256, sourceRepoUrl, sourceCommit, attested, artifacts: [{role, name, address, txHash, blockNumber}], pool}]} for every store launch IMD lists, live or parked. objectiveSha256 is the lowercase hex SHA-256 of the UTF-8 request objective, which the site already decodes from the Requested log's body, so a chain-read request matches its record with no relay call; paidBy must equal the request's payer. The site fetches the snapshot at load like the proven index, never bundles it, and uses it to resolve addresses, Live (still confirming hook code on chain as today) and the public rule's running and stopped states whenever /intake, /jobs or /launches fail, time out or answer 5xx; the relay stays the first source and the chain scan keeps working for new requests. Ship a fixture of the file. Playwright: with /jobs and /intake answering 503, the catalog shows the four live hooks as Live from the snapshot. (s) Log windows and backoff (SPEC 7.2, decision 48): a per-endpoint maximum log range in site-config.json (publicnode: 10,000 blocks), windows split to fit the endpoint in use, a backoff of 2, 4, 8 seconds on 429 before any retry, at most two log scans in flight per chain, and the validation run includes a scan against the real endpoints with the counts of failed calls in the results (zero on a quiet network). (t) Findings grouped by cause (SPEC 6.7, low): on a hook-only draft with a name typed and no wallet connected the Builder lists seven findings for two causes; the chain finding suppresses the PoolManager and deployer findings that follow from it, and the missing owner raises one finding that also covers the recipient, the body address and the deployer constructor lines, the others appearing only when the owner is set and still wrong; unit tests on the grouping, Playwright asserts two findings on that draft. Deliver source, dist/ and test results.","baseCommit":"199ffd1abfc2e25f694d531a7d39c77e97e7e698","workflowId":null,"deliveredAt":"2026-10-23T13:44:45.229+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase/pull/14"}],"contracts":[],"publishedAt":"2026-10-23T13:56:04.288+00:00"},{"id":"launch:c346908e-8af8-4f68-8c39-9e9acc217e46","code":[],"media":[],"sites":[{"id":"12edc916-ea3b-4f94-9ccc-75c0319f536b","cid":"bafybeicdnz5rhzubjw2c72nwtkv3skjsfg72zcdxjbsuzwckfxmmfcuyrm","jobId":"8c72521f-d6f9-4a41-a604-0a3b7b102553","label":"cardvault-borrow-against-a-grade","status":"named","txHash":"0xb00d619f6b2dc980b0599af347ff0cc753610c8eaffd9254253e197b1c52173a","ensName":"cardvault-borrow-against-a-grade.site.identitymd.eth","failure":null,"namedAt":"2026-10-22T23:54:02.792+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1828-c","pinnedAt":"2026-10-22T23:52:03.448+00:00","createdAt":"2026-10-22T23:51:38.917+00:00","previewHash":"b22ccf61a7ef8627e5ad2ff72dcc7c2538ac5ef5b48a244fc83f5d6d0601dde7","supersededBy":null}],"title":"Build CardVault, a lending protocol where vaulted trading-card NFTs are collateral and prices come from the IdentityMD oracle. Deploy to Sepolia with the owner wallet as admin. Contracts: (1) MockUSDC (6 decimals, mintable). (2) MockCardNFT, ERC-721 standing in for a vaulted-card token such as Courtyard: metadata fields game, set, cardName, cardNumber, grader, grade, certNumber, plus a classId (bytes32) that groups identical card+grade. (3) CardPool, ERC-4626 over MockUSDC; lenders deposit and withdraw subject to utilisation. (4) CardOracle, the oracle consumer: holds an allowlist classId → question template parameters (PriceCharting product URL path, grade column); requestPrice(classId) pulls 0.5 test IMD from the caller, approves Intake, builds the oracle.request JSON body and calls Intake.requestWithFailure with this contract as callback target; onPrice(bytes32 requestId, OracleAttestation.Attestation a, bytes signature) accepts calls only from Intake, only for requests it opened and not yet settled, verifies the EIP-712 signature against this contract’s domain and the configured oracle signer, requires a.agreed >= a.quorum, decodes the numeric USD answer and stores {price, issuedAt, expiresAt} per classId; onFailure(bytes32, uint8, bytes32, uint16, uint16, bytes) clears the pending flag and moves no value; also a permissionless submit(attestation, signature) for relayed delivery. (5) CardLending: borrow(tokenId, amount) requires a fresh attestation (issuedAt within 24h) for the NFT’s classId, amount <= 45% of price, pulls the NFT, draws USDC from CardPool, 30-day term, interest accrues linearly at a rate set by the owner (initial 12% APR) plus a 1% origination fee to the pool; repay, extend (new attestation, same LTV check), liquidate after maturity or if a newer attestation puts LTV above 60%: 24-hour Dutch auction from 120% of debt down to 50%, proceeds repay the pool, surplus to the borrower, shortfall absorbed by a reserve funded from the origination fee. Pausable by a guardian; two-step admin hand-over; no upgradeability. Sepolia addresses: Intake 0xa43e6f75ee006411f79ac1c84120606c2330de82, test IMD 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a (mintable), action id bytes32(“oracle.request@oracle-1”). Oracle body template: question “On pricecharting.com, on the product page for “{cardName} #{cardNumber}” in “{setName}” (URL starting https://www.pricecharting.com/game/{setSlug}/{cardSlug}), what is the price shown in the “{gradeColumn}” column at the time of reading within the pinned window?”, definitions term = the single number displayed in that column, period = value when read within the block window, unit = US dollars, rounding = whole dollars rounded down; answer type number; public sources; tolerance 500 bps; validForSeconds 86400; consumer = {chainId 11155111, verifyingContract = CardOracle}. Read the oracle-consumer and oracle-assess skills for the exact Attestation struct and domain, and verify the body with POST /requests/check before relying on it. Tests: unit tests for every path, a mocked-signer test for onPrice and submit, replay and wrong-request rejection, auction math at the boundaries, 4626 rounding, and a fork or scripted test on Sepolia that opens one real oracle request for Charizard #4 in Pokemon Base Set, PSA 10, and borrows against a minted mock card once the callback lands. Deliver source, tests, a README with the Sepolia addresses and a runbook for adding a card class.\n\nToken name: C\nToken symbol: AUREON\nTotal supply: 1000000","types":["contracts","sites"],"audits":[],"paidBy":"0xd58dcd4594087c2758717a59f44a5ac09db65105","release":null,"research":[],"versions":[{"site":null,"jobId":"3d045c98-285b-45fe-8302-42d18fc8bf05","state":"completed","commit":"ef5a93b696798b861b99e5e0ce31651431eb5cd2","repoUrl":"https://github.com/identity-md-launches/launch-1828-c","createdAt":"2026-10-15T08:30:32.348941+00:00","objective":"Build CardVault, a lending protocol where vaulted trading-card NFTs are collateral and prices come from the IdentityMD oracle. Deploy to Sepolia with the owner wallet as admin. Contracts: (1) MockUSDC (6 decimals, mintable). (2) MockCardNFT, ERC-721 standing in for a vaulted-card token such as Courtyard: metadata fields game, set, cardName, cardNumber, grader, grade, certNumber, plus a classId (bytes32) that groups identical card+grade. (3) CardPool, ERC-4626 over MockUSDC; lenders deposit and withdraw subject to utilisation. (4) CardOracle, the oracle consumer: holds an allowlist classId → question template parameters (PriceCharting product URL path, grade column); requestPrice(classId) pulls 0.5 test IMD from the caller, approves Intake, builds the oracle.request JSON body and calls Intake.requestWithFailure with this contract as callback target; onPrice(bytes32 requestId, OracleAttestation.Attestation a, bytes signature) accepts calls only from Intake, only for requests it opened and not yet settled, verifies the EIP-712 signature against this contract’s domain and the configured oracle signer, requires a.agreed >= a.quorum, decodes the numeric USD answer and stores {price, issuedAt, expiresAt} per classId; onFailure(bytes32, uint8, bytes32, uint16, uint16, bytes) clears the pending flag and moves no value; also a permissionless submit(attestation, signature) for relayed delivery. (5) CardLending: borrow(tokenId, amount) requires a fresh attestation (issuedAt within 24h) for the NFT’s classId, amount <= 45% of price, pulls the NFT, draws USDC from CardPool, 30-day term, interest accrues linearly at a rate set by the owner (initial 12% APR) plus a 1% origination fee to the pool; repay, extend (new attestation, same LTV check), liquidate after maturity or if a newer attestation puts LTV above 60%: 24-hour Dutch auction from 120% of debt down to 50%, proceeds repay the pool, surplus to the borrower, shortfall absorbed by a reserve funded from the origination fee. Pausable by a guardian; two-step admin hand-over; no upgradeability. Sepolia addresses: Intake 0xa43e6f75ee006411f79ac1c84120606c2330de82, test IMD 0x44a1cd38474fb1748400e7deb5f8d786cce3f89a (mintable), action id bytes32(“oracle.request@oracle-1”). Oracle body template: question “On pricecharting.com, on the product page for “{cardName} #{cardNumber}” in “{setName}” (URL starting https://www.pricecharting.com/game/{setSlug}/{cardSlug}), what is the price shown in the “{gradeColumn}” column at the time of reading within the pinned window?”, definitions term = the single number displayed in that column, period = value when read within the block window, unit = US dollars, rounding = whole dollars rounded down; answer type number; public sources; tolerance 500 bps; validForSeconds 86400; consumer = {chainId 11155111, verifyingContract = CardOracle}. Read the oracle-consumer and oracle-assess skills for the exact Attestation struct and domain, and verify the body with POST /requests/check before relying on it. Tests: unit tests for every path, a mocked-signer test for onPrice and submit, replay and wrong-request rejection, auction math at the boundaries, 4626 rounding, and a fork or scripted test on Sepolia that opens one real oracle request for Charizard #4 in Pokemon Base Set, PSA 10, and borrows against a minted mock card once the callback lands. Deliver source, tests, a README with the Sepolia addresses and a runbook for adding a card class.\n\nToken name: C\nToken symbol: AUREON\nTotal supply: 1000000","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","workflowId":null,"deliveredAt":"2026-10-15T11:28:21.447+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1828-c/pull/1"},{"site":{"cid":"bafybeicdnz5rhzubjw2c72nwtkv3skjsfg72zcdxjbsuzwckfxmmfcuyrm","status":"named","ensName":"cardvault-borrow-against-a-grade.site.identitymd.eth"},"jobId":"8c72521f-d6f9-4a41-a604-0a3b7b102553","state":"completed","commit":"7f02a41e64a79bcc18d6c85529f26ec44b44ee0b","repoUrl":"https://github.com/identity-md-launches/launch-1828-c","createdAt":"2026-10-22T21:52:53.562048+00:00","objective":"CardVault — web app for card-backed lending on Sepolia (11155111). The referenced repo holds the five contracts: read README.md and src/ first, generate ABIs with forge build. Build the site in site/ at the repo root; do not touch the contracts. Addresses (fill before submitting): MockUSDC 0x…, MockCardNFT 0x…, CardPool 0x…, CardOracle 0x…, CardLending 0x…. Static export, no backend, wallet via injected + WalletConnect (wagmi/viem or equivalent), reads over a public RPC with multicall. Mobile first.\n\nWHAT IT IS\nCollectors lock a graded trading-card NFT and borrow AUREON (6-decimal test dollar) for 30 days, up to 45% of an oracle-attested PriceCharting price. Lenders deposit AUREON into an ERC-4626 pool backed by those cards. Prices come from the IdentityMD oracle (panel 30, quorum 21, EIP-712 signed). Defaults go to a 24h Dutch auction, 120% to 50% of debt.\n\nCONCEPT: THE COUNTER\nA card-shop counter, not a DeFi dashboard. Three physical objects carry the UI:\n1. THE SLAB. Every card is a graded slab: label strip on top (grader, grade, set, name, number, cert) over a clear body. Typographic only: no card art, no franchise logos, mascots or palette; card names as plain text. The slab is the hero of every page.\n2. THE TICKET. Every loan is a pawn-style ticket: number, card, principal, fee, APR, issue and due dates, live debt, stamped status (ACTIVE / MATURED / AT AUCTION / REPAID / SOLD). Mono tabular numbers, perforated edge.\n3. THE PRICE TAG. Every oracle price shows its provenance: USD figure, issued, expires, \"21 of 30 agreed\", signer, links to explorer.imdnotdead.fun/oracle and api.imdnotdead.fun/oracle/requests/<uuid> (uuid = first 16 bytes of the PriceStored oracleId). Tap any number to see where it came from. Never show a price without its tag.\n\nLook: paper off-white, ink near-black, one stamp red for status and the primary action, brass for lender yield. No gradients, glass, glow, purple or blue; radii 4px or less; hairline borders; dense like a grading label. Condensed grotesque for labels, mono for every number. Motion only when it means something: debt accruing per second, the Dutch price falling, the stamp landing when a ticket closes. No scroll-reveal, parallax or animated marketing counters.\n\nPAGES (five screens, nothing else)\n1. /  THE COUNTER. The landing is the quote tool, no wallet needed. One slab per allowlisted class (ClassSet events, then oracle.template and oracle.freshPrice). Tap a slab: attested price with tag; \"borrow up to\" = price*4500/10000; amount slider; You receive = amount minus ceil(1%) fee; You repay in 30 days = amount + ceil(amount*aprBps*30d/(10000*365d)); due date; cost in dollars and %. One button, \"Open a ticket\", connects and lands on /borrow with that class preselected. No fresh price: greyed slab, \"No price in the last 24h. Request one (0.5 IMD).\" Below: three facts from chain (pool size, cards in custody, last price with age). Footer: \"Sepolia testnet. AUREON is a test dollar.\" No slogan, feature grid, testimonials, logos or FAQ.\n2. /borrow  YOUR BINDER. The wallet's cards as slabs in a 3-wide grid (CardMinted and Transfer events, then cardData and classId), each Eligible / Needs price / Not listed. Tap eligible: quote card, Review ticket, at most two transactions (nft.approve, lending.borrow), stamp animation. Reverts in plain words: StalePrice, TooMuchDebt, InsufficientLiquidity, paused.\n3. /tickets  YOUR TICKETS. All loans of the wallet (iterate 1..nextLoanId-1 with multicall, filter borrower). Live debtOf, days left. Repay in full (approve debt plus one hour of interest, then repay; say why), Extend (needs a price newer than priceIssuedAt, else offer \"Request a price (0.5 IMD)\"; maxAprBps = current aprBps), Claim surplus. MATURED: red stamp, \"Anyone can send this card to auction now.\"\n4. /vault  THE VAULT. Deposit and withdraw AUREON (approve + deposit; respect maxWithdraw; explain that lent cash returns on repayment, so a withdrawal may wait). Tagged numbers: totalAssets, availableLiquidity, reserve and coveredReserve, utilisation, share price (convertToAssets(1e12)) with history from events, realised yield since inception. Never a promised APY. Below: THE BOOK, every card in custody as a slab with its ticket, grouped Active / At auction, with netReceivable and auction marks. The book is the selling point: a lender sees exactly what backs their shares.\n5. /auctions  THE FLOOR. Per auction: slab, frozen debt, live auctionPrice falling with the curve drawn (120% to 50% over 24h, then the floor), time to floor, Buy with a max price field, receiver = connected wallet. Matured or underwater loans listed as \"ready for auction\" with Start auction (permissionless liquidate). Past auctions with outcomes.\nPlus a PRICE DESK drawer from any tag: all classes, last price and age, pending request, Request price (approve test IMD, requestPrice), history from Requested/PriceStored/Failed/TimedOut, PriceCharting link per class. If test IMD mint(address,uint256) is public, add \"Get 0.5 test IMD\"; else link the faucet. AUREON has no faucet: say so in one line.\n\nGLOBAL\nWrong network: one line and a switch button, nothing else works. Pause banner per contract. AUREON with two decimals, \"test dollar\" on first mention per page. Addresses from env, ABIs generated from the repo, typed. Empty states like a shopkeeper (\"No tickets yet. Your binder is on the left.\"). Copy short, numbers first. Banned words: unlock, seamless, empower, revolutionize, next-generation, powered by, journey, ecosystem, \"the future of\".\n\nDELIVERABLES\nStatic site (Vite + React + TS or Next static export). README (setup, env, repointing addresses), .env.example. Playwright e2e against anvil with the five contracts deployed from this repo: quote without wallet, borrow, repay, deposit/withdraw, auction buy. Lighthouse 90+ performance and accessibility on mobile, zero console errors, every page works disconnected. Pin the export to IPFS.\n\nACCEPTANCE\nA visitor sees a real attested price and a quote within two seconds, no wallet. A borrower opens a ticket in at most two transactions. Every price carries a tag linking to its attestation. A lender can list every card backing the pool. Nowhere: gradients, glass, slogans, feature grids, testimonials, stock illustration, franchise artwork.","baseCommit":"ef5a93b696798b861b99e5e0ce31651431eb5cd2","workflowId":null,"deliveredAt":"2026-10-22T23:51:52.167+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1828-c/pull/2"}],"contracts":[{"id":"c346908e-8af8-4f68-8c39-9e9acc217e46","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":11155111,"artifacts":[{"name":"CardLending","role":"other","txHash":"0x9673bdbfbf0209093b6230202d02dde3958e901b7c20f36f5e4b8a3b05e97f0a","address":"0xecd0992da58c974f4fa882b2ec8bde44d3bce7db"},{"name":"CardOracle","role":"other","txHash":"0x9673bdbfbf0209093b6230202d02dde3958e901b7c20f36f5e4b8a3b05e97f0a","address":"0xa981bb206daf2ceb22b879ed6c62519f37332756"},{"name":"CardPool","role":"other","txHash":"0x9673bdbfbf0209093b6230202d02dde3958e901b7c20f36f5e4b8a3b05e97f0a","address":"0x225e41fed68048d95a0c5f7d3a04f792c23cf585"},{"name":"MockCardNFT","role":"other","txHash":"0x9673bdbfbf0209093b6230202d02dde3958e901b7c20f36f5e4b8a3b05e97f0a","address":"0x4d1dd1082e3841dc9b6f900252a15b5ef11ec4ac"},{"name":"MockUSDC","role":"other","txHash":"0x9673bdbfbf0209093b6230202d02dde3958e901b7c20f36f5e4b8a3b05e97f0a","address":"0x79d4f28dbcd48836f80fe3e851419e67c6ce639a"}],"createdAt":"2026-10-15T11:28:21.447+00:00","updatedAt":"2026-10-15T11:29:28.279+00:00","launchNumber":1828,"parkedReason":null,"sourceCommit":"ef5a93b696798b861b99e5e0ce31651431eb5cd2","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1828-c"}],"publishedAt":"2026-10-22T23:54:02.792+00:00"},{"id":"workflow:51bec67e-efec-4e88-bb68-297892343ce0","code":[],"media":[],"sites":[{"id":"b16204e7-fead-471d-a19f-a500f4b361d4","cid":"bafybeigbeg2ypoipijsc57b35qm5qryp3tlwsjw2u4ow6rjncaj4d3h2ne","jobId":"b8abdc6c-7990-406e-a674-da092f6f13ab","label":"hamster-hour-bet-on-the-wheel","status":"named","txHash":"0x5e55aa29357f3a891afb10a2eb145d19888b91900096845b13c43fa257c1cb39","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth","failure":null,"namedAt":"2026-10-20T21:07:28.544+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","pinnedAt":"2026-10-20T21:07:12.239+00:00","createdAt":"2026-10-20T21:06:57.493+00:00","previewHash":"18e939c46270946f918c37f03e05a2b19b8bdfbabfb48560fbb32c61dc48b04d","supersededBy":null},{"id":"fbecf53d-4860-4096-9c9f-60cbd63cfd3f","cid":"bafybeihfhge32lyyprnu44rjtthnw5qyyln2wjulzkxmfkmjhlj4ff5qc4","jobId":"040611d4-bc95-477a-9a0a-1a6cf829bf81","label":null,"status":"named","txHash":"0x7b5d9998ad1900d2d3e2266ddca9d00dbc033c96cb847618a059ed93b549354c","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth","failure":null,"namedAt":"2026-10-20T20:33:50.918+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","pinnedAt":"2026-10-20T20:32:58.305+00:00","createdAt":"2026-10-20T20:32:28.812+00:00","previewHash":"ae3794ab064bd2813bd33e1dd07eda1a623a1526b411e7b85a64eea6400097cb","supersededBy":"b16204e7-fead-471d-a19f-a500f4b361d4"},{"id":"5330d78b-3aee-4840-b4de-16b8ee072bce","cid":"bafybeifpo6lenmuviml45blmr5gbh2nmdr6pdkthuoxr7er35h72a3jjwq","jobId":"35a18b93-f502-40e3-a23d-e6dbc3155cb0","label":null,"status":"named","txHash":"0x161e33269938abd76fb8f6d6755c0db02b16d9f0812a61699960674e01d7b893","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth","failure":null,"namedAt":"2026-10-20T08:57:02.037+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","pinnedAt":"2026-10-20T08:55:55.071+00:00","createdAt":"2026-10-20T08:55:27.181+00:00","previewHash":"5fa0094e41bbf01cd3c64cb1e604407f5f974250b1d4583e8a5332b99b282158","supersededBy":"fbecf53d-4860-4096-9c9f-60cbd63cfd3f"},{"id":"1920a2b9-89fe-42b4-bb37-81a97761813b","cid":"bafybeianrdeol7mh6snfotcrvjafqjmd4smafvoc4qxxi4msl54o2qfeha","jobId":"227695a3-02a8-4abc-96b8-bfa592a8cd28","label":null,"status":"named","txHash":"0x98b9e967122336e526d0231bbc2f6685fa2aedf17834087c813f6d7c0b1da544","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth","failure":null,"namedAt":"2026-10-20T07:46:04.057+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","pinnedAt":"2026-10-20T07:45:03.485+00:00","createdAt":"2026-10-20T07:44:59.008+00:00","previewHash":"3155caa343504b18f606a58f5a3fe906b2bc8c391e83eca33082c002e836e9ba","supersededBy":"5330d78b-3aee-4840-b4de-16b8ee072bce"},{"id":"c1f7e1ed-dfdb-4757-aede-ed7ed1189e35","cid":"bafybeiciuxk7e52vnxyibpulnppgp2yewspnkc47b3iepcl6t3gcwupczq","jobId":"277869c5-5b4a-4467-8d08-1f71097558b6","label":null,"status":"named","txHash":"0x18959c9e61747a86e5d181504f0a9d426902fcffffbf9666c6effc2bf44f4a59","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth","failure":null,"namedAt":"2026-10-17T06:42:51.633+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","pinnedAt":"2026-10-17T06:41:36.54+00:00","createdAt":"2026-10-17T06:41:33.396+00:00","previewHash":"54288d9788658c2fb0d237a8951d5357d7715c8620551b496b63e214a65192f4","supersededBy":"1920a2b9-89fe-42b4-bb37-81a97761813b"},{"id":"4bf8915f-91bb-4b67-ab8e-d2dd1af64933","cid":"bafybeic5m4qzfu5vtpoadgne5bqoq2orf5t3f7f7wbgv4mnbtq466bqqu4","jobId":"18b6d6ce-f228-43a5-a6f4-02e33978e0ac","label":null,"status":"named","txHash":"0x660b61f164a6bec8ba9c5543062bcd0ac629910e7282e088e3d698994a43caaf","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth","failure":null,"namedAt":"2026-10-16T15:25:38.148+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","pinnedAt":"2026-10-16T15:24:53.411+00:00","createdAt":"2026-10-16T15:24:33.821+00:00","previewHash":null,"supersededBy":"c1f7e1ed-dfdb-4757-aede-ed7ed1189e35"},{"id":"61a3d7ea-c1e1-4c13-afac-ef6bd67844c2","cid":"bafybeibtut7la2xwv25bldo4pusmms6utp4xyhsd2t46ednunachuz3kie","jobId":"bca03477-1456-4288-a3bc-e8481901f2b2","label":null,"status":"named","txHash":"0x0993af27bd0173124afbe618fe0d15677060bb5add331adf36cc63b7e3a6cfda","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth","failure":null,"namedAt":"2026-10-16T13:17:13.148+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","pinnedAt":"2026-10-16T13:15:22.903+00:00","createdAt":"2026-10-16T13:15:09.005+00:00","previewHash":null,"supersededBy":"4bf8915f-91bb-4b67-ab8e-d2dd1af64933"},{"id":"474d64c8-2937-4218-a0d7-44fd53f31b4f","cid":"bafybeidp4zcka5l7nf3gnj4fcmooxhp3vc3wucml6st4bckcjwa3ain3f4","jobId":"a3549cc7-2989-463d-8d9b-46df2d6a5bac","label":null,"status":"named","txHash":null,"ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth","failure":null,"namedAt":"2026-10-16T11:42:54.98+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","pinnedAt":"2026-10-16T11:28:52.776+00:00","createdAt":"2026-10-16T11:28:32.821+00:00","previewHash":null,"supersededBy":"61a3d7ea-c1e1-4c13-afac-ef6bd67844c2"}],"title":"Hamster Hour: a pari-mutuel betting game on a real hamster. Squeekchain (https://sepolia.squeekchain.com) runs a physical hamster wheel and settles a round every 10 minutes with the number of wheel passes. Hamster Hour lets people bet IMD on how far the hamster runs over the next 6 rounds (one hour). Results come only from the IMD oracle.\n\nCONTRACTS (Ethereum mainnet, no owner, no upgradeability, no admin withdraw). TEAM = the wallet that requested this launch, immutable.\n\n1. HamsterHour\n- Windows are defined by Squeekchain round numbers: window k covers rounds 6k to 6k+5. Round duration 600 s from genesisTimestamp 1791847800; the contract derives the current round from block.timestamp. Betting on window k is open until round 6k starts.\n- Bets in IMD (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7) via transferFrom, minimum 0.5 IMD.\n- Three pari-mutuel markets per window, each its own pool:\n  a) OVER/UNDER: total passes above or below the line. Line = average total passes over the last 7 settled windows, fixed at window creation; bootstrap line 1000 until 7 windows exist.\n  b) EXACT: bettor submits a uint256 guess of total passes. Closest wins 60% of the pool, second 30%, third 10%; ties split equally. The EXACT winner also receives the full jackpot balance (see below).\n  c) SLEEP: yes/no, total passes == 0.\n- Settlement: after round 6k+5 ends, anyone may call settle(k) with a signed IMD oracle attestation for the question template \"What is the total number of wheel passes recorded by Squeekchain for rounds {6k} through {6k+5} inclusive, as published at {sourceUrl}? Answer as a single uint256.\" The contract verifies it through OracleVerifier and stores the result. Lazy: windows with no bets are never settled.\n- Split of every window's total bets: 91% to winners pro rata, 5% to stakers, 3% to an oracle reserve that reimburses 0.5 IMD to whoever supplied the settlement attestation, 1% to TEAM.\n- Staking: once setStakingToken is set, anyone can stake and unstake that token here. The 5% share is distributed pro rata by stake-weight at each settlement (accumulator pattern, pull-based claimStaking). Before the token is set, the 5% accrues in a reserve that is released to stakers evenly over the 30 windows after the token is set.\n- Jackpot: the contract accepts any ERC-20 sent to it; the balance of the token set once via setJackpotToken is paid in full to the EXACT winner of each settled window. Empty jackpot pays nothing.\n- Edge cases: a market with bets on only one side is void and refunded; a window with no valid attestation within 48 hours after it ends is void and refunded; all claims pull-based via claim(k).\n- Configuration: setStakingToken and setJackpotToken are one-shot; sourceUrl and genesisTimestamp are updatable. All four callable only by TEAM, each with a 48-hour timelock and a public event. Nothing else is adjustable. No other TEAM powers.\n- Events for every bet, settlement, claim, void, stake, unstake, config change.\n\n2. OracleVerifier\n- Verifies IMD oracle attestations exactly as the IMD attester scheme requires: attester signature, question hash, validity window, uint256 answer. Rejects expired, mismatched or replayed attestations.\n\nTESTS: pari-mutuel math for all three markets, EXACT ties, one-sided void, no-attestation void, split sums to 100%, oracle reimbursement, staking accumulator, pre-token reserve release over 30 windows, jackpot payout, attestation replay rejected, line over 7 windows, round-to-window math around genesis, timelocks.\n\nWEBSITE: dark console style like sepolia.squeekchain.com, monospace. Top: the live Squeekchain stream embedded full width (YouTube id from https://media.squeekchain.com/live/current.json), countdown to the current window close, the line, live pool sizes and implied payouts per side, jackpot balance. Tabs: Bet (three markets, connect wallet, approve IMD, place bet, claim), Stake (\"staking opens with the token\" until set, then stake, unstake, claim), History (settled windows with links to the oracle attestation on explorer.imdnotdead.fun). Mobile first. No fake data.\n\nREADME first section: no owner, no house, pari-mutuel only, results only from the IMD oracle, the contract never owes more than it holds, TEAM gets 1% of bets and nothing else.","types":["contracts","sites"],"audits":[],"paidBy":"0x6cba4751742f6989fa224b2dc5d5d52fcef98a34","release":{"status":"completed","failure":null},"research":[],"versions":[{"site":{"cid":"bafybeidp4zcka5l7nf3gnj4fcmooxhp3vc3wucml6st4bckcjwa3ain3f4","status":"named","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth"},"jobId":"3930fbbd-dc5d-4207-9217-b9c920567996","state":"completed","commit":"7ab2a01b3d9a15e2acca8b317e77058e6f2d41e9","repoUrl":"https://github.com/identity-md-launches/launch-1951-workflow-contract-stage-context","createdAt":"2026-10-16T08:08:44.321813+00:00","objective":"Hamster Hour: a pari-mutuel betting game on a real hamster. Squeekchain (https://sepolia.squeekchain.com) runs a physical hamster wheel and settles a round every 10 minutes with the number of wheel passes. Hamster Hour lets people bet IMD on how far the hamster runs over the next 6 rounds (one hour). Results come only from the IMD oracle.\n\nCONTRACTS (Ethereum mainnet, no owner, no upgradeability, no admin withdraw). TEAM = the wallet that requested this launch, immutable.\n\n1. HamsterHour\n- Windows are defined by Squeekchain round numbers: window k covers rounds 6k to 6k+5. Round duration 600 s from genesisTimestamp 1791847800; the contract derives the current round from block.timestamp. Betting on window k is open until round 6k starts.\n- Bets in IMD (0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7) via transferFrom, minimum 0.5 IMD.\n- Three pari-mutuel markets per window, each its own pool:\n  a) OVER/UNDER: total passes above or below the line. Line = average total passes over the last 7 settled windows, fixed at window creation; bootstrap line 1000 until 7 windows exist.\n  b) EXACT: bettor submits a uint256 guess of total passes. Closest wins 60% of the pool, second 30%, third 10%; ties split equally. The EXACT winner also receives the full jackpot balance (see below).\n  c) SLEEP: yes/no, total passes == 0.\n- Settlement: after round 6k+5 ends, anyone may call settle(k) with a signed IMD oracle attestation for the question template \"What is the total number of wheel passes recorded by Squeekchain for rounds {6k} through {6k+5} inclusive, as published at {sourceUrl}? Answer as a single uint256.\" The contract verifies it through OracleVerifier and stores the result. Lazy: windows with no bets are never settled.\n- Split of every window's total bets: 91% to winners pro rata, 5% to stakers, 3% to an oracle reserve that reimburses 0.5 IMD to whoever supplied the settlement attestation, 1% to TEAM.\n- Staking: once setStakingToken is set, anyone can stake and unstake that token here. The 5% share is distributed pro rata by stake-weight at each settlement (accumulator pattern, pull-based claimStaking). Before the token is set, the 5% accrues in a reserve that is released to stakers evenly over the 30 windows after the token is set.\n- Jackpot: the contract accepts any ERC-20 sent to it; the balance of the token set once via setJackpotToken is paid in full to the EXACT winner of each settled window. Empty jackpot pays nothing.\n- Edge cases: a market with bets on only one side is void and refunded; a window with no valid attestation within 48 hours after it ends is void and refunded; all claims pull-based via claim(k).\n- Configuration: setStakingToken and setJackpotToken are one-shot; sourceUrl and genesisTimestamp are updatable. All four callable only by TEAM, each with a 48-hour timelock and a public event. Nothing else is adjustable. No other TEAM powers.\n- Events for every bet, settlement, claim, void, stake, unstake, config change.\n\n2. OracleVerifier\n- Verifies IMD oracle attestations exactly as the IMD attester scheme requires: attester signature, question hash, validity window, uint256 answer. Rejects expired, mismatched or replayed attestations.\n\nTESTS: pari-mutuel math for all three markets, EXACT ties, one-sided void, no-attestation void, split sums to 100%, oracle reimbursement, staking accumulator, pre-token reserve release over 30 windows, jackpot payout, attestation replay rejected, line over 7 windows, round-to-window math around genesis, timelocks.\n\nWEBSITE: dark console style like sepolia.squeekchain.com, monospace. Top: the live Squeekchain stream embedded full width (YouTube id from https://media.squeekchain.com/live/current.json), countdown to the current window close, the line, live pool sizes and implied payouts per side, jackpot balance. Tabs: Bet (three markets, connect wallet, approve IMD, place bet, claim), Stake (\"staking opens with the token\" until set, then stake, unstake, claim), History (settled windows with links to the oracle attestation on explorer.imdnotdead.fun). Mobile first. No fake data.\n\nREADME first section: no owner, no house, pari-mutuel only, results only from the IMD oracle, the contract never owes more than it holds, TEAM gets 1% of bets and nothing else.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","workflowId":"51bec67e-efec-4e88-bb68-297892343ce0","deliveredAt":"2026-10-16T09:30:40.604+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1951-workflow-contract-stage-context/pull/1"},{"site":{"cid":"bafybeibtut7la2xwv25bldo4pusmms6utp4xyhsd2t46ednunachuz3kie","status":"named","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth"},"jobId":"bca03477-1456-4288-a3bc-e8481901f2b2","state":"completed","commit":"effe1f54b876d607c075475c4a69d8568636e2b3","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","createdAt":"2026-10-16T12:03:52.395168+00:00","objective":"Project: Hamster Hour, https://ipfs.imd.fun/ipfs/bafybeidp4zcka5l7nf3gnj4fcmooxhp3vc3wucml6st4bckcjwa3ain3f4/ (launch 1959; contracts HamsterHour 0xc5217f129da200a8e86229de4eabf3686eef64b1 and OracleVerifier 0xdcd7a7dee31d589f9df8113780050c18e7ea1f7d on Ethereum, repo identity-md-launches/launch-1951-workflow-contract-stage-context). Keep every existing on-chain feature. Rebuild the look and the player flow as described. Six changes.\n\n1. LIVE WHEEL CAM. media.squeekchain.com/live/current.json blocks cross-origin reads, so the cam never shows. Embed the YouTube player directly: https://www.youtube.com/embed/6K_uF2s-LSw?autoplay=1&mute=1, full width at the top, 16:9, lazy. Try current.json in the background and swap the embed only if it answers with a different publicId. Never show \"unavailable\" while the hardcoded id works. Keep the \"Open source\" link.\n\n2. ONE-CLICK SETTLE. In the settle panel add a \"Buy oracle answer\" step before the paste field. For window k: build the oracle.request body exactly as docs/ORACLE.md in the contract repo specifies: question = question(k) read from the contract, chainId 1, window {hours: 24}, answerType \"uint256\", evidence \"panel\", panelSize 20, quorum 14, validForSeconds 86400, consumer {chainId: 1, verifyingContract: HamsterHour}. Pay the 0.5 IMD through the protocol's standard paid route for a browser wallet (the IMD Intake contract on Ethereum, approve + request, or the route the IMD protocol docs name), then poll GET https://api.imdnotdead.fun/oracle/requests/<uuid>/attestation every 15 s, show the panel link on explorer.imdnotdead.fun, and when the attestation arrives, prefill it and enable \"Settle\". Keep the manual paste path as a fallback. Only allow buying when the window has ended and has bets. Show the 0.5 IMD reimbursement note.\n\n3. TEAM CONTROLS. Keep the four settings, current values, pending values and execute dates visible to everyone. Show inputs and the Schedule/Execute buttons only when the connected wallet equals the contract's TEAM address; otherwise read-only.\n\n4. MAKE IT RADICALLY SIMPLE.\n- First screen on mobile: the live cam, the countdown, the line, and three big buttons: OVER, UNDER, SLEEPING. One tap opens an amount sheet with 1 / 5 / 10 / 25 IMD chips and a Place bet button. Approve and bet are one flow with clear states: Approving… → Placing… → Bet placed, you win X if OVER.\n- Under each button show live \"pays x1.8\" from pool sizes, updating as bets arrive.\n- EXACT lives behind a \"Guess the exact number\" link, not as a primary market.\n- One line under the buttons: \"Bet IMD on how far the hamster runs in the next hour. Winners share the pool. Verified by the IMD oracle.\" and a second dim line: \"Lose a bet, mine $HAMSTER. Coming soon.\"\n- Plain words everywhere. No \"pari-mutuel\", \"attestation\", \"void\", \"settle\" in player-facing copy: use \"shared pool\", \"verified result\", \"refunded\", \"close the window\". Precise terms only in a \"How it works\" drawer and in the settle and TEAM panels.\n- After a window ends: a result card with passes, who won, your payout, and one Claim button. Claimable windows surface automatically on the Bet tab, no window-number lookup needed.\n- A \"My bets\" strip on the Bet tab with the wallet's open positions in the current and next window.\n- Stake, History, Settle and TEAM controls move under a \"More\" menu. The Bet tab is the whole app for most visitors.\n- Wallet connect in one tap; show IMD balance and a \"Get IMD\" link to the IMD/ETH pool when balance is below 0.5.\n- Header: a small \"X\" link to https://x.com/hamsterhourgame next to the wallet button. Footer: the same link plus the two contract links.\n- Empty and error states in plain language: \"No bets yet, be first\", \"Betting closed, next window opens in 12:03\".\n\n5. INTRO OVERLAY. On first visit show a full-screen overlay: a looping muted video of a hamster chewing, download https://static.klipy.com/ii/d6b0ce929193df3c242ac34b5654d2ce/af/08/uurjWLxi1HRjI5kfVD.mp4 into the site assets (do not hotlink; if the download fails, use a looping pixel-art animation of the mascot chewing instead). Make it feel like a meme, not a corporate splash: the video big and centered with a neon green frame, the title HAMSTER HOUR in large monospace above it, one line \"bet. lose. win $HAMSTER.\" and two buttons: \"Start playing\" (closes the overlay) and \"Follow on X\" (opens https://x.com/hamsterhourgame in a new tab). Remember dismissal in localStorage, show it once per device, Escape and tap outside also close it.\n\n6. VISUAL STYLE. Build the whole look from this description, no external image files will be supplied. Terminal aesthetic: background #0b0d0b with a faint grid of #163a1c lines at 25 px pitch across the entire page. Accent neon green #39ff6a with a soft outer glow for rings, countdown digits, pool numbers and button borders. Headings in off-white #f2f0e6, secondary text in dim green #5a8f63. One monospace font everywhere (IBM Plex Mono or JetBrains Mono); the title HAMSTER HOUR bold, wide, uppercase. Buttons: dark fill, 1 px neon border, glow on hover, square pixel-crisp corners. Draw the mascot yourself as pixel-art SVG: a chubby orange-and-cream hamster with round green-lensed goggles, front view, big cheeks, inside a glowing neon green ring; use it as the header logo, favicon, og:image, loading state and result card (happy when you win, asleep for a zero round). Draw a second pixel-art SVG of the same hamster running in a side-view wheel with motion lines for the hero on desktop. No gradients except the neon glow, no stock icons, no emoji, no photos.\n\nKeep everything live and real. No fake numbers, no placeholders, zero console errors, mobile first at 375 and desktop at 1440, no horizontal scroll.\n\nACCEPTANCE: fresh visit at 375 and 1440 shows the intro overlay with the video, then the YouTube player within 3 s of dismissing it; OVER tap → amount → one bet transaction; the settle flow produces a valid settle transaction for a finished window with bets; TEAM buttons are absent for a non-TEAM wallet.","baseCommit":"33fe273714ec984a1c54db66aeca5d2a63f02b52","workflowId":null,"deliveredAt":"2026-10-16T13:15:26.227+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context/pull/2"},{"site":{"cid":"bafybeic5m4qzfu5vtpoadgne5bqoq2orf5t3f7f7wbgv4mnbtq466bqqu4","status":"named","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth"},"jobId":"18b6d6ce-f228-43a5-a6f4-02e33978e0ac","state":"completed","commit":"cbb258e6762c3522627f067acadaa7475f6a0627","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","createdAt":"2026-10-16T13:48:54.824198+00:00","objective":"Project: Hamster Hour, https://hamster-hour-bet-on-the-wheel.sites.imd.fun (launch 1959 v2; contracts HamsterHour 0xc5217f129da200a8e86229de4eabf3686eef64b1 and OracleVerifier 0xdcd7a7dee31d589f9df8113780050c18e7ea1f7d on Ethereum). Keep the current look, structure and every on-chain feature. Six changes.\n\n1. FIX THE CRITIC'S FINDINGS: a reverted or cancelled oracle payment must show the failed receipt and restore the Buy button (OraclePurchase.tsx:193); an invalid window lookup must show the error and a \"Back to next open window\" link instead of \"Reading pool…\" (Bet.tsx:89); with a single detected wallet, Connect connects in one tap (Wallet.tsx:75); primary buttons dark fill with 1 px neon border and glow on hover, secondary text #5a8f63 (styles.css:24). Remove the stray line \"Bet RUNNING: at least one pass\" from How it works.\n\n2. LIVE OR SLEEPING, through our proxy. The site may not call squeekchain.com directly (CORS). Use the proxy at https://hamster-hour.hamsterhour562.workers.dev: GET /live mirrors media.squeekchain.com/live/current.json, GET /status mirrors api.squeekchain.com/v1/status. Poll /live every 20 s. If state is \"live\" and playback.kind is \"youtube\", embed https://www.youtube.com/embed/<publicId>?autoplay=1&mute=1 and switch when publicId changes. Otherwise show a SLEEPING screen in the same 16:9 slot: dark background, the pixel mascot curled up, drifting \"zzz\", the text \"HAMSTER IS SLEEPING · stream is off\", and the last known passes from /status (measurement.speedMmPerSecond and cumulativeWorkUnits). If the proxy fails, fall back to the embed of the channel's last known stream id and never show a blank box. Show a small badge over the player: \"LIVE\" green or \"SLEEPING\" dim.\n\n3. WALLET CHAT. A chat panel beside the stream on desktop (right column) and below the buttons on mobile, titled \"Wheel chat\". Endpoint https://hamster-hour.hamsterhour562.workers.dev/chat. GET /chat?since=<ms> returns {messages:[{id,address,message,ts}],now}; poll every 5 s, append new ones, keep the last 200, autoscroll unless the user scrolled up. POST /chat with JSON {address, message, signature, ts} where ts = Date.now() and signature = personal_sign (EIP-191) of the exact string \"Hamster Hour chat\\n\" + ts + \"\\n\" + message from the connected wallet. Max 200 chars, no links, 1 message per 5 s; surface server errors in plain words (\"slow down\", \"no links\"). Show sender as 0xab12…cd34 with an identicon-style pixel color, and a small \"bet\" tag next to wallets that have a position in the current or next window (read from the contract). Not connected: read-only with a \"Connect to chat\" button. Messages are user content: escape everything, no markdown, no HTML.\n\n4. MEME LAYER.\n- \"Poke the hamster\" button under the player: squeak sound (short synthesized beep, no external file) and the mascot hops; a local counter \"poked N times\" per visitor.\n- Hamster mood in the header from /status: \"sleeping\" at zero speed, \"stretching\" below 30% of the line pace, \"zoomies\" above the line pace, \"villain era\" when the current window is above 2× the line.\n- Losing result card: the chewing hamster video from the intro plays small with \"you fed the hamster\" and, until the token exists, \"$HAMSTER mining coming soon\"; a \"share my L\" button opens an X intent with the window number and passes.\n- Winning result card: pixel sunflower-seed confetti, the goggled mascot gives a thumbs up, \"share my W\" button.\n- When the wheel is sleeping the whole page dims 10% and \"zzz\" drift over the player; when it goes live, a one-time green pulse and a 3 s \"HE'S RUNNING\" banner.\n- Easter eggs: 10 clicks on the logo put black sunglasses on the mascot (\"deal with it\"); the Konami code spins the page one full turn like a wheel.\n- Jackpot digits animate like a slot machine when the value changes.\nAll of it client-side, respect prefers-reduced-motion, no console errors.\n\n5. COPY. Under the line add a tooltip \"passes = wheel turns, about 21 cm each\". On the EXACT screen add one line: \"Closest three guesses share the pool. The jackpot pays only if the closest guess is within 2% of the result.\" Under the countdown: \"Betting on window N · starts in MM:SS · result about 1 h after start\".\n\n6. Keep everything live and real, mobile first at 375, desktop at 1440, no horizontal scroll, zero console errors.\n\nACCEPTANCE: at 375 and 1440, /live state idle shows the SLEEPING screen and state live shows the YouTube embed; a chat message posted from a connected wallet appears within 5 s for a second visitor; the poke button and both result cards work; critic's four findings closed.","baseCommit":"effe1f54b876d607c075475c4a69d8568636e2b3","workflowId":null,"deliveredAt":"2026-10-16T15:24:59.178+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context/pull/3"},{"site":{"cid":"bafybeiciuxk7e52vnxyibpulnppgp2yewspnkc47b3iepcl6t3gcwupczq","status":"named","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth"},"jobId":"277869c5-5b4a-4467-8d08-1f71097558b6","state":"completed","commit":"ef19db49a5d580fdbd979e80af95a7940556119a","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","createdAt":"2026-10-17T06:18:18.038746+00:00","objective":"Project: https://hamsterhour.fun\n\nMaintenance update of the existing Hamster Hour site (current build: https://hamster-hour-bet-on-the-wheel.sites.imd.fun, served at https://hamsterhour.fun). Keep design, layout, copy, contract wiring, wallet flow, chat, History, Settle, Stake and TEAM pages exactly as they are. Change only the five items below.\n\nContracts (Ethereum mainnet, unchanged): HamsterHour 0xc5217f129da200a8e86229de4eabf3686eef64b1, OracleVerifier 0xdcd7a7dee31d589f9df8113780050c18e7ea1f7d. Deployment record and ABIs are already in the site (/imd-deployment.json, /abi/*.json).\n\n1. Bet sheet amount field. In every bet sheet (OVER, UNDER, SLEEPING/RUNNING, EXACT) the \"IMD\" suffix inside the amount input wraps onto two lines (\"IM\" / \"D\") on desktop and mobile. Make the suffix white-space: nowrap with a min-width, let the number input shrink instead. Verify at 375px and 800px.\n\n2. Plurals. \"1 messages\" -> \"1 message\", \"poked 1 times\" -> \"poked 1 time\"; keep plural for other values. Apply to every counter on the site.\n\n3. Jackpot copy. Hide the sentence \"The jackpot pays only if the closest guess is within 2% of the result.\" (EXACT sheet) and the line \"Available jackpot: Not enabled yet.\" (How it works) while HamsterHour.jackpotToken() is the zero address. Conditional render, show them again once the token is configured.\n\n4. Live window progress (new, small). While the current window is running (windowTimes(k).startsAt <= now < endsAt), show a block under the countdown card:\n\"Window k in progress · round r of 6 · N passes so far · line L\" and a thin progress bar N / L (cap 100%).\nData only through the existing Hamster Hour worker (same base URL the site already uses for /live and /status); never call squeekchain.com directly (CORS):\n- GET {worker}/status -> measurement.cumulativeWorkUnits (decimal string, live hardware counter; keep the current 20 s polling).\n- GET {worker}/rounds -> mirror of Squeekchain /v1/settlements?range=now. Use recentSettlements[] (up to 10, newest first): previousSettledThroughRound, settledThroughRound, cumulativeWork, workAdded. All decimal strings, parse as BigInt.\nRound mapping: Squeekchain genesis is 1791847800 and its round n covers [1791847800 + (n-1)*600, 1791847800 + n*600). Do not reuse HamsterHour.genesisTimestamp for this mapping, it can differ by one round. firstRound = floor((startsAt - 1791847800)/600) + 1, lastRound = firstRound + 5. Round shown to the user r = clamp(floor((now - startsAt)/600) + 1, 1, 6).\nbaseline = cumulativeWork of the settlement with settledThroughRound == firstRound - 1. passesSoFar = cumulativeWorkUnits - baseline, clamped at 0. If that exact settlement is not in the list, use the newest one with settledThroughRound < firstRound and prefix the number with \"≈\"; if none, show only \"round r of 6\". Also show the block inside \"My bets\" for a bet on the running window. Mobile: one line, bar below.\nSmall print under the block: \"Live counter, unofficial. Result is settled by the IMD oracle.\"\n\n5. First visit. Expand \"How it works\" by default on the first visit (remember collapse state in localStorage, default collapsed afterwards).\n\nDeliver the updated site in the same hosting slot, no new dependencies, bundle size roughly unchanged. Test at 1280, 800 and 375 px: bet sheets, How it works, History, TEAM page read-only without a wallet, progress block with a running window and with the hamster asleep (N = 0).","baseCommit":"cbb258e6762c3522627f067acadaa7475f6a0627","workflowId":null,"deliveredAt":"2026-10-17T06:42:02.552+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context/pull/4"},{"site":{"cid":"bafybeianrdeol7mh6snfotcrvjafqjmd4smafvoc4qxxi4msl54o2qfeha","status":"named","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth"},"jobId":"227695a3-02a8-4abc-96b8-bfa592a8cd28","state":"completed","commit":"0724789990231d4bdcb77ded32b0a9fcea331681","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","createdAt":"2026-10-20T06:54:35.796439+00:00","objective":"Rebuild the Hamster Hour site for the v2 contract. Keep the domain, wheel cam, chat and existing worker endpoints (/live, /status, /rounds, /chat).\n\nCONTRACT: HamsterHour v2 on Ethereum mainnet 0xe33ab493249a2df0d8c4a71ac54f46d1f7778367, IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7. ABI and rules: github.com/identity-md-launches/launch-2260-build-hamster-hour-v2 (abi/, README). Use windowInfo(k), betOverUnder, betSnooze, buyTicket, claim, claimable, feedHamster, the jackpot views and events. Remove all v1 references.\n\nDESIGN \"cozy pixel\": minimal like playground.token.works. Geist font, huge tight headline with a period (\"Bet on the hamster.\"), pill buttons, 1px warm borders, 22-28px rounded cards, subtle film grain. Original pixel-art hamster mascot (own design, no known characters) in a pixel cage with a wheel: it sleeps with floating z's or runs in the spinning wheel based on live data, and the whole site switches to a night theme while he runs. Day palette: bg #FFF5E6, card #FFFBF4, ink #2B2118, muted #8A7765, line #E9D9C3, peach #FFB48A, butter #FFE08A, mint #A8E6C6, lilac #CDB8FF, rose #FF9AA8. Night: bg #1E1A2E, card #29233D. Silkscreen pixel font for numbers and tags. Over #E07A3E, under #5B8DEF, snooze #9A6FE0. 8-bit WebAudio blips, a jingle and pixel confetti on wins, chunky buttons with a colored drop shadow. Subtle dotted-grid touches as a nod to sepolia.squeekchain.com.\n\nBET PANEL:\n- Plain language, local time: \"Bets for 23:20-00:20 your time · closes in 12:41\". No window/round jargon.\n- Line shown big. Sides OVER / UNDER / SNOOZE (under 100 passes) with a live payout preview (\"if you win ≈1.8x · ~9 IMD\").\n- Quick amounts 1/5/10/Max, an Approve → Bet stepper, and a Get IMD button (swap link).\n- While he sleeps: \"usually wakes in ~5h\" plus a timeline picker for upcoming windows.\n- 6 sunflower seeds per window, one per 10-min round, filling with live passes. A passes odometer for the current hour.\n\nJACKPOT: dark card, glowing butter-yellow counter as a pixel jar filling with coins. 5 IMD ticket, ±0.5% wins 80%, 20% carries, no winner = grows, asleep = rolls over. Show next fixed prize, last winner and when. \"Feed the hamster\" button (feedHamster) and a \"fed by 0x…\" list from Fed events.\n\nMORE:\n- Live event ticker: bets, wins, feeds, jackpot hits.\n- Results ribbon for the last 24 windows versus the line.\n- 24h activity strip from telemetry: when he usually runs, with a \"you are here\" marker.\n- My bets: status, claimable, \"Claim all\", win banner.\n- Share card after a bet: image with side, amount, line and time, and a \"share on X\" button.\n- \"?\" tooltip on every card. 3-step onboarding on first visit. Light/dark toggle.\n- Mobile: sticky bottom bet panel, collapsible chat.\n- Teaser: \"Lose a bet, mine $HAMSTER. Soon.\" Losses already count.\n\nSTATS TAB: add worker routes /stats7 and /stats30 proxying api.squeekchain.com/v1/measurement/stats?range=7d|30d. Show a typical day by hour, km run, records, and on-chain game stats from events.\n\nAGENTS: worker route /api/window returns the current and next window, line, pools, close time, jackpot and recent results as JSON. Publish SKILL.md so `npx skills add https://hamsterhour.fun` works (format like docs.squeekchain.com). It covers the contract, ABI, reading windows, betting, claiming, and safety rules (own wallet only, spending limits, never handle others' keys). Add a small \"AI agents can play\" section linking it.\n\nFooter: x.com/hamsterhourgame, contract on etherscan, \"settled by the IMD oracle, data from Squeekchain\".","baseCommit":"ef19db49a5d580fdbd979e80af95a7940556119a","workflowId":null,"deliveredAt":"2026-10-20T07:45:33.899+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context/pull/5"},{"site":{"cid":"bafybeifpo6lenmuviml45blmr5gbh2nmdr6pdkthuoxr7er35h72a3jjwq","status":"named","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth"},"jobId":"35a18b93-f502-40e3-a23d-e6dbc3155cb0","state":"completed","commit":"6458b3e40bd5aacfd4a2987fe84397960bb3b7a0","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","createdAt":"2026-10-20T08:12:21.805355+00:00","objective":"Polish the v2 site. Keep the design, colors and contract integration as they are. Goal: the home page is short like v1, only what you need to bet; everything else moves to top tabs.\n\nTABS: The wheel | Jackpot | Stats | My bets | Agents.\n\nHOME (The wheel), in this order only:\n1. Header and the \"Bet on the hamster.\" headline (keep \"New here?\").\n2. One hamster frame: when the stream is live (worker /live), show the live stream inside this exact frame; when it is offline or stale, show the pixel hamster sleeping or running from live data. Never show an old recording. Remove the separate \"wheel cam\" card. Retitle the card from \"Meet the entire team\" to \"Live from the wheel\". Below it: this hour's passes and the 6 seeds.\n3. Bet panel as now.\n4. A compact jackpot strip: amount, \"Guess the exact number · 5 IMD\" button, link to the Jackpot tab.\n5. The one-line live ticker.\nNothing else on home. On mobile the first screen is the hamster frame plus the bet panel.\n\nMOVE: full jackpot jar, feed the hamster and the \"fed by\" list → Jackpot tab. \"A hamster's usual day\" and results history → Stats tab. AI agents section → Agents tab. Chat → a small floating chat button (bottom right) that opens a drawer, available on every tab.\n\nFIXES:\n- \"The last 24 hours\" lists future windows as past. Show only finished windows, newest first, with the hamster's actual passes for each hour (from the worker /rounds or stats), the line, and the winning side when there were bets. Put it in Stats.\n- \"usually wakes in ~Xh\": compute from the first hour of the 7-day average with at least 100 passes after now (should be ~12h at noon Kyiv time).\n- Format numbers with commas: 2,100, not \"2 100\".\n- Apply the medium and low findings from the previous design critic review of this site.\n- Remove anything duplicated or decorative that does not help betting.","baseCommit":"0724789990231d4bdcb77ded32b0a9fcea331681","workflowId":null,"deliveredAt":"2026-10-20T08:56:02.449+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context/pull/6"},{"site":{"cid":"bafybeihfhge32lyyprnu44rjtthnw5qyyln2wjulzkxmfkmjhlj4ff5qc4","status":"named","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth"},"jobId":"040611d4-bc95-477a-9a0a-1a6cf829bf81","state":"completed","commit":"fc0ecd0d6278b57d028ed4dd7405752d56aed74d","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","createdAt":"2026-10-20T20:08:26.935051+00:00","objective":"Project site: https://hamsterhour.fun\n\nAdd one new top tab \"$HAMSTER\" to the live site. Do not change anything else: keep the design, other tabs and features exactly as they are.\n\nADDRESSES (Ethereum mainnet):\n- HAMSTER token 0x8e7c7936b4f2d4475dc4bacd174dc228d4d24e86 (18 decimals), pool HAMSTER/IMD on Uniswap v4\n- HamsterVault 0x1dceb78b36b5f18ac4a130f1ffc76eba0e73d183 (ABI: github.com/identity-md-launches/launch-2304-project-site-https-hamsterhour-fun-launc/abi)\n- HamsterHook 0x82f636a92364d13754d7b3e72d460f0be20a28cc (source: github.com/identity-md-launches/launch-2336-hamster-hour)\n- Game v2 0xe33ab493249a2df0d8c4a71ac54f46d1f7778367, IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7\n\nTHE TAB, top to bottom:\n1. Token: the official CA with a copy button, \"Buy on Uniswap\" (app.uniswap.org swap, IMD to HAMSTER, mainnet), and the note \"beware of fake tokens, this is the only CA\". While the anti-snipe tax is live, show the current buy tax and a countdown to 0 (95% at pool start, minus 2 points per full minute, 0 after 48 minutes; read the start time from the hook).\n2. Mine: list the windows where the connected wallet lost (lossOf > 0 on the game) with vault.claimable(game, k, account), and a \"Claim all\" button calling claimMined(game, windows[], account) in bounded batches. Show grants with vested and locked amounts, plus a withdrawVested button.\n3. Stake: approve and stake HAMSTER (show the 24h warm-up), requestUnstake (rewards stop now, tokens release after 24h), withdrawUnstaked, pendingIMD and claimRewards.\n4. Stats: current mining rate (HAMSTER per 1 IMD lost) and the next halving from currentMiningState, buckets left, total staked, IMD paid to stakers.\n5. A short \"how it works\" with a \"?\" tooltip: lose a bet and mine $HAMSTER, 7-day vesting that counts as stake, stakers earn IMD from 5% of every bet and 0.5% of every swap.","baseCommit":"6458b3e40bd5aacfd4a2987fe84397960bb3b7a0","workflowId":null,"deliveredAt":"2026-10-20T20:32:48.953+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context/pull/7"},{"site":{"cid":"bafybeigbeg2ypoipijsc57b35qm5qryp3tlwsjw2u4ow6rjncaj4d3h2ne","status":"named","ensName":"hamster-hour-bet-on-the-wheel.site.identitymd.eth"},"jobId":"b8abdc6c-7990-406e-a674-da092f6f13ab","state":"completed","commit":"f0bb75a34f0402f74b761e8984e4771d9c537520","repoUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context","createdAt":"2026-10-20T20:41:00.332956+00:00","objective":"Small update. Change nothing else.\n\n1. $HAMSTER tab, in Stats and on top of the Stake card, add a \"Rewards pool\" block:\n- IMD waiting for stakers = vault.dripDeposited() + vault.hookDeposited() + vault.gameDeposited() - vault.rewardsPaid() (vault 0x1dceb78b36b5f18ac4a130f1ffc76eba0e73d183), shown in IMD and USD.\n- Releasing now: IMD per day (drip about 1% of the remaining drip per day, plus active 7-day streams).\n- Estimated APR for stakers: daily release × 365 ÷ USD value of total staked (HAMSTER price from the HAMSTER/IMD pool). Mark it as an estimate that changes with stake and price.\n- For a connected wallet: your share of the stake (%) and your IMD per day.\n\n2. Jackpot total: everywhere the jackpot is shown (home strip and Jackpot tab), show game.jackpotSeed() + game.totalPendingJackpotDeposits() (game 0xe33ab493249a2df0d8c4a71ac54f46d1f7778367), not only the next window's bucket. Keep \"next hour's fixed prize\" as a secondary line.","baseCommit":"fc0ecd0d6278b57d028ed4dd7405752d56aed74d","workflowId":null,"deliveredAt":"2026-10-20T21:07:05.063+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1959-workflow-frontend-stage-context/pull/8"}],"contracts":[{"id":"ed83213d-f7c5-487c-b17b-c79ba8d2c3fc","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"HamsterHour","role":"other","txHash":"0x48c8490dbccbb523a232d880b2909f35a721b140fb586493c9f49dbf429ba268","address":"0xc5217f129da200a8e86229de4eabf3686eef64b1"},{"name":"OracleVerifier","role":"other","txHash":"0x48c8490dbccbb523a232d880b2909f35a721b140fb586493c9f49dbf429ba268","address":"0xdcd7a7dee31d589f9df8113780050c18e7ea1f7d"}],"createdAt":"2026-10-16T09:30:40.604+00:00","updatedAt":"2026-10-16T09:31:27.287+00:00","launchNumber":1951,"parkedReason":null,"sourceCommit":"7ab2a01b3d9a15e2acca8b317e77058e6f2d41e9","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1951-workflow-contract-stage-context"}],"publishedAt":"2026-10-20T21:07:28.544+00:00"},{"id":"launch:0537b7d1-e1e1-415b-9e4c-d3bd581f4e60","code":[],"media":[],"sites":[],"title":"Build and deploy NightshiftVault, one contract for NIGHTSHIFT players (web and Telegram Mini App): game balances with personal deposit addresses, staked games without a signature per game, a shop for in-game items, and weekly leaderboard prizes. Player money stays here and can only go into games the player starts or back to the player's own wallet.\n\nAssets: native ETH (address(0)), IMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7, SHIFT 0xe5e58e53d0bb204aa62c995a6c8cc8a48e60c3ac (ERC-20, 18 decimals, no transfer fee). Every function works for all three; ETH by call with a checked result.\n\nAccounts: bytes32 accountId with an owner wallet. register(accountId, owner, deadline, ownerSig, operatorSig): EIP-712 Register(bytes32 accountId,address owner,uint256 deadline) signed by both the owner and the operator. Only the owner changes the owner (with the new owner's signature). Events Registered, OwnerSet.\n\nDeposits: depositAddress(accountId) is a CREATE2 forwarder (salt accountId) taking ETH and tokens from any wallet or exchange. sweep(accountId, asset), callable by anyone, deploys it if needed and credits its whole balance to the account; it can only send here for its own account. Also payable depositETH(accountId) and deposit(accountId, token, amount). Event Deposited.\n\nWithdraw: withdraw(accountId, asset, amount) only by the owner, only to the owner, works while paused or frozen.\n\nGames (an internal escrow with the rules of NIGHTSHIFT's GameEscrow 0xf460fd9ad76f18414f54a2431870e8a116193489): the operator calls lockGame(gameId, accountA, accountB, asset, stake, expiresAt) at the players' request: both stakes move from available to locked; gameId new; accounts and owners distinct. settle(gameId, result, deadline, sig) with EIP-712 Result(bytes32 gameId,uint8 result,uint256 deadline) from the result signer: 0 A won, 1 B won, 2 draw or void. The winner gets 95% of the pot as available balance, 5% goes to the fee splitter 0x1119d5df2f046bc2d3c0f6279ef2e9ce49422d44 (it takes ETH and tokens); draw or void refunds both, no fee. refundGame by anyone 24 h after expiresAt.\n\nCaps against a compromised operator: per account and asset a rolling 24 h stake cap (default 0.05 ETH, 100 IMD, 2500000 SHIFT) and a per-game max; lockGame reverts above them. The owner lowers caps or freezes instantly; raising caps or unfreezing takes 24 h. Events CapsSet, Frozen.\n\nShop: buy(accountId, itemId, asset, amount) from the account's balance, signed by the owner or by the operator within the same daily cap; or payable/transferFrom buyDirect(accountId, itemId, asset, amount) by anyone. Event Purchased(accountId, itemId, asset, amount). Every purchase splits at once: IMD half to IMD's BurnExecutor 0xe29386719c155b6847ad5a4e97c6674f10ffc750, half to the prize pot; SHIFT half to 0x000000000000000000000000000000000000dEaD, half to the pot; ETH half to an ETH burn reserve, half to the pot. burnReserve(amountIn, minShiftOut), by the keeper only: buys SHIFT with that ETH on the Uniswap v4 SHIFT/ETH pool (key: currency0 ETH, currency1 SHIFT, fee 12500, tickSpacing 60, hooks 0x42ebcf86e3ab0445ba0362f911a7e8fad6ace0cc) and sends it all to 0x…dEaD in the same call, requiring minShiftOut. Events Burned.\n\nWeekly prizes: the pot is tracked per asset. postPrizes(epoch, root, asset, total) by the operator reserves total from that asset's pot (never more than it holds), once per epoch and asset. claimPrize(epoch, accountId, asset, amount, proof) credits the account's available balance; OpenZeppelin StandardMerkleTree leaf keccak256(bytes.concat(keccak256(abi.encode(epoch, accountId, asset, amount)))); once per leaf; unclaimed after 30 days returns to the pot with expirePrizes. Events PrizesPosted, PrizeClaimed.\n\nRoles: operator, result signer and keeper are set by the contract owner 0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5 (initially 0x3b5919586fc04f7e99b450a72bcb14eeb6977497 for all three); each change takes effect after 48 h. The contract owner may pause new games, deposits and purchases; nothing else. Nobody can move, take or redirect a player balance, the pot or the burn reserve except by the rules above, or change the split, the fee, the recipients or the assets. No upgradeability, delegatecall, selfdestruct or sweeping. Reentrancy guard, checks-effects-interactions, SafeERC20, Solidity 0.8.x, NatSpec, events everywhere. EIP-712 domain \"NightshiftVault\", version \"1\".\n\nViews: accountOf, balanceOf(accountId, asset) available and locked, depositAddress, games, pot(asset), burnReserve, epochs.\n\nFoundry tests for ETH, IMD and SHIFT: registration needs both signatures; transfer then sweep; withdraw only to the owner, paused and frozen; caps, delays and freeze; settle A, B, draw, wrong signer, expired, double; refund; 5% fee; every purchase split exactly half and half; burnReserve with a mocked pool and minShiftOut; prize posting within the pot, claims, double claims, expiry; role delays; owner cannot move funds; invariants that balances plus locked plus pot plus reserve never exceed holdings.","types":["contracts"],"audits":[],"paidBy":"0x6c4c78f2c3bdf4c4318fe305fb1c8bc1694d19b5","release":null,"research":[],"versions":[],"contracts":[{"id":"0537b7d1-e1e1-415b-9e4c-d3bd581f4e60","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":1,"artifacts":[{"name":"NightshiftVault","role":"other","txHash":"0x3c3e8fcfe358fb2a7473aed542f4ee5ec136f2074a05c0bf7fe2574efda9c4d7","address":"0xefc4076fa25327db4b0c89c05619d6b1273bff9b"}],"createdAt":"2026-10-20T19:15:44.995+00:00","updatedAt":"2026-10-20T19:17:05.606+00:00","launchNumber":2329,"parkedReason":null,"sourceCommit":"3be7283da43e1c99d70c770a8d69c73757d47ec4","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2329-build-deploy-nightshiftvault-one"}],"publishedAt":"2026-10-20T19:15:44.995+00:00"},{"id":"job:8c8b822f-8b49-4776-bcf7-8a53c0650426","code":[],"media":[{"cid":"bafybeiguzd7iapgry3ju5l3fy6njebelz3e5oq6puqbpaedflzbwkqlxwe","files":[{"hash":"a7c691c3063e9d51740b3ed446048e6cef1beea88cce806950b13353d086df89","name":"card_09_supply","path":"artifacts/cards/09-supply-1080x1350.png","bytes":171432,"committed":false,"mediaType":"image/png"},{"hash":"145964f95d4c3da4ea46d3428c2d1961af01dd1c8d96a947764ad67d90ac9b8a","name":"card_10_launch_hour","path":"artifacts/cards/10-launch-hour-1080x1350.png","bytes":165009,"committed":false,"mediaType":"image/png"},{"hash":"dd9107eec2448c1ad9b312c2259d727e3028fcf1f64f6f5fdfe5d9aee59a1eae","name":"card_11_whos_who","path":"artifacts/cards/11-whos-who-1080x1350.png","bytes":210349,"committed":false,"mediaType":"image/png"},{"hash":"bdd871569b162b2ed0162333fd7e1a10706d2a6440ea79aa3bd952cb49b971b2","name":"card_12_contract_map","path":"artifacts/cards/12-contract-map-1080x1350.png","bytes":201552,"committed":false,"mediaType":"image/png"},{"hash":"2729725df3986af9ffaafdcf68632324e4a3e2f5c5b838f0c1f78cf6471d9454","name":"story_10_launch_hour","path":"artifacts/cards/10-launch-hour-1080x1920.png","bytes":182926,"committed":false,"mediaType":"image/png"},{"hash":"30ad3a15b49a93648e90f6c435eda15b7eda4a70deac2b8ce66741fcedccf957","name":"contact_sheet","path":"artifacts/contact-sheet.png","bytes":603773,"committed":false,"mediaType":"image/png"}],"jobId":"8c8b822f-8b49-4776-bcf7-8a53c0650426","commit":null,"repoUrl":null,"publishedAt":"2026-10-19T16:27:28.946+00:00"}],"sites":[],"title":"Design 4 infographic cards of moneycanbuy.fun on its token, roles and contracts. moneycanbuy.fun is a board of paid dares. An author posts a dare with a reward locked in a contract, a doer does it and submits proof, NFT holders and the IMD swarm judge disputes, predictors enter WILL DO or WON'T DO, the contract pays. These 4 cards are 9-12 of a series of 12. At first sight a reader must see where every YOLO goes, what happens in the launch hour, what each role can do, pays and can get, and which contract holds the money.\n\nFILES: use only this repository. infographics/README.md is the spec: frame rules, forbidden words and the exact text of every card (cards 9-12 here). infographics/numbers.json holds every number allowed on a card, field \"display\"; take numbers only from there and never compute new ones. Brand: explainers/brand/ (colors.md, fonts/ with Quicksand variable and IBM Plex Mono 400/600 plus licences, mark-transparent-1024.png, wordmark.png). IMD: explainers/imd/ (imd-token-logo.png = the IMD coin with a frog, the IMD swarm; nft-*.png = official identity.md NFT images). No other image or font source.\n\nTOOLS: draw every card in code only: SVG or HTML/CSS, rendered to PNG offline by headless Chromium (Playwright) or resvg, fonts loaded from explainers/brand/fonts/. No image generation model, no stock images, no photos, no people, no faces, no hands, no toad in a costume. The toad mark appears only as the supplied PNG, at most 96 px, in a corner, never redrawn. The IMD coin (at most 160 px) and the NFT images are used as is: never redrawn, recoloured, stretched or cropped.\n\nFORMAT: PNG, sRGB. All 4 cards at 1080x1350. Card 10 also at 1080x1920 (story), with the steps on a vertical time axis top to bottom. At 1080 px width: main text at least 32 px, small text (footnotes, examples, labels, footer) at least 24 px, headings at least 56 px; if text does not fit, shrink icons and gaps, never the text or the card text. Text contrast at least 4.5:1.\n\nLAYOUT: every element (text, icon, image, bar, arrow, line, box, mark, footer) at least 64 px from every edge. Nothing overlaps: no text touches another text, an icon, an image, an arrow or a line; arrows end at a box edge and never cross a number or a word; at least 16 px between boxes. One thought per card: a dare, a payout and a trophy never share a block, each has its own box.\n\nLOOK: clean data cards for a dark social feed. Background #000000, accent #3ECF7A, gold #F5C451 only on payout amounts, white text, secondary #9EA69F. Quicksand Bold for headings and text, IBM Plex Mono for every number. One question per card as the heading. Simple icon shapes only (wallet, NFT frame, hammer, scales, flame, padlock). Every burn and every 0x…dEaD has a red flame: filled #FF4D2E with a #FFB020 core, at least 56 px high, never green, never a drop; red only for burns. Footer of every card: \"moneycanbuy.fun\" and the card number, e.g. \"3/12\".\n\nCARDS (heading; layout; the full card text is in infographics/README.md, use it character for character):\n9. \"YOLO Supply and Unlocks\": bars, not a pie, for the 7 parts with their YOLO counts and percents and how each unlocks; the unlock curve day 0 54% / month 6 72% / month 12 91% / month 24 100% on a vertical time axis; \"No owner, no mint, no pause\".\n10. \"The Launch Hour\": vertical time axis 0 → 60 min: before openAt, minutes 0-30 NFT holder snapshot only with 500,000 YOLO per NFT and 30% on every sell, minutes 30-60 tax falling in a straight line 30% → 0%, minute 60+ plain ERC-20; the 1,000 YOLO sell example; tax \"→ treasury → burned\".\n11. \"Who's Who\": 8 role tiles author, doer, disputer, NFT holder, predictor, swarm caller, IMD swarm, dev wallet; each tile has three lines \"can\", \"pays\", \"can get\" exactly as in the spec; one icon per tile, no people; the NFT holder tile shows one NFT image, the IMD swarm tile the IMD coin.\n12. \"Contract Map\": 4 tiers = launches 0-3 with the contract names, money as gold arrows, calls as grey arrows; outside the IMD swarm (with the IMD coin) and the treasury, buyback and dev wallets as labelled boxes without addresses; \"No server, no keeper\".\n\nWORDING RULES: every percent names its base (\"5% of the supply = 50,000,000\"). No dollar amounts on cards 9, 10 and 12; card 11 uses only shares of the reward. Keep the name \"Stabilizer / MM fund\" as written. The launch tax goes to the treasury and is then burned; never write that the tax burns by itself. The launch tax appears only on card 10.\n\nFORBIDDEN on any card: any token price, opening price, FDV, market cap, \"initial market cap\", \"circulating supply value\", \"x100\", \"moon\", price charts; \"automatic\", \"auto\" or \"auto-burn\" next to buyback or burn; \"bought back\"; \"guaranteed\", \"earn\", \"yield\", \"passive\", \"APY\", \"staking rewards\"; \"bet\", \"gamble\", \"odds\", \"win big\"; \"deflationary\"; \"fair launch\", \"anti-bot\", \"whitelist\" (write \"snapshot\"); \"audited\"; \"owner\" for the dev wallet; gas in dollars; contract or wallet addresses; any web address other than moneycanbuy.fun; any link in your files; any number not in numbers.json (exempt: list numbers, the footer card number, the names Launch 0-3).\n\nDELIVER (all under artifacts/):\n- cards/09-supply-1080x1350.png, 10-launch-hour-1080x1350.png, 11-whos-who-1080x1350.png, 12-contract-map-1080x1350.png, 10-launch-hour-1080x1920.png;\n- contact-sheet.png: all 5 PNGs on one sheet, labelled with file name;\n- cards.pdf: the 4 cards at 1080x1350, one per page, in order;\n- check.json: for every PNG, every text string on it, each number with its numbers.json id, forbidden-word hits (must be 0), fonts used, size in px, smallest text size, lowest contrast ratio;\n- bbox.json: an automatic check of every rendered PNG: each element's box x, y, w, h from the render (getBoundingClientRect or getBBox), its distance to each edge, every intersecting pair, PASS/FAIL per card; FAIL if an element is under 64 px from an edge, two text boxes intersect, a text box crosses an icon, image, arrow or line other than its container, or text is under the minimum size; must end with 0 FAIL;\n- README.md: tools used, one offline command that rebuilds all PNGs, and the self-check below;\n- src/: the full SVG/HTML source and the render script.\n\nSELF-CHECK before you finish, write each result in README.md and fix anything that fails: every PNG has the exact size above; every number on every card has a numbers.json id; every card's text matches infographics/README.md character for character; no text is cut off; bbox.json 0 FAIL on every card; every burn has the red flame; no block mixes a dare, a payout and a trophy; contact-sheet.png viewed, nothing crowded or touching; contrast at least 4.5:1; forbidden-word hits 0; the mark PNG at most 96 px and unchanged; footer present on every card.","types":["media"],"audits":[],"paidBy":"0x3c587eff6c96eacf7e3dcc2cff6416161386e48c","release":null,"research":[],"versions":[],"contracts":[],"publishedAt":"2026-10-19T16:27:28.946+00:00"},{"id":"job:24f5df8d-80bd-4580-974c-715c70d9d66c","code":[],"media":[{"cid":"bafybeiedsw4de5xdbyndalcl3gxck22jaasdfyt6k4jsrgwh2qmfityrru","files":[{"hash":"c420b2e3acc9cd215d0827724463da7533aae5b7694c8daab442f9d27c5a0c33","name":"card_01_lifecycle","path":"artifacts/cards/01-lifecycle-1080x1350.png","bytes":439505,"committed":false,"mediaType":"image/png"},{"hash":"a500ef396601ce869c12c8326ce509ac2bea736e097ea48f4e1b4d6b3854f9d4","name":"card_02_money_in","path":"artifacts/cards/02-money-in-1080x1350.png","bytes":409263,"committed":false,"mediaType":"image/png"},{"hash":"1d85f89e3217f1ddc7601084890ac981a11ae1f61ba97c30345af05bc78e2d06","name":"card_03_dispute","path":"artifacts/cards/03-dispute-1080x1350.png","bytes":478612,"committed":false,"mediaType":"image/png"},{"hash":"e81a989e504dd0d5db5baf7b5790d971b69205643256159744802ab8277cea6b","name":"card_04_loser_bond","path":"artifacts/cards/04-loser-bond-1080x1350.png","bytes":420618,"committed":false,"mediaType":"image/png"},{"hash":"734c16887de959bdef45234402aeabcc90347733d1a6acf0e220e28cfdb86676","name":"card_05_where_100_goes","path":"artifacts/cards/05-where-100-goes-1080x1350.png","bytes":331254,"committed":false,"mediaType":"image/png"},{"hash":"a0d8704c12235b32f5569b9e1ce43f293005e046314e4bbaf2d6f712fc8de0d7","name":"card_06_doer_stake","path":"artifacts/cards/06-doer-stake-1080x1350.png","bytes":339410,"committed":false,"mediaType":"image/png"},{"hash":"539378e942fe43bad4e6296bbc73d5baa64a063c314972deb4767d3f58c793f3","name":"card_07_will_do","path":"artifacts/cards/07-will-do-1080x1350.png","bytes":432375,"committed":false,"mediaType":"image/png"},{"hash":"814308e8fbb10c5b92968e8283fba632f1468caa79389149eac923cac97b15e5","name":"card_08_fees","path":"artifacts/cards/08-fees-1080x1350.png","bytes":420982,"committed":false,"mediaType":"image/png"},{"hash":"0077bd39e63262611ca941164df141f7035cb59e8911bee632375411638816f6","name":"story_01_lifecycle","path":"artifacts/cards/01-lifecycle-1080x1920.png","bytes":459312,"committed":false,"mediaType":"image/png"},{"hash":"0dacbede7f792ff8587564252e37888d24f6821eda59b80dc455640c6991f996","name":"story_05_where_100_goes","path":"artifacts/cards/05-where-100-goes-1080x1920.png","bytes":354172,"committed":false,"mediaType":"image/png"},{"hash":"5e2e8766772e4943a12923182e709d1fb66660d4fc618ef322c1806d80da275d","name":"story_07_will_do","path":"artifacts/cards/07-will-do-1080x1920.png","bytes":459194,"committed":false,"mediaType":"image/png"},{"hash":"b5ca3be157485b672e06ff9ebd274975367f486b6fa0f505c61eed5359b9f893","name":"contact_sheet","path":"artifacts/contact-sheet.png","bytes":970002,"committed":false,"mediaType":"image/png"}],"jobId":"24f5df8d-80bd-4580-974c-715c70d9d66c","commit":null,"repoUrl":null,"publishedAt":"2026-10-19T16:21:25.822+00:00"}],"sites":[],"title":"Design 8 infographic cards of moneycanbuy.fun on dares, disputes and payouts. moneycanbuy.fun is a board of paid dares. An author posts a dare with a reward locked in a contract, a doer does it and submits proof, NFT holders and the IMD swarm judge disputes, predictors enter WILL DO or WON'T DO, the contract pays. These 8 cards are 1-8 of a series of 12. At first sight a reader must see how the platform works, how a dare flows, where every dollar goes, and what they can do as author, doer, disputer, NFT holder or predictor.\n\nFILES: use only this repository. infographics/README.md is the spec: frame rules, forbidden words and the exact text of every card (cards 1-8 here). infographics/numbers.json holds every number allowed on a card, field \"display\"; take numbers only from there and never compute new ones. Brand: explainers/brand/ (colors.md, fonts/ with Quicksand variable and IBM Plex Mono 400/600 plus licences, mark-transparent-1024.png, wordmark.png). IMD: explainers/imd/ (imd-token-logo.png = the IMD coin with a frog, the IMD swarm; nft-*.png = official identity.md NFT images). No other image or font source.\n\nTOOLS: draw every card in code only: SVG or HTML/CSS, rendered to PNG offline by headless Chromium (Playwright) or resvg, fonts loaded from explainers/brand/fonts/. No image generation model, no stock images, no photos, no people, no faces, no hands, no toad in a costume. The toad mark appears only as the supplied PNG, at most 96 px, in a corner, never redrawn. The IMD coin (at most 160 px) and the NFT images are used as is: never redrawn, recoloured, stretched or cropped.\n\nFORMAT: PNG, sRGB. All 8 cards at 1080x1350. Cards 1, 5 and 7 also at 1080x1920 (story), with the steps on a vertical time axis top to bottom. At 1080 px width: main text at least 32 px, small text (footnotes, examples, labels, footer) at least 24 px, headings at least 56 px; if text does not fit, shrink icons and gaps, never the text or the card text. Text contrast at least 4.5:1.\n\nLAYOUT: every element (text, icon, image, bar, arrow, line, box, mark, footer) at least 64 px from every edge. Nothing overlaps: no text touches another text, an icon, an image, an arrow or a line; arrows end at a box edge and never cross a number or a word; at least 16 px between boxes. One thought per card: a dare, a payout and a trophy never share a block, each has its own box.\n\nLOOK: clean data cards for a dark social feed. Background #000000, accent #3ECF7A, gold #F5C451 only on payout amounts, white text, secondary #9EA69F. Quicksand Bold for headings and text, IBM Plex Mono for every number. One question per card as the heading. Simple icon shapes only (wallet, NFT frame, hammer, scales, flame, padlock). Every burn and every 0x…dEaD has a red flame: filled #FF4D2E with a #FFB020 core, at least 56 px high, never green, never a drop; red only for burns. Footer of every card: \"moneycanbuy.fun\" and the card number, e.g. \"3/12\".\n\nCARDS (heading; layout; the full card text is in infographics/README.md, use it character for character):\n1. \"The Dare Lifecycle\": vertical time axis Post → Submit → Review → NFT vote → Appeal or swarm → outcomes Completed / Expired / Unwound; a rejected submission reopens the dare.\n2. \"Who Puts Money In\": 5 role rows, each \"puts in → back when\"; the footnote and the $100 USDC example.\n3. \"Dispute → NFT Vote → Swarm\": a tree with the three vote results, one NFT image at the vote, the swarm panel as the IMD coin with 7 NFT images, silence, the tie rule, the footnote.\n4. \"Who Gets the Loser's Bond\": 2x2 grid, 50/50 vs 100%, winner's own bond back, 0.5 IMD to an outside appellant, the fake-proof example; small 24 px footnote: the 0.5 IMD goes back only if the loser's bond still holds IMD.\n5. \"Where $100 Goes\": 6 horizontal bars, each the full $100, segments doer (gold), NFT voters, buyback wallet, treasury, widths to scale, the dollar amount on every segment; the footnote.\n6. \"The Doer Stake\": lock, power, bonus, the 4-step scale, \"Lock, not burn\".\n7. \"WILL DO / WON'T DO\": the 100 YOLO entry split 90 / 5 / 5 as three separate boxes, the red flame only on the burning 5, then weight, done, not done, empty side, cancelled, the example.\n8. \"Where Every Fee Goes\": sources on the left; on the right 0x…dEaD, BUYBACK WALLET, TREASURY and \"back to people\"; the line from the buyback wallet onward dashed and labelled \"by hand\"; the trophy row in its own box; a red flame on 0x…dEaD.\n\nWORDING RULES: every percent names its base (\"4% of the reward = $4\", never \"4% of 5%\"). Dollars only as the $100 USDC example reward and its shares. On ETH, USDC and IMD segments write \"buyback wallet\", never \"burned\"; only YOLO burns. Prediction 5% burns at the outcome, never \"on entry\". The dispute window starts at activation of the submission.\n\nFORBIDDEN on any card: any token price, FDV, market cap, \"x100\", \"moon\", price charts; \"automatic\", \"auto\" or \"auto-burn\" next to buyback or burn; \"bought back\"; \"guaranteed\", \"earn\", \"yield\", \"passive\", \"APY\", \"staking rewards\"; \"bet\", \"gamble\", \"odds\", \"win big\"; \"deflationary\"; \"AI judge\", \"oracle\" as a name, model names; \"creation fee\"; \"30 days timeout\"; the launch tax or first-hour tax (it is explained only on card 10); YOLO counts converted to dollars; contract or wallet addresses other than 0x…dEaD; any web address other than moneycanbuy.fun; any link in your files; any number not in numbers.json (exempt: list numbers, the footer card number).\n\nDELIVER (all under artifacts/):\n- cards/01-lifecycle-1080x1350.png, 02-money-in, 03-dispute, 04-loser-bond, 05-where-100-goes, 06-doer-stake, 07-will-do, 08-fees, each -1080x1350.png;\n- cards/01-lifecycle-1080x1920.png, 05-where-100-goes-1080x1920.png, 07-will-do-1080x1920.png;\n- contact-sheet.png: all 11 PNGs on one sheet, labelled with file name;\n- cards.pdf: the 8 cards at 1080x1350, one per page, in order;\n- check.json: for every PNG, every text string on it, each number with its numbers.json id, forbidden-word hits (must be 0), fonts used, size in px, smallest text size, lowest contrast ratio;\n- bbox.json: an automatic check of every rendered PNG: each element's box x, y, w, h from the render (getBoundingClientRect or getBBox), its distance to each edge, every intersecting pair, PASS/FAIL per card; FAIL if an element is under 64 px from an edge, two text boxes intersect, a text box crosses an icon, image, arrow or line other than its container, or text is under the minimum size; must end with 0 FAIL;\n- README.md: tools used, one offline command that rebuilds all PNGs, and the self-check below;\n- src/: the full SVG/HTML source and the render script.\n\nSELF-CHECK before you finish, write each result in README.md and fix anything that fails: every PNG has the exact size above; every number on every card has a numbers.json id; every card's text matches infographics/README.md character for character; no text is cut off; bbox.json 0 FAIL on every card; every burn has the red flame; no block mixes a dare, a payout and a trophy; contact-sheet.png viewed, nothing crowded or touching; contrast at least 4.5:1; forbidden-word hits 0; the mark PNG at most 96 px and unchanged; footer present on every card.","types":["media"],"audits":[],"paidBy":"0x3c587eff6c96eacf7e3dcc2cff6416161386e48c","release":null,"research":[],"versions":[],"contracts":[],"publishedAt":"2026-10-19T16:21:25.822+00:00"},{"id":"job:e8d9e151-5e00-4a7f-81c3-afabf46d4c5c","code":[],"media":[{"cid":"bafybeigqzrfnu6rhy4u6nau4huz3n4xda47iogdc4mwni6cg2ry65um4su","files":[{"hash":"0052e7ed96be923586df4c123df460e391c0ea6f86f8aea9a5d34b7ab97f48de","name":"video","path":"artifacts/money-loop-9x16.mp4","bytes":2333479,"committed":false,"mediaType":"video/mp4"},{"hash":"0bfcd392dc6a0c01af919d4b07ec73d41fb0f1719fcf00e8cd42b792c50408ee","name":"contact_sheet","path":"artifacts/contact-sheet.png","bytes":274661,"committed":false,"mediaType":"image/png"}],"jobId":"e8d9e151-5e00-4a7f-81c3-afabf46d4c5c","commit":null,"repoUrl":null,"publishedAt":"2026-10-19T14:50:43.98+00:00"}],"sites":[],"title":"Make a 55-second vertical explainer video of the money loop of moneycanbuy.fun, rendered entirely in code. moneycanbuy.fun is a board of paid dares: anyone posts a dare with a reward locked in a contract, anyone does it and submits proof, NFT holders and the IMD swarm judge disputes, the contract pays. This video follows one $100 USDC dare and shows where every dollar goes.\n\nFILES: use only the files in this repository, folder explainers/brand/: mark-transparent-1024.png (our toad mark), wordmark.png, fonts/ (Quicksand variable, IBM Plex Mono 400 and 600, with licences), colors.md. No other image source.\n\nTOOLS: draw and animate everything in code (vector shapes, text, the supplied PNGs, keyframes with easing). Do not use any image, video, voice or music generation model and no stock material. Compose the music in code too.\n\nFORMAT: 1080x1920, exactly 55.000 s, constant 24 fps (1320 frames), H.264 High yuv420p, AAC 48 kHz stereo, faststart, under 60 MB.\n\nLOOK: native phone content, not an advert or a cartoon story. Every scene is a phone screen seen flat, full frame: a dark social feed post, an app card, a notification, a wallet \"confirmed\" toast, a cursor, a tap ripple. Background #000000, accent green #3ECF7A, gold #F5C451 only on payout amounts, white text, secondary #9EA69F. Quicksand Bold for captions and UI text, IBM Plex Mono for every number and address. The toad mark appears only as the supplied PNG (scene 14 and the app header), never redrawn, never in a costume, never animated into a character. No real people, no platform logos, no real handles (use @poster and @doer).\n\nMUSIC: one original track composed in code for exactly 55.000 s at a constant 120 BPM (beat 0.5 s), starting at 0.000 s and ending with a clean final hit at 54.5 s and silence by 55.000 s. Never loop, stretch, slow down or retime the track or any motion to fill time. Loudness about -14 LUFS, true peak under -1 dBTP, no clipping. Soft UI sound effects in code: key clicks in scene 1, taps, a coin tick on payouts, a short flame whoosh on burns. No voice.\n\nCAPTIONS: every scene has its caption, shown for the whole scene (scene 1: typed). Caption in the upper third, Quicksand Bold, white, at least 64 px, max two lines, never covered. Use the exact text of the table, character for character. UI text inside the phone screen is extra and must match the numbers below.\n\nSCENES (start-end in seconds, cuts land on beats; caption in quotes; then what is on screen):\n1. 0-3 \"where does the money go?\" Black screen, a green block cursor types the caption letter by letter at a steady pace, done by 2.2 s, cursor blinks. Fixed baseline, text never jumps.\n2. 3-7 \"Someone posts a dare. $100.\" A dark feed post by @poster: \"Reply to my pinned post with your DOER CODE. $100 USDC if you do.\" A finger tap lands on it.\n3. 7-11 \"Reward locked in the contract\" Dare card: \"100 USDC\" with a padlock and the word LOCKED, a deadline timer counting down.\n4. 11-15 \"Doer gets 90% = $90\" Notification \"Proof accepted · no dispute in 24h\". The 100 counter splits: 90 in gold slides to a wallet marked @doer.\n5. 15-19 \"Fee: 10% of the reward = $10\" The remaining $10 as a stack, split into two halves of $5, each labelled 5%.\n6. 19-23 \"No stake: $10 to treasury\" Both $5 halves fly into an icon labelled TREASURY.\n7. 23-28 \"Lock YOLO 1-52 weeks\" A stake screen: a YOLO amount field, a slider from 1 to 52 weeks, the line \"power = amount × weeks / 52\".\n8. 28-33 \"Staked doer: +4% of reward = +$4\" Scene 4 again with a staked doer: the gold amount counts 90 to 94, \"+$4\" flashes.\n9. 33-38 \"Rest: $5.50 burn, $0.50 treasury\" The remaining $6 splits: $5.50 flies into a flame labelled BURN, $0.50 into TREASURY.\n10. 38-41 \"YOLO burns. Others go to buyback wallet.\" A fork: a YOLO coin goes to \"0x…dEaD\" with a flame; ETH, USDC and IMD coins go to a box labelled BUYBACK WALLET (no flame on that side).\n11. 41-45 \"Every prediction: 5% of it burns\" A prediction ticket \"100 YOLO\" splits into 90 / 5 / 5; one 5 burns, label \"5% burns at the outcome\".\n12. 45-48 \"Trophy: 7,777 YOLO burned\" A \"Mint trophy\" button is tapped, \"7,777 YOLO\" burns, a badge appears.\n13. 48-51 \"Launch tax and pool YOLO burn\" A line chart of the first hour: tax 30% flat to minute 30, then falling straight to 0% at minute 60. Under it: \"Tax + YOLO side of the 1% pool fee → treasury → burned\".\n14. 51-55 \"More dares. More fees. More burned.\" Three arrows turn in a circle labelled \"more dares\", \"more fees\", \"more burned\"; then the toad mark PNG and the wordmark, centred, held to the end.\n\nNUMBERS (base of every percent is the dare reward of $100): doer 90% = $90; fee 10% = $10, two halves of 5% = $5; no stake: $10 to treasury; staked doer bonus 4% = $4, doer $94; of the staker half $1 left: $0.50 burn, $0.50 treasury, plus the other $5 half burns, so $5.50 burn; prediction 100 YOLO: 90 / 5 / 5; trophy 7,777 YOLO; lock 1-52 weeks; launch tax 30% to 0% over the first hour; pool fee 1%. No other number may appear.\n\nFORBIDDEN: any token price, chart of a price, \"x100\", \"moon\", \"pump\", market cap or FDV, a $ price of YOLO, any prediction of returns; the words \"automatic\" or \"automatically\" for buybacks or burns; \"bought back\"; slow motion, frame interpolation, speed ramps, freeze frames longer than 1 s before 51 s; any synthetic camera shake, handheld wobble or film grain; empty scenes without a caption; any web address other than moneycanbuy.fun; any link in your files.\n\nDELIVER (all under artifacts/):\n- money-loop-9x16.mp4: the video.\n- contact-sheet.png: the decoded frame at the middle second of each of the 14 scenes, labelled with scene number and time.\n- captions.srt: the 14 captions with the scene times above.\n- README.md: tools used, how to rebuild offline with one command, and the self-check results below.\n- src/: the full source that rebuilds the video and the track.\n\nSELF-CHECK before you finish, write each result in README.md and fix anything that fails: ffprobe duration 55.000 s ±0.04, 1320 frames, 24 fps constant, 1080x1920, audio 55.0 s; decode the middle frame of every scene and confirm its caption is present and identical to the table (OCR or a text overlay log); every number on screen is in NUMBERS; the first frame of scene 2 is not black; no frame is identical to the previous one for more than 24 frames before 51 s; integrated loudness and true peak of the final AAC.","types":["media"],"audits":[],"paidBy":"0x3c587eff6c96eacf7e3dcc2cff6416161386e48c","release":null,"research":[],"versions":[],"contracts":[],"publishedAt":"2026-10-19T14:50:43.98+00:00"},{"id":"launch:ffd8f76a-484d-4366-b1d6-a3100b9766e4","code":[],"media":[],"sites":[],"title":"Audit and deploy the three AskSwarm contracts on Robinhood Chain (chainId 4663), unchanged if they pass review. Foundry project at the repo root. These exact contracts were each audited and deployed on Ethereum mainnet through earlier IMD launches (#2099 AskSwarmRegistry, #2190 SwarmMarket, #2189 SwarmWager); their adaptation notes are in contracts/ADAPTATION-2099.md, ADAPTATION-2190.md and ADAPTATION-2189.md. This launch puts the same system on Robinhood Chain.\n\nDeploy in this order, in one launch:\n1. AskSwarmRegistry (src/AskSwarmRegistry.sol), constructor (address intake, address imd, address signer) = (0xa43e6f75ee006411f79ac1c84120606c2330de82, 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, 0x5598aa9146215bc13eb26f2c692ad1461fd32982). Intake v2 and the oracle attester are the same on Robinhood Chain; 0x5f7b… is IMD on Robinhood Chain.\n2. SwarmMarket (src/SwarmMarket.sol), constructor (address registry, address imd, address treasury) = ($contract:AskSwarmRegistry, 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127, 0x571e17b13d8f6492bbc372a160520b20bfda320c). The treasury is AskSwarm's operating wallet, which pays for free asks.\n3. SwarmWager (src/SwarmWager.sol), constructor (address registry, address imd) = ($contract:AskSwarmRegistry, 0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127).\n\nWhat they do: the registry pays Intake v2 for an oracle.request with itself as callback, verifies the attester's EIP-712 signature under its own domain (chain id 4663, the registry's address), requires agreed >= quorum and a strict majority, and stores answers by questionHash. SwarmMarket runs parimutuel yes/no markets settled only from the registry's verified bool answers, 2% fee on the losing pool split creator/treasury, 1h resolve window, voids on any non-answer. SwarmWager runs 1v1 yes/no bets settled the same way. None has an owner, admin, upgrade path or ETH handling; constructors make no external calls; tests are in test/.\n\nPart of AskSwarm (github.com/ChromiaAgents/askswarm).","types":["contracts"],"audits":[],"paidBy":"0x571e17b13d8f6492bbc372a160520b20bfda320c","release":null,"research":[],"versions":[],"contracts":[{"id":"ffd8f76a-484d-4366-b1d6-a3100b9766e4","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":4663,"artifacts":[{"name":"AskSwarmRegistry","role":"other","txHash":"0xf3de97499688c53dffa1970fbd38a65d85413b985f91724f6332be3b4f291566","address":"0xf3a79f962ec1e75f0087af5491a69dee2a869012"},{"name":"SwarmMarket","role":"other","txHash":"0xf3de97499688c53dffa1970fbd38a65d85413b985f91724f6332be3b4f291566","address":"0x6c95a84944b05e7de5000caef80a7c487aa57cb8"},{"name":"SwarmWager","role":"other","txHash":"0xf3de97499688c53dffa1970fbd38a65d85413b985f91724f6332be3b4f291566","address":"0xd237dd7564edb7a026613ebb6da31da0292af96c"}],"createdAt":"2026-10-19T12:21:28.78+00:00","updatedAt":"2026-10-19T13:35:28.521+00:00","launchNumber":2223,"parkedReason":null,"sourceCommit":"712164b6f0121e093dfcd97b2925036becf6019b","sourceRepoUrl":"https://github.com/identity-md-launches/launch-2223-src-askswarmregistry-sol-src-swarmmarket"}],"publishedAt":"2026-10-19T12:21:28.78+00:00"},{"id":"launch:bdcd5d98-0793-4340-8227-4c7c3945c8bb","code":[],"media":[],"sites":[{"id":"900e3493-2b13-4b23-b64b-a223ec868f36","cid":"bafybeiegrxfbmxnclymygzwsgkojh5desnlymqrin5oc54y6eowo7km6ja","jobId":"73dcff34-bafb-42ad-b853-fc51e9e653a5","label":"swarmpeg","status":"named","txHash":"0x28afbd55eb5be9b7c6e287de02c131143f793b1575d015a954b7af89a0282bcc","ensName":"swarmpeg.site.identitymd.eth","failure":null,"namedAt":"2026-10-16T09:10:16.735+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1941-swarmpeg","pinnedAt":"2026-10-16T09:08:55.292+00:00","createdAt":"2026-10-16T09:08:38.313+00:00","previewHash":"e1d30165c0dc57d10b5272719e81fd1a8ff3cb1d6333fe6fdb0b424a1fc519bd","supersededBy":null}],"title":"Launch SwarmPeg as a univ4_hook on Ethereum mainnet, paired with IMD.\n\nToken\n- Name: SwarmPeg\n- Symbol: SWARMPEG\n- Supply: 1_000_000_000e18, fixed single mint\n- Allocation: 88% seeds the pool, 2% to requester, 10% to swarm\n- No owner, no mint after construction, no pause, no upgrade\n\nHook (SwarmPegHook)\n- afterSwap + return deltas for fee accounting\n- 2% fee on every buy and sell, taken in IMD\n- 100% of the fee goes to an ownerless maintenance pot that the hook deploys itself inside its constructor\n- Constructor arguments: only $poolManager, $token, and $factory — do not require or invent any external maintenancePot_ address\n- Unipeg-style integer balance model: whole tokens own unique fully on-chain animated SVG glyphs\n- Glyphs: abstract node-network style with CryptoPunk-inspired pixel agents\n- Fully on-chain animated SVG (CSS keyframes): pulsing nodes, drawing/fading connections, color breathing, status blinks\n- Higher pulse → denser networks, brighter palettes, faster animations\n- Seed from trade data + block + previous holder + swarm pulse\n- Pulse system that rises with trades and decays over time\n- Clean events and views for glyphs and pulse\n\nWrite the launch.json and deploy via the factory.\n\nToken name: SwarmPeg\nToken symbol: SWARMPEG","types":["contracts","sites"],"audits":[],"paidBy":"0x3d6a89c8751a45dd577a4c1f3b34e71c58236193","release":null,"research":[],"versions":[{"site":null,"jobId":"2ebd5179-1bec-4e29-8c7a-53b41eeb3088","state":"completed","commit":"37f3cb86444d8acde5b6914cf8597eb365f289d7","repoUrl":"https://github.com/identity-md-launches/launch-1941-swarmpeg","createdAt":"2026-10-16T06:54:07.452248+00:00","objective":"Launch SwarmPeg as a univ4_hook on Ethereum mainnet, paired with IMD.\n\nToken\n- Name: SwarmPeg\n- Symbol: SWARMPEG\n- Supply: 1_000_000_000e18, fixed single mint\n- Allocation: 88% seeds the pool, 2% to requester, 10% to swarm\n- No owner, no mint after construction, no pause, no upgrade\n\nHook (SwarmPegHook)\n- afterSwap + return deltas for fee accounting\n- 2% fee on every buy and sell, taken in IMD\n- 100% of the fee goes to an ownerless maintenance pot that the hook deploys itself inside its constructor\n- Constructor arguments: only $poolManager, $token, and $factory — do not require or invent any external maintenancePot_ address\n- Unipeg-style integer balance model: whole tokens own unique fully on-chain animated SVG glyphs\n- Glyphs: abstract node-network style with CryptoPunk-inspired pixel agents\n- Fully on-chain animated SVG (CSS keyframes): pulsing nodes, drawing/fading connections, color breathing, status blinks\n- Higher pulse → denser networks, brighter palettes, faster animations\n- Seed from trade data + block + previous holder + swarm pulse\n- Pulse system that rises with trades and decays over time\n- Clean events and views for glyphs and pulse\n\nWrite the launch.json and deploy via the factory.\n\nToken name: SwarmPeg\nToken symbol: SWARMPEG","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","workflowId":null,"deliveredAt":"2026-10-16T08:15:41.888+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1941-swarmpeg/pull/1"},{"site":{"cid":"bafybeiegrxfbmxnclymygzwsgkojh5desnlymqrin5oc54y6eowo7km6ja","status":"named","ensName":"swarmpeg.site.identitymd.eth"},"jobId":"73dcff34-bafb-42ad-b853-fc51e9e653a5","state":"completed","commit":"eaafd8e3b0f9191cab32f997e98d48a8210601f9","repoUrl":"https://github.com/identity-md-launches/launch-1941-swarmpeg","createdAt":"2026-10-16T08:38:10.411002+00:00","objective":"Build the public website for SwarmPeg (SWARMPEG).\n\nDeployed contracts (Ethereum mainnet):\n- Token: 0x04d3acf2ddfa87418ba1b2ab99a1301f33135065\n- Hook: 0x1550a30c40f33ff64b68b7ec2ba552eca47ca0cc\n- Pool: Uniswap v4 SWARMPEG/IMD (https://app.uniswap.org/explore/tokens/ethereum/0x04d3acf2ddfa87418ba1b2ab99a1301f33135065)\n- Repo: https://github.com/identity-md-launches/launch-1941-swarmpeg\n\nRequired pages / sections:\n1. Home / Hero\n   - Live animated on-chain glyph (call hook.glyphSVG or hook.glyphURI)\n   - Token name, symbol, short description\n   - Current swarm pulse (hook.currentPulse())\n\n2. My Glyphs (connected wallet)\n   - Show the user’s integer balance (floor(balanceOf / 1e18))\n   - Render each owned glyph by ID\n   - Update live when balance changes\n\n3. Swap\n   - Buy/sell SWARMPEG against IMD via the Uniswap v4 pool\n   - Slippage controls, clear amounts, transaction status\n\n4. Gallery / Explorer\n   - Browse recent or notable glyphs\n   - Optional simple activity feed from events\n\n5. Pulse Visualizer\n   - Display currentPulse() (0–1000)\n   - Show how higher pulse affects density, brightness, and animation speed\n\n6. How it works\n   - Explain the integer-balance model: fractional tokens trade normally, whole units own unique animated on-chain objects\n   - Mention the 2% IMD fee that goes to the ownerless maintenance pot\n\nDesign & technical requirements:\n- Clean, modern, responsive (mobile + desktop)\n- All art read directly from the contracts (no IPFS)\n- Single non-conflicting wallet connection (wagmi/viem or equivalent + WalletConnect + injected providers). No competing modals or stuck “connecting…” states\n- Works on Ethereum mainnet with the addresses above\n- Lightweight and fast\n- Include links to the contracts, Uniswap pool, and GitHub repo\n\nUse the real deployed contracts. The hook provides glyphSVG, glyphURI, currentPulse, glyphTraits, and maintenancePot views.","baseCommit":"37f3cb86444d8acde5b6914cf8597eb365f289d7","workflowId":null,"deliveredAt":"2026-10-16T09:08:48.488+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1941-swarmpeg/pull/2"}],"contracts":[{"id":"bdcd5d98-0793-4340-8227-4c7c3945c8bb","kind":"univ4_hook","token":{"logo":"21617f50a34be2eb4532d7787226bd896e16719efa5f2402689ee2f496a1cf54","name":"SwarmPeg","symbol":"SWARMPEG"},"seeded":{"pools":[{"fee":12500,"hooks":"0x1550a30c40f33ff64b68b7ec2ba552eca47ca0cc","currency0":"0x04d3acf2ddfa87418ba1b2ab99a1301f33135065","currency1":"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7","tickSpacing":60}],"launched":[{"hook":"0x1550a30c40f33ff64b68b7ec2ba552eca47ca0cc","token":"0x04d3acf2ddfa87418ba1b2ab99a1301f33135065","factory":"0x12c63b581d07093f6126bc02263c58f7eadaa96f","distributor":"0xbc018a898be26dd0339d915c5e1666c990db6567","launchNumber":1941}],"positions":[{"factory":"0x12c63b581d07093f6126bc02263c58f7eadaa96f","tickLower":-128940,"tickUpper":887220,"launchNumber":1941}]},"status":"live","chainId":1,"artifacts":[{"name":"MerkleDistributor","role":"distributor","txHash":"0xa8a1f368b08435cc97311ddb0f04f07198f1f4da5ec9994435e02e859cbd6376","address":"0xbc018a898be26dd0339d915c5e1666c990db6567"},{"name":"SwarmPeg","role":"token","txHash":"0xa8a1f368b08435cc97311ddb0f04f07198f1f4da5ec9994435e02e859cbd6376","address":"0x04d3acf2ddfa87418ba1b2ab99a1301f33135065"},{"name":"SwarmPegHook","role":"hook","txHash":"0xa8a1f368b08435cc97311ddb0f04f07198f1f4da5ec9994435e02e859cbd6376","address":"0x1550a30c40f33ff64b68b7ec2ba552eca47ca0cc"}],"createdAt":"2026-10-16T08:15:41.888+00:00","updatedAt":"2026-10-16T08:18:14.3+00:00","launchNumber":1941,"parkedReason":null,"sourceCommit":"37f3cb86444d8acde5b6914cf8597eb365f289d7","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1941-swarmpeg"}],"publishedAt":"2026-10-16T09:10:16.735+00:00"},{"id":"job:e30bc484-4748-4fad-9751-a0babb61a8b1","code":[],"media":[],"sites":[{"id":"9300d713-92d9-4d5d-bd1e-70b189e7a5c0","cid":"bafybeia4acppfzy6t6m7tkxufmxn2ndsqtbhgahoekzby6m4iaslmtp55u","jobId":"2f84393e-9879-41ba-bcf0-1da1ae29686d","label":"blackout-mine-the-city-pray-the","status":"named","txHash":"0x51084295d8d01d5b26602cd0678d4c32ef1d59f1bb43c2bba3c2cf7dd9b20e92","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-15T15:24:37.506+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-15T15:24:17.654+00:00","createdAt":"2026-10-15T15:23:52.13+00:00","previewHash":"d332308e5b5b2758e6d00e55280d8b14325595652cbfb9c41d3719073660cebc","supersededBy":null},{"id":"096102d7-d5c0-4e0b-876d-b0b3e784f6b8","cid":"bafybeietdtznvv7wjpxs5mbhfxutjqxcnjrdrfx54j25jhs4xe7lvsu2xy","jobId":"424cf08d-e9a0-453f-8a4a-ce3c92b21ee8","label":null,"status":"named","txHash":"0x0e25ed00ffcae3ffb034d5512038f7179174af10aee2b9e3a5a96ae8e78715bd","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-15T14:01:01.833+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-15T14:00:11.38+00:00","createdAt":"2026-10-15T13:59:59.098+00:00","previewHash":null,"supersededBy":"9300d713-92d9-4d5d-bd1e-70b189e7a5c0"},{"id":"95b69c2c-ae09-4af5-a740-b933f0302c73","cid":"bafybeiheda3xnv2ecougwum6oo724khlwlwgktdmmn2o2rsvdsponglzli","jobId":"3e803ec6-bef3-43dd-8b69-ff95d798ed83","label":null,"status":"named","txHash":"0xe553fe739f30a0367dd70d71d01dd6c96a90bc281b0f7648040e61f2791edb5f","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-15T11:17:24.923+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-15T11:11:35.043+00:00","createdAt":"2026-10-15T11:11:20.179+00:00","previewHash":null,"supersededBy":"096102d7-d5c0-4e0b-876d-b0b3e784f6b8"},{"id":"8334ea35-9c01-45e0-9042-bca8ffcabc94","cid":"bafybeic2nuxucx2zsxvbe2idc7pr2e7zbeyc44ii252cjbrzcfpyqvrnv4","jobId":"8b85abbc-2c51-4905-be40-8aaaa10ffde2","label":null,"status":"named","txHash":"0xf8b036bc2a78bafd1b304d8fbcea435ff4b005218e2ebb5fb1aaaddcee1607eb","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-15T08:07:27.016+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-15T08:06:37.935+00:00","createdAt":"2026-10-15T08:06:31.304+00:00","previewHash":null,"supersededBy":"95b69c2c-ae09-4af5-a740-b933f0302c73"},{"id":"02d368aa-37d2-4c26-928c-18da7cb13bc2","cid":"bafybeig4q26yod57k3z2yxfkbmwjlafxbyk7sgtmyqfxazq5ezifguiccu","jobId":"afe4bf4f-7218-482e-8e08-969fd3121a08","label":null,"status":"named","txHash":"0xc63bf8d5e0d73d79b7348aa482291ee632f46e52ef5e688ca4f476887ee8f475","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-14T18:26:13.213+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-14T18:23:57.039+00:00","createdAt":"2026-10-14T18:23:35.797+00:00","previewHash":null,"supersededBy":"8334ea35-9c01-45e0-9042-bca8ffcabc94"},{"id":"afd5fc47-6e3c-40b5-b939-5f1a0627a574","cid":"bafybeiahwisawgrr36dklhbas72k7ullx4loqv4sfamybcnywgi7oph32q","jobId":"b342a6e4-34f7-41df-bf9e-324f982ae443","label":null,"status":"named","txHash":"0x966159cd7d14e089dc6ddb4bde0e937c796cc6fa305b1983400ca1c57e33d324","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-14T15:23:01.692+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-14T15:10:41.317+00:00","createdAt":"2026-10-14T15:10:13.147+00:00","previewHash":null,"supersededBy":"02d368aa-37d2-4c26-928c-18da7cb13bc2"},{"id":"51ad3cfb-d118-48e2-bf78-6aaf4ec6b378","cid":"bafybeihtlqfdhbht2e2olpvc4boehst3twt4bu27p7ttk6hhbkvrsydxx4","jobId":"da5e3246-1720-46e1-b126-50cba8fdf7af","label":null,"status":"named","txHash":"0xdeeb4bc13a9198e72af54621cc239bcc504511efceb181131e1b62591d233fc3","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-14T13:24:38.316+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-14T13:23:03.609+00:00","createdAt":"2026-10-14T13:22:58.613+00:00","previewHash":null,"supersededBy":"afd5fc47-6e3c-40b5-b939-5f1a0627a574"},{"id":"83c97242-110c-43f8-8fc2-c10907b8bc51","cid":"bafybeiadxqhcfrsl4xwnvb2sdbeujlewyozdvh6iii5tjiwmj7minfpsby","jobId":"64605c27-0dd2-466e-be98-0ecb895a4622","label":null,"status":"named","txHash":"0xd5231f15177f90306915d5113ec5735dcd678e0aebba34ac5570ad95e2e86161","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-11T17:10:04.976+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-11T17:09:44.727+00:00","createdAt":"2026-10-11T17:09:23.607+00:00","previewHash":null,"supersededBy":"51ad3cfb-d118-48e2-bf78-6aaf4ec6b378"},{"id":"82600d93-b705-4154-829d-9963e15dfa0c","cid":"bafybeiexesicfmp4iw6zog6yfviig3lodsyjrha2am2s5jf3pwt4qi5lqy","jobId":"97804103-4043-4c4c-882b-68f2bfa657b4","label":null,"status":"named","txHash":"0xad8da88a5a53adaba367199814851898f132b85bfdf08c020a98c800f4dba4bf","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-11T12:16:02.93+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-11T12:15:28.159+00:00","createdAt":"2026-10-11T12:15:14.224+00:00","previewHash":null,"supersededBy":"83c97242-110c-43f8-8fc2-c10907b8bc51"},{"id":"21523cd9-a70c-4c35-96a9-189c65f5762f","cid":"bafybeifvzbwfdzatfwrhybrjfa5qfnnvrpj74fqip3hoasmw6bzdnxx4ue","jobId":"04dcfabf-fb44-4886-a470-80e15f46efd5","label":null,"status":"named","txHash":"0x96cc8eb52e17347e907c44800f7f7e00bdea09c48271c5462b7e7711ee3d68f8","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-11T10:59:27.662+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-11T10:59:16.06+00:00","createdAt":"2026-10-11T10:58:59.973+00:00","previewHash":null,"supersededBy":"82600d93-b705-4154-829d-9963e15dfa0c"},{"id":"226c60d8-7236-42f4-a1df-077756f83741","cid":"bafybeibk3ndymeqog55pa3pxrulkn4xubneuxd4aohllwquz2e7yxz6m6u","jobId":"9759766f-2985-4598-a301-d5bab4089b56","label":null,"status":"named","txHash":"0xf0c9f3f959f53f4548980cffd07b2a78ff8202bc436469558689edcf599b7f4a","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-11T09:18:51.418+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-11T09:17:27.932+00:00","createdAt":"2026-10-11T09:17:14.591+00:00","previewHash":null,"supersededBy":"21523cd9-a70c-4c35-96a9-189c65f5762f"},{"id":"e19e2c0f-28b2-4b21-9183-f002b4ca3e0c","cid":"bafybeidwidwoyfuxm5twzzjlhtbyxfstn4uewfkdoqdreqaudx4m4h2boa","jobId":"5097a8f8-f3a8-47b3-9f24-7133d4e88279","label":null,"status":"named","txHash":"0x83b8311d70859d1e1954b1efa41d0d55ef6f16e8fc27390bf68c8a25d1210ea0","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-11T08:37:15.891+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-11T08:35:22.202+00:00","createdAt":"2026-10-11T08:34:54.474+00:00","previewHash":null,"supersededBy":"226c60d8-7236-42f4-a1df-077756f83741"},{"id":"3bd8a2a0-3d9b-4d6e-8b44-e093e01ec107","cid":"bafybeie5aottr6hn2is3u5sawhjucvrlqgdh45dwp45moififfg4zxixcm","jobId":"e30bc484-4748-4fad-9751-a0babb61a8b1","label":null,"status":"named","txHash":"0x3e7268744c63e120d5b076f1a2b7d986be463546f195c3d21b44f63dc641242b","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth","failure":null,"namedAt":"2026-10-10T20:00:26.998+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","pinnedAt":"2026-10-10T19:55:25.481+00:00","createdAt":"2026-10-10T19:55:08.153+00:00","previewHash":null,"supersededBy":"e19e2c0f-28b2-4b21-9183-f002b4ca3e0c"}],"title":"Build the pre-launch website for BLACKOUT (X: https://x.com/IMDBlackout), an upcoming pixel-art idle mining-farm game on Robinhood Chain where the IMD swarm runs the city power grid. Contracts are NOT deployed yet: build a fully playable DEMO MODE with no wallet and no real money, architected so on-chain contracts can be plugged in later without redesign. Publish to the site label \"blackout\".\n\nVISUAL STYLE (match our X profile art exactly)\nDetailed 16-bit pixel art, cyberpunk night city seen from a rooftop. Deep navy-to-purple sky with small stars and subtle horizontal CRT scanlines. Palette: neon cyan (#39E6FF) as the main glow, electric yellow (#FFE600) for lightning and highlights, hot magenta (#FF3DF2) for accents and outlines, near-black navy (#030C39 / #05060F) for backgrounds. The left side of the city is alive: tall buildings with glowing cyan and yellow windows, racks of GPUs visible through windows, neon signs (CRYPTO, MINING, GPU, PACK), rooftop pipes and AC units. The right side is in blackout: dark silhouettes, a yellow lightning bolt striking a sparking power substation, sagging power lines between poles. In the middle stands a dark control tower with a single glowing red eye: this is the swarm, the grid operator, always watching. The logo is the word BLACKOUT in a bold blocky pixel font, cyan neon with a soft glow and a dark outline, one letter occasionally flickering. The icon/mascot is a black graphics card with two fans and cyan LEDs, struck through the center by a big yellow lightning bolt with a magenta outline and small sparks. Draw all sprites in code (pixel grids to canvas or SVG) in this style and put every sprite behind a single sprite registry so hand-made art in /assets can replace any sprite later by file name. Crisp scaling (image-rendering: pixelated), scanline overlay toggle, pixel heading font (e.g. Press Start 2P) and a readable mono or pixel body font. Phone first, keyboard accessible, respects prefers-reduced-motion. Sound effects optional, off by default, with mute toggle.\n\nPAGES / SECTIONS\n1. Hero: the rooftop city scene above, animated (blinking windows, spinning fans, the tower eye scanning, an occasional lightning strike that knocks a block of windows dark). BLACKOUT logo, tagline \"Mine the city. Pray the grid stays on.\", buttons \"Open a demo pack\" and \"Follow on X\" linking to https://x.com/IMDBlackout.\n2. Pack opening (the star feature): click or tap a pack sprite; shake, burst and a 3-card reveal; each card flips to show item type (GPU, Cooling, Power Supply, Room) and rarity (Common, Rare, Epic, Legendary) with rarity colors, glow and particles that scale with rarity; Legendary gets a full-screen moment with a lightning flash. Demo odds: rarity 70/22/7/1; type GPU 60, Cooling 20, PSU 12, Room 8. Items go to a demo inventory. Mark the pack clearly as DEMO.\n3. Your farm: a pixel room with GPU slots, one cooling slot and one PSU slot; drag or tap items into slots. GPU hashrate by rarity: Common 10, Rare 28, Epic 80, Legendary 250. Cooling boosts the room (2/5/10/20%), PSU adds slots, a Room item unlocks a second room. Animated fans and blinking LEDs, a live demo hashrate counter and a demo token counter labeled DEMO (no real value). Durability bars that slowly fall with a Repair button, an electricity meter, and an Overclock button with levels, all spending demo tokens.\n4. City map and the swarm grid: 8 districts, your farm sits in one. Every 45 seconds in demo a grid event fires: bonus surge, heat wave (farms without Rare+ cooling slow down), blackout (a district goes dark with an animation), tax audit, or calm. Each event shows a \"Dispatcher letter\" from the swarm in a terminal panel, written in a dry grid-operator voice, with a log of past letters. A \"Lobby the grid\" demo button marks your district as lobbied for the next event, with the honest note that lobbying lowers odds but guarantees nothing.\n5. How it works: short pixel-illustrated steps: open packs, build your farm, mine, pay electricity and repairs, survive the swarm's grid events, upgrade or merge. Explain that the IMD swarm is the grid operator: it chooses the event type and a future block hash chooses the district, so neither the swarm nor players can target anyone. Upgrades, electricity and repairs burn the token.\n6. Extras teaser: free starter pack for IMD NFT holders (at launch), invite friends and earn a share of their mining (at launch), weekly swarm inspection where the best farm gets a bonus.\n7. Launch panel: \"Coming soon on Robinhood Chain\", countdown from a launch date in config (\"Date TBA\" when empty), X link https://x.com/IMDBlackout.\n8. Footer: X link, and a risk note in this spirit: this is a game, not an investment; rewards will depend on new players and trading volume; early players earn more; only spend what you would spend on a game. Do NOT show any APY, payback days, prices or earnings estimates anywhere.\n\nARCHITECTURE (for the later contract upgrade)\nTypeScript + Vite, static build in dist/. A single GameAdapter interface (openPack, reveal, getFarm, place, unplace, claim, repair, overclock, merge, lobby, getGridEvents, getLetters) with one implementation now: DemoAdapter (seeded RNG, state in localStorage, reset button). A ChainAdapter for Robinhood Chain (chain id 4663) will be added later without touching UI code. config.ts holds launch date, X link, chain id and empty contract address fields. No backend, no wallet, no trackers. Also render og.png 1200x630 (logo, tagline, \"Coming soon on Robinhood Chain\") for link previews.\n\nTESTS\nVitest: demo odds within tolerance over 100k rolls, hashrate math, cooling and slot rules, event scheduler, adapter persistence. Playwright smoke test: open a pack, place a GPU, see hashrate change, see a grid event letter. Rebuild dist/, commit, publish to \"blackout\", report what you verified.","types":["sites"],"audits":[],"paidBy":"0x6d51cbe774aeae4dd40bca2560e9bc2695a0d007","release":null,"research":[],"versions":[{"site":{"cid":"bafybeie5aottr6hn2is3u5sawhjucvrlqgdh45dwp45moififfg4zxixcm","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"e30bc484-4748-4fad-9751-a0babb61a8b1","state":"completed","commit":"6ca1d6054b2a5d914c964ef97a37245e3e8d2441","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-10T18:24:42.039835+00:00","objective":"Build the pre-launch website for BLACKOUT (X: https://x.com/IMDBlackout), an upcoming pixel-art idle mining-farm game on Robinhood Chain where the IMD swarm runs the city power grid. Contracts are NOT deployed yet: build a fully playable DEMO MODE with no wallet and no real money, architected so on-chain contracts can be plugged in later without redesign. Publish to the site label \"blackout\".\n\nVISUAL STYLE (match our X profile art exactly)\nDetailed 16-bit pixel art, cyberpunk night city seen from a rooftop. Deep navy-to-purple sky with small stars and subtle horizontal CRT scanlines. Palette: neon cyan (#39E6FF) as the main glow, electric yellow (#FFE600) for lightning and highlights, hot magenta (#FF3DF2) for accents and outlines, near-black navy (#030C39 / #05060F) for backgrounds. The left side of the city is alive: tall buildings with glowing cyan and yellow windows, racks of GPUs visible through windows, neon signs (CRYPTO, MINING, GPU, PACK), rooftop pipes and AC units. The right side is in blackout: dark silhouettes, a yellow lightning bolt striking a sparking power substation, sagging power lines between poles. In the middle stands a dark control tower with a single glowing red eye: this is the swarm, the grid operator, always watching. The logo is the word BLACKOUT in a bold blocky pixel font, cyan neon with a soft glow and a dark outline, one letter occasionally flickering. The icon/mascot is a black graphics card with two fans and cyan LEDs, struck through the center by a big yellow lightning bolt with a magenta outline and small sparks. Draw all sprites in code (pixel grids to canvas or SVG) in this style and put every sprite behind a single sprite registry so hand-made art in /assets can replace any sprite later by file name. Crisp scaling (image-rendering: pixelated), scanline overlay toggle, pixel heading font (e.g. Press Start 2P) and a readable mono or pixel body font. Phone first, keyboard accessible, respects prefers-reduced-motion. Sound effects optional, off by default, with mute toggle.\n\nPAGES / SECTIONS\n1. Hero: the rooftop city scene above, animated (blinking windows, spinning fans, the tower eye scanning, an occasional lightning strike that knocks a block of windows dark). BLACKOUT logo, tagline \"Mine the city. Pray the grid stays on.\", buttons \"Open a demo pack\" and \"Follow on X\" linking to https://x.com/IMDBlackout.\n2. Pack opening (the star feature): click or tap a pack sprite; shake, burst and a 3-card reveal; each card flips to show item type (GPU, Cooling, Power Supply, Room) and rarity (Common, Rare, Epic, Legendary) with rarity colors, glow and particles that scale with rarity; Legendary gets a full-screen moment with a lightning flash. Demo odds: rarity 70/22/7/1; type GPU 60, Cooling 20, PSU 12, Room 8. Items go to a demo inventory. Mark the pack clearly as DEMO.\n3. Your farm: a pixel room with GPU slots, one cooling slot and one PSU slot; drag or tap items into slots. GPU hashrate by rarity: Common 10, Rare 28, Epic 80, Legendary 250. Cooling boosts the room (2/5/10/20%), PSU adds slots, a Room item unlocks a second room. Animated fans and blinking LEDs, a live demo hashrate counter and a demo token counter labeled DEMO (no real value). Durability bars that slowly fall with a Repair button, an electricity meter, and an Overclock button with levels, all spending demo tokens.\n4. City map and the swarm grid: 8 districts, your farm sits in one. Every 45 seconds in demo a grid event fires: bonus surge, heat wave (farms without Rare+ cooling slow down), blackout (a district goes dark with an animation), tax audit, or calm. Each event shows a \"Dispatcher letter\" from the swarm in a terminal panel, written in a dry grid-operator voice, with a log of past letters. A \"Lobby the grid\" demo button marks your district as lobbied for the next event, with the honest note that lobbying lowers odds but guarantees nothing.\n5. How it works: short pixel-illustrated steps: open packs, build your farm, mine, pay electricity and repairs, survive the swarm's grid events, upgrade or merge. Explain that the IMD swarm is the grid operator: it chooses the event type and a future block hash chooses the district, so neither the swarm nor players can target anyone. Upgrades, electricity and repairs burn the token.\n6. Extras teaser: free starter pack for IMD NFT holders (at launch), invite friends and earn a share of their mining (at launch), weekly swarm inspection where the best farm gets a bonus.\n7. Launch panel: \"Coming soon on Robinhood Chain\", countdown from a launch date in config (\"Date TBA\" when empty), X link https://x.com/IMDBlackout.\n8. Footer: X link, and a risk note in this spirit: this is a game, not an investment; rewards will depend on new players and trading volume; early players earn more; only spend what you would spend on a game. Do NOT show any APY, payback days, prices or earnings estimates anywhere.\n\nARCHITECTURE (for the later contract upgrade)\nTypeScript + Vite, static build in dist/. A single GameAdapter interface (openPack, reveal, getFarm, place, unplace, claim, repair, overclock, merge, lobby, getGridEvents, getLetters) with one implementation now: DemoAdapter (seeded RNG, state in localStorage, reset button). A ChainAdapter for Robinhood Chain (chain id 4663) will be added later without touching UI code. config.ts holds launch date, X link, chain id and empty contract address fields. No backend, no wallet, no trackers. Also render og.png 1200x630 (logo, tagline, \"Coming soon on Robinhood Chain\") for link previews.\n\nTESTS\nVitest: demo odds within tolerance over 100k rolls, hashrate math, cooling and slot rules, event scheduler, adapter persistence. Playwright smoke test: open a pack, place a GPU, see hashrate change, see a grid event letter. Rebuild dist/, commit, publish to \"blackout\", report what you verified.","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","workflowId":null,"deliveredAt":"2026-10-10T19:55:18.586+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/1"},{"site":null,"jobId":"c2fd0306-6370-4204-a3e8-1d88b666ac2d","state":"blocked","commit":null,"repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-10T20:07:57.52856+00:00","objective":"Update the BLACKOUT demo site (previous site job e30bc484, keep its pixel style, palette, DEMO mode, no wallet, ChainAdapter architecture). Publish to the site label \"blackout\" exactly (blackout.sites.imd.fun). Do not use an auto-generated label.\n\n1. STRUCTURE: split the one long page into separate pages. Must work as static hosting with no server rewrites (separate index.html files or hash routing). Demo state shared across pages via localStorage.\n- Landing (/): short. Hero city art, title, tagline \"Mine the city. Pray the grid stays on.\", 3 short lines on how it works, big \"START GAME\" button, Follow on X (https://x.com/IMDBlackout). No game UI on this page.\n- Farm (/farm): opens after START GAME. The player's farm is the main screen: rooms with slots, live hashrate, token balance, mined/unclaimed, claim, electricity meter, repair, overclock, merge, inventory, active set bonuses, district status, next grid event timer, dispatcher letters in a side panel.\n- Open Packs (/packs): pack opening with a juicier animation (shake, seal break, light burst, cards flip one by one, rarity glow: cyan Rare, magenta Epic, yellow Legendary with screen flash), odds, what is inside a pack, set bonus guide.\n- Top nav on game pages: FARM | OPEN PACKS, plus a small link back to the landing. Mobile friendly.\n\n2. ITEMS: 6 hardware types: GPU, ASIC, Power Supply, Cooling, Motherboard, Router. Rarity Common/Rare/Epic/Legendary. Each type has its own pixel sprite per rarity.\n- Every item mines on its own (GPU and ASIC highest, others lower but with effects). A farm works with just 1 item.\n- Room = 6 slots, one per type. Room 02 unlocks with a Room key.\n\n3. SET BONUSES (show which are active and which are missing on the farm page):\n- Full Rig: all 6 types in one room: +25% hashrate.\n- Compute Duo: GPU + ASIC: +10% hashrate.\n- Cold Power: Power Supply + Cooling: -15% electricity cost.\n- Backbone: Motherboard + Router: -25% blackout damage.\n- Rarity set: 3+ items of the same rarity in a room: +5% Rare, +10% Epic, +20% Legendary.\n- Total set bonus capped at +40%. All values from one config object (later read from the Params contract).\n\n4. Keep the city grid (8 districts, grid events, dispatcher letters) on the farm page, compact. Remove long explanatory sections from the game pages; put \"How it works\" as a short page or modal linked from the landing.\n\nDeliver: published site at blackout.sites.imd.fun, repo, short changelog.","baseCommit":"6ca1d6054b2a5d914c964ef97a37245e3e8d2441","workflowId":null,"deliveredAt":null,"pullRequestUrl":null},{"site":{"cid":"bafybeidwidwoyfuxm5twzzjlhtbyxfstn4uewfkdoqdreqaudx4m4h2boa","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"5097a8f8-f3a8-47b3-9f24-7133d4e88279","state":"completed","commit":"c46f8226afa80335331ab755a9bcf348eb5a1b4b","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-11T07:10:20.93892+00:00","objective":"Update the BLACKOUT pre-launch site (previous site jobs e30bc484 and c2fd0306; keep the pixel style, palette, DEMO mode with no wallet, ChainAdapter architecture). Goal: people discover the game, play the demo and read the docs before launch. Publish with label \"blackout\" if available; if member site names are closed, publish with the auto label and do not block. X: https://x.com/IMDBlackout\n\nSTRUCTURE (static, no server rewrites, state shared via localStorage)\n- Landing (/): hero city art, tagline \"Open packs. Mine the city. Pray the grid stays on.\", 3 short lines, buttons PLAY DEMO, READ DOCS, FOLLOW ON X, and a \"Launching soon on Robinhood Chain\" badge. No dates.\n- Farm (/farm): main demo screen. Rooms (6 slots each), inventory (15 slots), balance, claim, withdraw (with tax preview), electricity, repair, overclock, merge, scrap, active combos, account level and XP, epoch timer, district status, current event, dispatcher letters panel.\n- Open Packs (/packs): juicy opening animation (shake, seal break, light burst, cards flip one by one, rarity glow: cyan Rare, magenta Epic, yellow Legendary, red Mythic with screen flash), live dynamic price, odds, combo guide.\n- Docs (/docs): player guide, see DOCS below.\n- Nav on all inner pages: FARM | OPEN PACKS | DOCS.\n\nGAME MODEL (all numbers in one config object, later read from the Params contract; label them \"beta values, may change\")\n- Epoch = 6h (demo: 45 seconds). Mining, events and claims update every epoch.\n- Packs: 3 items, dynamic price 0.010 ETH start, 0.006 floor, 0.03 ceiling, rises with demand, decays when quiet. Token packs priced in tokens at 10% discount. No quantity limits.\n- Rarity: Common 70%, Rare 22%, Epic 6.7%, Legendary 1%, Mythic 0.3% (Mythic drops only from level 10). Hash 10/28/80/250/800.\n- 12 soulbound items with tags: GPU, ASIC, FPGA (compute, full hash); Power Supply, Battery, Solar Panel (power); Fan, Liquid Cooling (cooling); Router (network); Motherboard, Server Rack, Surge Protector (infra). Non-compute items mine at 60%. Each type gets its own pixel sprite per rarity.\n- Room = 6 slots, any items, no duplicate type. Combos (cap +40% hash per room): Compute Duo GPU+ASIC +10%; Triple Core GPU+ASIC+FPGA +20%; Full Stack all 5 tags +15%; Airflow Fan+Server Rack +5% and fire halved; Cold Power PSU+Liquid Cooling electricity -15% and fire immune; Off-grid Solar+Battery electricity -20% and outage loses 50% not 100%; Clean Power Surge Protector+PSU surge immune; Locked Rack Router+Server Rack cable theft immune; rarity set 3+ same rarity +5/10/20/30%. Show active and missing combos with hints.\n- Inventory 15 slots; full inventory blocks opening packs; scrap (tiny value), merge 3 into next rarity, expand +5 slots for tokens.\n- Rooms: room 1 at start, room 2 after 3 days, room 3 at level 7, room 4 at level 10.\n- Levels: XP from active epochs, packs, in-game spend. Equip gates: Epic level 3, Legendary level 5, Mythic level 10. Locked items show a lock and the level needed.\n- Durability -0.5 per epoch, repair with tokens. Electricity tariff 15%. Withdraw tax 20% falling to 5% over 7 days; in-game spend has no tax and +5% bonus.\n- City: 8 districts. Events each epoch: Outage, Power surge (item can burn), Server fire, Cable theft, Tax audit, Green wave (+10%), Cheap tariff (-50% electricity), Calm. Supply drop when pack sales spike. Lobby your district to lower bad-event odds. Each event shows a dispatcher letter in grid-operator voice and which combo would have protected you.\n- Weekly season: best district gets free packs, lottery for 3 farms, best farm prize. Season countdown and district leaderboard.\n- Referral link and dashboard (5% of invitees' mining). Identity MD NFT holders: 1 free starter pack.\n\nDOCS (/docs, also docs.md in the repo)\nPlain English, short sections with tables: What is BLACKOUT; How to start; Packs and prices; Items and rarity; Rooms and combos; Inventory; Levels; Mining, balance, withdraw tax; Farm costs; The city and swarm events (with protections); How the swarm runs the grid (6h epochs, anyone can trigger the next epoch for a small reward, fallback if the swarm is silent, swarm acts only within hard limits); Lobbying; Weekly season; Referrals; NFT holder pack; Token and launch (IMD launch on Robinhood Chain, 10% to IMD swarm contributors, part of supply seeds the game reward pool, exact split announced at launch); Where the money goes (packs 85% reward pool / 13% team / 2% swarm heartbeat; no team tokens; all in-game token spends go back to the reward pool, no burns); Who controls what (no owner, no upgrades, swarm only within bounds); Risks (rewards depend on new players and volume, early players earn more, not financial advice). Mark numbers as beta. Never promise returns.\n\nDeliver: published site, repo, short changelog.","baseCommit":"6ca1d6054b2a5d914c964ef97a37245e3e8d2441","workflowId":null,"deliveredAt":"2026-10-11T08:35:13.171+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/2"},{"site":{"cid":"bafybeibk3ndymeqog55pa3pxrulkn4xubneuxd4aohllwquz2e7yxz6m6u","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"9759766f-2985-4598-a301-d5bab4089b56","state":"completed","commit":"edb681317d282d4f9cbd0d81899d10b15e1565ab","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-11T08:39:40.331967+00:00","objective":"Fix the BLACKOUT pre-launch site from job 5097a8f8 (same repo and site, keep everything else unchanged). Publish with label \"blackout\" if available; otherwise keep the current auto label and do not block.\n\nFix these mismatches with the game design, in the demo logic, the config object and the docs:\n1. Token and launch: replace \"IMD is planned to launch on Robinhood Chain\" with: the BLACKOUT game token will launch through IMD on Robinhood Chain; 10% of supply goes to IMD swarm contributor agents; part of supply seeds the game reward pool; exact split announced at launch.\n2. Tax audit: only the top 10% of farms by hashrate are audited, and they give 10% of that epoch's mining to the reward pool. It never takes from player balances.\n3. Rarity set (3+ items of the same rarity in a room): Rare +5%, Epic +10%, Legendary +20%, Mythic +30%. Common gives no set bonus. Only the strongest set applies.\n4. Triple Core (GPU + ASIC + FPGA, +20%) replaces Compute Duo (+10%); they never stack.\n5. Overclock: +10% hash per level, up to 5 levels, cost rises each level, extra wear and power use shown before confirming.\n6. Electricity: remove the separate electricity reserve and refill. Electricity is only the tariff (15% of mining output, withheld each epoch); combos and events change the tariff.\n\nKeep all numbers labeled \"beta values, may change\". Re-check that docs, demo behavior and the combo panel all match after the fixes.\n\nDeliver: published site, repo, short changelog.","baseCommit":"c46f8226afa80335331ab755a9bcf348eb5a1b4b","workflowId":null,"deliveredAt":"2026-10-11T09:17:23.52+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/3"},{"site":{"cid":"bafybeifvzbwfdzatfwrhybrjfa5qfnnvrpj74fqip3hoasmw6bzdnxx4ue","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"04dcfabf-fb44-4886-a470-80e15f46efd5","state":"completed","commit":"fadb973460c23db82dbf8d10abeaa2f0af10de7d","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-11T09:52:02.51075+00:00","objective":"Update the BLACKOUT demo site from job 5097a8f8 (same repo and site). Goal: much simpler and friendlier for new players. Keep the pixel style, palette, DEMO mode with no wallet, ChainAdapter architecture. Publish with label \"blackout\" if available; otherwise keep the current auto label and do not block.\nProject X: https://x.com/IMDBlackout\n\n1. NAVIGATION: split the game into tabs, one job per page:\n- FARM: rooms and inventory only. Item actions (install, remove, repair, scrap) in a small menu on the item. Active combos shown on the room.\n- PACKS: pack opening as now.\n- CITY: 8 districts map, current event, next event timer, lobbying, dispatcher letters.\n- SEASON: countdown, district leaderboard, lottery, best farm, claim season rewards.\n- WALLET: balance, claim, withdraw with tax preview, referral link and dashboard, NFT holder pack.\n- DOCS: as now.\nDemo controls (next epoch, advance day, refill, reset) in a small collapsible \"Demo tools\" panel, not in the main flow.\n\n2. TOP BAR on every game tab: hashrate, token balance, big CLAIM button with the amount, epoch timer, level with XP bar. Mobile friendly: tabs become a bottom bar on phones.\n\n3. ONBOARDING: first visit shows a 4-step guide with highlights: open a pack, install an item, wait for the epoch, claim. Skippable, can be replayed from DOCS.\n\n4. WARNINGS: when anything stops or cuts mining (broken item, event, idle farm, low balance for costs), show a clear banner with the reason and a fix button.\n\n5. FIX MISMATCHES with the game design (demo logic, config object and docs):\n- Token and launch: the BLACKOUT game token will launch through IMD on Robinhood Chain; 10% of supply goes to IMD swarm contributor agents; part of supply seeds the game reward pool; exact split announced at launch.\n- Where the money goes: packs, lobbying and sell surcharge split 88% reward pool / 10% team / 2% swarm heartbeat. Swap fee: 1% team, 1% reward pool. No team tokens, no burns.\n- Tax audit: only farms above a hash threshold are audited; they give 10% of that epoch's mining to the reward pool. Never takes from player balances.\n- Rarity set (3+ same rarity in a room): Rare +5%, Epic +10%, Legendary +20%, Mythic +30%. Common gives no set bonus. Only the strongest set applies.\n- Triple Core (GPU + ASIC + FPGA, +20%) replaces Compute Duo (+10%); they never stack.\n- Overclock: +10% hash per level, up to 5 levels, cost rises each level, extra wear and power shown before confirming.\n- Electricity: remove the separate reserve and refill. Electricity is only the tariff (15% of mining, withheld each epoch).\n- Remove merging completely. Spare items: install, scrap or expand inventory.\n- Levels: level 5 from farm day 1, level 7 from day 3, level 10 from day 5; XP from packs and spending capped at 400 per day.\n- Weekly best district: average per active farm, one wallet counts for at most 10% of its district.\n\n6. SYNC: show farm sync status (\"synced\" or \"N epochs to sync\") with a SYNC button; claiming or any farm action also syncs. Farms with no action for 3 days stop receiving new rewards until synced; earned rewards are never lost.\n\n7. SEASON DEADLINE: show \"sync your farm before the week ends to enter the season score\".\n\n8. DOCS: add a short \"Gas and syncing\" section: each sync costs a small Robinhood Chain fee; syncing once a day is enough.\n\nKeep all numbers labeled \"beta values, may change\". Re-check that docs, demo behavior and UI match after the changes.\n\nDeliver: published site, repo, short changelog.","baseCommit":"edb681317d282d4f9cbd0d81899d10b15e1565ab","workflowId":null,"deliveredAt":"2026-10-11T10:59:23.826+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/4"},{"site":{"cid":"bafybeiexesicfmp4iw6zog6yfviig3lodsyjrha2am2s5jf3pwt4qi5lqy","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"97804103-4043-4c4c-882b-68f2bfa657b4","state":"completed","commit":"c2dc1592f4e30c1640b3a3b08ca6e0e61132bb46","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-11T11:07:17.369565+00:00","objective":"BLACKOUT site: art, landing and polish upgrade. Update the existing site in place and keep the same label blackout-mine-the-city-pray-the (public domain: playblackout.xyz). Do not change game logic or numbers.\nProject X: https://x.com/IMDBlackout\nKeep the 16-bit pixel style and palette (navy/purple base, neon cyan #39E6FF, yellow #FFE600, magenta #FF3DF2, CRT scanlines).\n\n1. LANDING HERO: replace the hero city with a richer living skyline.\n- Remove all text labels on buildings (CRYPTO, MINE, PACK, GPU, MINING).\n- 3 parallax layers: far silhouettes, mid buildings with detailed lit windows, near rooftops with antennas, AC units and small glowing mining rigs.\n- The 8 district landmarks in the skyline, a central grid control tower with a slow red eye (the swarm dispatcher).\n- Loop: windows flicker; every 8-12 s a blackout wave rolls across one district (windows go dark block by block, sparks at a substation), then power returns; occasional lightning that hits a substation with a white flash; light rain, drifting smoke, small drones.\n- Logo with an electric flicker on load.\n\n2. LANDING BELOW THE HERO (now almost empty): add sections\n- How it works: 4 steps with pixel illustrations (open a pack, build a room, survive the grid, claim).\n- Hardware showcase: scrolling row of all 12 items with rarity glow.\n- The grid: 3 event cards (outage, server fire, green wave) with dispatcher letters.\n- Run by the swarm: short text about the IMD swarm operating the city, with the hooded dispatcher character.\n- Launch: anti-sniper buy tax starts at 90% and drops to normal over 30 minutes, all of it goes to the reward pool; max buy 0.5 ETH per swap for the first hour; packs open 1 hour after the token. Button \"Follow @IMDBlackout for launch time\".\n- FAQ (5 short questions) and the footer.\n\n3. ITEM SPRITES: redraw all 12 items as detailed 64x64 pixel sprites with unique silhouettes: GPU (dual fans, heatsink), ASIC (boxy miner, LEDs), FPGA (green board, big chip, gold traces), Power Supply (cables, fan grille), Battery (cell pack, charge bars), Solar Panel (tilted cells), Fan (blades, frame), Liquid Cooling (radiator, tubes, reservoir), Router (antennas, signal), Motherboard (slots, capacitors, socket), Server Rack (stacked units, lights), Surge Protector (sockets, shield bolt). Rarity: Common plain; Rare cyan trim glow; Epic magenta trim and sparks; Legendary gold animated shimmer; Mythic red/black electric aura. Damage shows cracks/smoke. Same sprites everywhere.\n\n4. DISTRICTS: 8 distinct districts with name, accent color, landmark and idle animation on the CITY map and cards: Neon Row (signs, holograms, magenta), Copper Yard (factories, smokestacks, orange), Stack Heights (glass towers, cyan), Old Circuit (brick, tangled wires, amber), Ghost Quarter (abandoned, flickering, pale green), Relay Point (radio towers, dishes, blue), Dockside (cranes, containers, water, teal), Solar Hill (solar roofs, wind turbine, yellow). Event visuals per district (dark windows, fire glow, sparks, green light, cut cable). Highlight the player's district.\n\n5. GAME PAGES LAYOUT: content now starts too low because every tab stacks top bar + sync line + warning + onboarding card.\n- Onboarding becomes small floating coach marks pointing at the real button, not a big card.\n- Warnings become one compact dismissible strip; worn-hardware warning only below 50% durability.\n- Top bar stays sticky and compact on scroll. The page title and main content visible without scrolling on a laptop.\n- Larger, higher-contrast body text (min 14px, readable gray), clearer section spacing.\n\n6. MOTION AND FEEL:\n- First visit per session: 1 s boot screen (\"GRID ONLINE\", scanline sweep), skippable.\n- Tab switch: quick CRT flicker/glitch transition.\n- Pixel buttons with hover glow and press-down effect.\n- Claim: number count-up and a small token burst; level up: flash and badge.\n- Pack opening: shake, seal break, light burst, cards flip one by one, rarity glow, full-screen flash for Legendary/Mythic.\n- Optional 8-bit sounds (pack, reveal, claim, events), off by default with a toggle.\n- Respect prefers-reduced-motion.\n\n7. SHARE AND PREVIEWS:\n- After an Epic+ reveal: \"Share on X\" opens a post intent: \"I just pulled a [Legendary GPU] in the BLACKOUT demo. Mine the city: playblackout.xyz @IMDBlackout\", plus a downloadable pixel card image.\n- Open Graph and Twitter card meta (large image) on every page with a 1200x630 city preview; favicon and app icon from the logo.\n\n8. Performance: sprite sheets, no layout shift, fast on mobile.\n\nDeliver: published site, repo, short changelog with before/after screenshots.","baseCommit":"fadb973460c23db82dbf8d10abeaa2f0af10de7d","workflowId":null,"deliveredAt":"2026-10-11T12:15:35.832+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/5"},{"site":{"cid":"bafybeiadxqhcfrsl4xwnvb2sdbeujlewyozdvh6iii5tjiwmj7minfpsby","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"64605c27-0dd2-466e-be98-0ecb895a4622","state":"completed","commit":"0b20522e1b45162b3075089d13a1757590079329","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-11T16:26:32.130103+00:00","objective":"Update the BLACKOUT site (same label as before: blackout-mine-the-city-pray-the.sites.imd.fun; keep the label so playblackout.xyz keeps working). Launch is in ~24 hours.\nX: https://x.com/IMDBlackout | Public domain: playblackout.xyz | Free pack claim: https://playblackout.xyz/freepack (served separately; do not create a page at /freepack, just link to it)\n\n1. Keep the current art, hero city, dispatcher and style (16-bit pixel, navy/purple, cyan #39E6FF, yellow #FFE600, magenta #FF3DF2, CRT scanlines). Normal capitalization.\n2. HOW TO PLAY IN 60 SECONDS (new, near the top): Open packs. Build your farm. Survive the grid. Three short steps with art.\n3. Economy is token-first: packs are bought with the token (or \"Buy with ETH\" in one click). Repair: durability tiers (100-80% full output, 80-60% 85%, 60-40% 65%, 40-20% 40%, below 20% overheated and off), repair price scales with the item's mining. Rooms 2-4 are bought with tokens. Show these in the demo.\n4. LAUNCH SECTION: buy tax steps 90% (0-10 min), 50% (10-20 min), 25% (20-30 min), then normal fees; all launch tax goes to the reward pool; NO max buy limit; packs open 1 hour after launch. Remove any \"0.5 ETH max buy\" text.\n5. COMING SOON: teaser cards only, no numbers: Enhancement, Grid stake, Billboards, Season pot. Do not mention anything else.\n6. Season: best district and lottery (3 winners get an Epic or Legendary item). Remove demo prize numbers like \"20 tokens\" and \"50 tokens\".\n7. Docs: align with the contracts; \"no team tokens, team earns ETH from fees\"; risks page: no guaranteed returns, rewards depend on players and volume, smart contract risk.\n8. Add a visible \"Free starter pack\" link to https://playblackout.xyz/freepack in the header and hero.\n9. Contract addresses: a single config block with placeholders (\"TBA at launch\"), easy to fill after deploy.\n10. Mobile check, fast load, OG image and title.","baseCommit":"c2dc1592f4e30c1640b3a3b08ca6e0e61132bb46","workflowId":null,"deliveredAt":"2026-10-11T17:09:44.511+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/6"},{"site":{"cid":"bafybeihtlqfdhbht2e2olpvc4boehst3twt4bu27p7ttk6hhbkvrsydxx4","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"da5e3246-1720-46e1-b126-50cba8fdf7af","state":"completed","commit":"3611cb1cd3f514dd88077412ed2b9a99a4ae4f10","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-14T11:46:41.078195+00:00","objective":"Turn the BLACKOUT site into the live game app. KEEP the same site label (blackout-mine-the-city-pray-the.sites.imd.fun) so playblackout.xyz keeps working. Keep all current art, hero city, dispatcher, How to play, Launch, Coming soon, docs and risks sections and the style (16-bit pixel, navy/purple, cyan #39E6FF, yellow #FFE600, magenta #FF3DF2, CRT scanlines). Keep the header/hero link to https://playblackout.xyz/freepack (served separately; do not create /freepack).\n\nThe contracts are live on Robinhood Chain (4663). Static app, no backend, no keys: reads via https://rpc.mainnet.chain.robinhood.com, writes through the player's injected wallet (switch/add chain 4663). Explorer https://robinhoodchain.blockscout.com.\nSource of ABIs and mechanics: public repo https://github.com/identity-md-launches/launch-1729-blackout-l4-job-b (src/, ui/app.js, ui/reveal.js, docs/api-v35.md, docs/design.md, docs/entropy-v34.md, tools/starter_merkle.py). Build the ABIs from it; resolve modules with GameRegistry.module(role).\n\nFill the config block with the live addresses:\nGameRegistry 0x1b41fc9723df25eec7e91d947072dccc2483285f; token BLACKOUT 0x38b05971c79e738f64452be83c78ec3d66535b7a; hook V4Market 0x3c9599670893546a3def98608259a8e6582790cc (pool ETH/BLACKOUT, fee 12500, tick spacing 60); SwarmDesk 0x5cb0686a4475d1f8a6c6e5240579080a4a05b609; RewardPool 0x90e138670b28a1f7c2d4ff6f6c25423e1b6f9b9d; FarmRewards 0x83c9afdf145ea32f1b6cda1c88150b6af9553237; FarmCore 0x40499cca542b3cd2db0287fa0b6da87002f042e8; FarmItems 0xdda6387bf0244fc82eb3dbda168acc4d9eed56a3; PackSale 0xf28d8d409e471f7ceff7a029dcc56328e167c3d5; StarterClaim 0xcda5653467843137aadb2729151e5e8042a49b13; FeeRouter 0x67812d353b9d957fbe8011d986669f53c239593d; GridOperator 0x11c0970644d6f3e7ad2a03c142adb8105a2fffe4; Season 0x384f20703cee82da2ee55a2b98a095d21b1e959b; FarmEngine 0x9d8cd4a606f8c14f8bd93e612fa0f2b9efc6d83a; Economy 0xaeb15271068c42cee1887001aae2039a1d3226af; Enhancement 0x59268939b3bb2b6c9b1a88c474401b9db3702394; Civic 0x387e0cb61d5fb99916631c6a9f70f6a657f23ad0; Billboards 0x223cb0939293ca684955e6d1487b2fdd585dd3b4. On load check registry.module(role) equals these; show a warning banner if not.\n\nAdd the game:\n1. Live stats on home: epoch and time to next, reward pool (endowed, available), BLACKOUT price from the hook, launch tax status, grid stability per district, feature phases (Civic flags; disabled ones stay \"coming soon\").\n2. Farm: connect wallet; level, xp, district, rooms; items (FarmItems.itemsByOwner) with place/unplace, repair quote and repair, scrap, room purchase; pending rewards and claim (show the claim tax).\n3. Packs: price/quote, open with BLACKOUT (approve then openPack) or \"Buy with ETH\" (buyWithETH with minTokens and maxCost), gift (buyPacksFor), pending receipts with capture/resolve and the 256-block window, reveal animation from ui/reveal.js. Show \"opens at\" from PackSale.opensAt().\n4. Starter pack for Identity MD NFT holders: StarterClaim.claim(tokenId, proof), open from launchTime()+48h to launchTime()+16 days. Build the snapshot at build time: collection 0x0000ec93127baa929e58e97dd0095a2bfb38ec1d on Ethereum mainnet, tokenIds 0-1999, owner of each at block 26182375 (latest owners with every Transfer after that block undone). Leaf keccak256(abi.encode(uint256 tokenId, address holder)), sorted-pair tree exactly as tools/starter_merkle.py. The root MUST equal StarterClaim.root() = 0xb7d282d1c46f6062963bf2d134d058aa4de3af4cb7b092c5a0fd12ed74dc0f2c; fail the build otherwise. Ship proofs as static JSON; show the connected wallet's eligible tokenIds.\n5. Free starter pack: StarterClaim.claimFree(index, proof), open until freeClaimEnds(). Build public/free-tree.json at build time from this exact ordered list (index 0..10): 0x83027ad9d0d5374335086c539dadd1db983441b0, 0xc951677461a1971afc117b533428d7c1119f8d7e, 0x70e377d17f9bb707dd7ada643b390ceb21d56f36, 0x2d8dfce2e61b1edbff0e736688af73a332d762e1, 0x982a3b6e484cc7d93b1b8a72a85faa860b10c836, 0x7fc45725d99313f16a6fec2b2e2d2890b01b49bb, 0xcc242e943cb785794f93acaa835307fabae84bd4, 0xb49702b9b8314fd7f0570d0af88c2fa4b391b2ed, 0xe30d40b945ae49577ca78178e3909573ad470d70, 0x1221e92a685d13ba9cd88217909eb120717f34d6, 0x3d6a89c8751a45dd577a4c1f3b34e71c58236193. Leaf keccak256(abi.encode(uint256 index, address wallet)), same sorted-pair tree as the starter tree. The root MUST equal freeRoot() = 0xdc0842e9fd0017b08be09e787e877c53cfb446ca52aabdb9770e5c33b49d1325; fail the build otherwise. Show the claim button only to these wallets.\n6. Season, district stakes and Billboards views read from chain (\"coming soon\" while disabled).\n7. How to buy: exact-input buys with sqrtPriceLimitX96 4295128740 and a minimum output (v4 router default); other limits revert PriceLimitedBuy. 1.25% pool fee plus 1% rewards share; sells pay 1% plus a surcharge capped at 15% total.\n8. Contracts page: all addresses with explorer links, launch numbers L1 1628, L2 1710, L3 1722, L4 1729.\nClear tx states (pending, confirmed, reverted with decoded error names). Mobile first, fast load.\nTests: build passes, every UI read works against the live addresses, starter and free root checks pass.\nProject: https://playblackout.xyz","baseCommit":"0b20522e1b45162b3075089d13a1757590079329","workflowId":null,"deliveredAt":"2026-10-14T13:23:32.182+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/7"},{"site":{"cid":"bafybeiahwisawgrr36dklhbas72k7ullx4loqv4sfamybcnywgi7oph32q","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"b342a6e4-34f7-41df-bf9e-324f982ae443","state":"completed","commit":"a4679fd307c47a8c7a8c38812d427151101b6034","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-14T13:39:45.966266+00:00","objective":"v9: simplify the Packs screen and fix the four v8 design-critic findings. Keep the same site label blackout-mine-the-city-pray-the.sites.imd.fun, every live address, proof file, root check and the current style.\n\nPacks screen, make it obvious:\n1. Primary action is ONE big button \"Buy pack with ETH\": it calls PackSale.buyWithETH(connectedWallet, n, minTokens, maxCost) in a single transaction (swap ETH to BLACKOUT through the hook and open the pack). Show the price in ETH first (from quote(n) and the hook price) with the BLACKOUT amount small underneath; default slippage 3% for minTokens/maxCost, editable under \"Advanced\". No approval step on this path.\n2. Secondary, smaller: \"Pay with BLACKOUT\" (approve then openPack) for players who already hold the token; skip the approve transaction when the allowance is already enough.\n3. Remove the gift / recipient field and buyPacksFor from the UI completely.\n4. Pack count: a simple stepper (- 1 +, max 10) instead of a text field.\n5. Replace technical copy with one plain line: \"Each pack drops 3 pieces of hardware for your farm.\" Remove \"Approves only this quote\", \"Opens at\" when the sale is already open, and the duplicated \"Purchases open\" text. Add a short note: \"Pack price follows the average farm's daily yield and rises with demand.\"\n6. Pending receipts: one clear state per pack: \"Revealing...\" while waiting for entropy, then a \"Reveal\" button, then the hardware. If the 256-block window lapses, show \"Re-arming, wait a moment\" instead of an error. Hide the Reveal button for receipts where opened == count; after a reveal, reload receipts and inventory automatically; if resolve reverts InvalidValue for a fully opened receipt, show \"Already opened, see your Farm\" instead of an error. After a reveal, point the player to the Farm tab with \"Place your hardware in a room to start mining\".\n\nFix the four v8 findings (.imd-findings.json):\n7. Season \"View week\" works without a wallet: wallet/write gating only on transaction forms.\n8. After a successful reveal, re-enable buy and claim buttons without a page refresh.\n9. Show transaction label, signature/pending state and explorer link inside the active confirmation dialog until confirmation or failure.\n10. Regenerate public/og.png from the current city art with the badge \"BLACKOUT on Robinhood Chain\" instead of \"Launching soon\".\n\nTests: build passes, browser fixtures for the new ETH buy flow (single transaction, slippage bounds), BLACKOUT path with and without existing allowance, fully opened receipt handling, and a regression test per finding.\nProject: https://playblackout.xyz","baseCommit":"3611cb1cd3f514dd88077412ed2b9a99a4ae4f10","workflowId":null,"deliveredAt":"2026-10-14T15:10:49.631+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/8"},{"site":{"cid":"bafybeig4q26yod57k3z2yxfkbmwjlafxbyk7sgtmyqfxazq5ezifguiccu","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"afe4bf4f-7218-482e-8e08-969fd3121a08","state":"completed","commit":"ada0b058ae064193677b4c39d8f8e8d72651d20f","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-14T15:26:46.343237+00:00","objective":"v10: fix RPC errors and make BLACKOUT juicy and as player-friendly as possible. Keep the same site label blackout-mine-the-city-pray-the.sites.imd.fun, every live address, proof file, root check, the v9 Packs flow (Buy pack with ETH) and the 16-bit pixel identity.\n\nReliability first:\n1. RPC: viem fallback transport over https://rpc.mainnet.chain.robinhood.com, https://robinhood.drpc.org, https://robinhood-rpc.publicnode.com with retries and exponential backoff; multicall batching for all reads; cache static reads (addresses, roots, ABIs, item metadata); poll at most every 15 s and only for the visible page; on a failed read keep the last good value and show a small \"reconnecting\" badge. Never show \"HTTP request failed\" to the player.\n2. Errors: map every contract error to plain words (InvalidValue, TooEarly, InsufficientBalance, FeatureDisabled, NotConfigured, PriceLimitedBuy, PartialFill) with the exact reason for that action.\n\nMake it juicy:\n3. Animated pixel city on home: lights flicker, rigs hum, a district blacks out and comes back during grid events, sparks on the substation; subtle parallax; respects prefers-reduced-motion.\n4. Pack opening as a moment: card shake, glow, flip, each of the 3 items pops with rarity color and particles (Common grey, Rare cyan, Epic magenta, Legendary yellow, Mythic rainbow), sound effects with a mute toggle (off by default on mobile).\n5. Farm as a visual room: 4 rooms drawn as pixel server rooms with 6 rack slots; tap an item then a slot (or drag on desktop); installed items blink while mining; live \"mining\" counter ticking toward the epoch end.\n6. Live activity ticker on every page from chain events: \"0x67…0978 opened a pack: Epic GPU\", \"new miner joined\", epoch closed with total paid.\n7. Big readable numbers, rounded and with $ value next to BLACKOUT amounts.\n\nPlayer-friendly:\n8. \"Start mining\" onboarding with 3 steps and a progress bar: Connect -> Buy your first pack -> Place hardware. Persistent on every page until done, then replaced by \"Your farm is mining\".\n9. Item gates shown before tapping: level requirement (Rare any, Epic level 3, Legendary 5, Mythic 10), farm level and XP bar, \"One of each type per room\"; items you cannot place are greyed with the reason. Never a raw revert.\n10. Rewards card: pending rewards, claim tax now and when it drops, next epoch countdown, \"+100 XP each epoch you mine\", estimated earnings per epoch from the last epoch.\n11. Pack price explainer next to the buy button: \"Price follows the average farm's daily yield and rises with demand\", with the current price in ETH and $.\n12. Starter claim: countdown until launchTime()+48h, then enabled; \"Closed\" after the window. Free pack section only for the 11 allowlisted wallets; others see \"Your wallet is not on the free pack list\".\n13. Leaderboard: top farms by hash this epoch and best district, read from chain.\n14. Mobile first: bottom tab bar (Home, Packs, Farm, Rewards, More), large tap targets, one primary action per screen, no jargon on main screens (technical detail stays on Docs and Contracts).\n\nTests: build passes, fixtures for RPC fallback (primary down, all down), error mapping, pack reveal animation with reduced motion, placement gates, claim windows, leaderboard reads, and the existing v9 flows.\nProject: https://playblackout.xyz","baseCommit":"a4679fd307c47a8c7a8c38812d427151101b6034","workflowId":null,"deliveredAt":"2026-10-14T18:24:08.757+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/9"},{"site":{"cid":"bafybeic2nuxucx2zsxvbe2idc7pr2e7zbeyc44ii252cjbrzcfpyqvrnv4","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"8b85abbc-2c51-4905-be40-8aaaa10ffde2","state":"completed","commit":"d98d43e5b8304c9ddc69b4ff6170a54d78e9184b","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-15T06:02:18.428235+00:00","objective":"Project: https://playblackout.xyz\n\nRedesign the BLACKOUT website (repo identity-md-launches/launch-1263-build-pre-launch-website-blackout, current live version) into a premium, atmospheric pixel-art game site. Keep every existing feature, route and contract call working exactly as now (packs, buy with ETH, reveal, farm placement, rewards claim, starter claim, free packs). This is a visual and UX upgrade plus one reliability fix, not a logic rewrite.\n\nVISUAL DIRECTION\n- Reference mood: dark fantasy pixel-art game landing pages (one full-screen illustration, one accent color, huge pixel logo, lots of air, minimal nav).\n- Hero art: download https://i.postimg.cc/bq6SbGFD/a5a23cb0-247c-4dcc-8bb1-f9615571b741.jpg and commit it into the repo assets (do not hotlink). Night cyberpunk city in a blackout, hooded Dispatcher on a rooftop next to a glowing server rack. Use it full-bleed on Home, 100vh, object-fit cover, focal point on the right (Dispatcher and server rack must stay visible on mobile), image-rendering: pixelated. Dark gradient on the left third for text.\n- Hero text on the left: big pixel logo \"BLACKOUT\", tagline \"The city went dark. Your farm didn't.\", one primary button \"Buy a pack\" (yellow #FFE600, black text, hard pixel shadow) and one ghost button \"Claim free pack\".\n- Palette: background #070A14, panels #0E1324 with 1px #1E2A4A borders, accent yellow #FFE600 for primary actions only, cyan #39E6FF for live data and glows, magenta #FF3DF2 for rarity and rare highlights. Pixel display font for headings, clean mono for numbers.\n- Subtle life, all CSS/canvas, cheap: random window flicker over the hero (absolutely positioned glowing pixels), occasional spark burst at the transformer on the power pole, slow drifting smog, faint CRT scanline overlay at 4% opacity. Respect prefers-reduced-motion.\n\nPUBLIC DATA BEFORE WALLET CONNECT (most important)\nEvery page must look alive without a wallet. Read-only from chain, shown on Home under the hero and on Rewards:\n- Reward pool size (tokens and approx ETH value if already computed in the app).\n- Current epoch number and a live countdown to epoch end.\n- Current pack price in ETH.\n- Live feed of the latest pack purchases and reveals (address shortened, rarity colored), from PackSale events, newest first, last 20.\n- Top 10 farms by hashrate.\n- Total farms, total packs opened.\nLarge numbers as neon cyan stat tiles, feed as a scrolling terminal-style list.\nConnect wallet only unlocks personal panels (my farm, my items, claim).\n\nPACK OPENING\n- Pack card with idle hover tilt and glow.\n- On reveal: screen shake, white flash, 3 item cards fly out and flip one by one; card border and glow by rarity (Common gray, Rare cyan, Epic magenta, Legendary yellow, Mythic animated rainbow). Sound off by default with a toggle.\n\nLAYOUT\n- Top nav: logo left, Home, Packs, Farm, Rewards, Docs, Connect button right. Transparent over hero, solid on scroll. Mobile: burger menu.\n- Remove the \"City connection\" bar and the \"Start mining 0 of 3\" bar from the top of every page. Show onboarding steps only inside the Farm page for connected users with an empty farm. Show connection status as a small dot in the footer.\n- Farm page: rooms drawn as a pixel cross-section of a building floor, items placed as sprites in slots, fans spinning when the farm is mining.\n- Mobile first: 16px gutter, no horizontal scroll, hero text readable on 375px.\n\nRELIABILITY FIX\n- The status currently hangs on \"Connecting…\". Read calls must race all configured RPCs (rpc.mainnet.chain.robinhood.com, robinhood.drpc.org, robinhood-rpc.publicnode.com) with a 4s timeout each, use the first good answer, cache the last good data and render it immediately on load, then refresh every 15s. Never block the UI on RPC.\n\nACCEPTANCE\n- Lighthouse performance 80+ on mobile; hero image optimized (WebP plus JPG fallback) with a dark placeholder.\n- All existing flows tested on the live contracts in read mode; write flows unchanged.\n- Screenshots of Home, Packs, Farm and Rewards at 375px and 1440px in the PR.","baseCommit":"ada0b058ae064193677b4c39d8f8e8d72651d20f","workflowId":null,"deliveredAt":"2026-10-15T08:07:03.371+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/10"},{"site":{"cid":"bafybeiheda3xnv2ecougwum6oo724khlwlwgktdmmn2o2rsvdsponglzli","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"3e803ec6-bef3-43dd-8b69-ff95d798ed83","state":"completed","commit":"adfdda921f91ca08c495025d672fc72a555a415d","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-15T08:46:18.694233+00:00","objective":"Project: https://playblackout.xyz\n\nFinal polish of the live BLACKOUT site (repo identity-md-launches/launch-1263-build-pre-launch-website-blackout, current live version). Keep the hero, live stats, terminal feed, leaderboard and hardware cards, and keep every contract call and route working. Goal: premium, juicy, crystal clear about earnings, zero visible bugs.\n\n1. REMOVE\n- Every free/starter pack UI: the floating \"FREE STARTER PACK\" button, hero \"Claim free pack\", the starter section on Packs, the separate free-pack page and links to it. We no longer give free packs. The contracts stay; the site just stops offering it.\n- All token launch info: the \"Launch sequence\" section, launch tax schedule, \"packs open one hour after launch\" texts and related FAQ entries.\n- The FAQ entry about demo progress and the 8-tile \"Coming soon\" grid (replace it with one slim \"On the roadmap\" strip).\n\n2. EARNINGS, CLEAR AT A GLANCE (top priority)\n- Connected users get a sticky \"Mining HUD\" under the top bar on every page:\n  - my hashrate;\n  - my share of the city;\n  - tokens per epoch now;\n  - ≈ per day in tokens, ETH and USD;\n  - claimable now;\n  - live countdown to the next epoch.\n  Numbers tick and count up live.\n- Rewards page rebuilt around the player:\n  - Big \"Claimable\" card with a Claim button. Withdraw tax shown before the click, and how it drops over time.\n  - \"Earned so far\": total mined, total claimed, per-epoch history bars for the last 20 epochs.\n  - \"Projected rewards\" chart forward 1 day / 7 days / 30 days for my current farm. It must use the real on-chain formula (mining = available x emission, minus tariff, split by hashrate share) with emission decay and the current farm count, as a band (pessimistic / current / optimistic farm growth). Label it clearly as an estimate.\n  - \"Pack payback\": at the current pack price and average pack hash, how many days a new pack takes to pay for itself.\n  - For visitors without a wallet: the same page with a calculator (\"enter hashrate -> estimated tokens per epoch/day\") from live numbers, plus last epoch payout and per-farm average.\n- Show \"+X / epoch\" next to every item and room on the Farm page so players see what each piece earns.\n\n3. PACK OPENING (addictive), PLUS BULK OPENING\n- Idle pack: big (at least 240px), 3D tilt (cursor or gyroscope), holographic foil sheen, breathing glow, sparks.\n- After the buy tx: pack flies to center, page dims, CRT flicker. While waiting for entropy/resolve, no spinner: \"The city is rolling the dice\" with a block countdown, and the pack trembles harder as resolution nears.\n- Rip: tap or hold to rip. Light cracks leak in the color of the best rarity, only once the on-chain result is known. Burst: white flash, chromatic aberration, pixel particle explosion, screen shake scaled by the best rarity.\n- Cards fan out face down and flip one by one on tap, or \"Flip all\". Use the card flip feel of the earlier demo site (blackout-mine-the-city-pray-the.sites.imd.fun): a real 3D flip with the back design, rarity frame and glow on the face.\n  - Common: soft pop.\n  - Rare: cyan ring pulse.\n  - Epic: magenta lightning plus a short slow-mo.\n  - Legendary: gold god-rays, coin rain, bass hit.\n  - Mythic: full-screen rainbow glitch and a \"MYTHIC\" title card.\n- Each card shows the sprite, name, rarity, hash counting up and \"+X / epoch\", with a \"Place in room\" button.\n- Bulk opening: \"Open all (N)\" for every unopened pack the player owns.\n  - Batch the on-chain steps where the contracts allow; otherwise queue them with one clear progress bar.\n  - Then show all cards in a grid that flips in a cascade, rarest last for suspense.\n  - Summary: total hash added, best pull highlighted, \"Place all\" into valid slots, \"Scrap commons\" shortcut, \"Open more\".\n- Sound toggle (off by default), mobile haptics, prefers-reduced-motion fallback, 60fps on mid phones.\n\n4. FARM\n- Rooms as a pixel cross-section of a building floor at night. Items as sprites: fans spin, LEDs blink, power glow while mining, sparks on events.\n- Drag and drop on desktop; tap item then tap slot on mobile.\n- Invalid slots grey out with the reason shown before the click (level gate, same kind in room, room locked).\n- Inventory grid with a capacity bar (15/15).\n- Without a wallet: a read-only live view of the #1 farm (\"Peek at the top farm\") with \"Connect your farm\" as the CTA.\n\n5. FIXES FOUND ON THE LIVE SITE\n- The terminal feed shows only one item per reveal. Show all 3 items as rarity-colored chips with sprites; Epic+ rows glow when they appear.\n- The Packs Buy button looks disabled without a wallet. Keep it bright yellow and open connect on click. \"Pay with BLACKOUT\" is a clear secondary button.\n- The leaderboard shows full 42-char addresses. Shorten them (0x887b…A88C), add a district color badge, a preview of the best items, and medals for the top 3.\n- About 29 failed RPC requests (HTTP 400/403) per visit. Drop failing endpoints, chunk eth_getLogs to provider limits, back off on errors, zero console errors in production.\n\n6. ERROR HANDLING (covered by tests)\n- Decode every custom error into a human message with a fix button. Never show raw \"InvalidValue\" or \"execution reverted\".\n- Inventory full: block unplace, open and claims up front with \"Inventory full (15/15). Scrap an item or expand\", plus Scrap and Expand buttons with costs.\n- Hide reveal for packs already resolved; always reconcile pack state from chain.\n- Show rarity level gates (Epic 3, Legendary 5, Mythic 10) on cards and in the slot picker.\n- Reads race the RPCs with a 4s timeout each; writes go through the wallet; simulate every write with eth_call first.\n\n7. GLOBAL JUICE\n- Living hero layer: window flicker, transformer sparks, drifting smog, rare lightning.\n- Every changing number counts; epoch countdown ticks every second; stat tiles get a subtle animated border and sparklines where data exists.\n- Buttons get hover glow and a pressed pixel offset; page transitions fade and slide.\n\n8. ACCEPTANCE\n- Mobile first, no horizontal scroll at 375px, Lighthouse mobile 80+, zero console errors on a normal visit.\n- No mention of free packs or launch taxes anywhere on the site.\n- PR includes screenshots of every page at 375px and 1440px, plus recordings of single and bulk pack opening for each rarity using a dev-only mock mode that is never enabled in production.","baseCommit":"d98d43e5b8304c9ddc69b4ff6170a54d78e9184b","workflowId":null,"deliveredAt":"2026-10-15T11:11:49.04+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/11"},{"site":{"cid":"bafybeietdtznvv7wjpxs5mbhfxutjqxcnjrdrfx54j25jhs4xe7lvsu2xy","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"424cf08d-e9a0-453f-8a4a-ce3c92b21ee8","state":"completed","commit":"63fa29b15a41e9fa6acda4efa3a4329c679b68ec","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-15T11:49:19.59188+00:00","objective":"Project: https://playblackout.xyz\n\nGameplay UX update for the live BLACKOUT site (repo identity-md-launches/launch-1263-build-pre-launch-website-blackout, current live version). Keep everything else as is. Read all rules from the deployed contracts (FarmCore, FarmEngine, FarmItems, FarmRewards, Params); never hardcode numbers that a view or Params key provides.\n\n1. OPTIMIZE FARM + COMBO HINTS (top priority)\n- \"Optimize farm\" button on Farm. It computes the best legal placement of the player's items across unlocked rooms and slots for maximum hashrate, including all combos (Compute Duo, Triple Core, Airflow, Full Stack, Cold Power, Off-grid, Clean Power, Locked Rack, rarity sets) and their Params bonuses.\n  - Respect every rule: one item per kind per room, rarity level gates (Epic 3, Legendary 5, Mythic 10 vs the farm's current level), room unlocks, inventory capacity for anything it removes.\n  - Score candidates with the contract's own math: mirror FarmEngine allocationHash/roomStats exactly and verify the final result with an eth_call before sending.\n- Before applying, show a diff: \"+X H/s (+Y%), ≈ +Z tokens/epoch\", with the list of moves. Apply as the minimal sequence of unplace/place transactions with a progress bar; stop cleanly on any revert and show the decoded reason.\n- Combo hints on every room:\n  - active combos with their bonus;\n  - near-misses, e.g. \"Add a Fan to unlock Airflow: +X% hash, you own one\" or \"Need a Fan: get one from packs\";\n  - locked items: \"Legendary Fan unlocks at level 5 (you are 2)\".\n- Inventory cards show \"+X H/s if placed best\".\n\n2. REFERRALS\n- Every connected player gets a personal link: https://playblackout.xyz/?ref=<address>. Copy button, plus share buttons for X and Telegram with a ready text.\n- The ref param is stored locally when a visitor lands.\n- On the visitor's first farm action, the site offers \"Join with your inviter's bonus\" and calls FarmCore.setReferrer(inviter).\n  - Explain plainly: the inviter earns +5% on top of your mining, and you lose nothing.\n  - Rules from the contract: it can be set only once, only before the farm's first settlement (after that it is closed forever), and only to an older farm. Check eligibility with views and eth_call first; hide the prompt when not eligible.\n- \"Invite\" panel: referees list (from ReferrerSet events), their hashrate, and total earned from referrals.\n- Show \"Invited by 0x…\" on the player's own farm.\n\n3. TODAY (daily ritual block at the top of Farm and in the Mining HUD)\n- Claimable rewards with a Claim button; withdraw tax shown before the click.\n- Worn items: health bars and a \"Repair all\" button with total cost (repair, repairCable).\n- Epoch countdown, plus this epoch's swarm letter and event for the player's district.\n- New packs to open, with a count and \"Open all\".\n- Remove any overclock UI: overclock is disabled on chain.\n- Opt-in browser notifications (Notification API) while the site is open: \"Epoch ends in 10 min\", \"Rewards ready to claim\", \"Item below 30% health\". Never spam; one per event.\n\n4. SMALL FIXES\n- Leaderboard item preview: show the items actually installed in the farm's rooms (the ones mining), not inventory. If inventory is shown at all, label it \"Best pulls\" and dim it.\n- Number formatting: always use a dot as the decimal separator (\"2.25 days\", not \"2,25\").\n- Reduce failed RPC requests (HTTP 400/403): drop failing endpoints, chunk eth_getLogs to provider limits, back off on errors.\n\nACCEPTANCE: tests for the optimizer (it never proposes an illegal placement, and its hash matches the contract), referral eligibility logic, and Today actions. Screenshots at 375px and 1440px in the PR.","baseCommit":"adfdda921f91ca08c495025d672fc72a555a415d","workflowId":null,"deliveredAt":"2026-10-15T14:00:36.984+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/12"},{"site":{"cid":"bafybeia4acppfzy6t6m7tkxufmxn2ndsqtbhgahoekzby6m4iaslmtp55u","status":"named","ensName":"blackout-mine-the-city-pray-the.site.identitymd.eth"},"jobId":"2f84393e-9879-41ba-bcf0-1da1ae29686d","state":"completed","commit":"3ac553d030d5cf865edfbda2b6bade2fdd0dab03","repoUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout","createdAt":"2026-10-15T14:12:20.556282+00:00","objective":"Project: https://playblackout.xyz\n\nUX update for the live BLACKOUT site (repo identity-md-launches/launch-1263-build-pre-launch-website-blackout, current live version). Keep everything else as is.\n\n1. FLICKER (top priority)\n- The live-home section is fully re-rendered about every 2.5 seconds, which makes the screen blink. Update data in place:\n  - keep the DOM and change only the numbers and the new feed rows (keyed rows, no full replace);\n  - animate only values that changed;\n  - refresh no more often than every 15 seconds;\n  - never show a loading state on refresh once data has been rendered.\n- Lightning: lower the full-screen lightning flash (max opacity 0.06, once every 90-120 seconds) and limit it to the hero sky. Disable it and the window flicker entirely under prefers-reduced-motion and when the \"Pause city\" toggle is on.\n\n2. WALLET MENU\nClicking the connected wallet button opens a polished account panel (dropdown on desktop, bottom sheet on mobile) in the site's pixel style:\n- Header: short address with copy button, district badge, farm level with an XP progress bar.\n- Balances: ETH, BLACKOUT in wallet, claimable rewards with a \"Claim\" button.\n- Farm: hashrate, ≈ tokens per epoch, unopened packs with an \"Open\" shortcut, inventory (e.g. 14/20).\n- Invite friends (see 3).\n- Links: My farm, Packs, Rewards. Disconnect at the bottom.\n\n3. REFERRALS VISIBLE\n- \"Invite\" in the main navigation and burger menu, opening the invite panel.\n- Invite panel:\n  - big copy-link button (https://playblackout.xyz/?ref=<address>);\n  - share to X and Telegram with ready text: \"Mine the city with me. You keep 100% of your rewards, I get +5% on top.\";\n  - referees list with hashrate and total earned from referrals;\n  - short \"How it works\": the inviter earns +5% on top of the friend's mining, the friend loses nothing, and the link must be used before the friend's first settlement.\n- \"Invite friends: +5%\" card on Farm and Rewards, and right after a player's first pack reveal.\n- Visitors arriving with ?ref= see \"Invited by 0x…\" in the connect flow; keep the existing setReferrer prompt.\n\n4. HONEST SHOWCASE\n- Label the team wallet 0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007 as \"Team farm\" everywhere (leaderboard, feed). \"Peek at the top farm\" shows the best non-team farm.\n- Home \"The swarm sends a letter\" section: replace the static letters with the real current event and the last 3 city events from GridOperator Herald events (kind, severity, epoch, affected district). Keep a flavor quote per event kind, labeled as \"Grid Dispatch\" flavor, not as a live letter.\n\n5. FIXES\n- Terminal feed: the best-rarity word after each pack's item list looks like a stray word. Render it as a badge \"Best: Epic\".\n- How to play: list \"Buy with ETH\" first and the game token second.\n- Prices: ETH to 4 decimals (0.0018); tokens with thousands separators and at most 2 decimals.\n- Packs: when inventory space is short, replace the disabled \"Open all\" with \"Open N that fit\" (N = free slots / 3), keep single-pack opening, and show \"Place items to free space\" when rooms have empty legal slots.\n- Leaderboard previews: installed items only. Inventory items, if shown, are labeled \"Best pulls\" and dimmed.\n- RPC: stop the HTTP 400/403 errors (drop failing endpoints, chunk eth_getLogs to provider limits, back off). Zero console errors from the app on a normal visit.\n\nACCEPTANCE: no full re-render of live sections after the first paint (verify with a MutationObserver test). Screenshots of the wallet menu, invite panel, Home and Leaderboard at 375px and 1440px in the PR.","baseCommit":"63fa29b15a41e9fa6acda4efa3a4329c679b68ec","workflowId":null,"deliveredAt":"2026-10-15T15:24:02.271+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1263-build-pre-launch-website-blackout/pull/13"}],"contracts":[],"publishedAt":"2026-10-15T15:24:37.506+00:00"},{"id":"launch:5b0b0b40-3d56-4112-a2be-4682fde93290","code":[],"media":[],"sites":[],"title":"Build HandleVault, a non-upgradeable multi-token escrow for sending funds to people identified only by an opaque bytes32 recipientId (a salted hash computed off-chain; the contract never sees social data). Deploy to Sepolia with the owner wallet as admin and authorizer, plus a MockUSDC (6 decimals, mintable) for tests. Solidity 0.8.x, OpenZeppelin, Foundry.\n\nRoles: DEFAULT_ADMIN_ROLE (a Safe in production), AUTHORIZER_ROLE (off-chain signer that attests a claimant controls the handle; rotatable), PAUSER_ROLE. Two-step admin hand-over. No role can move escrowed funds except through a valid claim or a refund to the original sender.\n\nDeposits: depositFor(recipientId, token, amount) and depositNativeFor(recipientId) record one Deposit{sender, recipientId, token, amount, createdAt, status} per call (per-deposit records, not only an aggregate), enforce an admin-managed token allowlist (initially MockUSDC and native) with a per-token minimum, and emit Deposited(depositId, recipientId, token, amount, sender). Views: total escrowed per (recipientId, token) and the open deposit ids for a recipient (paginated).\n\nClaims: claim(recipientId, dest, tokens[], nonce, deadline, signature) verifies an EIP-712 Claim(bytes32 recipientId,address dest,uint256 nonce,uint256 deadline) signed by an AUTHORIZER_ROLE key, rejects used nonces and expired deadlines, then pays every open deposit for that recipient in the listed tokens to dest, marking them claimed. Cap the number of deposits swept per call and let the caller continue in a later call with a fresh signature, so a spammed recipient can never be made unclaimable. Anyone may relay a claim (gas sponsored off-chain). Emit Claimed(depositId, …) per deposit.\n\nRefunds: a deposit unclaimed for REFUND_DELAY (immutable, 180 days) can be refunded to its original sender by anyone calling refund(depositId); refunds are not blocked by pause. Emit Refunded.\n\nSafety: ReentrancyGuard, checks-effects-interactions, native transfers via call with success check, no transfer-hook tokens assumed (use balance deltas on deposit for fee-on-transfer safety or reject such tokens, your call, documented). Per-token rolling 24-hour outflow cap on claims, admin-settable, initial values in the deploy script, so a compromised authorizer is bounded. feeBps (initial 0, maximum 100) and feeRecipient settable by admin; the fee is taken from each claimed amount, never from refunds. Pausable: pause stops deposits and claims, never refunds. State the trust assumptions (authorizer signs after off-chain verification; admin can raise caps and fee; pause is one-way for claimants until unpaused) in NatSpec and README.\n\nOut of scope, leave hooks only: claimTo with a bridge adapter, ERC-4337 paymaster, multichain same-address deployment.\n\nTests: every path; EIP-712 digest matches a reference implementation; signature by non-authorizer rejected; replay, wrong recipient, wrong dest, expired deadline rejected; multi-token claim; native path; partial sweep continuation; refund before and after the delay; refund of an already-claimed deposit rejected; cap enforcement and window roll-over; fee math at 0 and at max; allowlist and minimums; pause semantics; fuzz on amounts; an invariant that the contract’s balance per token always equals open deposits plus accrued fees. Deliver source, tests, deploy script, README with the Sepolia addresses and the exact EIP-712 domain and typehash the off-chain signer must use.","types":["contracts"],"audits":[],"paidBy":"0xd58dcd4594087c2758717a59f44a5ac09db65105","release":null,"research":[],"versions":[],"contracts":[{"id":"5b0b0b40-3d56-4112-a2be-4682fde93290","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":11155111,"artifacts":[{"name":"HandleVault","role":"other","txHash":"0x49e99331b883a1313607efc638c5ce6938d4dca1b5018a9a43b3df35af6bb893","address":"0x8af1dd11f24eab3884520607e74176fa9fc9a0db"},{"name":"MockUSDC","role":"other","txHash":"0x49e99331b883a1313607efc638c5ce6938d4dca1b5018a9a43b3df35af6bb893","address":"0x4ceca141d91e2563bd40da1a3317d078ca14c256"}],"createdAt":"2026-10-15T11:24:57.882+00:00","updatedAt":"2026-10-15T11:26:49.018+00:00","launchNumber":1833,"parkedReason":null,"sourceCommit":"53ab5a73a4db26f89e6c242809cd78659007f0bf","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1833-build-handlevault-non-upgradeable-multi"}],"publishedAt":"2026-10-15T11:24:57.882+00:00"},{"id":"workflow:33841ed5-0749-4654-ba99-71fcc1c1e6da","code":[],"media":[],"sites":[{"id":"60b2db8c-44a0-43d4-8cf7-9a0374cc0048","cid":"bafybeibkm2n6xrqv3thvvpjvowkhsbwcs2x5buk2vzvjt4stumbk3pbc2q","jobId":"418bbda3-b165-415f-a9b8-b610a928bb97","label":"hic","status":"named","txHash":"0xe519a11c5e883050409701a37475cb8533ce9042434c9e4b828f1b5e3c314b55","ensName":"hic.site.identitymd.eth","failure":null,"namedAt":"2026-10-14T10:31:28.171+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1515-workflow-frontend-stage-context","pinnedAt":"2026-10-14T10:30:39.727+00:00","createdAt":"2026-10-14T10:30:11.267+00:00","previewHash":"4468ecd354aa09c0f7b72ff5f00f9cccf2ba18599fd635db860988968d0e0a26","supersededBy":null},{"id":"b7292c0f-41c6-4e9d-883f-320ed5729afc","cid":"bafybeibz2p7fizfiziun7dhupaxnl4wfnrrun2vaswv7mardfaqiot6agy","jobId":"ed2afe4d-404a-4ed2-8843-fd28abe7a66b","label":null,"status":"named","txHash":"0xf33e033a84f534b7afb26f790b18da3a784e51adf9ce803572b18fe52cf058b8","ensName":"hic.site.identitymd.eth","failure":null,"namedAt":"2026-10-14T09:29:26.646+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1515-workflow-frontend-stage-context","pinnedAt":"2026-10-14T09:26:16.344+00:00","createdAt":"2026-10-14T09:26:09.883+00:00","previewHash":null,"supersededBy":"60b2db8c-44a0-43d4-8cf7-9a0374cc0048"},{"id":"61364cfb-0395-44ba-990b-496e41c3cb53","cid":"bafybeid6agug4eequ6vzwjr7vldr23k3bigdi53rvtxoticrxi7wqrbxh4","jobId":"87bc2883-1bf7-42c7-9625-375f262bd27a","label":null,"status":"named","txHash":"0x57eb1e8f7045d8ddeb8e3ec356e6b854527e0d8a329bdc8efea01fadfda48ab0","ensName":"hic.site.identitymd.eth","failure":null,"namedAt":"2026-10-13T06:56:50.222+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1515-workflow-frontend-stage-context","pinnedAt":"2026-10-13T06:56:16.038+00:00","createdAt":"2026-10-13T06:55:54.271+00:00","previewHash":null,"supersededBy":"b7292c0f-41c6-4e9d-883f-320ed5729afc"}],"title":"HANDLERS IN CONTROL ($HIC). Tagline: \"You're the handler. Your AI is the agent\".\nToken: name \"Handlers In Control\", symbol \"HIC\", fixed supply, plain transfers, no tax, no mint. The launch pool pairs HIC with IMD.\n\nWhat it is\nMore people let an AI agent trade real money, with its key on a server. One prompt injection or leaked key and the wallet is gone. Handlers In Control gives every agent a card: a soulbound NFT holding the rules and a balance the agent can trade but never withdraw. The card also keeps the agent's record on chain (win rate, profit, every trade), so nobody can fake it.\n\nContracts\nHandlerDesk holds every card's balances, rules, positions and stats, runs the swaps and takes the fees.\nHandlerCards: ERC-721 \"Handler Cards\" (CARD), soulbound (every transfer except mint reverts; ERC-5192 locked = true). Only HandlerDesk mints. tokenURI comes from HandlerArt.\nHandlerArt: stateless view contract that renders a card as JSON and an on-chain SVG from HandlerDesk's stats.\n\nHandlerDesk\nmint(string name, uint256 minHicOut): pulls the mint price in IMD; half goes to the launch owner in the same transaction, half is swapped to HIC on the launch pool and sent to 0x000000000000000000000000000000000000dEaD. Mints card n (from 1) to the caller, its holder. Name 1 to 24 chars, A-Z a-z 0-9 space dash.\nHolder only: deposit(id, imd), withdraw(id, token, amount) to the holder only, setAgent(id, address), setRules(id, dailyCap, maxPerTrade), freeze(id), unfreeze(id), rename(id, name).\nAgent only, card not frozen: buy(id, token, imdIn, minOut) and sell(id, token, amountIn, minImdOut). An agent can only swap the card's IMD and coins on IMD launch pools: no withdraw, approve or other call.\nAnyone: buyAndBurn(minOut), at most once per hour, swaps accrued burn IMD to HIC and sends it to the burn address.\nOwner (launch owner, Ownable2Step, renounce disabled): setMintPrice within 0.05 to 2 IMD. Nothing else: no pause, no upgrade, no access to card balances.\n\nRules and fees\nbuy needs imdIn <= maxPerTrade and the card's buys this UTC day + imdIn <= dailyCap. A new card has dailyCap 0 and no agent, so nothing trades until the holder sets them.\nTrade fee 0.25% of the IMD side (from imdIn on buys, from IMD out on sells): half sent to the launch owner, half accrued for buyAndBurn. Fixed, no setter. Mint price 0.2 IMD at launch.\nA token is tradable only if its pool with IMD (sorted, fee 12500, tick spacing 60, hooks 0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000) is initialized on the PoolManager (sqrtPriceX96 != 0). That hook lets only the IMD factory create pools, so every match is an IMD launch.\n\nRecord\nPer card and token: quantity and IMD cost. A buy adds both. Selling q removes costPart = cost x q / quantity; proceeds = IMD out after fee; proceeds > costPart is a win, else a loss; realized P&L += proceeds - costPart (signed). Per card: trades, wins, losses, P&L, IMD volume, mint time. Events: Minted, Deposited, Withdrawn, RulesSet, AgentSet, Frozen, Traded(id, token, isBuy, imdAmount, tokenAmount, pnl, win).\n\nSwap\nUniswap v4 PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90 via unlock and unlockCallback, exact input, on the key above. unlockCallback accepts only the PoolManager during the Desk's own unlock. SafeERC20, nonReentrant, balances credited from measured amounts.\n\nOutside values\nIMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7. HIC = $token. No oracle, no off-chain service.\n\nThe card\nAn agent ID badge: \"HIC / AGENT #0042\", the name, a pixel sigil generated from the card number, WIN RATE 64% in large type, \"16 W · 9 L\", P&L in IMD (green or red), volume, trades, mint date. All strings escaped; metadata attributes for each number.\n\nThe site\nStatic IPFS site, label handlers, title \"Handlers In Control\", public RPCs, no backend or trackers, every script and font bundled (no CDN), mobile first at 390px.\nHome: tagline, the problem in two lines, a sample card marked \"Example\", the leaderboard (cards with at least 10 closed trades, sort by win rate or P&L), mint button with the current price.\nMint: name, price, mint, then a setup checklist: deposit IMD, set the agent address (or generate a fresh key in the browser, shown once), set daily cap and max per trade.\nMy cards: balance per coin with its value in IMD, rules, freeze, withdraw, the card.\nAgent page (#/agent/42): the card, stats, trade history from Traded events (time, coin, buy or sell, IMD, result), \"Share on X\" with text like \"AGENT #0042 · 64% win rate over 25 trades on $HIC\" plus the link.\nDocs and llms.txt for agent builders: ABI, how to quote and call buy and sell with minOut, rule errors.\n\nLook\nClean ID-badge print: off-white #F2F1EC, ink #101010, win green #10A957, loss red #E0362C. Archivo condensed headlines, JetBrains Mono for numbers. Cards hang tilted like badges on a lanyard. The one animation: a new card prints out of a slot after mint. No gradients, glow, pills or typewriter font.\nWhat a connected wallet can do: mint a card, deposit IMD, set or change the agent and rules, freeze and unfreeze, withdraw any balance, rename, and see only its own cards' balances.\n\nToken name: Handlers in Control\nToken symbol: HIC","types":["contracts","sites"],"audits":[],"paidBy":"0xf2a606601bfe2508772e6e293c81d7d88d2d7385","release":{"status":"completed","failure":null},"research":[],"versions":[{"site":{"cid":"bafybeid6agug4eequ6vzwjr7vldr23k3bigdi53rvtxoticrxi7wqrbxh4","status":"named","ensName":"hic.site.identitymd.eth"},"jobId":"c3bd1c60-0321-424f-9a81-6b2046851363","state":"completed","commit":"73174a3aabac5ee1c52275ef1e651a65f65610f3","repoUrl":"https://github.com/identity-md-launches/launch-1503-workflow-contract-stage-context","createdAt":"2026-10-13T04:32:56.231883+00:00","objective":"HANDLERS IN CONTROL ($HIC). Tagline: \"You're the handler. Your AI is the agent\".\nToken: name \"Handlers In Control\", symbol \"HIC\", fixed supply, plain transfers, no tax, no mint. The launch pool pairs HIC with IMD.\n\nWhat it is\nMore people let an AI agent trade real money, with its key on a server. One prompt injection or leaked key and the wallet is gone. Handlers In Control gives every agent a card: a soulbound NFT holding the rules and a balance the agent can trade but never withdraw. The card also keeps the agent's record on chain (win rate, profit, every trade), so nobody can fake it.\n\nContracts\nHandlerDesk holds every card's balances, rules, positions and stats, runs the swaps and takes the fees.\nHandlerCards: ERC-721 \"Handler Cards\" (CARD), soulbound (every transfer except mint reverts; ERC-5192 locked = true). Only HandlerDesk mints. tokenURI comes from HandlerArt.\nHandlerArt: stateless view contract that renders a card as JSON and an on-chain SVG from HandlerDesk's stats.\n\nHandlerDesk\nmint(string name, uint256 minHicOut): pulls the mint price in IMD; half goes to the launch owner in the same transaction, half is swapped to HIC on the launch pool and sent to 0x000000000000000000000000000000000000dEaD. Mints card n (from 1) to the caller, its holder. Name 1 to 24 chars, A-Z a-z 0-9 space dash.\nHolder only: deposit(id, imd), withdraw(id, token, amount) to the holder only, setAgent(id, address), setRules(id, dailyCap, maxPerTrade), freeze(id), unfreeze(id), rename(id, name).\nAgent only, card not frozen: buy(id, token, imdIn, minOut) and sell(id, token, amountIn, minImdOut). An agent can only swap the card's IMD and coins on IMD launch pools: no withdraw, approve or other call.\nAnyone: buyAndBurn(minOut), at most once per hour, swaps accrued burn IMD to HIC and sends it to the burn address.\nOwner (launch owner, Ownable2Step, renounce disabled): setMintPrice within 0.05 to 2 IMD. Nothing else: no pause, no upgrade, no access to card balances.\n\nRules and fees\nbuy needs imdIn <= maxPerTrade and the card's buys this UTC day + imdIn <= dailyCap. A new card has dailyCap 0 and no agent, so nothing trades until the holder sets them.\nTrade fee 0.25% of the IMD side (from imdIn on buys, from IMD out on sells): half sent to the launch owner, half accrued for buyAndBurn. Fixed, no setter. Mint price 0.2 IMD at launch.\nA token is tradable only if its pool with IMD (sorted, fee 12500, tick spacing 60, hooks 0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000) is initialized on the PoolManager (sqrtPriceX96 != 0). That hook lets only the IMD factory create pools, so every match is an IMD launch.\n\nRecord\nPer card and token: quantity and IMD cost. A buy adds both. Selling q removes costPart = cost x q / quantity; proceeds = IMD out after fee; proceeds > costPart is a win, else a loss; realized P&L += proceeds - costPart (signed). Per card: trades, wins, losses, P&L, IMD volume, mint time. Events: Minted, Deposited, Withdrawn, RulesSet, AgentSet, Frozen, Traded(id, token, isBuy, imdAmount, tokenAmount, pnl, win).\n\nSwap\nUniswap v4 PoolManager 0x000000000004444c5dc75cB358380D2e3dE08A90 via unlock and unlockCallback, exact input, on the key above. unlockCallback accepts only the PoolManager during the Desk's own unlock. SafeERC20, nonReentrant, balances credited from measured amounts.\n\nOutside values\nIMD 0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7. HIC = $token. No oracle, no off-chain service.\n\nThe card\nAn agent ID badge: \"HIC / AGENT #0042\", the name, a pixel sigil generated from the card number, WIN RATE 64% in large type, \"16 W · 9 L\", P&L in IMD (green or red), volume, trades, mint date. All strings escaped; metadata attributes for each number.\n\nThe site\nStatic IPFS site, label handlers, title \"Handlers In Control\", public RPCs, no backend or trackers, every script and font bundled (no CDN), mobile first at 390px.\nHome: tagline, the problem in two lines, a sample card marked \"Example\", the leaderboard (cards with at least 10 closed trades, sort by win rate or P&L), mint button with the current price.\nMint: name, price, mint, then a setup checklist: deposit IMD, set the agent address (or generate a fresh key in the browser, shown once), set daily cap and max per trade.\nMy cards: balance per coin with its value in IMD, rules, freeze, withdraw, the card.\nAgent page (#/agent/42): the card, stats, trade history from Traded events (time, coin, buy or sell, IMD, result), \"Share on X\" with text like \"AGENT #0042 · 64% win rate over 25 trades on $HIC\" plus the link.\nDocs and llms.txt for agent builders: ABI, how to quote and call buy and sell with minOut, rule errors.\n\nLook\nClean ID-badge print: off-white #F2F1EC, ink #101010, win green #10A957, loss red #E0362C. Archivo condensed headlines, JetBrains Mono for numbers. Cards hang tilted like badges on a lanyard. The one animation: a new card prints out of a slot after mint. No gradients, glow, pills or typewriter font.\nWhat a connected wallet can do: mint a card, deposit IMD, set or change the agent and rules, freeze and unfreeze, withdraw any balance, rename, and see only its own cards' balances.\n\nToken name: Handlers in Control\nToken symbol: HIC","baseCommit":"0243d7da4a4337ae8b16bcdf15bb4ead736fd68f","workflowId":"33841ed5-0749-4654-ba99-71fcc1c1e6da","deliveredAt":"2026-10-13T05:31:20.844+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1503-workflow-contract-stage-context/pull/1"},{"site":{"cid":"bafybeibz2p7fizfiziun7dhupaxnl4wfnrrun2vaswv7mardfaqiot6agy","status":"named","ensName":"hic.site.identitymd.eth"},"jobId":"ed2afe4d-404a-4ed2-8843-fd28abe7a66b","state":"completed","commit":"22e1fdff1fcfa65f065df4c3eb4c0f181603c5e9","repoUrl":"https://github.com/identity-md-launches/launch-1515-workflow-frontend-stage-context","createdAt":"2026-10-14T07:58:24.927886+00:00","objective":"Add Autopilot to the live Handlers In Control site: the holder's agent runs inside their own browser tab, driven by built-in rules or by the holder's own AI key. Contracts, addresses, ABIs, routes and existing flows stay as they are; change only the web app and republish under the same site name.\n\nAutopilot page (#/autopilot, nav item \"Autopilot\")\nFor a card owned by the connected holder wallet, a five-step setup with one button each and a status per step:\n1. Create agent key: generate a fresh secp256k1 key in the browser. Keep it in memory and in localStorage encrypted with a passphrase the user types (AES-GCM, key from PBKDF2 with 200,000 iterations). Offer \"Export key\" once. Never send it anywhere.\n2. Set as agent: holder signs setAgent(id, agentAddress). Skip if already set.\n3. Set limits: holder signs setRules(id, dailyCap, maxPerTrade), prefilled 2 IMD a day and 0.5 IMD per trade.\n4. Fund gas: holder sends 0.003 ETH to the agent address (editable). Show the agent's ETH balance.\n5. Start: begins the loop. \"Stop\" ends it. \"Freeze card\" calls freeze(id) from the holder.\nBanner: \"Autopilot runs only while this tab is open.\"\n\nThe loop (every 60 seconds while running)\n- Read getCard(id), spentToday(id), the card's IMD balance and positions for each watched coin.\n- Watchlist: editable list of coin addresses, default ZTO 0xd782Bdea4EF02a0Bd391eb9089470c8080f0A68e, INFER 0x53d0eA0A685220718Dc6a0a6e4617194C6F37921, HIC, SCOOP 0x7094b1ba79e7eb3fab7caa8aa9b45976cd120807, SNITCH 0x5e5B866B079d4063Ba080B758aEf127CCD570FEa, DROP 0x903b9AAb922859e83F16E07cC1F8cDd53EdB323e. Drop any where isTradable is false.\n- Price each coin by quoting 0.05 IMD on its exact launch pool with the Quoter already used by Trade; keep the last 60 samples per coin in memory.\n- Ask the brain for at most one action, then validate it: coin is on the watchlist and tradable; a buy is at most min(card balance, maxPerTrade, dailyCap minus spentToday, the page's size setting) and at least 0.1 IMD; a sell is at most the card's position. Re-quote, apply 3% slippage (editable), simulate, then send buy or sell signed by the agent key. Anything invalid is logged and skipped.\n- After 3 failed sends in a row, stop and say why.\n\nTwo brains, picked with a toggle\n- Rules (default): buy when a coin rose 5% over its last 10 samples and the card holds none of it; sell all at +12%, at -8%, or after 12 hours; one hour cooldown per coin after a sell. Every number editable.\n- Your AI: the holder pastes their own API key, stored like the agent key. Providers: Anthropic (POST https://api.anthropic.com/v1/messages with header anthropic-dangerous-direct-browser-access: true, default model claude-haiku-5-5) or any OpenAI-compatible URL with a model name. Each loop sends a JSON snapshot (card limits, balance, spent today, positions with cost, value and P&L %, each coin's price and change over 10 and 60 samples) plus the holder's own instructions from a text box, and asks for JSON only: {\"action\":\"buy|sell|hold\",\"coin\":\"0x…\",\"imd\":\"0.5\",\"reason\":\"…\"}. Unparseable replies count as hold.\n\nActivity feed\nEach loop adds a line: time, brain, decision, reason, and the transaction link when one is sent. Keep the last 200 lines in localStorage. A \"Share\" button posts to X: \"My AI agent runs on Handlers In Control. Card #0001 · 64% win rate over 25 trades\" with a link to the card's record page.\n\nPlumbing fixes\n- RPC: JSON-RPC batches of 3 or fewer, and add https://rpc.flashbots.net and https://rpc.mevblocker.io as fallbacks after the current ones.\n- Home and mint show the price as \"0.2 IMD\" once read and \"Checking price…\" before, never a bare \"Price loading\".\n\nTests: setup steps against a mocked wallet, the validator (oversize buy, foreign coin, sell above position, frozen card, malformed AI reply), passphrase encryption round trip, and that no key or API key ever appears in a network request other than its own provider call. Check the page at 390, 500 and 1440px.","baseCommit":"f03d980e5e178650a1eea9e54e1f6ac93e42c6a5","workflowId":null,"deliveredAt":"2026-10-14T09:26:20.966+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1515-workflow-frontend-stage-context/pull/2"},{"site":{"cid":"bafybeibkm2n6xrqv3thvvpjvowkhsbwcs2x5buk2vzvjt4stumbk3pbc2q","status":"named","ensName":"hic.site.identitymd.eth"},"jobId":"418bbda3-b165-415f-a9b8-b610a928bb97","state":"completed","commit":"55dcecc0433588f79e96ad00e0e09e1d267c6f64","repoUrl":"https://github.com/identity-md-launches/launch-1515-workflow-frontend-stage-context","createdAt":"2026-10-14T10:02:16.252556+00:00","objective":"Add Autopilot to the live Handlers In Control site: the holder's agent runs inside their own browser tab, driven by built-in rules or by the holder's own AI key. Contracts, addresses, ABIs, routes and existing flows stay as they are; change only the web app and republish under the same site name.\n\nAutopilot page (#/autopilot, nav item \"Autopilot\")\nFor a card owned by the connected holder wallet, a five-step setup with one button each and a status per step:\n1. Create agent key: generate a fresh secp256k1 key in the browser. Keep it in memory and in localStorage encrypted with a passphrase the user types (AES-GCM, key from PBKDF2 with 200,000 iterations). Offer \"Export key\" once. Never send it anywhere.\n2. Set as agent: holder signs setAgent(id, agentAddress). Skip if already set.\n3. Set limits: holder signs setRules(id, dailyCap, maxPerTrade), prefilled 2 IMD a day and 0.5 IMD per trade.\n4. Fund gas: holder sends 0.003 ETH to the agent address (editable). Show the agent's ETH balance.\n5. Start: begins the loop. \"Stop\" ends it. \"Freeze card\" calls freeze(id) from the holder.\nBanner: \"Autopilot runs only while this tab is open.\"\n\nThe loop (every 60 seconds while running)\n- Read getCard(id), spentToday(id), the card's IMD balance and positions for each watched coin.\n- Watchlist: HIC by default. The holder can add other coin addresses; drop any where isTradable is false.\n- Price each coin by quoting 0.05 IMD on its exact launch pool with the Quoter already used by Trade; keep the last 60 samples per coin in memory.\n- Ask the brain for at most one action, then validate it: coin is on the watchlist and tradable; a buy is at most min(card balance, maxPerTrade, dailyCap minus spentToday, the page's size setting) and at least 0.1 IMD; a sell is at most the card's position. Re-quote, apply 3% slippage (editable), simulate, then send buy or sell signed by the agent key. Anything invalid is logged and skipped.\n- After 3 failed sends in a row, stop and say why.\n\nTwo brains, picked with a toggle\n- Rules (default): buy when a coin rose 5% over its last 10 samples and the card holds none of it; sell all at +12%, at -8%, or after 12 hours; one hour cooldown per coin after a sell. Every number editable.\n- Your AI: the holder pastes their own API key, stored like the agent key. Providers: Anthropic (POST https://api.anthropic.com/v1/messages with header anthropic-dangerous-direct-browser-access: true, default model claude-haiku-5-5) or any OpenAI-compatible URL with a model name. Each loop sends a JSON snapshot (card limits, balance, spent today, positions with cost, value and P&L %, each coin's price and change over 10 and 60 samples) plus the holder's own instructions from a text box, and asks for JSON only: {\"action\":\"buy|sell|hold\",\"coin\":\"0x…\",\"imd\":\"0.5\",\"reason\":\"…\"}. Unparseable replies count as hold.\n\nActivity feed\nEach loop adds a line: time, brain, decision, reason, and the transaction link when one is sent. Keep the last 200 lines in localStorage. A \"Share\" button posts to X: \"My AI agent runs on Handlers In Control. Card #0001 · 64% win rate over 25 trades\" with a link to the card's record page.\n\nPlumbing fixes\n- RPC: JSON-RPC batches of 3 or fewer, and add https://rpc.flashbots.net and https://rpc.mevblocker.io as fallbacks after the current ones.\n- Home and mint show the price as \"0.2 IMD\" once read and \"Checking price…\" before, never a bare \"Price loading\".\n\nTests: setup steps against a mocked wallet, the validator (oversize buy, foreign coin, sell above position, frozen card, malformed AI reply), passphrase encryption round trip, and that no key or API key ever appears in a network request other than its own provider call. Check the page at 390, 500 and 1440px.","baseCommit":"22e1fdff1fcfa65f065df4c3eb4c0f181603c5e9","workflowId":null,"deliveredAt":"2026-10-14T10:30:18.526+00:00","pullRequestUrl":"https://github.com/identity-md-launches/launch-1515-workflow-frontend-stage-context/pull/3"}],"contracts":[{"id":"a3907511-d5f4-43b7-b2b4-03d34cb166cb","kind":"evm_project","token":{"logo":"78d5bb3d11dc49eb6bf542dcbb0afe140948f4f6d7216bb0bd871992a028c13f","name":"Handlers In Control","symbol":"HIC"},"seeded":{"pools":[{"fee":12500,"hooks":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000","currency0":"0x7cf6fd992e6ff892caa8651f6d4e93859e1c1c71","currency1":"0xd34a99bc0f67ae1bbd63c660e6d0b0dd03e263b7","tickSpacing":60}],"launched":[],"positions":[{"factory":"0xff03410d0fe5fa8f7f59f743de35e333d9857120","tickLower":-128940,"tickUpper":887220,"launchNumber":1503}]},"status":"live","chainId":1,"artifacts":[{"name":"HandlerArt","role":"other","txHash":"0x8bf43a88e0335aac9b7a9809f27b15da55aa094b59f955c852f68e1864815c15","address":"0x6d24f0f9dd65a2f793bf83dae9d1ab8640e6b445"},{"name":"HandlerDesk","role":"other","txHash":"0x8bf43a88e0335aac9b7a9809f27b15da55aa094b59f955c852f68e1864815c15","address":"0x5f8078b871908632db0ebaaa4f79a122e4916dd8"},{"name":"LaunchToken","role":"token","txHash":"0x8bf43a88e0335aac9b7a9809f27b15da55aa094b59f955c852f68e1864815c15","address":"0x7cf6fd992e6ff892caa8651f6d4e93859e1c1c71"},{"name":"MerkleDistributor","role":"distributor","txHash":"0x8bf43a88e0335aac9b7a9809f27b15da55aa094b59f955c852f68e1864815c15","address":"0xf59ee78a01672d17ff55ed3428f0ada9b0c03c3f"},{"name":"PoolInitializationGuard","role":"hook","txHash":"0x8bf43a88e0335aac9b7a9809f27b15da55aa094b59f955c852f68e1864815c15","address":"0x784ff9a3ac5d88a30bfff6f7f2a270161fbe6000"}],"createdAt":"2026-10-13T05:31:20.844+00:00","updatedAt":"2026-10-13T05:32:51.459+00:00","launchNumber":1503,"parkedReason":null,"sourceCommit":"73174a3aabac5ee1c52275ef1e651a65f65610f3","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1503-workflow-contract-stage-context"}],"publishedAt":"2026-10-14T10:31:28.171+00:00"},{"id":"launch:6852fdde-75ab-4792-be10-0861e97bbb10","code":[],"media":[],"sites":[],"title":"Deploy IMD6900RobinhoodLaunch (src/IMD6900RobinhoodLaunch.sol) on Robinhood Chain exactly as it is in the repository: one contract, four constructor arguments in this order: 0x35da9c0303507ddf708e87f2568eddf12c47a059 (owner: the team wallet), 0x8366a39CC670B4001A1121B8F6A443A643e40951 (Uniswap v4's PoolManager on Robinhood Chain), 0x0000198C940D8cD70Cb9ACeC5E3af8216ac57d2F (Robinhood's IMDSTR, the old token that claims the new coin 1:1), 0x16D3f65B708883DF042d98E1C7a49B32A33E2A14 (the Robinhood timelock: owns the hook and recovers ETH). Its constructor creates IMD6900LockedPool and nothing else (no salt mining: about 6.9M gas from any deployer address). After the deploy, createHook(salt) (anyone, once) creates IMD6900Hook with CREATE2 from the launch at a salt mined off-chain for its address (script/launch.sh hook: its address carries exactly the hook's permission flags and doesn't start with 0x91; the hook is owned by the timelock); the team calls it, the deploy does not need to. The pool's fee is static: 4.44% (POOL_FEE 44_400), the same for every trade, so Uniswap's router routes the pool on its own (no dynamic fee, no return deltas); it accrues to the locked position, whose fees anyone can collect. A v4 pool's fee can't change, so IMD6900LockedPool.lowerFee (the timelock only, lower only) moves the whole position in one unlock to a new pool at the lower fee and the same price. It calls nothing that existed before it, so it deploys the same on a fresh chain (test_DeploysOnAFreshChain); it fits one transaction (test_FitsOneTransaction, ~6.9M gas, the same from any deployer); no contract shows CALLCODE, DELEGATECALL or SELFDESTRUCT, creation code included (test_PassesTheAdmissionScan). Later, its owner launches the coin IMD6900 at a 0x6900… address mined for this contract's address (launch(): the coin with CREATE2, the pool opened with the whole 1B supply as coin-only liquidity, locked for good, and the opening buy, in one transaction), through Programmable's custom launch, which binds every component to the exact source: do not change the source, the compiler settings (solc 0.8.26, via-IR, 200 runs, cancun, bytecode_hash none), the constructor, the hook's permissions, the 4.44% static fee and lowerFee's lower-only move (refused while the perps engine has positions open), the fee refund (IMD6900LockedPool.feeCheckpoint/feeRefund: only the hook's perps engine and the launch's sellHeld trade fee-free), the pool's lack of any liquidity removal (only lowerFee's move from one pool into the next), the coin's plain ERC20 (no owner, no mint, no tax) and launch()'s refusal of any coin address not starting with 0x6900, the fee split's defaults (90% the pot bridge, which feeds IMD6900's NFT floor pot on Ethereum; 10% $IMD bought for IMD's canonical Robinhood burn executor 0x4D6537ec564aFf82eABb1Ce5f355E817cBEA1e07, fixed in the code), the perps engine's fees (addPerpFees: all of it as ETH to the pot bridge), the split and every landing address being the timelock's alone to change (setPayees, setPerpFeeTo, setCoinFeeTo, setImdBurn, setImdPool), or the timelock's role (the hook's owner; it alone recovers ETH, releases the excess or sells the coins the launch holds back into the pool for the opening buy's ETH (sellHeld), ends the claims early (endClaims), repoints $IMD's pool and sets the split). The perps are part of this project and of every audit and test step: src/perps/PerpEngine.sol, PerpVault.sol and PerpSwapLib.sol (inlined, internal functions only: no DELEGATECALL anywhere, the engine under EIP-170 at about 24.4KB). They are not deployed with the launch (the engine's constructor binds to the live pool): IMD6900LockedPool.createPerps creates them right after launch() from exactly the code whose keccak256 is ENGINE_CODE_HASH / VAULT_CODE_HASH (test_ThePerpsCodeIsTheAuditedCode): any fix to src/perps must update those two constants, or the test fails; the engine stays owned by the Robinhood timelock and is wired into the hook at once (initPerpEngine), fee-free by refund; audit its no-bad-debt liquidation inside the hook's pre-trade sweep, the refund pair, the vault's accounting and the fee split (20% stakers, 10% insurance, 70% to the launch's addPerpFees). test/Perps.t.sol covers creation, longs, shorts, the sweep's liquidations and fees. test/RobinhoodFork.t.sol runs the whole launch on a Robinhood fork when ROBINHOOD_RPC_URL is set (claims, trades, buys through Uniswap's Universal Router, the fee split, the $IMD burn, the perps created and traded, a fee move to 3.33%) and skips otherwise. Everything builds offline (lib/ is vendored; v4-core's PoolManager is used by the tests only).","types":["contracts"],"audits":[],"paidBy":"0xc94400e90bb652afa02740bff50824e14069c133","release":null,"research":[],"versions":[],"contracts":[{"id":"6852fdde-75ab-4792-be10-0861e97bbb10","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":4663,"artifacts":[{"name":"IMD6900RobinhoodLaunch","role":"other","txHash":"0xa361122b96cd79b4889819abfa78d94ed4904a8d365edadd02f759796bc541d8","address":"0x7434511fbae8b2900c9546d910ba24c81379d229"}],"createdAt":"2026-10-14T04:04:44.828+00:00","updatedAt":"2026-10-14T04:06:21.294+00:00","launchNumber":1591,"parkedReason":null,"sourceCommit":"0d03b6d4e958cae21070c3aae0dcc612cbb9d703","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1591-imd6900robinhoodlaunch"}],"publishedAt":"2026-10-14T04:04:44.828+00:00"},{"id":"launch:d9ab2613-5ac4-48f7-83ec-28843a1fcd96","code":[],"media":[],"sites":[],"title":"Deploy IMD6900RobinhoodLaunch (src/IMD6900RobinhoodLaunch.sol) on Robinhood Chain exactly as it is in the repository: one contract, four constructor arguments in this order: 0x35da9c0303507ddf708e87f2568eddf12c47a059 (owner: the team wallet), 0x8366a39CC670B4001A1121B8F6A443A643e40951 (Uniswap v4's PoolManager on Robinhood Chain), 0x0000198C940D8cD70Cb9ACeC5E3af8216ac57d2F (Robinhood's IMDSTR, the old token that claims the new coin 1:1), 0x16D3f65B708883DF042d98E1C7a49B32A33E2A14 (the Robinhood timelock: owns the hook and recovers ETH). Its constructor creates IMD6900LockedPool and nothing else (no salt mining: about 6.9M gas from any deployer address). After the deploy, createHook(salt) (anyone, once) has IMD6900LockedPool create IMD6900Hook with CREATE2 from the pool (IMD6900LockedPool.createHook) at a salt mined off-chain for the pool's address (script/launch.sh hook: its address carries exactly the hook's permission flags and doesn't start with 0x91; the hook is owned by the timelock); the team calls it, the deploy does not need to. The pool's fee is static: 4.44% (POOL_FEE 44_400), the same for every trade, so Uniswap's router routes the pool on its own (no dynamic fee, no return deltas); it accrues to the locked position, whose fees anyone can collect. A v4 pool's fee can't change, so IMD6900LockedPool.lowerFee (the timelock only, lower only) moves the whole position in one unlock to a new pool at the lower fee and the same price. It calls nothing that existed before it, so it deploys the same on a fresh chain (test_DeploysOnAFreshChain); it fits one transaction (test_FitsOneTransaction, ~6.9M gas, the same from any deployer); no contract shows CALLCODE, DELEGATECALL or SELFDESTRUCT, creation code included (test_PassesTheAdmissionScan). Later, its owner launches the coin IMD6900 at a 0x6900… address mined for this contract's address (launch(): the coin with CREATE2, the pool opened with the whole 1B supply as coin-only liquidity, locked for good, and the opening buy, in one transaction), through Programmable's custom launch, which binds every component to the exact source: do not change the source, the compiler settings (solc 0.8.26, via-IR, 200 runs, cancun, bytecode_hash none), the constructor, the hook's permissions, the 4.44% static fee and lowerFee's lower-only move (refused while the perps engine has positions open), the fee refund (IMD6900LockedPool.feeCheckpoint/feeRefund: only the hook's perps engine and the launch's sellHeld trade fee-free), the pool's lack of any liquidity removal (only lowerFee's move from one pool into the next), the coin's plain ERC20 (no owner, no mint, no tax) and launch()'s refusal of any coin address not starting with 0x6900, the fee split's defaults (90% the pot bridge, which feeds IMD6900's NFT floor pot on Ethereum; 10% $IMD bought for IMD's canonical Robinhood burn executor 0x4D6537ec564aFf82eABb1Ce5f355E817cBEA1e07, fixed in the code), the perps engine's fees (addPerpFees: all of it as ETH to the pot bridge), the split and every landing address being the timelock's alone to change (setPayees, setPerpFeeTo, setCoinFeeTo, setImdBurn, setImdPool), or the timelock's role (the hook's owner; it alone recovers ETH, releases the excess or sells the coins the launch holds back into the pool for the opening buy's ETH (sellHeld), ends the claims early (endClaims), repoints $IMD's pool and sets the split). The perps are part of this project and of every audit and test step: src/perps/PerpEngine.sol, PerpVault.sol and PerpSwapLib.sol (inlined, internal functions only: no DELEGATECALL anywhere, the engine under EIP-170 at about 24.4KB). They are not deployed with the launch (the engine's constructor binds to the live pool): IMD6900LockedPool.createPerps creates them right after launch() from exactly the code whose keccak256 is ENGINE_CODE_HASH / VAULT_CODE_HASH (test_ThePerpsCodeIsTheAuditedCode): any fix to src/perps must update those two constants, or the test fails; the engine stays owned by the Robinhood timelock and is wired into the hook at once (initPerpEngine), fee-free by refund; audit its no-bad-debt liquidation inside the hook's pre-trade sweep, the refund pair, the vault's accounting and the fee split (20% stakers, 10% insurance, 70% to the launch's addPerpFees). test/Perps.t.sol covers creation, longs, shorts, the sweep's liquidations and fees. test/RobinhoodFork.t.sol runs the whole launch on a Robinhood fork when ROBINHOOD_RPC_URL is set (claims, trades, buys through Uniswap's Universal Router, the fee split, the $IMD burn, the perps created and traded, a fee move to 3.33%) and skips otherwise. Everything builds offline (lib/ is vendored; v4-core's PoolManager is used by the tests only). Proof tests: deploy Uniswap's PoolManager with `new PoolManager(address(this))` (importing it) and the project's contracts by importing them, never vm.deployCode / vm.getCode on a contract the proof doesn't import: a proof is compiled with its own imports only (a proof that loaded the PoolManager by name failed setUp with 'vm.deployCode: no matching artifact found' on job 4b952282).","types":["contracts"],"audits":[],"paidBy":"0xc94400e90bb652afa02740bff50824e14069c133","release":null,"research":[],"versions":[],"contracts":[{"id":"d9ab2613-5ac4-48f7-83ec-28843a1fcd96","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":4663,"artifacts":[{"name":"IMD6900RobinhoodLaunch","role":"other","txHash":"0xe2fc4bd7b5f88efb7996f49e0fb0c33c8ae6ed508eb89bf44f0da62b85ecbaf6","address":"0x9b813a3a8c179dd057a95b67bb4f1e98ed225b6b"}],"createdAt":"2026-10-13T22:12:56.466+00:00","updatedAt":"2026-10-13T22:14:08.067+00:00","launchNumber":1639,"parkedReason":null,"sourceCommit":"f90743e67e43c8492464d79900e791bcadb29d3c","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1639-imd6900robinhoodlaunch"}],"publishedAt":"2026-10-13T22:12:56.466+00:00"},{"id":"launch:7ccf4aae-4316-43e3-ac69-570c655c7029","code":[],"media":[],"sites":[],"title":"BLACKOUT v3.17 L1 on Robinhood Chain (4663). NO SOURCE CHANGES.\nSource: commit e17f0ef7bd7d188949eb4dc91e3eb0540c94cbf3 of identity-md-launches/launch-1544-blackout-swarmdesk-bootstrap-robinhood. Build with the unchanged repo foundry.toml: solc 0.8.26, optimizer 200, cancun, viaIR false, bytecode_hash none.\nDeploy SwarmDesk at index 0 then EndowmentEscrow at index 1 in ONE evm_contracts launch. Resolve the escrow Desk argument as $contract:SwarmDesk from this same launch. Return both addresses, their indices and this single launch number.\nThe Desk takes eight static words. The eighth is the binder 0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007: the project wallet (not an IMD protocol address) and the only account that may call bind; any other caller gets Unauthorized. The Desk is bound after L3 with bind(REGISTRY, registryCreationCode, paramsCreationCode, N_A, 1, N_A, 0, N_TOKEN), signed by that wallet: the last word is the recorded L2 launch number, and bind reads LaunchFactory.positionOf(N_TOKEN) (compiled-in 0xa25b…4645) and refuses any registry whose market is not the hook that record names for the registry's token. A market that only echoes desk(), token() and gameConfigHash() cannot bind. Keep the L2 launch number with the L1/L3 outputs for the keeper (wiring.tokenLaunch).\nGAME_CONFIG_HASH: 0x11ed7438974e96ecc962201e9c46422c7bf239d725876863fa25a56c734b20d3.\nExact ordered constructor words and expected creation hashes:\n[0] SwarmDesk [\"0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000\",\"5391989333430298100116863486635657822062725418115979424500284366258177\",\"0x2fc5a57f2c5f7bc083ea8ac5016234f1a0b1c68a514e5d921956cc57948534ef\",\"0xc13efed8438aab53ea052a4507def2dc4ce9856765520dfa28c66daa59cfc11d\",\"0x00e69e4445c7ca7256338293f9f9cea439fd2beb1959d1d43ebec7b14493e2f6\",\"0xc0ae7511b06744cf7ccadc6b60ff9ff96cb7234cf32988850df33324861cc8df\",\"0x11ed7438974e96ecc962201e9c46422c7bf239d725876863fa25a56c734b20d3\",\"0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007\"]\nCreation hash: 0x1d8e1afa90ba7a4c436fa2406f52743c97f7e6d9add372516144cadcb0795879\n[1] EndowmentEscrow [\"$contract:SwarmDesk\"]\nCreation hash: 0xe7a48446223ad53d50a9a9372c5552b70fb94e4f03c0f9f45298f7e5d2036368\nNo literal IMD protocol addresses may appear as constructor words. Protocol endpoints are compiled in; allowed platform placeholders and named contract references stay as shown.\nAccepted findings (low/info only, full text in docs/accepted-v317.md; do not change source for them):\n- RewardPool shortfall: repair with a plain token transfer; donate is not the repair path.\n- Exact-input swaps only: V4Market rejects exact-output swaps.\n- spot() bounds: zero, underflowed or above-1e40 prices revert.\n- Fixed oracle signer/endpoints: compiled in, no owner rotation.\n- Answers between job A and job B: stored after L3, executable only once all L4 modules are registered; stream-0 answers before role 1 likewise.\n- Future-block randomness: native L2 block entropy with capture/re-arm rules, not VRF; enhancement attempts lapse to their worst outcome instead of re-arming; grid events re-arm instead of using a precomputable seed.\n- Reserved Params keys: no gameplay effect; proposals may still consume cooldown.\n- M-2 matching twin: only the pinned binder can bind; the binder key could still choose a proven twin.\n- Binder liveness: one-time bind by 0x6d51…d007; a lost key leaves the Desk unbound and the endowment in escrow; the binder cannot bypass any proof.\n- GameRegistry.register prefill by a byte-identical copy: same pinned code and registry; the keeper registers every role immediately and verifies module(role).\n- Season.rollover before finalize: the keeper finalizes, then rolls over weekly; a rollover only moves the pot to later players.\n- FeeRouter.executeSells sweep rollback: repeats on the next success, no value lost.\n- FarmRewards same-epoch vintage back-dating: at most about 54 bps in the player's favour, self-triggered.\n- Deploy-gate tool takes only the JSON plan.\n- Civic.claimWar rounding dust stays in the game.\n- No max-cost bound on openPack/buyTokenPack: bounded by approval or ETH minimum output.\n- Unused minter/caller permissions: every allowed caller is a pinned module of this registry.\n- Dead fields: written, never read.\n- PackSale.buyPacksFor gifting: value only flows in.\n- One-shot escrow: forward runs once to the proven RewardPool, after the whole remainder has landed.\n- Economy._insert 33-tie lock griefing: reverts atomically, no funds at risk.\n- Festival severity band always +15%: no value moves.\nProject: https://playblackout.xyz","types":["contracts"],"audits":[],"paidBy":"0x6d51cbe774aeae4dd40bca2560e9bc2695a0d007","release":null,"research":[],"versions":[],"contracts":[{"id":"7ccf4aae-4316-43e3-ac69-570c655c7029","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":4663,"artifacts":[{"name":"EndowmentEscrow","role":"other","txHash":"0x0f2fbbe998a802fa2f0edf041b220be86a8fa70830e0cea1a1937a3421b248f4","address":"0x11947494c0ba91508eb7409648193818c36521fb"},{"name":"SwarmDesk","role":"other","txHash":"0x0f2fbbe998a802fa2f0edf041b220be86a8fa70830e0cea1a1937a3421b248f4","address":"0x5cb0686a4475d1f8a6c6e5240579080a4a05b609"}],"createdAt":"2026-10-13T19:46:51.076+00:00","updatedAt":"2026-10-13T19:47:45.817+00:00","launchNumber":1628,"parkedReason":null,"sourceCommit":"4667ac59ead67dfd99f96b33b760d8b3835b0349","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1628-blackout-v3-17-l1-robinhood"}],"publishedAt":"2026-10-13T19:46:51.076+00:00"},{"id":"workflow:d844b795-f3ac-45d4-8437-0891eb93d861","code":[],"media":[],"sites":[{"id":"19836be8-fb9a-4754-af5e-be195941e417","cid":"bafybeiakiav5xwfjlq7b7cl6tprchtj23vnngmsw3c2pi4krca6gdylnpq","jobId":"ed3411f0-e336-4612-9b76-78204f84561f","label":"pepe-4a81fbcaf4ad4fac8f6eb7b80b2","status":"named","txHash":"0x20585f61cfbb69b8fb4d56cce824e266d01ca0c315b4f6ba7fb69ea98787985e","ensName":"pepe-4a81fbcaf4ad4fac8f6eb7b80b2.site.identitymd.eth","failure":null,"namedAt":"2026-10-13T19:12:27.39+00:00","repoUrl":"https://github.com/identity-md-launches/launch-1617-workflow-frontend-stage-context","pinnedAt":"2026-10-13T19:00:30.889+00:00","createdAt":"2026-10-13T19:00:16.609+00:00","previewHash":"8456690aaa98cfcef467b385e9099cff57523af8f512198941e29595842badff","supersededBy":null}],"title":"HTML5 game + ERC20 IMD RISK (RISK). Build contracts, then a playable website with controls, results and wallet claims. Publish the website publicly on IPFS and its source on GitHub; both are authorized. Follow https://github.com/adaki2004/pepe2pepe-game-template/blob/main/ONCHAIN.md.\n\nMy game name: IMD PEPE RISK\nMy game idea: Build IMD RISK, an unofficial Community Coin (not the IMD token; show contract address; never call it official). Classic Risk-style territorial conquest played only with Pepes of different ranks and jobs (Recruit Pepe, Scout Pepe, Tank Pepe, Commando Pepe, etc.). 6 continents, 42 territories. 2–6 players or 1 vs swarm AI. Turns: deploy, attack, fortify. Dice via commit-reveal or seat-signed oracle; defender wins ties. Continent bonuses grant extra Pepes. Win by domination or highest territory count at turn/time limit. Matches short so more people can play.\n\nToken: IMD RISK, symbol RISK, 1B cap, no mint after launch. Launch only as IMD Community Coin (curve priced in IMD; every buy is underlying IMD buy; 0.5% IMD-leg burns). IMD (0xD34a99Bc0f67aE1bbd63C660e6d0b0dd03E263B7) is prize and pricing only. Burned RISK to 0x000…dEaD. Circulating = totalSupply minus dead.\n\nEntry: small IMD or RISK routed to IMD. Prize vault pays IMD only (60/25/15), pull payment, no inflation. Burns: 20% of cosmetics; 10% of RISK entries; 1% attack tax on bought Pepes. After 20% burn, cosmetics split ~1000 bps buyback, 3500 IMD to vault, 3500 to seats/stakers. Buyback buys RISK on curve and burns same tx. 24h cooldown + max 3 rewarded wins per wallet per day so more players can join without one wallet farming.\n\nContracts: MatchFactory, PrizeVault, Cosmetics, Buyback. No admin mint. Tests for combat, prizes, burns. Frontend: map, match list, circulating/burned totals, \"unofficial\" label, IPFS. Seats sign outcomes. README: Pepe ranks, burn table, daily caps, launch checklist.\nMy design: Neon-noir Pepe war room. Classic green Pepes rendered as slightly worn, low-poly military miniatures with glowing rank pips and job gear (scout visors, tank plating, commando bandanas). The board is a dark cartographic hex or territory map with thin bone-white borders; claimed territories pulse faint crimson. Continents sit under harsh cyan and magenta neon strips. Night atmosphere with light fog, wet-ink reflections, and distant searchlights sweeping the map. UI is sharp military-stencil with subtle scanlines. Instantly readable at a glance — rank icons and territory ownership stay clear even in a full 6-player match. Tactical, gritty, and pure Pepe.\nMy UX: Turn-based Risk feel, tightened for speed and more players. Click a territory to select, click adjacent to attack or move Pepes. Drag to multi-select same-rank Pepes. Number keys jump to your continents. Space centers on the last combat. Simple hotkeys for deploy / attack / fortify phases. Dice resolve instantly with a short Pepe bark and neon flash. Territory borders light up on hover; rank pips and job icons stay visible at full zoom. Matches stay short (5–15 min) so queues fill fast. No micromanagement — select, commit Pepes, resolve, next player. Clean, readable, and easy to jump into.","types":["contracts","sites"],"audits":[],"paidBy":"0x529e9729a314c5219a99152141ded2ac354fccce","release":{"status":"completed","failure":null},"research":[],"versions":[],"contracts":[{"id":"9aecab31-7554-4e10-9b1c-fabf44cb383a","kind":"evm_project","token":{"logo":"661c329ad323b216ac2367f494a8cc721d08ca5ce3cf99838598fe9f71ab2909","name":"IMD RISK","symbol":"RISK"},"seeded":{"pools":[{"fee":12500,"hooks":"0x19bec7c2e1b2aadaf67b259744751a9960d66000","currency0":"0x5f7bb59365ce557c26dbcaa4ee9d39a4b95b7127","currency1":"0x8568a3f9469510837bac4e98e2f93cf9b5a91101","tickSpacing":60}],"launched":[],"positions":[{"factory":"0x9c9d2fcb75c2c132c0ac0c42df3819a42347265e","tickLower":-887220,"tickUpper":128940,"launchNumber":1594}]},"status":"live","chainId":4663,"artifacts":[{"name":"Buyback","role":"other","txHash":"0xc335c3c222f6d2b452b85ce1abb9ce94c175f8d1b907ec610650d99cbef9bec7","address":"0x6808a025eb14399660e101353a6df73918f95692"},{"name":"Cosmetics","role":"other","txHash":"0xc335c3c222f6d2b452b85ce1abb9ce94c175f8d1b907ec610650d99cbef9bec7","address":"0xc6e7d724b80f37926fc44f0ff4b74111f8f230e1"},{"name":"LaunchToken","role":"token","txHash":"0xc335c3c222f6d2b452b85ce1abb9ce94c175f8d1b907ec610650d99cbef9bec7","address":"0x8568a3f9469510837bac4e98e2f93cf9b5a91101"},{"name":"MatchFactory","role":"other","txHash":"0xc335c3c222f6d2b452b85ce1abb9ce94c175f8d1b907ec610650d99cbef9bec7","address":"0xb47373fa67f23854ba21418e43a3756919dcb431"},{"name":"MerkleDistributor","role":"distributor","txHash":"0xc335c3c222f6d2b452b85ce1abb9ce94c175f8d1b907ec610650d99cbef9bec7","address":"0xe6cf134acf902b562857f5a02b874137dadd33c2"},{"name":"PoolInitializationGuard","role":"hook","txHash":"0xc335c3c222f6d2b452b85ce1abb9ce94c175f8d1b907ec610650d99cbef9bec7","address":"0x19bec7c2e1b2aadaf67b259744751a9960d66000"},{"name":"PrizeVault","role":"other","txHash":"0xc335c3c222f6d2b452b85ce1abb9ce94c175f8d1b907ec610650d99cbef9bec7","address":"0x6fff4e864830d98f8a42d17251445628b612d6eb"}],"createdAt":"2026-10-13T17:25:18.796+00:00","updatedAt":"2026-10-13T17:25:42.933+00:00","launchNumber":1594,"parkedReason":null,"sourceCommit":"ea68f7e1a9b6271449984eefa6cc791ccb6a8748","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1594-workflow-contract-stage-context"}],"publishedAt":"2026-10-13T19:12:27.39+00:00"},{"id":"launch:df83ce89-2cd5-4422-a88d-5ba97e7c83b0","code":[],"media":[],"sites":[],"title":"BLACKOUT v3.16 L1 on Robinhood Chain (4663). NO SOURCE CHANGES.\nSource: commit 15100e6af0893008f2f09d534604dcc6c1e008b4 of identity-md-launches/launch-1544-blackout-swarmdesk-bootstrap-robinhood. Build with the unchanged repo foundry.toml: solc 0.8.26, optimizer 200, cancun, viaIR false, bytecode_hash none.\nDeploy SwarmDesk at index 0 then EndowmentEscrow at index 1 in ONE evm_contracts launch. Resolve the escrow Desk argument as $contract:SwarmDesk from this same launch. Return both addresses, their indices and this single launch number.\nThe Desk takes eight static words. The eighth is the binder 0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007: the project wallet (not an IMD protocol address) and the only account that may call bind; any other caller gets Unauthorized (import audit 10bfac6d). The Desk is bound after L3 with bind(REGISTRY, registryCreationCode, paramsCreationCode, N_A, 1, N_A, 0, N_TOKEN), signed by that wallet: the last word is the recorded L2 launch number, and bind reads LaunchFactory.positionOf(N_TOKEN) (compiled-in 0xa25b…4645) and refuses any registry whose market is not the hook that record names for the registry's token. A market that only echoes desk(), token() and gameConfigHash() cannot bind. Keep the L2 launch number with the L1/L3 outputs for the keeper (wiring.tokenLaunch).\nGAME_CONFIG_HASH: 0x11ed7438974e96ecc962201e9c46422c7bf239d725876863fa25a56c734b20d3.\nExact ordered constructor words and expected creation hashes:\n[0] SwarmDesk [\"0x6f7261636c652e72657175657374406f7261636c652d31000000000000000000\",\"5391989333430298100116863486635657822062725418115979424500284366258177\",\"0x2fc5a57f2c5f7bc083ea8ac5016234f1a0b1c68a514e5d921956cc57948534ef\",\"0xc13efed8438aab53ea052a4507def2dc4ce9856765520dfa28c66daa59cfc11d\",\"0x00e69e4445c7ca7256338293f9f9cea439fd2beb1959d1d43ebec7b14493e2f6\",\"0xc0ae7511b06744cf7ccadc6b60ff9ff96cb7234cf32988850df33324861cc8df\",\"0x11ed7438974e96ecc962201e9c46422c7bf239d725876863fa25a56c734b20d3\",\"0x6d51cBE774aeAe4dd40bCA2560E9bc2695A0d007\"]\nCreation hash: 0x81b258d403f90ab53a3c52d0b5ee895e57b2c80667b6fb82b637c3cf92a17b59\n[1] EndowmentEscrow [\"$contract:SwarmDesk\"]\nCreation hash: 0x8120758fa38683db9af5b5dbd28c6bd5682f58f160e36b1fc951815082101087\nNo literal IMD protocol addresses may appear as constructor words. Protocol endpoints are compiled in; allowed platform placeholders and named contract references stay as shown.\nAccepted findings (low/info only, full text in docs/accepted-v316.md; do not change source for them):\n- Accepted: RewardPool shortfall: repair an accounting shortfall with a plain token transfer to RewardPool; donate is not the shortfall-repair path.\n- Accepted: Exact-input swaps only: V4Market intentionally rejects exact-output swaps; integrations must request exact input with a minimum output.\n- Accepted: spot() bounds: zero/uninitialized, underflowed, or prices above 1e40 tokens per ETH are unsupported and revert.\n- Accepted: Fixed oracle signer/endpoints: Robinhood protocol addresses and signer are compiled in with no owner rotation; migration requires a separately reviewed source release.\n- Accepted: Answers between job A and job B: the Desk may store answers after L3 binds, but they are not executable until all L4 modules are registered; keepers defer execution until wiring completes.\n- Accepted: Future-block randomness: pack, event, enhancement and lottery entropy uses future native L2 blocks with capture/rearm rules and sequencer/withholding risk; it is not verifiable randomness.\n- Accepted: Reserved Params keys: the reader-less keys in docs/params-keys-v313.md have no gameplay effect; valid proposals may still consume their cooldown.\n- Accepted: M-2 matching twin: since v3.16 no twin can bind, only the pinned binder; the binder key could still choose a proven twin.\n- Accepted: 031c93c4 low 2, GameRegistry.register prefill by an identical copy: a byte-identical module copy constructed with this registry could take a role first; it runs the same pinned code against the same registry, no authority or funds move, and the keeper registers every role immediately and verifies module(role) against the recorded addresses.\n- Accepted: 031c93c4 low 3, Season.rollover does not require finalize: after a week's claim deadline anyone can roll its pot forward, and a later finalize of that week marks winners whose pot claims revert; mitigated by the keeper finalizing every week before its deadline; the pot only moves to later players, never out of the game.\n- Accepted: 031c93c4 low 4, FeeRouter.executeSells sweep rollback: when nothing sellable remains after the capped-heartbeat sweep, the InvalidValue revert also undoes the sweep; heartbeat tokens wait in the FeeRouter until team tokens accrue, small magnitude, no value lost.\n- Accepted: 031c93c4 info 5, FarmRewards._credit vintage timestamp: a same-epoch scrap/award credit back-dates the later settlement credit's maturity by up to one epoch; at most about 54 bps in the player's favour, self-triggered, reserved accounting unchanged.\n- Accepted: 031c93c4 info 6, deploy-gate tool input: tools/check_deploy_gate.mjs takes the JSON plan, not the markdown runbook; docs only.\n- Accepted: Binder liveness: bind is a one-time call by the pinned binder 0x6d51…d007; if that key is lost before binding, the Desk can never bind and the endowment stays in the escrow; the binder cannot bypass any proof.\nProject: https://playblackout.xyz","types":["contracts"],"audits":[],"paidBy":"0x6d51cbe774aeae4dd40bca2560e9bc2695a0d007","release":null,"research":[],"versions":[],"contracts":[{"id":"df83ce89-2cd5-4422-a88d-5ba97e7c83b0","kind":"evm_contracts","token":null,"seeded":null,"status":"live","chainId":4663,"artifacts":[{"name":"EndowmentEscrow","role":"other","txHash":"0xaa60ea07469da33391e6aa79ffc41c44ca813a87a1dd6bf132b5ba901d4a276f","address":"0x500113232498d8ddbdc06f5373a6de793b419345"},{"name":"SwarmDesk","role":"other","txHash":"0xaa60ea07469da33391e6aa79ffc41c44ca813a87a1dd6bf132b5ba901d4a276f","address":"0xac5a425794ef3d63d221a4d8e78934c9b7c5035f"}],"createdAt":"2026-10-13T16:59:58.817+00:00","updatedAt":"2026-10-13T17:00:51.839+00:00","launchNumber":1593,"parkedReason":null,"sourceCommit":"1e4490923f20a389ecb6be136121f4eea65db3b1","sourceRepoUrl":"https://github.com/identity-md-launches/launch-1593-blackout-v3-16-l1-robinhood"}],"publishedAt":"2026-10-13T16:59:58.817+00:00"}],"pageSize":20,"totalPages":4}