{"assessments":[],"deployments":[],"fuzz":[],"identity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"interpretation":"Records acceptance and evidence. Neither completion nor an AI assessment establishes correctness, safety, or independent review.","jobId":"2890a532-849a-42ef-ad89-ac69f28af73f","kind":"skill:build-website","nodes":[{"acceptedSubmissionHash":"37ea55a4a2baa0522618eae0b0499e93bfc6068147a69fcd0d3658a779debed2","dependsOn":[],"execution":{"mustProduce":["dist/index.html"],"network":true,"optionalTools":["browser"],"profile":"none","requires":["network"],"skillHash":"a60bc8b42446c13d993341179fe13c712a5addb118fc532fb2d15e71f912efc8","skillId":"build-website","tools":[]},"key":"build_website","kind":"code","role":"implement","skillHash":"a60bc8b42446c13d993341179fe13c712a5addb118fc532fb2d15e71f912efc8","skillId":"build-website","state":"accepted"},{"acceptedSubmissionHash":"cfe7d4d5eee5e2ecc6ad83b5a3ca9f7731eff60e8e9ff701f378040037549899","dependsOn":["build_website"],"execution":{"network":true,"optionalTools":["browser"],"profile":"none","requires":["network"],"skillHash":"fd33b6741366d364a55a4c0ba2bc4f5d329cec0b62f27a83289dc5b30ab03575","skillId":"design-critic","tools":[]},"key":"design_critic","kind":"code","role":"review","skillHash":"fd33b6741366d364a55a4c0ba2bc4f5d329cec0b62f27a83289dc5b30ab03575","skillId":"design-critic","state":"accepted"}],"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.","parentJobId":"a307647e-223c-4679-b2b1-f140a98f23df","planHash":"227889c21d27d26129d1b164d0575baab8a4a8bd86557b721dc1a5d24b2ec790","previousHash":"0000000000000000000000000000000000000000000000000000000000000000","projectId":"4cc83fbc-42d7-49fe-a9db-4310fb61a570","publication":{"commit":null,"deliveredAt":null,"repoUrl":"https://github.com/identity-md-launches/launch-2369-build-hooks-store-phase"},"receiptIdentity":{"adapter":"0xde152afb7db5373f34876e1499fbd893a82dd336","chainId":1,"collection":"0x0000ec93127baa929e58e97dd0095a2bfb38ec1d","registry":"0x8004a169fb4a3325136eb29fa0ceb6d2e539a432"},"registry":"0xb6d0a187b050fa5bb0b87033a203f37becf4a775","research":[],"schema":"identitymd-work-v1","signals":[{"agentId":"52012","feedbackHash":"839a4176e7281e163d5d6f2b0296034826a2aa1121dd4d4157332641226f9efc","nodeKey":"build_website","submissionHash":"37ea55a4a2baa0522618eae0b0499e93bfc6068147a69fcd0d3658a779debed2","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"51162","feedbackHash":"6b83c233ed1e35440838a47432f19729be24dc16fb35d8c66a42397d1a57225a","nodeKey":"design_critic","submissionHash":"cfe7d4d5eee5e2ecc6ad83b5a3ca9f7731eff60e8e9ff701f378040037549899","tag1":"review:submission","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"c06157a6ac20d2b611c2249f1e28811505f9e9f9f67fdbf34cff4601a4a52a02","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"addadb9c6d3d97ad99176ee0e4c0bed08690256b55c6aebf75b25da2f9e29088","device":"8687b633e8d497b9","findings":[],"hash":"37ea55a4a2baa0522618eae0b0499e93bfc6068147a69fcd0d3658a779debed2","nodeId":"8cfd7f81-0bd1-40ea-8b1b-2d73fc02d896","outcome":"completed","summary":"Implemented job 12 and all carry-overs. Source, `dist/`, README, DESIGN.md and test results are included.\n\nPassed: build, typecheck, 1,177 unit tests, 9 relay tests and 277 browser cases. Seven opt-in cases were skipped. Bundle: **7.824 MiB**, within the limit.\n\n[Validation report](VALIDATION.md) documents design review coverage and limitations.","treeHash":"8bbf6435cc6ce548754b236902d706356d793f04","usage":{"cachedInputTokens":26178176,"inputTokens":274909,"model":"gpt-6.1-sol","outputTokens":82976,"runtime":"codex","turns":9,"wallClockMs":2494029}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"771f83f312eace21","findings":[{"citation":"resolved","description":"Now: exactProvenMatch requires the same chain, but matchProvenLaunch's nearest step ignores chain. A draft whose block set equals a proven launch's on the other chain fails the exact test and gets picked as the nearest match. The Builder line then reads \"Adapted from a proven launch: PondsideGuard (launch 2424, audited 2026-10-22): the swarm removes none and adds none\". The paid request (provenInstruction, line 33) says \"remove none; add none; ... audit it as a new hook\" and never mentions the chain change. Every entry in the live index is on Robinhood Chain (4663), so this happens to anyone who builds one of those stacks on Ethereum. Change to: in provenLine and provenInstruction, when changes.remove and changes.add are both empty, drop the remove/add clause and name the chain instead: \"Adapted from a proven launch: PondsideGuard (launch 2424, audited 2026-10-22): the swarm deploys the same blocks on Ethereum\". In the request, write \"keep its blocks, deploy it on Ethereum, apply the parameters and rules of this request, ... and audit it as a new hook.\" Omit an empty half in the mixed case too (\"removes Buyback jar\" with no \"and adds none\"). Add a unit test for the cross-chain case. Why: the brief's line names \"the blocks\" the swarm removes and adds, and this line is the only thing telling a visitor what their 0.5 IMD request asks the swarm to change. \"none and none\" says nothing changes, and the request hides the one real change, the chain.","line":23,"path":"src/lib/proven.ts","reproduction":"Width any (logic in src/lib/proven.ts). Steps: Builder, type B, how = blocks, add Swap fee, Anti-sniper window, Buyback jar and Pause, set chain Ethereum (1). Live index entry 2424 (chainId 4663, blocks swap-fee, anti-sniper, jar, pause). Measured with node on matchProvenLaunch/provenLine from the repo: match = 2424, line = \"Adapted from a proven launch: PondsideGuard (launch 2424, audited 2026-10-22): the swarm removes none and adds none\". Expected: a line and request that name the chain change and contain no \"none\".","severity":"medium","snippet":"  return `Adapted from a proven launch: ${title}: the swarm removes ${blockNames(changes.remove)} and adds ${blockNames(changes.add)}`;","title":"bug: a draft with a proven launch's exact blocks on the other chain reads \"the swarm removes none and adds none\""},{"citation":"resolved","description":"Now: job 12 removed vt323-latin.woff2 and its @font-face (dist/fonts holds only Atkinson Hyperlegible, JetBrains Mono and Press Start 2P), but the pond scene still sets ctx.font to 13px VT323 and still waits on document.fonts.load('13px VT323') at line 254. Every glyph on the tile scene now falls back to Courier New, or to whatever monospace face the OS provides. Change to: point both lines at a face the site still ships, so the drawing no longer depends on the OS: ctx.font = '13px \"JetBrains Mono\", ui-monospace, Menlo, monospace' and document.fonts?.load('13px \"JetBrains Mono\"'). Why: the carry-over says \"the landing tile scene keeps its own drawing\", and job 1 asked for the canvas drawn exactly as mockup/index.html draws it. Leaving a dead font name means the scene changed without anyone deciding it should.","line":228,"path":"src/scene/pond.ts","reproduction":"Any width, landing (#). grep -rn VT323 web/src src dist/assets returns only src/scene/pond.ts:228 and :254. ls dist/fonts lists no vt323 file, and the loaded document.fonts on the export are Atkinson Hyperlegible, JetBrains Mono and Press Start 2P, so the canvas text resolves to the Courier New fallback.","severity":"low","snippet":"    ctx.font = '13px VT323, \"Courier New\", monospace'; ctx.textAlign = 'center'; ctx.textBaseline = 'middle';","title":"fidelity: the landing pond canvas still asks for VT323, which job 12 deleted, so its glyphs now draw in Courier New"}],"hash":"cfe7d4d5eee5e2ecc6ad83b5a3ca9f7731eff60e8e9ff701f378040037549899","nodeId":"9f9d184d-5bcb-4c1b-ad6d-2d18b212a0a8","outcome":"completed","summary":"I found no high-severity issues. Two findings went into `.imd-findings.json`: one medium bug in the proven-launch line and one low fidelity issue in the pond canvas. I changed no files in the repository; the probe screenshots and a scratch script I wrote went into `test/scratch/`, and I deleted the script.\n\n| Area | Count |\n|---|---|\n| Brief requirements | 16 listed: 16 met, 0 missing, 0 faked (one met item has a medium bug in an edge case) |\n| Broken features | 1 (medium: a nearest match on the other chain reads \"removes none and adds none\") |\n| Product on the first screen at 390 | yes (\"What should your hook do?\" and **Describe it** sit above the fold) |\n| taste@1 checks passed | 11 of 16 (the 5 failures come from choices the brief keeps; see below) |\n| Copy findings | 0 |\n| Share card | yes (title, favicon, og:title and og:image all pass) |\n\n**Requirements**\n\n1. **(h) Phantom scroll gap test kept:** met. The job 12 Playwright run (23 passed) checks it at 1920x1080 and 1366x768 with seven findings (`web/tests/job12.spec.ts:51`). I didn't re-measure it myself.\n2. **(i) Fluid Builder:** met. `styles.css:264` and `styles.css:280`. At 1920 I measured the wrap at 60 to 1860 px (1800 px wide), the card 514 px wide and inside the viewport, and no sideways scroll at 390 or 1920.\n3. **(j) Readable text:** met. On the Builder at 390 and 1920, a paragraph and the wait line compute to \"Atkinson Hyperlegible\", Verdana, and the cost number to \"JetBrains Mono\", ui-monospace, Menlo. The old font files and @font-face rules are gone and the licences are in `LICENSES/`. One leftover is the low finding below.\n4. **(k) A request id that is not a hook:** met. I opened both ads request ids (2454 and 2456) on the export, with no wallet and the real chain. Each showed \"Contracts launch <n>, live\", then \"Not a hook: a contracts launch for the store\", then the explorer link (`Hook.tsx:98`).\n5. **(l) Two labelled balances:** met. `Promotions.tsx:86–89`: the low-balance note triggers below 0.1 IMD (`AD_PRICE` = 10^17) and the explanation sentence is there. Its Playwright test passed.\n6. **(m) Pay on any chain:** met by code and tests. The Playwright tests at `job12.spec.ts:140` (Robinhood hook paid from Ethereum reaches Done) and `:150` (one merged card per hook) passed. I couldn't run these steps live because they need a wallet.\n7. **(1) Nearest match, line and request sentence:** met. The unit tests cover exact, nearest, tie, no-match and words-only. **Bug:** if a draft's blocks exactly match a proven launch on the other chain, the Builder line and the paid request say \"the swarm removes none and adds none\" and never mention the chain change (`src/lib/proven.ts:23`, `:33`). Every entry in the live index is on Robinhood Chain, so this hits anyone who builds one of those stacks on Ethereum.\n8. **(2) PROVEN pill and \"Build one like this\":** met. Catalog card at `Catalog.tsx:68` and `:73`, hook page at `Hook.tsx:105` and `:108`. The index is read from the spec repository's raw URL (`proven.ts:4`).\n9. **(3) Wait line and \"This stack starts from audited code.\":** met. `Builder.tsx:581–582` and `LaunchReview.tsx:157`; I saw both on the 1920 screenshot.\n10. **(4) One launch, no instant lane:** met. There is one cost row (\"Swarm fee 0.5 IMD\"), and the bundle has no instant-lane, factory or free-launch copy.\n11. **Unit tests, Playwright at 390, 1100 and 1920, source, dist/, results:** met. `tests/results/job12/` records 1177 unit tests passing and 23 of 23 job 12 Playwright tests passing.\n\n**The idea:** a store for Uniswap v4 hooks, carried by one device: a pixel-pond ASCII scene in Press Start 2P. It now reads cleanly with Atkinson Hyperlegible for prose and JetBrains Mono for numbers.\n\n**Probe failures that are not findings:**\n- **Casing and eyebrows:** these flag the Press Start 2P uppercase labels, which the brief says to keep wherever they are used today.\n- **Scrolling ticker:** this is the featured strip the brief asks for.\n- **Type sizes (8 counting one-","treeHash":null,"usage":{"cachedInputTokens":1535253,"inputTokens":56,"model":"claude-opus-5-5","outputTokens":16790,"runtime":"claude","turns":31,"wallClockMs":329856}}],"verification":[{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"37ea55a4a2baa0522618eae0b0499e93bfc6068147a69fcd0d3658a779debed2","verifiedTreeHash":"8bbf6435cc6ce548754b236902d706356d793f04","verifierVersion":"0.1.0+ead9012e"}]}