{"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":"a307647e-223c-4679-b2b1-f140a98f23df","kind":"skill:build-website","nodes":[{"acceptedSubmissionHash":"d39b55562f721be50dfa65b8cfb3e68016f2b3a2234c1e97852b59351271682e","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":"a2b610909631ccd878b67fe14ba3bd2957722236bf927f477a0fff102645b9ac","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, 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.","parentJobId":"65b39d7a-7c8c-43d4-a48d-7083d0aab9ff","planHash":"88545db3073547b6440242edea73edad6279bd7788a4bf9fd704cb77d96d4739","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":"51207","feedbackHash":"64609f9b7aa17e2b3cf5c3f979d0fbaaf9625da858a9929619326428c0068fdc","nodeKey":"build_website","submissionHash":"d39b55562f721be50dfa65b8cfb3e68016f2b3a2234c1e97852b59351271682e","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"51544","feedbackHash":"bb283cb659ace54004dec12035c5126886b22cc3eb81cffd071872cc1e2714ca","nodeKey":"build_website","submissionHash":"5f424554509ff13e37d81cc3c43dd6530a436a84c48159e3e9a993fba64008b0","tag1":"verification:structural","tag2":"acceptance-v2","value":1},{"agentId":"51890","feedbackHash":"7d5f98942acbd32bc96515e0c32ec851d83e44d788af6a15b99574fe0274d69a","nodeKey":"design_critic","submissionHash":"95177b9dc2c49a17ad74fee20d78c54fb4674f439536b4f23a1245770a9d217e","tag1":"review:submission","tag2":"acceptance-v2","value":1},{"agentId":"51754","feedbackHash":"aa6a074100ad56f71902faae3834c6bb9eba043088f5b8fa9098aded27468216","nodeKey":"design_critic","submissionHash":"a2b610909631ccd878b67fe14ba3bd2957722236bf927f477a0fff102645b9ac","tag1":"review:submission","tag2":"acceptance-v2","value":1}],"site":null,"snapshotHash":"88270ca738a8e3b1d51503f990f74e78615bbc488b9c517ff33b59ac10a259b9","state":"completed","submissions":[{"artifacts":[],"attempt":1,"bundleHash":"de28d67d747f749396de4239540059da9ebd37883eb99bd6a86de19ec48697b0","device":"cf6bec70b883c22a","findings":[],"hash":"5f424554509ff13e37d81cc3c43dd6530a436a84c48159e3e9a993fba64008b0","nodeId":"55214ebe-ea58-4a64-9946-d368a6eccbb8","outcome":"completed","summary":"Implemented the carry-overs and ads flows; source, `dist/`, documentation and [validation results](/home/imd10/.identitymd/work/a307647e-223c-4679-b2b1-f140a98f23df/55214ebe-ea58-4a64-9946-d368a6eccbb8/VALIDATION.md) are ready.\n\nBuild/typecheck passed: 1,166 unit, 9 relay and 249 browser tests passed; 7 optional cases skipped. Bundle: 7.75 MiB.\n\nLive paid ads remain disabled until the owner configures IMD and the proceeds recipient.\n\nNot delivered: artifacts/abi-check.json, artifacts/ads-fork-results.json, artifacts/browser-geometry.json, artifacts/build.txt, artifacts/bundle-budget.json, artifacts/contrast.json, artifacts/design-probe.json, artifacts/export-integrity.json and 18 more. Under artifacts/, only this step's named outputs leave the machine.","treeHash":"94eab35c8b92fea551ba6d93875b4b4d5cc0e2a9","usage":{"cachedInputTokens":34954496,"inputTokens":294627,"model":"gpt-6.1-sol","outputTokens":152586,"runtime":"codex","turns":11,"wallClockMs":5271184}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e66f9bf5eca15ea2","findings":[{"citation":"resolved","description":"Now: Unknown recipients are recognized only at the start of a fee clause. \"On every swap, Alice receives 1% of the ETH side.\" produces no recipient finding and the composed constructor/footer silently use the paying wallet as recipient.\nChange to: Recognize named payees after introductory trade phrases and commas for every required receiving verb; leave an unresolved payee unresolved, raise the recipient finding, and keep the action locked until a full address is supplied. Add prefixed-phrase regression cases.\nWhy: Carry-over (8) requires a recipient finding for unknown payees using receives, accrues, gets, earns, keeps or collects. Defaulting to a different recipient contradicts the written request before a paid launch.","line":143,"path":"src/lib/writtenFees.ts","reproduction":"At 390×844, choose type B, Describe it, no blocks, Robinhood Chain, hook name AliceHook, and an owner/connected wallet 0x6cba4751742f6989fa224b2dc5d5d52fcef98a34. Enter exactly \"On every swap, Alice receives 1% of the ETH side.\". The findings box says \"Nothing to fix. The request is consistent.\" and Check is enabled with the configured relay. Independently call writtenFeeTargets on that text: actual []; writtenFeeRates: {buy:1,sell:1}; checkConsistency(body(draft,wallet)): actual []. The composed fee footer names the connected wallet instead of Alice. Expected: a recipient finding and a locked check. \"For every swap, Alice receives 1%.\" and \"From each trade, Alice collects 1%.\" reproduce the same failure; removing the prefix correctly raises the finding.","severity":"high","snippet":"  const passivePayee = /^(?:then\\s+)?((?:(?:the|my|our)\\s+)?[a-z][\\w'’-]*(?:\\s+[a-z][\\w'’-]*){0,2}|0x[\\da-fA-F]{40})\\s+(?:(?:is|are|will be|shall be|gets?)\\s+(?:paid|credited|owed|given|sent)|receives?|accrues?|gets?|earns?|keeps?|collects?)\\b(?!\\s+(?:to|by|in|as|out)\\b)/gi;","title":"bug: a trade prefix lets an unknown fee recipient pass the required local check"},{"citation":"resolved","description":"Now: The unpositioned details and findings scroll containers let absolutely positioned .sr labels extend the sticky column beyond its visible content.\nChange to: Add position: relative to .hc-scroll and .findings .list (and the other nested scroll containers using .sr labels), retaining their existing overflow. The column should end at its last panel plus padding.\nWhy: This removes a false scrolling destination and keeps the card and findings usable as one bounded desktop column without changing the supplied layout.","line":398,"path":"web/src/styles.css","reproduction":"Chromium, 1440×900, fresh storage: open #builder, leave the default draft, and scroll within the right-hand .hookcol to the bottom. Its children end at offset 1079 px and it has 6 px bottom padding, but scrollHeight is 1410 px: 325 px of extra scroll range. Injecting only .hc-scroll,.findings .list,.understood,.marquee{position:relative} leaves both child heights/positions unchanged and reduces scrollHeight to 1085 px. Before/after screenshots confirm the blank region closes.","severity":"medium","snippet":".hc-scroll { flex: 0 1 auto; max-height: var(--scroll-room, 30vh); overflow: auto; overscroll-behavior: contain; min-width: 0; }","title":"bug: hidden labels add 325 px of empty scrolling space below the Builder findings"},{"citation":"resolved","description":"Now: After a purchase reaches Done, Promote a hook only toggles flow visibility. Reopening it retains step 4, disables the hook selector, and provides no listing/purchase action.\nChange to: When starting a new promotion from Done, reset step to 1 and clear the selected hook, listing id, revision, recipient and reviewed metadata before opening the existing flow.\nWhy: My hooks must let a wallet promote its live hooks without requiring a reload or navigation away to discard a finished checkout.","line":95,"path":"web/src/Promotions.tsx","reproduction":"Chromium, 390×900: using the provided local Anvil promotion fixture, create a listing, deposit and purchase until \"Your #ad placement is active.\" appears. Stay on My hooks. Click Promote a hook to close the flow, then click it again. Measured: the \"Your live hook on Robinhood Chain\" select is disabled, the count of \"1. Create or use free listing\" buttons is 0, and the step list still ends at Done. Expected: a fresh step 1 with an enabled selector so a second live hook can be promoted. Verified during a real local wallet flow; no public-chain transaction is needed.","severity":"medium","snippet":"      <button className=\"btn primary\" disabled={busy} onClick={() => { setFlow(!flow); setError(''); setMessage(''); }}>Promote a hook</button>","title":"bug: Promote a hook reopens the completed purchase instead of starting another listing"}],"hash":"95177b9dc2c49a17ad74fee20d78c54fb4674f439536b4f23a1245770a9d217e","nodeId":"cd4af70e-4a8b-4dd5-9e10-c334e6cfc9b0","outcome":"completed","summary":"| Area | Count |\n|---|---:|\n| Requirements | 49: **48 met, 1 missing, 0 faked** |\n| Broken features | **3: 1 high, 2 medium** |\n| Product and action on first screen at 390 px | Yes |\n| taste@1 | 12/16 |\n| Copy findings | 0 |\n| Share card | Present, 1200×630 |\n\n**Revision required for the unknown-recipient guard.** Findings are saved in [.imd-findings.json](/root/.identitymd-1450/work/a307647e-223c-4679-b2b1-f140a98f23df/cd4af70e-4a8b-4dd5-9e10-c334e6cfc9b0/.imd-findings.json). Website files were unchanged.\n\n- **High — bug:** “On every swap, Alice receives 1% of the ETH side.” produces no recipient finding and silently names the paying wallet as recipient. Verified in the parser and at 390×844.\n- **Medium — bug:** the Builder column has **325 px of empty scroll range** below its panels at 1440×900. Positioning its existing scroll containers closes the gap.\n- **Medium — bug:** reopening “Promote a hook” after purchase retains Done, disables hook selection, and offers no new listing action. Verified at 390×900 with local wallet transactions.\n\nIndependent checks passed: **1,166 unit tests, 9 relay tests, 143 provided browser cases**, the Anvil transaction sequence, and export integrity. Chromium and WebKit completed the description-to-Builder interaction; WebKit’s public RPC reads encountered access-control errors.\n\nReviewed against [SPEC 1.43](https://github.com/the-hook-store/hooks-store-spec/blob/cc2e24c824f9ec7448a4f78adaf092b3be2eb576/SPEC.md) and the [carry-over wording](https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/jobs/job-10-carry-overs.md).\n\n| # | Requirement | Status | Evidence |\n|---:|---|---|---|\n| 1 | (a) On-screen card sizing; rAF scroll and resize updates; no collapse | Met | `web/src/Builder.tsx` |\n| 2 | (a) Both desktop tests: load height, ≥300 px, viewport fit | Met | `web/tests/builder.spec.ts` |\n| 3 | (b) Phone details floor of 40% viewport or content height | Met | `Builder.tsx`, `.hc-scroll` |\n| 4 | (b) Tests at 390×844 and 320×900 | Met | `builder.spec.ts` |\n| 5 | (c) Port all six older specs; remove `testIgnore` | Met | `web/tests/`, `web/playwright.config.ts`; browser run |\n| 6 | (d) Drop trailing “in the request.” | Met | Builder finding excerpts |\n| 7 | (e) Type A record roles, Live status and hook-code verification | Met | `chain/decode.ts`, `chain/store.ts` |\n| 8 | (e) Compute seeded PoolKey id and prefill selector | Met | `decode.ts`, `Management.tsx` |\n| 9 | (e) Recorded 2448 unit test and Live browser case | Met | `tests/job10.test.mjs`, `web/tests/job10.spec.ts` |\n| 10 | (f) Reread owner after deployer resolves hook | Met | `Management.tsx`; browser case |\n| 11 | (f) Omit Distributor; correct pool text; Open the pool panel | Met | `Hook.tsx`, `OpenPool.tsx` |\n| 12 | (g) Contracts excluded from catalog; plain My hooks row; no dead end | Met | `Catalog.tsx`, `MyHooks.tsx`, `Hook.tsx`; browser case |\n| 13 | (1) Post-payment explorer job link and pre-admission root fallback | Met | `Hook.tsx`, `relay.ts` |\n| 14 | (2) Remove redundant Hook page link; retain request id and Copy | Met | Post-payment notice and hook controls |\n| 15 | (3) Deduplicated Build page links; no `/launches` links; unit test | Met | `Hook.tsx`, `job10.test.mjs` |\n| 16 | (4) Range-order access, permission bit, one-sided sentence and sweep | Met | Catalog, composer and tests; 1,221 pairs, zero failures |\n| 17 | (5) Same-trade fee wording and both `mulDiv` formulas | Met | Catalog/composer; unit assertions |\n| 18 | (6) Dynamic-fee rejection without Dynamic LP fee block | Met | `src/lib/compose.ts`; unit assertions |\n| 19 | (7) Normalize repository URL case, slash and `.git`; realistic mocks | Met | `web/src/relay.ts`, job 9 tests |\n| 20 | (8) Rate spellings; unreadable rates raise findings instead of zero | Met | `src/lib/writtenFees.ts`, regression tests |\n| 21 | (8) Unknown payees using all required receiving verbs | **Missing** | `writtenFees.ts:143`; introductory trade phrases bypass detection |\n| 22 | (9","treeHash":null,"usage":{"cachedInputTokens":11714816,"inputTokens":257122,"model":"gpt-6.1-sol","outputTokens":41034,"runtime":"codex","turns":13,"wallClockMs":1494529}},{"artifacts":[],"attempt":1,"bundleHash":null,"device":"e9bb398fec9e3e04","findings":[],"hash":"a2b610909631ccd878b67fe14ba3bd2957722236bf927f477a0fff102645b9ac","nodeId":"cd4af70e-4a8b-4dd5-9e10-c334e6cfc9b0","outcome":"completed","summary":"| Area | Previous review | This review |\n|---|---:|---:|\n| Requirements | Counts unavailable | 50 groups met; 0 missing, 0 faked |\n| Broken features | 3 | 0 |\n| First screen at 390 | — | Product and action visible |\n| taste@1 | — | 12/16 |\n| Copy findings | — | 0 |\n| Share metadata | — | 5/5 present |\n\nAll three reported findings are fixed. No new reproducible defects found. [.imd-findings.json](/root/.identitymd-45/work/a307647e-223c-4679-b2b1-f140a98f23df/cd4af70e-4a8b-4dd5-9e10-c334e6cfc9b0/.imd-findings.json) contains `{\"findings\":[]}`. Application files remain unchanged.\n\n- **Recipient safety:** All three original phrases preserve “Alice” as unresolved and raise recipient findings. Check, Continue and direct Launch remain locked until a full address replaces the name.\n- **Phantom scrolling:** At 1440×900, the column now measures 1,085 px against a last-panel bottom of 1,079.19 px plus 6 px padding. The excess blank range is gone at both desktop sizes.\n- **Promotion restart:** After an actual local purchase, closing and reopening starts at step 1 with an empty, enabled selector and cleared purchase details.\n\nValidation passed: **1,167 unit tests, 128 Chromium tests and 5 WebKit regressions**. The local Anvil flow passed listing, deposit, purchase, second-wallet boost, cancellation, withdrawal and pinned-revision checks. Browser regressions use controlled RPC responses; transactions ran on the local fork.\n\nThe four taste flags concern casing, heading labels, type sizes and border/shadow styling retained from the prescribed visual system. They produce no new finding. At 390×844, the main action ends at **574.16 px**, with no horizontal overflow.\n\nThe requirement inventory below covers the assigned SPEC 1.43 scope and [carry-over wording](https://raw.githubusercontent.com/the-hook-store/hooks-store-spec/main/jobs/job-10-carry-overs.md). Evidence paths are repository-relative.\n\n| # | Requirement | Status | Evidence |\n|---:|---|---|---|\n| 1 | Desktop card sizing uses viewport position, scroll/rAF and resize; preserves load height and viewport fit at both sizes | Met | `web/src/Builder.tsx`; `web/tests/builder.spec.ts` |\n| 2 | Phone details floor reaches 40% at 390×844 and 320×900 | Met | Same files; responsive checks passed |\n| 3 | Six carry-over specs ported; no `testIgnore` | Met | `web/playwright.config.ts`; all six suites exercised |\n| 4 | Finding excerpt drops “in the request.” | Met | `web/src/Builder.tsx` |\n| 5 | Type A resolves hook, token and distributor roles; Live requires record and code | Met | `web/src/chain/decode.ts`; `store.ts` |\n| 6 | Seeded PoolKey produces the specified pool id and prefills controls | Met | `tests/job10.test.mjs`; `web/tests/job10.spec.ts` |\n| 7 | Recorded 2448 unit test and Type A Live browser case | Met | Same tests |\n| 8 | Type C owner rereads after hook resolution | Met | `web/src/Management.tsx`; browser regression |\n| 9 | Type C omits Distributor and shows no-pool copy and opening panel | Met | `web/src/Hook.tsx`; `OpenPool.tsx` |\n| 10 | Contracts launches excluded from catalog, avoid dead end and have plain My hooks rows | Met | `web/src/MyHooks.tsx`; `Hook.tsx`; browser regression |\n| 11 | Payment notice uses admitted job id, with explorer-root fallback | Met | `web/src/Hook.tsx`; `relay.ts` |\n| 12 | Notice removes self-link while retaining request/copy functionality | Met | `web/src/Hook.tsx`; `AddressValue.tsx` |\n| 13 | Unique “Build page” job links; unsupported launch URLs absent | Met | `web/src/Hook.tsx`; unit assertion |\n| 14 | Range-order restrictions, callback, one-sided wording and pair sweep | Met | `src/blocks/catalog.json`; 1,156 accepted pairs, zero failures |\n| 15 | Fee sentences include both exact-input/output mulDiv formulas | Met | Catalog; `tests/job10.test.mjs` |\n| 16 | Fixed-fee requests reject the dynamic flag; tests included | Met | `src/lib/compose.ts`; unit tests |\n| 17 | Proven imports normalize case, slash and `.git`; realistic mocks | Met | `web/src/relay.t","treeHash":null,"usage":{"cachedInputTokens":3557888,"inputTokens":133141,"model":"gpt-6.1-sol","outputTokens":18118,"runtime":"codex","turns":8,"wallClockMs":578040}},{"artifacts":[],"attempt":1,"bundleHash":"c91c502ff9811f0cec52d4d9e54a956b1af55e1ea1792ce8d424c0108061b28b","device":"43ece644a892418a","findings":[],"hash":"d39b55562f721be50dfa65b8cfb3e68016f2b3a2234c1e97852b59351271682e","nodeId":"55214ebe-ea58-4a64-9946-d368a6eccbb8","outcome":"completed","summary":"Fixed all three reproduced findings, rebuilt `dist/`, and wrote `.imd-responses.json`.\n\nValidation passed: build, typecheck, 1,167 unit tests, 9 relay tests, and 252 Chromium cases. Seven existing optional cases remain skipped. Bundle: 7.45 MB.\n\nWebKit lacked system libraries; the browser connector failed initialization. Chromium validation used Playwright. Details are in [VALIDATION.md](VALIDATION.md).\n\nNot delivered: artifacts/revision/ads-fork-results.json, artifacts/revision/build.txt, artifacts/revision/bundle-budget.json, artifacts/revision/design-probe.json, artifacts/revision/export-integrity.json, artifacts/revision/playwright-results.json, artifacts/revision/playwright.txt, artifacts/revision/relay.txt and 6 more. Under artifacts/, only this step's named outputs leave the machine.","treeHash":"096854cc45c945817ac9673f87f1d1592eff2141","usage":{"cachedInputTokens":4683648,"inputTokens":150735,"model":"gpt-6.1-sol","outputTokens":27348,"runtime":"codex","turns":7,"wallClockMs":755011}}],"verification":[{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"5f424554509ff13e37d81cc3c43dd6530a436a84c48159e3e9a993fba64008b0","verifiedTreeHash":"94eab35c8b92fea551ba6d93875b4b4d5cc0e2a9","verifierVersion":"0.1.0+ead9012e"},{"checks":[],"detail":"paths and tree verified; no suite was run for this kind of work","evaluation":"structural","profile":"none","status":"accepted","submissionHash":"d39b55562f721be50dfa65b8cfb3e68016f2b3a2234c1e97852b59351271682e","verifiedTreeHash":"096854cc45c945817ac9673f87f1d1592eff2141","verifierVersion":"0.1.0+ead9012e"}]}